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

525 lines 23.9 kB
"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