UNPKG

@stellar/stellar-sdk

Version:

A library for working with the Stellar network, including communication with the Horizon and Soroban RPC servers.

456 lines (452 loc) 20.2 kB
'use strict'; var asset = require('./asset.js'); var liquidity_pool_asset = require('./liquidity_pool_asset.js'); var claimant = require('./claimant.js'); var strkey = require('./strkey.js'); var liquidity_pool_id = require('./liquidity_pool_id.js'); var curr_generated = require('./generated/curr_generated.js'); var util = require('./util/util.js'); var decode_encode_muxed_account = require('./util/decode_encode_muxed_account.js'); var manage_sell_offer = require('./operations/manage_sell_offer.js'); var create_passive_sell_offer = require('./operations/create_passive_sell_offer.js'); var account_merge = require('./operations/account_merge.js'); var allow_trust = require('./operations/allow_trust.js'); var bump_sequence = require('./operations/bump_sequence.js'); var change_trust = require('./operations/change_trust.js'); var create_account = require('./operations/create_account.js'); var create_claimable_balance = require('./operations/create_claimable_balance.js'); var claim_claimable_balance = require('./operations/claim_claimable_balance.js'); var clawback_claimable_balance = require('./operations/clawback_claimable_balance.js'); var inflation = require('./operations/inflation.js'); var manage_data = require('./operations/manage_data.js'); var manage_buy_offer = require('./operations/manage_buy_offer.js'); var path_payment_strict_receive = require('./operations/path_payment_strict_receive.js'); var path_payment_strict_send = require('./operations/path_payment_strict_send.js'); var payment = require('./operations/payment.js'); var set_options = require('./operations/set_options.js'); var begin_sponsoring_future_reserves = require('./operations/begin_sponsoring_future_reserves.js'); var end_sponsoring_future_reserves = require('./operations/end_sponsoring_future_reserves.js'); var revoke_sponsorship = require('./operations/revoke_sponsorship.js'); var clawback = require('./operations/clawback.js'); var set_trustline_flags = require('./operations/set_trustline_flags.js'); var liquidity_pool_deposit = require('./operations/liquidity_pool_deposit.js'); var liquidity_pool_withdraw = require('./operations/liquidity_pool_withdraw.js'); var invoke_host_function = require('./operations/invoke_host_function.js'); var extend_footprint_ttl = require('./operations/extend_footprint_ttl.js'); var restore_footprint = require('./operations/restore_footprint.js'); var operations = require('./util/operations.js'); const AuthRequiredFlag = 1 << 0; const AuthRevocableFlag = 1 << 1; const AuthImmutableFlag = 1 << 2; const AuthClawbackEnabledFlag = 1 << 3; class Operation { /** * Deconstructs the raw XDR operation object into the structured object that * was used to create the operation (i.e. the `opts` parameter to most ops). * * @param operation - An XDR Operation. */ static fromXDRObject(operation) { const result = {}; const sourceAccount = operation.sourceAccount(); if (sourceAccount) { result.source = decode_encode_muxed_account.encodeMuxedAccountToAddress(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 = operations.fromXDRAmount(attrs.startingBalance()); break; } case "payment": { result.type = "payment"; result.destination = decode_encode_muxed_account.encodeMuxedAccountToAddress(attrs.destination()); result.asset = asset.Asset.fromOperation(attrs.asset()); result.amount = operations.fromXDRAmount(attrs.amount()); break; } case "pathPaymentStrictReceive": { result.type = "pathPaymentStrictReceive"; result.sendAsset = asset.Asset.fromOperation(attrs.sendAsset()); result.sendMax = operations.fromXDRAmount(attrs.sendMax()); result.destination = decode_encode_muxed_account.encodeMuxedAccountToAddress(attrs.destination()); result.destAsset = asset.Asset.fromOperation(attrs.destAsset()); result.destAmount = operations.fromXDRAmount(attrs.destAmount()); result.path = []; const path = attrs.path(); Object.keys(path).forEach((pathKey) => { result.path.push(asset.Asset.fromOperation(path[pathKey])); }); break; } case "pathPaymentStrictSend": { result.type = "pathPaymentStrictSend"; result.sendAsset = asset.Asset.fromOperation(attrs.sendAsset()); result.sendAmount = operations.fromXDRAmount(attrs.sendAmount()); result.destination = decode_encode_muxed_account.encodeMuxedAccountToAddress(attrs.destination()); result.destAsset = asset.Asset.fromOperation(attrs.destAsset()); result.destMin = operations.fromXDRAmount(attrs.destMin()); result.path = []; const path = attrs.path(); Object.keys(path).forEach((pathKey) => { result.path.push(asset.Asset.fromOperation(path[pathKey])); }); break; } case "changeTrust": { result.type = "changeTrust"; switch (attrs.line().switch()) { case curr_generated.default.AssetType.assetTypePoolShare(): result.line = liquidity_pool_asset.LiquidityPoolAsset.fromOperation(attrs.line()); break; default: result.line = asset.Asset.fromOperation(attrs.line()); break; } result.limit = operations.fromXDRAmount(attrs.limit()); break; } case "allowTrust": { result.type = "allowTrust"; result.trustor = accountIdtoAddress(attrs.trustor()); result.assetCode = attrs.asset().value().toString(); result.assetCode = util.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() !== void 0 ? attrs.homeDomain().toString("ascii") : void 0; 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.StrKey.encodeSignedPayload( signedPayload.toXDR() ); } signer.weight = attrs.signer().weight(); result.signer = signer; } break; } // the next case intentionally falls through! case "manageOffer": case "manageSellOffer": { result.type = "manageSellOffer"; result.selling = asset.Asset.fromOperation(attrs.selling()); result.buying = asset.Asset.fromOperation(attrs.buying()); result.amount = operations.fromXDRAmount(attrs.amount()); result.price = operations.fromXDRPrice(attrs.price()); result.offerId = attrs.offerId().toString(); break; } case "manageBuyOffer": { result.type = "manageBuyOffer"; result.selling = asset.Asset.fromOperation(attrs.selling()); result.buying = asset.Asset.fromOperation(attrs.buying()); result.buyAmount = operations.fromXDRAmount(attrs.buyAmount()); result.price = operations.fromXDRPrice(attrs.price()); result.offerId = attrs.offerId().toString(); break; } // the next case intentionally falls through! case "createPassiveOffer": case "createPassiveSellOffer": { result.type = "createPassiveSellOffer"; result.selling = asset.Asset.fromOperation(attrs.selling()); result.buying = asset.Asset.fromOperation(attrs.buying()); result.amount = operations.fromXDRAmount(attrs.amount()); result.price = operations.fromXDRPrice(attrs.price()); break; } case "accountMerge": { result.type = "accountMerge"; result.destination = decode_encode_muxed_account.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.Asset.fromOperation(attrs.asset()); result.amount = operations.fromXDRAmount(attrs.amount()); result.claimants = []; attrs.claimants().forEach((claimant$1) => { result.claimants.push(claimant.Claimant.fromXDR(claimant$1)); }); 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 = operations.fromXDRAmount(attrs.amount()); result.from = decode_encode_muxed_account.encodeMuxedAccountToAddress(attrs.from()); result.asset = asset.Asset.fromOperation(attrs.asset()); break; } case "clawbackClaimableBalance": { result.type = "clawbackClaimableBalance"; result.balanceId = attrs.toXDR("hex"); break; } case "setTrustLineFlags": { result.type = "setTrustLineFlags"; result.asset = asset.Asset.fromOperation(attrs.asset()); result.trustor = accountIdtoAddress(attrs.trustor()); const clears = attrs.clearFlags(); const sets = attrs.setFlags(); const mapping = { authorized: curr_generated.default.TrustLineFlags.authorizedFlag(), authorizedToMaintainLiabilities: curr_generated.default.TrustLineFlags.authorizedToMaintainLiabilitiesFlag(), clawbackEnabled: curr_generated.default.TrustLineFlags.trustlineClawbackEnabledFlag() }; const getFlagValue = (key) => { const bit = mapping[key]?.value ?? 0; if (sets & bit) { return true; } if (clears & bit) { return false; } return void 0; }; const flags = {}; Object.keys(mapping).forEach((flagName) => { flags[flagName] = getFlagValue(flagName); }); result.flags = flags; break; } case "liquidityPoolDeposit": { result.type = "liquidityPoolDeposit"; result.liquidityPoolId = attrs.liquidityPoolId().toString("hex"); result.maxAmountA = operations.fromXDRAmount(attrs.maxAmountA()); result.maxAmountB = operations.fromXDRAmount(attrs.maxAmountB()); result.minPrice = operations.fromXDRPrice(attrs.minPrice()); result.maxPrice = operations.fromXDRPrice(attrs.maxPrice()); break; } case "liquidityPoolWithdraw": { result.type = "liquidityPoolWithdraw"; result.liquidityPoolId = attrs.liquidityPoolId().toString("hex"); result.amount = operations.fromXDRAmount(attrs.amount()); result.minAmountA = operations.fromXDRAmount(attrs.minAmountA()); result.minAmountB = operations.fromXDRAmount(attrs.minAmountB()); break; } case "invokeHostFunction": { result.type = "invokeHostFunction"; result.func = attrs.hostFunction(); result.auth = attrs.auth() ?? []; 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; } // Attach all imported operations as static methods on the Operation class static accountMerge = account_merge.accountMerge; static allowTrust = allow_trust.allowTrust; static bumpSequence = bump_sequence.bumpSequence; static changeTrust = change_trust.changeTrust; static createAccount = create_account.createAccount; static createClaimableBalance = create_claimable_balance.createClaimableBalance; static claimClaimableBalance = claim_claimable_balance.claimClaimableBalance; static clawbackClaimableBalance = clawback_claimable_balance.clawbackClaimableBalance; static createPassiveSellOffer = create_passive_sell_offer.createPassiveSellOffer; static inflation = inflation.inflation; static manageData = manage_data.manageData; static manageSellOffer = manage_sell_offer.manageSellOffer; static manageBuyOffer = manage_buy_offer.manageBuyOffer; static pathPaymentStrictReceive = path_payment_strict_receive.pathPaymentStrictReceive; static pathPaymentStrictSend = path_payment_strict_send.pathPaymentStrictSend; static payment = payment.payment; static setOptions = set_options.setOptions; static beginSponsoringFutureReserves = begin_sponsoring_future_reserves.beginSponsoringFutureReserves; static endSponsoringFutureReserves = end_sponsoring_future_reserves.endSponsoringFutureReserves; static revokeAccountSponsorship = revoke_sponsorship.revokeAccountSponsorship; static revokeTrustlineSponsorship = revoke_sponsorship.revokeTrustlineSponsorship; static revokeOfferSponsorship = revoke_sponsorship.revokeOfferSponsorship; static revokeDataSponsorship = revoke_sponsorship.revokeDataSponsorship; static revokeClaimableBalanceSponsorship = revoke_sponsorship.revokeClaimableBalanceSponsorship; static revokeLiquidityPoolSponsorship = revoke_sponsorship.revokeLiquidityPoolSponsorship; static revokeSignerSponsorship = revoke_sponsorship.revokeSignerSponsorship; static clawback = clawback.clawback; static setTrustLineFlags = set_trustline_flags.setTrustLineFlags; static liquidityPoolDeposit = liquidity_pool_deposit.liquidityPoolDeposit; static liquidityPoolWithdraw = liquidity_pool_withdraw.liquidityPoolWithdraw; static invokeHostFunction = invoke_host_function.invokeHostFunction; static extendFootprintTtl = extend_footprint_ttl.extendFootprintTtl; static restoreFootprint = restore_footprint.restoreFootprint; // These are not `xdr.Operation`s directly, but proxies for common // versions of `Operation.invokeHostFunction` static createStellarAssetContract = invoke_host_function.createStellarAssetContract; static invokeContractFunction = invoke_host_function.invokeContractFunction; static createCustomContract = invoke_host_function.createCustomContract; static uploadContractWasm = invoke_host_function.uploadContractWasm; } function extractRevokeSponshipDetails(attrs, result) { switch (attrs.switch().name) { case "revokeSponsorshipLedgerEntry": { const ledgerKey = attrs.ledgerKey(); switch (ledgerKey.switch().name) { case curr_generated.default.LedgerEntryType.account().name: { result.type = "revokeAccountSponsorship"; result.account = accountIdtoAddress(ledgerKey.account().accountId()); break; } case curr_generated.default.LedgerEntryType.trustline().name: { result.type = "revokeTrustlineSponsorship"; result.account = accountIdtoAddress( ledgerKey.trustLine().accountId() ); const xdrAsset = ledgerKey.trustLine().asset(); switch (xdrAsset.switch()) { case curr_generated.default.AssetType.assetTypePoolShare(): result.asset = liquidity_pool_id.LiquidityPoolId.fromOperation(xdrAsset); break; default: result.asset = asset.Asset.fromOperation(xdrAsset); break; } break; } case curr_generated.default.LedgerEntryType.offer().name: { result.type = "revokeOfferSponsorship"; result.seller = accountIdtoAddress(ledgerKey.offer().sellerId()); result.offerId = ledgerKey.offer().offerId().toString(); break; } case curr_generated.default.LedgerEntryType.data().name: { result.type = "revokeDataSponsorship"; result.account = accountIdtoAddress(ledgerKey.data().accountId()); result.name = ledgerKey.data().dataName().toString("ascii"); break; } case curr_generated.default.LedgerEntryType.claimableBalance().name: { result.type = "revokeClaimableBalanceSponsorship"; result.balanceId = ledgerKey.claimableBalance().balanceId().toXDR("hex"); break; } case curr_generated.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 curr_generated.default.SignerKeyType.signerKeyTypeEd25519().name: { attrs.ed25519PublicKey = strkey.StrKey.encodeEd25519PublicKey( signerKey.ed25519() ); break; } case curr_generated.default.SignerKeyType.signerKeyTypePreAuthTx().name: { attrs.preAuthTx = signerKey.preAuthTx().toString("hex"); break; } case curr_generated.default.SignerKeyType.signerKeyTypeHashX().name: { attrs.sha256Hash = signerKey.hashX().toString("hex"); break; } case curr_generated.default.SignerKeyType.signerKeyTypeEd25519SignedPayload().name: { const signedPayload = signerKey.ed25519SignedPayload(); attrs.ed25519SignedPayload = strkey.StrKey.encodeSignedPayload( signedPayload.toXDR() ); break; } default: { throw new Error(`Unknown signerKey: ${signerKey.switch().name}`); } } return attrs; } function accountIdtoAddress(accountId) { return strkey.StrKey.encodeEd25519PublicKey(accountId.ed25519()); } exports.AuthClawbackEnabledFlag = AuthClawbackEnabledFlag; exports.AuthImmutableFlag = AuthImmutableFlag; exports.AuthRequiredFlag = AuthRequiredFlag; exports.AuthRevocableFlag = AuthRevocableFlag; exports.Operation = Operation; //# sourceMappingURL=operation.js.map