@msafe/sui-app-store 0.0.227 → 0.0.231
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/apps/alphafi/helper.ts","../src/apps/alphafi/decoder.ts","../src/apps/alphafi/intentions/claim-reward.ts","../src/apps/interface/sui.ts","../src/apps/alphafi/intentions/deposit-double-asset.ts","../src/apps/alphafi/intentions/deposit-single-asset.ts","../src/apps/alphafi/intentions/withdraw.ts","../src/apps/alphafi/intentions/withdraw-alpha.ts","../src/apps/bucket/helper.ts","../src/apps/bucket/decoder.ts","../src/apps/bucket/intentions/psm.ts","../src/apps/bucket/api/psm.ts","../src/apps/bucket/api/config.ts","../src/apps/bucket/intentions/borrow.ts","../src/apps/bucket/api/lending.ts","../src/apps/bucket/intentions/repay.ts","../src/apps/bucket/intentions/withdraw.ts","../src/apps/bucket/intentions/close.ts","../src/apps/bucket/intentions/sbuck.ts","../src/apps/bucket/api/sbuck.ts","../src/apps/bucket/intentions/tank.ts","../src/apps/bucket/api/tank.ts","../src/apps/bucket/api/lock.ts","../src/apps/bucket/intentions/lock.ts","../src/apps/cetus/helper.ts","../src/apps/cetus/intentions/add-liquidity.ts","../src/apps/cetus/api/config.ts","../src/apps/cetus/api/position.ts","../src/apps/cetus/intentions/claim-fee-and-mining.ts","../src/apps/cetus/intentions/decrease-liquidity.ts","../src/apps/cetus/intentions/farming-add.ts","../src/apps/cetus/api/farming.ts","../src/apps/cetus/intentions/farming-batch-harvest.ts","../src/apps/cetus/intentions/farming-claim-fee-and-rewards.ts","../src/apps/cetus/intentions/farming-decrease.ts","../src/apps/cetus/intentions/farming-harvest.ts","../src/apps/cetus/intentions/farming-increase.ts","../src/apps/cetus/intentions/farming-remove.ts","../src/apps/cetus/intentions/farming-stake.ts","../src/apps/cetus/intentions/farming-unstake.ts","../src/apps/cetus/intentions/increase-liquidity.ts","../src/apps/cetus/intentions/remove-liquidity.ts","../src/apps/cetus/intentions/swap.ts","../src/apps/cetus/api/swap.ts","../src/apps/cetus/intentions/vaults-add.ts","../src/apps/cetus/api/vaults.ts","../src/apps/cetus/intentions/vaults-remove.ts","../src/apps/cetus/intentions/vesting-redeem.ts","../src/apps/cetus/api/vesting.ts","../src/apps/cetus/intentions/xcetus-cancel.ts","../src/apps/cetus/api/xcetus.ts","../src/apps/cetus/intentions/xcetus-claim.ts","../src/apps/cetus/intentions/xcetus-convert.ts","../src/apps/cetus/intentions/xcetus-redeem.ts","../src/apps/cetus/intentions/xcetus-redeem-lock.ts","../src/apps/mpay/cancel-stream.ts","../src/apps/interface/sui-js.ts","../src/apps/mpay/common/env.ts","../src/apps/mpay/config/dev.json","../src/apps/mpay/config/prod.json","../src/apps/mpay/common/globals.ts","../src/apps/mpay/error/base.ts","../src/apps/mpay/error/NoBackendError.ts","../src/apps/mpay/error/WalletNotConnectedError.ts","../src/apps/mpay/stream/backend.ts","../src/apps/mpay/error/BackendError.ts","../src/apps/mpay/stream/client.ts","../src/apps/mpay/builder/MPayBuilder.ts","../src/apps/mpay/builder/CreateStreamHelper.ts","../src/apps/mpay/builder/const.ts","../src/apps/mpay/common/transaction.ts","../src/apps/mpay/contract/InspectViewer.ts","../src/apps/mpay/error/InvalidRpcResultError.ts","../src/apps/mpay/stream/metadata.ts","../src/apps/mpay/error/InvalidInputError.ts","../src/apps/mpay/sui/utils.ts","../src/apps/mpay/types/wallet.ts","../src/apps/mpay/utils/random.ts","../src/apps/mpay/contract/BaseContract.ts","../src/apps/mpay/const.ts","../src/apps/mpay/contract/FeeContract.ts","../src/apps/mpay/contract/StreamContract.ts","../src/apps/mpay/stream/helper.ts","../src/apps/mpay/error/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/stream/Stream.ts","../src/apps/mpay/error/NotCreatorError.ts","../src/apps/mpay/error/NotRecipientError.ts","../src/apps/mpay/error/RpcError.ts","../src/apps/mpay/error/SanityError.ts","../src/apps/mpay/error/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.ts","../src/apps/mpay/intention.ts","../src/apps/mpay/claim-by-proxy-stream.ts","../src/apps/mpay/claim-stream.ts","../src/apps/mpay/create-stream.ts","../src/apps/mpay/decoder/moveCall.ts","../src/apps/mpay/decoder/create.ts","../src/apps/mpay/decoder/decoder.ts","../src/apps/mpay/set-auto-claim-stream.ts","../src/apps/mpay/helper.ts","../src/apps/msafe-core/helper.ts","../src/apps/msafe-core/coin-transfer.ts","../src/apps/msafe-core/object-transfer.ts","../src/apps/navi/helper.ts","../src/apps/navi/config.ts","../src/apps/navi/decoder.ts","../src/apps/navi/api/incentiveV2.ts","../src/apps/navi/intentions/claim-reward.ts","../src/apps/navi/intentions/claim-supply.ts","../src/apps/navi/intentions/entry-borrow.ts","../src/apps/navi/utils/tools.ts","../src/apps/navi/intentions/entry-deposit.ts","../src/apps/navi/utils/token.ts","../src/apps/navi/intentions/entry-repay.ts","../src/apps/navi/intentions/entry-withdraw.ts","../src/apps/navi/intentions/multi-deposit.ts","../src/apps/plain-transaction/helper.ts","../src/apps/registry.ts","../src/lib/MSafeHTTPTransport/index.ts","../src/lib/MSafeHTTPTransport/errors.ts","../src/lib/MSafeHTTPTransport/rpc-websocket-client.ts","../src/apps/scallop/helper.ts","../src/apps/scallop/decoders/decoderLending.ts","../src/apps/scallop/decoders/decoder.ts","../src/apps/scallop/utils/moveCallHelper.ts","../src/apps/scallop/utils/splitCoinHelper.ts","../src/apps/scallop/utils/obligation.ts","../src/apps/scallop/decoders/decoderReferral.ts","../src/apps/scallop/decoders/decoderVesca.ts","../src/apps/scallop/intentions/scallopCoreBaseIntention.ts","../src/apps/scallop/intentions/lending/borrow.ts","../src/apps/scallop/intentions/lending/borrow-with-boost.ts","../src/apps/scallop/intentions/lending/borrow-with-referral.ts","../src/apps/scallop/intentions/lending/claim-incentive-reward.ts","../src/apps/scallop/intentions/lending/deposit-collateral.ts","../src/apps/scallop/intentions/lending/migrate-and-claim.ts","../src/apps/scallop/intentions/lending/migrate-scoin.ts","../src/apps/scallop/intentions/lending/open-obligation.ts","../src/apps/scallop/intentions/lending/repay.ts","../src/apps/scallop/intentions/lending/repay-with-boost.ts","../src/apps/scallop/intentions/lending/supply-lending.ts","../src/apps/scallop/intentions/lending/unstake-spool.ts","../src/apps/scallop/intentions/lending/withdraw-and-unstake-lending.ts","../src/apps/scallop/intentions/lending/withdraw-collateral.ts","../src/apps/scallop/intentions/lending/withdraw-lending.ts","../src/apps/scallop/intentions/referral/bind-referral.ts","../src/apps/scallop/intentions/referral/claim-revenue-referral.ts","../src/apps/scallop/intentions/referral/create-referral-link.ts","../src/apps/scallop/intentions/staking/extend-period-and-stake-more.ts","../src/apps/scallop/intentions/staking/extend-stake-period.ts","../src/apps/scallop/intentions/staking/redeem-sca.ts","../src/apps/scallop/intentions/staking/renew-exp-stake-period.ts","../src/apps/scallop/intentions/staking/stake-sca.ts","../src/apps/scallop/intentions/staking/supply-and-stake-lending.ts","../src/apps/scallop/intentions/staking/withdraw-staked-sca.ts","../src/apps/springSui/helper.ts","../src/apps/springSui/decoder.ts","../src/apps/springSui/constants.ts","../src/apps/suilend/helper.ts","../src/apps/suilend/decoder.ts","../src/apps/suilend/intentions/borrow.ts","../src/apps/suilend/intentions/suilendBaseIntention.ts","../src/apps/suilend/intentions/claim.ts","../src/apps/suilend/utils/getRewards.ts","../src/apps/suilend/intentions/claimAndDeposit.ts","../src/apps/suilend/intentions/deposit.ts","../src/apps/suilend/intentions/repay.ts","../src/apps/suilend/intentions/withdraw.ts","../src/apps/springSui/types/helper.ts","../src/apps/springSui/intentions/convert.ts","../src/apps/springSui/intentions/springSuiBaseIntention.ts","../src/apps/springSui/intentions/convertAndDeposit.ts","../src/apps/springSui/intentions/stake.ts","../src/apps/springSui/intentions/stakeAndDeposit.ts","../src/apps/springSui/intentions/unstake.ts","../src/apps/stsui/helper.ts","../src/apps/stsui/decoder.ts","../src/apps/stsui/intentions/mint.ts","../src/apps/stsui/intentions/redeem.ts","../src/apps/turbos/helper.ts","../src/apps/turbos/decoder.ts","../src/apps/turbos/config.ts","../src/apps/turbos/intentions/add-liquidity.ts","../src/apps/turbos/intentions/burn.ts","../src/apps/turbos/intentions/collect-fee.ts","../src/apps/turbos/intentions/collect-reward.ts","../src/apps/turbos/intentions/create-pool.ts","../src/apps/turbos/intentions/decrease-liquidity.ts","../src/apps/turbos/intentions/increase-liquidity.ts","../src/apps/turbos/intentions/prix-claim.ts","../src/apps/turbos/intentions/prix-join.ts","../src/apps/turbos/intentions/remove-liquidity.ts","../src/apps/turbos/intentions/swap.ts","../src/apps/turbos/intentions/swap-exact-base-for-quote.ts","../src/apps/turbos/api/deepbook.ts","../src/apps/turbos/utils/sui-kit.ts","../src/apps/turbos/intentions/swap-exact-quote-for-base.ts","../src/apps/volo/helper.ts","../src/apps/volo/decoder.ts","../src/apps/volo/config.ts","../src/apps/volo/intentions/claimTicket.ts","../src/apps/volo/intentions/stake.ts","../src/apps/volo/intentions/unStake.ts","../src/apps/bluefin/helper.ts","../src/apps/bluefin/decoder.ts","../src/apps/bluefin/intentions/close-position.ts","../src/apps/bluefin/tx-builder.ts","../src/apps/bluefin/config.ts","../src/apps/bluefin/intentions/collect-fee.ts","../src/apps/bluefin/intentions/collect-rewards.ts","../src/apps/bluefin/intentions/collect-rewards-and-fee.ts","../src/apps/bluefin/intentions/open-position-with-liquidity.ts","../src/apps/bluefin/intentions/provide-liquidity.ts","../src/apps/bluefin/intentions/remove-liquidity.ts","../src/apps/kriya/helper.ts","../src/apps/kriya/intentions/v2/add-liquidity.ts","../src/apps/kriya/intentions/v2/add-liquidity-single-side.ts","../src/apps/kriya/intentions/v2/claim-rewards.ts","../src/apps/kriya/intentions/v2/remove-liquidity.ts","../src/apps/kriya/intentions/v3/add-liquidity-single-side-v3.ts","../src/apps/kriya/intentions/v3/add-liquidity-v3.ts","../src/apps/kriya/intentions/v3/claim-maya-rewards.ts","../src/apps/kriya/intentions/v3/claim-rewards.ts","../src/apps/kriya/intentions/v3/remove-liquidity.ts"],"sourcesContent":["import { AlphaFiHelper } from '@/apps/alphafi/helper';\nimport { BucketHelper } from '@/apps/bucket/helper';\nimport { CetusHelper } from '@/apps/cetus/helper';\nimport { MPayAppHelper } from '@/apps/mpay/helper';\nimport { CoreHelper } from '@/apps/msafe-core/helper';\nimport { NAVIAppHelper } from '@/apps/navi/helper';\nimport { PlainTransactionHelper } from '@/apps/plain-transaction/helper';\nimport { MSafeApps } from '@/apps/registry';\nimport { ScallopAppHelper } from '@/apps/scallop/helper';\nimport { SpringSuiAppHelper } from '@/apps/springSui/helper';\nimport { StSuiHelper } from '@/apps/stsui/helper';\nimport { SuilendAppHelper } from '@/apps/suilend/helper';\nimport { TURBOSAppHelper } from '@/apps/turbos/helper';\nimport { VoloAppHelper } from '@/apps/volo/helper';\n\nimport { BluefinHelper } from './apps/bluefin/helper';\nimport { KRIYAAppHelper } from './apps/kriya/helper';\n\nexport const appHelpers = MSafeApps.fromHelpers([\n new CoreHelper(),\n new NAVIAppHelper(),\n new MPayAppHelper(),\n new PlainTransactionHelper(),\n new CetusHelper(),\n new TURBOSAppHelper(),\n new KRIYAAppHelper(),\n new ScallopAppHelper(),\n new VoloAppHelper(),\n new BucketHelper(),\n new SuilendAppHelper(),\n new SpringSuiAppHelper(),\n new AlphaFiHelper(),\n new BluefinHelper(),\n new StSuiHelper(),\n]);\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention } from './intentions/claim-reward';\nimport { DepositDoubleAssetIntention } from './intentions/deposit-double-asset';\nimport { DepositSingleAssetIntention } from './intentions/deposit-single-asset';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { WithdrawAlphaIntention } from './intentions/withdraw-alpha';\nimport {\n AlphaFiIntentionData,\n DepositDoubleAssetIntentionData,\n DepositSingleAssetIntentionData,\n EmptyIntentionData,\n TransactionSubType,\n WithdrawAlphaIntentionData,\n WithdrawIntentionData,\n} from './types';\n\nexport type AlphaFiIntention =\n | DepositDoubleAssetIntention\n | DepositSingleAssetIntention\n | WithdrawAlphaIntention\n | WithdrawIntention\n | ClaimRewardIntention;\n\nexport class AlphaFiHelper implements IAppHelperInternal<AlphaFiIntentionData> {\n application = 'alphafi';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: AlphaFiIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: transaction.getData().sender,\n transactionBlock: transaction,\n });\n console.log('AlphaFiHelper Sim result - ', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: AlphaFiIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { account } = input;\n console.log('AlphaFi build transaction type', input.txSubType);\n\n let intention: AlphaFiIntention;\n switch (input.txSubType) {\n case TransactionSubType.DEPOSIT_SINGLE_ASSET:\n intention = DepositSingleAssetIntention.fromData(input.intentionData as DepositSingleAssetIntentionData);\n break;\n case TransactionSubType.DEPOSIT_DOUBLE_ASSET:\n intention = DepositDoubleAssetIntention.fromData(input.intentionData as DepositDoubleAssetIntentionData);\n break;\n case TransactionSubType.WITHDRAW:\n intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.WITHDRAW_ALPHA:\n intention = WithdrawAlphaIntention.fromData(input.intentionData as WithdrawAlphaIntentionData);\n break;\n case TransactionSubType.CLAIM_REWARD:\n intention = ClaimRewardIntention.fromData(input.intentionData as EmptyIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ account });\n }\n}\n","import { coinsList, poolIdPoolNameMap, poolInfo, PoolName, singleAssetPoolCoinMap } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { bcs, fromBase64 } from '@mysten/bcs';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport {\n DecodeResult,\n DepositDoubleAssetIntentionData,\n DepositSingleAssetIntentionData,\n EmptyIntentionData,\n EventType,\n TransactionSubType,\n WithdrawAlphaIntentionData,\n WithdrawIntentionData,\n} from './types';\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n /**\n * Entry point for decoding the transaction. Determines the type of transaction\n * and calls the appropriate decode method.\n */\n decode(): DecodeResult {\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n\n const liquidityChangeEvent = this.getLiquidityChangeEvent();\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as EventType;\n const poolId = eventData.pool_id;\n const poolName = poolIdPoolNameMap[poolId];\n\n console.log('Decoder event data - ', eventData);\n console.log('Decoder poolName - ', poolName);\n\n if (this.isWithdrawAlphaEvent(liquidityChangeEvent)) {\n return this.decodeWithdrawAlpha(eventData);\n }\n\n if (this.isWithdrawEvent(eventData)) {\n return this.decodeWithdraw(poolName);\n }\n\n if (this.isDoubleAssetDepositEvent(eventData, poolName)) {\n return this.decodeDoubleAssetDeposit(poolName, eventData);\n }\n\n if (this.isSingleAssetDepositEvent(eventData, poolName)) {\n return this.decodeSingleAssetDeposit(poolName, eventData);\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n // ---- Private Helpers ----\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getLiquidityChangeEvent() {\n return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type));\n }\n\n // is*\n private isClaimRewardTransaction() {\n return !!this.getMoveCallCommand('get_user_rewards_all');\n }\n\n private isLiquidityChangeEventType(type: string) {\n return (\n type.includes('LiquidityChangeEvent') ||\n type.includes('LiquidityChangeNewNewEvent') ||\n type.includes('WithdrawEventV2')\n );\n }\n\n private isWithdrawAlphaEvent(event: { type: string }) {\n return event.type.includes('WithdrawEventV2');\n }\n\n private isWithdrawEvent(eventData: EventType) {\n return eventData.event_type === 1;\n }\n\n private isDoubleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 2;\n }\n\n private isSingleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 1;\n }\n\n /**\n * Extracts the xTokensAmount from transaction inputs.\n */\n private extractXTokensAmount(): string {\n const inputWithPure = this.inputs.find((input) => input.Pure !== undefined);\n if (!inputWithPure || !inputWithPure.Pure?.bytes) {\n throw new Error('Unable to extract xTokensAmount from inputs');\n }\n const { bytes } = inputWithPure.Pure;\n\n let res;\n if (bytes.length === 12) {\n res = bcs.u64().parse(fromBase64(bytes));\n } else if (bytes.length === 24) {\n res = bcs.u128().parse(fromBase64(bytes));\n } else if (bytes.length === 44) {\n res = bcs.u256().parse(fromBase64(bytes));\n } else {\n res = bcs.u64().parse(fromBase64(bytes));\n }\n\n return res;\n }\n\n // ---- Decode Methods ----\n\n private decodeDoubleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n const { amount_a, amount_b } = eventData;\n const isAmountA = Number(amount_a) > 0;\n console.log('Decoder.decodeDoubleAssetDeposit', amount_a, amount_b, isAmountA);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT_DOUBLE_ASSET,\n intentionData: {\n poolName,\n amount: isAmountA ? amount_a : amount_b,\n isAmountA,\n } as DepositDoubleAssetIntentionData,\n };\n }\n\n private decodeSingleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n let { amount } = eventData;\n console.log('Decoder.decodeSingleAssetDeposit', amount);\n const liquidityChangeEvent = this.getLiquidityChangeEvent();\n if (liquidityChangeEvent.type.includes(':alphafi_navi_pool:')) {\n const { coin } = singleAssetPoolCoinMap[poolName];\n const { expo } = coinsList[coin];\n amount = Math.floor(Number(amount) / 10 ** (9 - expo)).toString();\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT_SINGLE_ASSET,\n intentionData: {\n poolName,\n amount,\n } as DepositSingleAssetIntentionData,\n };\n }\n\n private decodeWithdraw(poolName: PoolName): DecodeResult {\n const xTokensAmount = this.extractXTokensAmount();\n console.log('Decoder.decodeWithdraw', xTokensAmount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW,\n intentionData: {\n poolName,\n xTokensAmount,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeWithdrawAlpha(eventData: EventType): DecodeResult {\n const xTokensAmount = this.extractXTokensAmount();\n const { amount_withdrawn_from_locked } = eventData;\n console.log('Decoder.decodeWithdrawAlpha', xTokensAmount, amount_withdrawn_from_locked);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW_ALPHA,\n intentionData: {\n withdrawFromLocked: Number(amount_withdrawn_from_locked) > 0,\n xTokensAmount,\n } as WithdrawAlphaIntentionData,\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM_REWARD,\n intentionData: {} as EmptyIntentionData,\n };\n }\n}\n","import { claimRewardTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { EmptyIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimRewardIntention extends BaseIntention<EmptyIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM_REWARD;\n\n constructor(public readonly data: EmptyIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const txb = await claimRewardTxb(account.address);\n return txb;\n }\n\n static fromData(data: EmptyIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","// interface for @mysten/sui package\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternal<T> {\n application: string;\n supportSDK: '@mysten/sui';\n\n deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n }>;\n\n build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction>;\n}\n\nexport interface TransactionIntention<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n\n serialize(): string;\n\n build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction>;\n}\n\nexport abstract class BaseIntention<D> implements TransactionIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { depositDoubleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositDoubleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositDoubleAssetIntention extends BaseIntention<DepositDoubleAssetIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT_DOUBLE_ASSET;\n\n constructor(public readonly data: DepositDoubleAssetIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, amount, isAmountA } = this.data;\n const txb = await depositDoubleAssetTxb(poolName, account.address, amount, isAmountA);\n return txb;\n }\n\n static fromData(data: DepositDoubleAssetIntentionData) {\n console.log('DepositDoubleAssetIntention.fromData', data);\n return new DepositDoubleAssetIntention(data);\n }\n}\n","import { depositSingleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositSingleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositSingleAssetIntention extends BaseIntention<DepositSingleAssetIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT_SINGLE_ASSET;\n\n constructor(public readonly data: DepositSingleAssetIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, amount } = this.data;\n const txb = await depositSingleAssetTxb(poolName, account.address, amount);\n return txb;\n }\n\n static fromData(data: DepositSingleAssetIntentionData) {\n console.log('DepositSingleAssetIntention.fromData', data);\n return new DepositSingleAssetIntention(data);\n }\n}\n","import { withdrawTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawIntentionData } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, xTokensAmount } = this.data;\n const txb = await withdrawTxb(xTokensAmount, poolName, account.address);\n return txb;\n }\n\n static fromData(data: WithdrawIntentionData) {\n console.log('WithdrawIntention.fromData', data);\n return new WithdrawIntention(data);\n }\n}\n","import { withdrawAlphaTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawAlphaIntentionData } from '../types';\n\nexport class WithdrawAlphaIntention extends BaseIntention<WithdrawAlphaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW_ALPHA;\n\n constructor(public readonly data: WithdrawAlphaIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { withdrawFromLocked, xTokensAmount } = this.data;\n const txb = await withdrawAlphaTxb(xTokensAmount, withdrawFromLocked, account.address);\n return txb;\n }\n\n static fromData(data: WithdrawAlphaIntentionData) {\n console.log('WithdrawAlphaIntention.fromData', data);\n return new WithdrawAlphaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { BucketIntentionData } from '@/apps/bucket/types/helper';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n LockClaimIntentionData,\n PsmIntentionData,\n RepayIntentionData,\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n WithdrawIntentionData,\n} from './api';\nimport { Decoder } from './decoder';\nimport {\n BorrowIntention,\n CloseIntention,\n LockClaimIntention,\n PsmIntention,\n RepayIntention,\n SBUCKClaimIntention,\n SBUCKDepositIntention,\n SBUCKUnstakeIntention,\n SBUCKWithdrawIntention,\n TankClaimIntention,\n TankDepositIntention,\n TankWithdrawIntention,\n WithdrawIntention,\n} from './intentions';\nimport { TransactionSubType } from './types';\n\nexport type BucketIntention =\n | PsmIntention\n | BorrowIntention\n | WithdrawIntention\n | RepayIntention\n | CloseIntention\n | TankDepositIntention\n | TankWithdrawIntention\n | TankClaimIntention\n | SBUCKDepositIntention\n | SBUCKWithdrawIntention\n | SBUCKUnstakeIntention\n | SBUCKClaimIntention\n | LockClaimIntention;\n\nexport class BucketHelper implements IAppHelperInternal<BucketIntentionData> {\n application = 'bucket';\n\n supportSDK = '@mysten/sui' as const;\n\n // TODO: Please refer to the documentation and move the `action` and `txbParams` params into the `appContext` structure.\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: BucketIntentionData }> {\n console.log('Bucket helper deserialize input: ', input);\n const { transaction } = input;\n const decoder = new Decoder(transaction);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: BucketIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n let intention: BucketIntention;\n switch (input.txSubType) {\n case TransactionSubType.Psm:\n intention = PsmIntention.fromData(input.intentionData as PsmIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(input.intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Withdraw:\n intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(input.intentionData as RepayIntentionData);\n break;\n case TransactionSubType.Close:\n intention = CloseIntention.fromData(input.intentionData as CloseIntentionData);\n break;\n case TransactionSubType.TankDeposit:\n intention = TankDepositIntention.fromData(input.intentionData as TankDepositIntentionData);\n break;\n case TransactionSubType.TankWithdraw:\n intention = TankWithdrawIntention.fromData(input.intentionData as TankWithdrawIntentionData);\n break;\n case TransactionSubType.TankClaim:\n intention = TankClaimIntention.fromData(input.intentionData as TankClaimIntentionData);\n break;\n case TransactionSubType.SBUCKDeposit:\n intention = SBUCKDepositIntention.fromData(input.intentionData as SBUCKDepositIntentionData);\n break;\n case TransactionSubType.SBUCKUnstake:\n intention = SBUCKUnstakeIntention.fromData(input.intentionData as SBUCKUnstakeIntentionData);\n break;\n case TransactionSubType.SBUCKWithdraw:\n intention = SBUCKWithdrawIntention.fromData(input.intentionData as SBUCKWithdrawIntentionData);\n break;\n case TransactionSubType.SBUCKClaim:\n intention = SBUCKClaimIntention.fromData(input.intentionData as SBUCKClaimIntentionData);\n break;\n case TransactionSubType.LockClaim:\n intention = LockClaimIntention.fromData(input.intentionData as LockClaimIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SBUCK_FOUNTAIN_PACKAGE_ID } from 'bucket-protocol-sdk';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n LockClaimIntentionData,\n PsmIntentionData,\n RepayIntentionData,\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n WithdrawIntentionData,\n} from './api';\nimport { DecodeResult, TransactionSubType } from './types';\n\nexport class Decoder {\n constructor(public readonly transaction: Transaction) {}\n\n decode() {\n // this.commands.map((command) => {\n // if (command.$kind === 'MoveCall') {\n // console.log(command);\n // }\n // });\n\n // Check sBUCK commands\n if (this.isSBUCKDepositTransaction()) {\n return this.decodeSBUCKDeposit();\n }\n if (this.isSBUCKUnstakeTransaction()) {\n return this.decodeSBUCKUnstake();\n }\n if (this.isSBUCKWithdrawTransaction()) {\n return this.decodeSBUCKWithdraw();\n }\n if (this.isSBUCKClaimTransaction()) {\n return this.decodeSBUCKClaim();\n }\n\n // Check lock commands\n if (this.isLockedClaimTransaction()) {\n return this.decodeLockedClaim();\n }\n\n // Check borrow commands\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isWithdrawTransaction()) {\n return this.decodeWithdraw();\n }\n if (this.isCloseTransaction()) {\n return this.decodeClose();\n }\n\n // Get tank commands\n if (this.isTankDepositTransaction()) {\n return this.decodeTankDeposit();\n }\n if (this.isTankWithdrawTransaction()) {\n return this.decodeTankWithdraw();\n }\n if (this.isTankClaimTransaction()) {\n return this.decodeTankClaim();\n }\n\n // Check PSM commands\n if (this.isPsmTransaction()) {\n return this.decodePsm();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getMoveCallModuleCommand(module: string, fn: string) {\n return this.commands.find(\n (command) =>\n command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n );\n }\n\n private getMoveCallPackageModuleCommand(package_: string, module: string, fn: string) {\n return this.commands.find(\n (command) =>\n command.$kind === 'MoveCall' &&\n command.MoveCall.package === package_ &&\n command.MoveCall.module === module &&\n command.MoveCall.function === fn,\n );\n }\n\n private getMoveCallModuleCommands(module: string, fn: string) {\n return this.commands.filter(\n (command) =>\n command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n );\n }\n\n private getSplitCoinsCommands() {\n return this.commands.filter((command) => command.$kind === 'SplitCoins');\n }\n\n private getTransferCommands() {\n return this.commands.filter((command) => command.$kind === 'TransferObjects');\n }\n\n private isPsmTransaction() {\n return !!this.getMoveCallCommand('charge_reservoir') || !!this.getMoveCallCommand('discharge_reservoir');\n }\n\n private isStrapNewTransaction() {\n return !!this.getMoveCallModuleCommand('strap', 'new');\n }\n\n private isBorrowTransaction() {\n return (\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_top_up') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow_with_strap')\n );\n }\n\n private isRepayTransaction() {\n return (\n !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay_with_strap') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw_with_strap')\n );\n }\n\n private isWithdrawTransaction() {\n return (\n !!this.getMoveCallModuleCommand('buck', 'withdraw') ||\n !!this.getMoveCallModuleCommand('buck', 'withdraw_with_strap')\n );\n }\n\n private isCloseTransaction() {\n return !!this.getMoveCallModuleCommand('bucket_operations', 'destroy_empty_strap');\n }\n\n private isTankDepositTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'deposit');\n }\n\n private isTankWithdrawTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'withdraw');\n }\n\n private isTankClaimTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'claim');\n }\n\n private isSBUCKDepositTransaction() {\n return !!this.getMoveCallModuleCommand('buck', 'buck_to_sbuck');\n }\n\n private isSBUCKWithdrawTransaction() {\n return !!this.getMoveCallModuleCommand('buck', 'sbuck_to_buck');\n }\n\n private isSBUCKStakeTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'stake');\n }\n\n private isSBUCKUnstakeTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'force_unstake');\n }\n\n private isSBUCKClaimTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'claim');\n }\n\n private isLockedClaimTransaction() {\n return (\n !!this.getMoveCallModuleCommand('proof_rule', 'claim') ||\n !!this.getMoveCallModuleCommand('lst_proof_rule', 'claim')\n );\n }\n\n private isLstUnlockTransaction() {\n return !!this.getMoveCallModuleCommand('lst_proof_rule', 'unlock');\n }\n\n private decodePsm(): DecodeResult {\n let coinType;\n let buckToCoin;\n\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n amount = this.getPureInputU64(inputCoinObject.Input);\n }\n\n if (this.getMoveCallCommand('charge_reservoir')) {\n const psmCommand = this.getMoveCallCommand('charge_reservoir').MoveCall;\n [coinType] = psmCommand.typeArguments;\n buckToCoin = false;\n } else {\n const psmCommand = this.getMoveCallCommand('discharge_reservoir').MoveCall;\n [coinType] = psmCommand.typeArguments;\n buckToCoin = true;\n }\n\n console.log('Decoder.decodePsm', coinType, amount, buckToCoin);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Psm,\n intentionData: {\n coinType,\n amount,\n buckToCoin,\n } as PsmIntentionData,\n };\n }\n\n private decodeBorrow(): DecodeResult {\n let collateralType = '';\n let borrowAmount = '0';\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n let collateralAmount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n collateralAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n\n if (this.getMoveCallCommand('high_top_up')) {\n const command = this.getMoveCallCommand('high_top_up').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckAmount = command.arguments[1];\n if (buckAmount.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckAmount.Input);\n }\n\n const insertPlaceArg = command.arguments[3];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('high_borrow')) {\n const command = this.getMoveCallCommand('high_borrow').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckAmount = command.arguments[4];\n if (buckAmount.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckAmount.Input);\n }\n\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('high_borrow_with_strap')) {\n const command = this.getMoveCallCommand('high_borrow_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckOutput = command.arguments[5];\n if (buckOutput.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckOutput.Input);\n }\n\n const insertPlaceArg = command.arguments[6];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Borrow,\n intentionData: {\n collateralType,\n collateralAmount,\n borrowAmount,\n insertionPlace,\n strapId,\n } as BorrowIntentionData,\n };\n }\n\n private decodeRepay(): DecodeResult {\n let collateralType = '';\n let repayAmount = '0';\n let withdrawAmount = '0';\n const isSurplus = false;\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('fully_repay')) {\n const repayCommand = this.getMoveCallCommand('fully_repay').MoveCall;\n [collateralType] = repayCommand.typeArguments;\n } else if (this.getMoveCallCommand('fully_repay_with_strap')) {\n const repayCommand = this.getMoveCallCommand('fully_repay_with_strap').MoveCall;\n [collateralType] = repayCommand.typeArguments;\n } else if (this.getMoveCallCommand('repay_and_withdraw')) {\n const command = this.getMoveCallCommand('repay_and_withdraw').MoveCall;\n [collateralType] = command.typeArguments;\n const withdrawArg = command.arguments[4];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n repayAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n } else if (this.getMoveCallCommand('repay_and_withdraw_with_strap')) {\n const command = this.getMoveCallCommand('repay_and_withdraw_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n const withdrawArg = command.arguments[5];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n const insertPlaceArg = command.arguments[6];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n repayAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Repay,\n intentionData: {\n collateralType,\n repayAmount,\n withdrawAmount,\n isSurplus,\n insertionPlace,\n strapId,\n } as RepayIntentionData,\n };\n }\n\n private decodeWithdraw(): DecodeResult {\n let collateralType = '';\n let withdrawAmount = '0';\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('withdraw_with_strap')) {\n const command = this.getMoveCallCommand('withdraw_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n\n const withdrawArg = command.arguments[4];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('withdraw')) {\n const command = this.getMoveCallCommand('withdraw').MoveCall;\n [collateralType] = command.typeArguments;\n\n const withdrawArg = command.arguments[3];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n\n const insertPlaceArg = command.arguments[4];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Withdraw,\n intentionData: {\n collateralType,\n withdrawAmount,\n insertionPlace,\n strapId,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeClose(): DecodeResult {\n let collateralType = '';\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('destroy_empty_strap')) {\n const command = this.getMoveCallCommand('destroy_empty_strap').MoveCall;\n [collateralType] = command.typeArguments;\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Close,\n intentionData: {\n collateralType,\n strapId,\n } as CloseIntentionData,\n };\n }\n\n private decodeSBUCKDeposit(): DecodeResult {\n const balanceObject = this.getMoveCallCommand('into_balance');\n const coinType = balanceObject.MoveCall.typeArguments[0];\n\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n const isStake = this.isSBUCKStakeTransaction();\n console.log('Decoder.decodeSBUCKDeposit', coinType, amount, isStake);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKDeposit,\n intentionData: {\n coinType,\n amount,\n isStake,\n } as SBUCKDepositIntentionData,\n };\n }\n\n private decodeSBUCKUnstake(): DecodeResult {\n let amount = '0';\n\n const isStake = this.isSBUCKStakeTransaction();\n if (isStake) {\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n }\n\n const stakeProofs: string[] = [];\n const unlockCommands = this.getMoveCallModuleCommands('proof_rule', 'unlock');\n if (unlockCommands.length > 0) {\n for (let i = 0; i < unlockCommands.length; i++) {\n const command = unlockCommands[i];\n stakeProofs.push('');\n }\n } else {\n const unstakeCommands = this.getMoveCallModuleCommands('fountain_core', 'force_unstake');\n for (let i = 0; i < unstakeCommands.length; i++) {\n const command = unstakeCommands[i];\n const argument = command.MoveCall.arguments[2];\n if (argument.$kind === 'Input') {\n const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n stakeProofs.push(objectId);\n }\n }\n }\n\n const toBuck = this.isSBUCKWithdrawTransaction();\n\n const intentionData = {\n stakeProofs,\n amount,\n isStake,\n toBuck,\n } as SBUCKUnstakeIntentionData;\n console.log('Decoder.decodeSBUCKUnstake', intentionData);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKUnstake,\n intentionData,\n };\n }\n\n private decodeSBUCKWithdraw(): DecodeResult {\n let amount = '0';\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n console.log('Decoder.SBUCKWithdraw', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKWithdraw,\n intentionData: {\n amount,\n } as SBUCKWithdrawIntentionData,\n };\n }\n\n private decodeSBUCKClaim(): DecodeResult {\n const stakeProofs: string[] = [];\n\n const commands = this.getMoveCallModuleCommands('fountain_core', 'claim');\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i];\n const argument = command.MoveCall.arguments[2];\n if (argument.$kind === 'Input') {\n const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n stakeProofs.push(objectId);\n }\n }\n\n console.log('Decoder.decodeSBUCKClaim', stakeProofs);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKClaim,\n intentionData: {\n stakeProofs,\n } as SBUCKClaimIntentionData,\n };\n }\n\n private decodeTankDeposit(): DecodeResult {\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n const command = this.getMoveCallModuleCommand('tank_operations', 'deposit').MoveCall;\n const coinType = command.typeArguments[0];\n\n console.log('Decoder.decodeTankDeposit', coinType, amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankDeposit,\n intentionData: {\n coinType,\n amount,\n } as TankDepositIntentionData,\n };\n }\n\n private decodeTankWithdraw(): DecodeResult {\n const command = this.getMoveCallModuleCommand('tank_operations', 'withdraw').MoveCall;\n const coinType = command.typeArguments[0];\n\n let amount = '0';\n const amountArg = command.arguments[5];\n if (amountArg.$kind === 'Input') {\n amount = this.getPureInputU64(amountArg.Input);\n }\n\n console.log('Decoder.decodeTankWithdraw', coinType, amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankWithdraw,\n intentionData: {\n coinType,\n amount,\n } as TankWithdrawIntentionData,\n };\n }\n\n private decodeTankClaim(): DecodeResult {\n const command = this.getMoveCallModuleCommand('tank_operations', 'claim').MoveCall;\n const coinType = command.typeArguments[0];\n\n console.log('Decoder.decodeTankClaim', coinType);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankClaim,\n intentionData: {\n coinType,\n } as TankClaimIntentionData,\n };\n }\n\n private decodeLockedClaim(): DecodeResult {\n let coinType = '';\n let proofCount = 0;\n\n const sbuckClaimCommands = this.getMoveCallModuleCommands('proof_rule', 'claim');\n for (let i = 0; i < sbuckClaimCommands.length; i++) {\n const command = sbuckClaimCommands[i];\n [coinType] = command.MoveCall.typeArguments;\n proofCount++;\n }\n\n const lstClaimCommands = this.getMoveCallModuleCommands('lst_proof_rule', 'claim');\n for (let i = 0; i < lstClaimCommands.length; i++) {\n const command = lstClaimCommands[i];\n [coinType] = command.MoveCall.typeArguments;\n proofCount++;\n }\n console.log('Decoder.decodeLockedClaim', coinType, proofCount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.LockClaim,\n intentionData: {\n coinType,\n proofCount,\n } as LockClaimIntentionData,\n };\n }\n\n // Helpers\n private getCoinInput(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Object') {\n throw new Error('not Object argument');\n }\n }\n\n private getStrapId() {\n let strapId: string | undefined;\n\n if (this.isStrapNewTransaction()) {\n strapId = 'new';\n } else if (this.isLstUnlockTransaction()) {\n strapId = 'locked';\n }\n\n if (!strapId) {\n const command = this.getMoveCallModuleCommand('fountain', 'unstake');\n if (command) {\n const strapArg = command.MoveCall.arguments[2];\n if (strapArg.$kind === 'Input') {\n strapId = this.inputs[strapArg.Input].UnresolvedObject.objectId;\n }\n }\n }\n\n return strapId;\n }\n\n private getPureInputU64(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Pure') {\n throw new Error('not pure argument');\n }\n\n return bcs.U64.fromBase64(input.Pure.bytes);\n }\n\n private getPureAddresses(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Pure') {\n throw new Error('not pure argument');\n }\n\n return bcs.vector(bcs.Address).fromBase64(input.Pure.bytes);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getPsmTx } from '../api/psm';\nimport { TransactionSubType } from '../types';\n\nexport class PsmIntention extends BaseIntention<PsmIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Psm;\n\n constructor(public readonly data: PsmIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getPsmTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: PsmIntentionData) {\n return new PsmIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildPsmTx } from 'bucket-protocol-sdk';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getPsmTx = async (\n txbParams: PsmIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount, buckToCoin } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildPsmTx(client, tx, coinType, amount, buckToCoin, account.address);\n\n return tx;\n};\n","import { WalletAccount } from '@mysten/wallet-standard';\nimport { BucketClient } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nexport const getBucketClient = (network: SuiNetworks, account: WalletAccount) => {\n const config = network === 'sui:mainnet' ? 'mainnet' : 'testnet';\n return new BucketClient(config, account.address);\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BorrowIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getBorrowTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class BorrowIntention extends BaseIntention<BorrowIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getBorrowTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: BorrowIntentionData) {\n return new BorrowIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildBorrowTx, buildCloseTx, buildRepayTx, buildWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n RepayIntentionData,\n WithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getBorrowTx = async (\n txbParams: BorrowIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, collateralAmount, borrowAmount, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildBorrowTx(\n client,\n tx,\n collateralType,\n collateralAmount,\n borrowAmount,\n account.address,\n insertionPlace,\n strapId,\n );\n\n return tx;\n};\n\nexport const getWithdrawTx = async (\n txbParams: WithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, withdrawAmount, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildWithdrawTx(client, tx, collateralType, withdrawAmount, account.address, insertionPlace, strapId);\n\n return tx;\n};\n\nexport const getRepayTx = async (\n txbParams: RepayIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, repayAmount, withdrawAmount, isSurplus, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildRepayTx(\n client,\n tx,\n collateralType,\n repayAmount,\n withdrawAmount,\n account.address,\n isSurplus,\n insertionPlace,\n strapId,\n );\n\n return tx;\n};\n\nexport const getCloseTx = async (\n txbParams: CloseIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, recipient, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildCloseTx(client, tx, collateralType, recipient, strapId);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { RepayIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRepayTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class RepayIntention extends BaseIntention<RepayIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Repay;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getRepayTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: RepayIntentionData) {\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { WithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getWithdrawTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Withdraw;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: WithdrawIntentionData) {\n return new WithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CloseIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getCloseTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class CloseIntention extends BaseIntention<CloseIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Close;\n\n constructor(public readonly data: CloseIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getCloseTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: CloseIntentionData) {\n return new CloseIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport {\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getSBUCKClaimTx, getSBUCKDepositTx, getSBUCKUnstakeTx, getSBUCKWithdrawTx } from '../api/sbuck';\nimport { TransactionSubType } from '../types';\n\nexport class SBUCKDepositIntention extends BaseIntention<SBUCKDepositIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKDeposit;\n\n constructor(public readonly data: SBUCKDepositIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKDepositTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKDepositIntentionData) {\n return new SBUCKDepositIntention(data);\n }\n}\n\nexport class SBUCKUnstakeIntention extends BaseIntention<SBUCKUnstakeIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKUnstake;\n\n constructor(public readonly data: SBUCKUnstakeIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKUnstakeTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKUnstakeIntentionData) {\n return new SBUCKUnstakeIntention(data);\n }\n}\n\nexport class SBUCKWithdrawIntention extends BaseIntention<SBUCKWithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKWithdraw;\n\n constructor(public readonly data: SBUCKWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKWithdrawIntentionData) {\n return new SBUCKWithdrawIntention(data);\n }\n}\n\nexport class SBUCKClaimIntention extends BaseIntention<SBUCKClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKClaim;\n\n constructor(public readonly data: SBUCKClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKClaimIntentionData) {\n return new SBUCKClaimIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildSBUCKClaimTx, buildSBUCKDepositTx, buildSBUCKUnstakeTx, buildSBUCKWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getSBUCKDepositTx = async (\n txbParams: SBUCKDepositIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount, isStake } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKDepositTx(client, tx, coinType, amount, account.address, isStake);\n\n return tx;\n};\n\nexport const getSBUCKUnstakeTx = async (\n txbParams: SBUCKUnstakeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { stakeProofs, amount, isStake, toBuck } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKUnstakeTx(client, tx, stakeProofs, amount, account.address, isStake, toBuck);\n\n return tx;\n};\n\nexport const getSBUCKWithdrawTx = async (\n txbParams: SBUCKWithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKWithdrawTx(client, tx, amount, account.address);\n\n return tx;\n};\n\nexport const getSBUCKClaimTx = async (\n txbParams: SBUCKClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { stakeProofs } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKClaimTx(client, tx, stakeProofs, account.address);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport {\n getTankClaimTx,\n getTankDepositTx,\n getTankWithdrawTx,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n} from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class TankDepositIntention extends BaseIntention<TankDepositIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankDeposit;\n\n constructor(public readonly data: TankDepositIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankDepositTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankDepositIntentionData) {\n return new TankDepositIntention(data);\n }\n}\n\nexport class TankWithdrawIntention extends BaseIntention<TankWithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankWithdraw;\n\n constructor(public readonly data: TankWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankWithdrawIntentionData) {\n return new TankWithdrawIntention(data);\n }\n}\n\nexport class TankClaimIntention extends BaseIntention<TankClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankClaim;\n\n constructor(public readonly data: TankClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankClaimIntentionData) {\n return new TankClaimIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildTankClaimTx, buildTankDepositTx, buildTankWithdrawTx } from 'bucket-protocol-sdk';\n\nimport { TankClaimIntentionData, TankDepositIntentionData, TankWithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getTankDepositTx = async (\n txbParams: TankDepositIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankDepositTx(client, tx, coinType, amount, account.address);\n\n return tx;\n};\n\nexport const getTankWithdrawTx = async (\n txbParams: TankWithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankWithdrawTx(client, tx, coinType, amount, account.address);\n\n return tx;\n};\n\nexport const getTankClaimTx = async (\n txbParams: TankClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankClaimTx(client, tx, coinType, account.address);\n\n return tx;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildLockedClaimTx } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport interface LockClaimIntentionData {\n coinType: string;\n proofCount: number;\n}\n\nexport const getLockClaimTx = async (\n txbParams: LockClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, proofCount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildLockedClaimTx(client, tx, coinType, proofCount, account.address);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { LockClaimIntentionData, getLockClaimTx } from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class LockClaimIntention extends BaseIntention<LockClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.LockClaim;\n\n constructor(public readonly data: LockClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getLockClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: LockClaimIntentionData) {\n return new LockClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\n\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { ClaimFeeAndMiningIntention } from './intentions/claim-fee-and-mining';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { FarmingAddLiquidityIntention } from './intentions/farming-add';\nimport { FarmingBatchHarvestIntention } from './intentions/farming-batch-harvest';\nimport { FarmingClaimFeeAndRewardIntention } from './intentions/farming-claim-fee-and-rewards';\nimport { FarmingDecreaseLiquidityIntention } from './intentions/farming-decrease';\nimport { FarmingHarvestIntention } from './intentions/farming-harvest';\nimport { FarmingIncreaseLiquidityIntention } from './intentions/farming-increase';\nimport { FarmingRemoveLiquidityIntention } from './intentions/farming-remove';\nimport { FarmingStakeIntention } from './intentions/farming-stake';\nimport { FarmingUnstakeIntention } from './intentions/farming-unstake';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport { AddVaultsPositionIntention } from './intentions/vaults-add';\nimport { RemoveVaultsPositionIntention } from './intentions/vaults-remove';\nimport { VestingRedeemIntention } from './intentions/vesting-redeem';\nimport { XcetusCancelIntention } from './intentions/xcetus-cancel';\nimport { XcetusClaimingStakeRewardsIntention } from './intentions/xcetus-claim';\nimport { XcetusConvertIntention } from './intentions/xcetus-convert';\nimport { XcetusRedeemIntention } from './intentions/xcetus-redeem';\nimport { XcetusRedeemLockIntention } from './intentions/xcetus-redeem-lock';\nimport { SuiNetworks, CetusIntentionData, TransactionSubType } from './types';\n\nexport type CetusIntention =\n | AddLiquidityIntention\n | IncreaseLiquidityIntention\n | FarmingAddLiquidityIntention\n | FarmingIncreaseLiquidityIntention\n | DecreaseLiquidityIntention\n | RemoveLiquidityIntention\n | ClaimFeeAndMiningIntention\n | FarmingDecreaseLiquidityIntention\n | FarmingRemoveLiquidityIntention\n | FarmingClaimFeeAndRewardIntention\n | FarmingHarvestIntention\n | FarmingBatchHarvestIntention\n | FarmingStakeIntention\n | FarmingUnstakeIntention\n | XcetusConvertIntention\n | XcetusRedeemLockIntention\n | XcetusClaimingStakeRewardsIntention\n | XcetusCancelIntention\n | XcetusRedeemIntention\n | VestingRedeemIntention\n | SwapIntention\n | AddVaultsPositionIntention\n | RemoveVaultsPositionIntention;\n\nexport class CetusHelper implements IAppHelperInternal<CetusIntentionData> {\n application = 'cetus';\n\n supportSDK = '@mysten/sui' as const;\n\n // TODO: Please refer to the documentation and move the `action` and `txbParams` params into the `appContext` structure.\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n action?: string;\n txbParams?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: CetusIntentionData }> {\n console.log('Cetus helper deserialize input: ', input);\n const { txbParams, action } = input;\n\n return {\n txType: TransactionType.Other,\n txSubType: action,\n intentionData: {\n txbParams: { ...txbParams },\n action,\n },\n };\n }\n\n async build(input: {\n intentionData: CetusIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n let intention: CetusIntention;\n switch (input.txSubType) {\n case TransactionSubType.OpenAndAddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.IncreaseLiquidity:\n intention = IncreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.DecreaseLiquidity:\n intention = DecreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.ClaimFeeAndMining:\n intention = ClaimFeeAndMiningIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingOpenAndAddLiquidity:\n intention = FarmingAddLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingIncreaseLiquidity:\n intention = FarmingIncreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingDecreaseLiquidity:\n intention = FarmingDecreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingRemoveLiquidity:\n intention = FarmingRemoveLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingClaimFeeAndReward:\n intention = FarmingClaimFeeAndRewardIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingHarvest:\n intention = FarmingHarvestIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingBatchHarvest:\n intention = FarmingBatchHarvestIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingStake:\n intention = FarmingStakeIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingUnstake:\n intention = FarmingUnstakeIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSConvert:\n intention = XcetusConvertIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSRedeemLock:\n intention = XcetusRedeemLockIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSClaimStakingRwewards:\n intention = XcetusClaimingStakeRewardsIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSCancelRedeem:\n intention = XcetusCancelIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSRedeem:\n intention = XcetusRedeemIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.VestingRedeem:\n intention = VestingRedeemIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.Swap:\n intention = SwapIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.AddVaultsPosition:\n intention = AddVaultsPositionIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveVaultsPosition:\n intention = RemoveVaultsPositionIntention.fromData(input.intentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.OpenAndAddLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getAddLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { CetusPeripherySDK, SdkOptions as PeripherySdkOptions } from '@cetusprotocol/cetus-periphery-sdk';\nimport { CetusClmmSDK, SdkOptions } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { CetusXcetusSDK, SdkOptions as XcetusSdkOptions } from '@cetusprotocol/cetus-xcetus-sdk';\nimport CetusVaultsSDK from '@cetusprotocol/vaults-sdk';\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '../types';\n\nexport const clmmConfig: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n cetus_config: {\n package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n published_at: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n config: {\n coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n global_config_id: '0x0408fa4e4a4c03cc0de8f23d0c2bbfe8913d178713c9a271ed4080973fe42d8f',\n coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n },\n },\n clmm_pool: {\n package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n published_at: '0xc6faf3703b0e8ba9ed06b7851134bbbe7565eb35ff823fd78432baa4cbeaa12e',\n version: 4,\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0x2d8c2e0fc6dd25b0214b3fa747e0fd27fd54608142cd2e4f64c1cd350cc4add4',\n version: 6,\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0x92aee86c01c79146d23938a00c7fff725ee0688c389be36d1bcbe03761b466c6',\n published_at: '0x92aee86c01c79146d23938a00c7fff725ee0688c389be36d1bcbe03761b466c6',\n },\n aggregatorUrl: 'https://api-sui.cetus.zone/router',\n swapCountUrl: 'https://api-sui.cetus.zone/v2/sui/swap/count',\n};\n\nexport const peripheryConfig: PeripherySdkOptions = {\n launchpad: {\n package_id: '0x80d114c5d474eabc2eb2fcd1a0903f1eb5b5096a8dc4184d72453f7a9be728e4',\n published_at: '0x80d114c5d474eabc2eb2fcd1a0903f1eb5b5096a8dc4184d72453f7a9be728e4',\n config: {\n pools_id: '0xfd8d37f7a1276878972d240302c8efe32f577220c1bbc6c8984d8b60dddfcab3',\n admin_cap_id: '0x66c70d58c69353714cc6fe2d3a62492d605a96a9821e2bd8274de17219c69980',\n config_cap_id: '0x02b8d23f033687579966e182c776fe0287cacdbb18bff56c29f141e29a18a4d1',\n },\n },\n ido: {\n package_id: '0x1192c9e20b4b0a8848a73a8c711b43e38f7ea1f307b556aab6ffab4e982e9c59',\n published_at: '0x1192c9e20b4b0a8848a73a8c711b43e38f7ea1f307b556aab6ffab4e982e9c59',\n config: {\n pools_id: '0xefc209b47acf1f23b29d166440904600229e520ad36228aaf2329b7c16be9762',\n admin_cap_id: '0x281859d366951830aeeda90779aa170d8ee6845875545470d33ecb890e78c8ce',\n package_version_id: '0xc93dc996106770af5f4e979b6808518f8cee080f22f35b936f071f59d834bb22',\n },\n },\n xcetus: {\n package_id: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n published_at: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n config: {\n xcetus_manager_id: '0x838b3dbade12b1e602efcaf8c8b818fae643e43176462bf14fd196afa59d1d9d',\n lock_manager_id: '0x288b59d9dedb51d0bb6cb5e13bfb30885ecf44f8c9076b6f5221c5ef6644fd28',\n lock_handle_id: '0x7c534bb7b8a2cc21538d0dbedd2437cc64f47106cb4c259b9ff921b5c3cb1a49',\n },\n },\n xcetus_dividends: {\n package_id: '0x785248249ac457dfd378bdc6d2fbbfec9d1daf65e9d728b820eb4888c8da2c10',\n published_at: '0x5aa58e1623885bd93de2331d05c29bf4930e54e56beeabcab8fe5385de2d31dc',\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '0x682ba823134f156eac2bcfb27d85a284954a0e61998dc628c40b9bcb4a46ff30',\n dividend_settle_id: '0xade40abe9f6dd10b83b11085be18f07b63b681cf1c169b041fa16854403388c5',\n venft_dividends_id: '0x9dcdb97b4307684bedaeaf803d381b12321a31ecbb9dad7df2cd5f64384f9456',\n venft_dividends_id_v2: '0xaa21fbc1707786d56302952f8327362f4eb9a431a5bc574834e6d46125390de3',\n },\n },\n cetus_faucet: {\n package_id: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n published_at: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n },\n xtoken: {\n package_id: '',\n published_at: '',\n config: {\n xtoken_manager_id: '',\n lock_manager_id: '',\n lock_handle_id: '',\n },\n },\n xtoken_dividends: {\n package_id: '',\n published_at: '',\n config: {\n dividend_manager_id: '',\n dividend_admin_id: '',\n dividend_settle_id: '',\n },\n },\n token_faucet: {\n package_id: '',\n published_at: '',\n },\n booster: {\n package_id: '',\n published_at: '',\n config: {\n booster_config_id: '',\n booster_pool_handle: '',\n },\n },\n maker_bonus: {\n package_id: '',\n published_at: '',\n config: {\n maker_config_id: '',\n maker_pool_handle: '',\n },\n },\n liquidity_stratefy: {\n package_id: '',\n published_at: '',\n version: undefined,\n config: undefined,\n },\n vaults: {\n package_id: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n published_at: '0x58e5de6e425397eeaf952d55c0f94637bee91b25d6138ce222f89cda0aefec03',\n version: 1,\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\n haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0xaabf0856070391df81fad9240049d69c5a51c3d376cc0885eeedd516526cc79b',\n version: 1,\n config: {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n },\n volo: {\n package_id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n published_at: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n version: 1,\n config: {\n native_pool: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n vsui_metadata: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n coin_type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n },\n },\n aftermath: {\n package_id: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n published_at: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n version: 1,\n config: {\n staked_sui_vault: '0x2f8f6d5da7f13ea37daa397724280483ed062769813b6f31e9788e59cc88994d',\n referral_vault: '0x4ce9a19b594599536c53edb25d22532f82f18038dc8ef618afd00fbbfb9845ef',\n safe: '0xeb685899830dd5837b47007809c76d91a098d52aabbf61e8ac467c59e5cc4610',\n validator_address: '0xd30018ec3f5ff1a3c75656abf927a87d7f0529e6dc89c7ddd1bd27ecb05e3db2',\n coin_type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI',\n },\n },\n },\n },\n limit_order: {\n package_id: '',\n published_at: '',\n version: 1,\n config: {\n rate_orders_indexer_id: '',\n rate_orders_indexer_handle: '',\n global_config_id: '',\n token_list_handle: '',\n user_orders_indexer_id: '',\n user_orders_indexer_handle: '',\n },\n },\n frams: {\n package_id: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\n published_at: '0x7e4ca066f06a1132ab0499c8c0b87f847a0d90684afa902e52501a44dbd81992',\n version: 1,\n config: {\n global_config_id: '0x21215f2f6de04b57dd87d9be7bb4e15499aec935e36078e2488f36436d64996e',\n rewarder_manager_id: '0xe0e155a88c77025056da08db5b1701a91b79edb6167462f768e387c3ed6614d5',\n rewarder_manager_handle: '0xb32e312cbb3367d6f3d2b4e57c9225e903d29b7b9f612dae2ddf75bdeb26a5aa',\n admin_cap_id: '0xf10fbf1fea5b7aeaa524b87769461a28c5c977613046360093673991f26d886c',\n },\n },\n dca: {\n package_id: '',\n published_at: '',\n version: 0,\n config: {\n admin_cap_id: '',\n global_config_id: '',\n indexer_id: '',\n user_indexer_id: '',\n in_coin_whitelist_id: '',\n out_coin_whitelist_id: '',\n },\n },\n};\n\nexport const xcetusConfig: XcetusSdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n xcetus: {\n package_id: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n published_at: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n config: {\n xcetus_manager_id: '0x838b3dbade12b1e602efcaf8c8b818fae643e43176462bf14fd196afa59d1d9d',\n lock_manager_id: '0x288b59d9dedb51d0bb6cb5e13bfb30885ecf44f8c9076b6f5221c5ef6644fd28',\n lock_handle_id: '0x7c534bb7b8a2cc21538d0dbedd2437cc64f47106cb4c259b9ff921b5c3cb1a49',\n },\n },\n xcetus_dividends: {\n package_id: '0x785248249ac457dfd378bdc6d2fbbfec9d1daf65e9d728b820eb4888c8da2c10',\n published_at: '0x5aa58e1623885bd93de2331d05c29bf4930e54e56beeabcab8fe5385de2d31dc',\n version: 4,\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '0x682ba823134f156eac2bcfb27d85a284954a0e61998dc628c40b9bcb4a46ff30',\n dividend_settle_id: '0xade40abe9f6dd10b83b11085be18f07b63b681cf1c169b041fa16854403388c5',\n venft_dividends_id: '0x9dcdb97b4307684bedaeaf803d381b12321a31ecbb9dad7df2cd5f64384f9456',\n venft_dividends_id_v2: '0xaa21fbc1707786d56302952f8327362f4eb9a431a5bc574834e6d46125390de3',\n },\n },\n cetus_faucet: {\n package_id: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n published_at: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n },\n};\n\nexport const getClmmSdk = (network: SuiNetworks, account: WalletAccount) => {\n const config = clmmConfig;\n const clmmSdk = new CetusClmmSDK(config);\n clmmSdk.senderAddress = account.address;\n return clmmSdk;\n};\n\nexport const getPeripherySdk = (network: SuiNetworks, account: WalletAccount) => {\n const clmmSdk = getClmmSdk(network, account);\n const config = peripheryConfig;\n const peripherySdk = new CetusPeripherySDK(config, clmmSdk);\n return peripherySdk;\n};\n\nconst aggregatorURL = 'https://api-sui.cetus.zone/router_v2/find_routes';\nexport const getAggregatorSdk = (network: SuiNetworks, account: WalletAccount) => {\n const suiClient = new SuiClient({\n url: 'https://fullnode.mainnet.sui.io/',\n });\n const aggregatorSdk = new AggregatorClient({\n endpoint: aggregatorURL,\n signer: account.address,\n client: suiClient,\n env: Env.Mainnet,\n });\n\n return aggregatorSdk;\n};\n\nconst vaultsSDKOptions = {\n fullRpcUrl: 'https://fullnode.mainnet.sui.io/',\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n clmm_pool: {\n package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n published_at: '0xc6faf3703b0e8ba9ed06b7851134bbbe7565eb35ff823fd78432baa4cbeaa12e',\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0x2d8c2e0fc6dd25b0214b3fa747e0fd27fd54608142cd2e4f64c1cd350cc4add4',\n },\n frams: {\n package_id: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\n published_at: '0x7e4ca066f06a1132ab0499c8c0b87f847a0d90684afa902e52501a44dbd81992',\n config: {\n global_config_id: '0x21215f2f6de04b57dd87d9be7bb4e15499aec935e36078e2488f36436d64996e',\n rewarder_manager_id: '0xe0e155a88c77025056da08db5b1701a91b79edb6167462f768e387c3ed6614d5',\n rewarder_manager_handle: '0xb32e312cbb3367d6f3d2b4e57c9225e903d29b7b9f612dae2ddf75bdeb26a5aa',\n admin_cap_id: '0xf10fbf1fea5b7aeaa524b87769461a28c5c977613046360093673991f26d886c',\n },\n },\n vaults: {\n package_id: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n published_at: '0x58e5de6e425397eeaf952d55c0f94637bee91b25d6138ce222f89cda0aefec03',\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\n haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0xaabf0856070391df81fad9240049d69c5a51c3d376cc0885eeedd516526cc79b',\n version: 1,\n config: {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n },\n volo: {\n package_id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n published_at: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n version: 1,\n config: {\n native_pool: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n vsui_metadata: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n coin_type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n },\n },\n aftermath: {\n package_id: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n published_at: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n version: 1,\n config: {\n staked_sui_vault: '0x2f8f6d5da7f13ea37daa397724280483ed062769813b6f31e9788e59cc88994d',\n referral_vault: '0x4ce9a19b594599536c53edb25d22532f82f18038dc8ef618afd00fbbfb9845ef',\n safe: '0xeb685899830dd5837b47007809c76d91a098d52aabbf61e8ac467c59e5cc4610',\n validator_address: '0xd30018ec3f5ff1a3c75656abf927a87d7f0529e6dc89c7ddd1bd27ecb05e3db2',\n coin_type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI',\n },\n },\n },\n },\n aggregator: {\n endPoint: 'https://api-sui.cetus.zone/router_v2/find_routes',\n fullNodeurl: 'https://fullnode.mainnet.sui.io/',\n walletAddress: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n env: Env.Mainnet,\n providers: [\n 'CETUS',\n 'DEEPBOOK',\n 'KRIYA',\n 'KRIYAV3',\n 'FLOWX',\n 'FLOWXV3',\n 'AFTERMATH',\n 'TURBOS',\n 'HAEDAL',\n 'VOLO',\n 'AFSUI',\n ],\n },\n};\n\nexport const getVaultsSdk = (network: SuiNetworks, account: WalletAccount) => {\n const vaultsSDK: any = new CetusVaultsSDK(vaultsSDKOptions);\n vaultsSDK.senderAddress = account.address;\n return vaultsSDK;\n};\n\nexport const getXcetusSdk = (network: SuiNetworks, account: WalletAccount) => {\n const xcetusSDk: any = new CetusXcetusSDK(xcetusConfig);\n xcetusSDk.senderAddress = account.address;\n return xcetusSDk;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getClmmSdk } from './config';\n\nexport const getAddLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(\n txbParams?.parameter,\n txbParams?.gasEstimateArg,\n );\n return txb;\n};\n\nexport const getIncreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(\n txbParams?.parameter,\n txbParams?.gasEstimateArg,\n );\n return txb;\n};\n\nexport const getRemoveLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.closePositionTransactionPayload(txbParams);\n return txb;\n};\n\nexport const getDecreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.removeLiquidityTransactionPayload(txbParams);\n return txb;\n};\n\nexport const getClaimFeeAndMiningTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Rewarder.collectRewarderTransactionPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getClaimFeeAndMiningTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimFeeAndMiningIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ClaimFeeAndMining;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getClaimFeeAndMiningTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new ClaimFeeAndMiningIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getDecreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.DecreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getDecreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new DecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingAddLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingAddLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingOpenAndAddLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingAddLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingAddLiquidityIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getPeripherySdk } from './config';\n\nexport const getFarmingAddLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.openPositionAddLiquidityStakePaylod(txbParams);\n return txb;\n};\n\nexport const getFarmingIncreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.addLiquidityFixCoinPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingDecreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingRemoveLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingClaimFeeAndRewardTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.claimFeeAndClmmReward(txbParams);\n return txb;\n};\n\nexport const getFarmingHarvest = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.harvestPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingBatchHarvest = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const params: any = Object.values(txbParams);\n const txb: Transaction = await peripherySdk.Farms.batchHarvestPayload(params);\n return txb;\n};\n\nexport const getFarmingStake = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.depositPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingUnstake = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.withdrawPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingBatchHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingBatchHarvestIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingBatchHarvest;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingBatchHarvest(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingBatchHarvestIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingClaimFeeAndRewardTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingClaimFeeAndRewardIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingClaimFeeAndReward;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingClaimFeeAndRewardTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingClaimFeeAndRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingDecreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingDecreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingDecreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingDecreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingDecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingHarvestIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingHarvest;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingHarvest(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingHarvestIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingIncreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingIncreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingIncreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingIncreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingIncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingRemoveLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingRemoveLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingRemoveLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingRemoveLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingRemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingStake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingStakeIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingStake;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingStake(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingStakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingUnstake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingUnstakeIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingUnstake;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingUnstake(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingUnstakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getIncreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.IncreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getIncreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new IncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getRemoveLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getSwapRouterTxb } from '../api/swap';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Swap;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getSwapRouterTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new SwapIntention(data);\n }\n}\n","import { restituteMsafeFastRouterSwapParams } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getAggregatorSdk } from './config';\n\nexport const getSwapRouterTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const aggregatorSdk = getAggregatorSdk(network, account);\n const txb = new Transaction();\n await aggregatorSdk.fastRouterSwap({\n ...txbParams,\n routers: restituteMsafeFastRouterSwapParams(txbParams.routers),\n txb,\n });\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddVaultsPositionIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.AddVaultsPosition;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getAddVaultsPositionPayload(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new AddVaultsPositionIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getVaultsSdk } from './config';\n\nexport const getAddVaultsPositionPayload = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const vaultsSdk = getVaultsSdk(network, account);\n const txb: Transaction = await vaultsSdk.Vaults.deposit(txbParams);\n return txb;\n};\n\nexport const getRemoveVaultsPositionPayload = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const vaultsSdk = getVaultsSdk(network, account);\n const txb: Transaction = await vaultsSdk.Vaults.withdraw(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveVaultsPositionIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveVaultsPosition;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getRemoveVaultsPositionPayload(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new RemoveVaultsPositionIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getVestingRedeemTxb } from '../api/vesting';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class VestingRedeemIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.VestingRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getVestingRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new VestingRedeemIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nconst VestingConfing = {\n package_id: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n published_at: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n cetus_coin_type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n};\n\nexport const getVestingRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n console.log('getVestingRedeemTxb txbParams: ', txbParams);\n console.log('getVestingRedeemTxb account: ', account);\n console.log('getVestingRedeemTxb network: ', network);\n const { pool, nftId, periods, CLOCK_ADDRESS } = txbParams;\n const txb = new Transaction();\n\n periods.forEach((period: any) => {\n txb.moveCall({\n target: `${VestingConfing.published_at}::router::redeem`,\n typeArguments: [VestingConfing.cetus_coin_type],\n arguments: [txb.object(pool), txb.object(nftId), txb.pure(period), txb.object(CLOCK_ADDRESS)],\n });\n });\n\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusCancelRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusCancelIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSCancelRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusCancelRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusCancelIntention(data);\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusSdk } from './config';\n\nexport const getXcetusConvertTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.convertPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemLockTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemLockPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusClaimingStakeRewardsTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemDividendV3Payload(\n txbParams.veNftId,\n txbParams.rewardList,\n );\n return txb;\n};\n\nexport const getXcetusCancelRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.cancelRedeemPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusClaimingStakeRewardsTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusClaimingStakeRewardsIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSClaimStakingRwewards;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusClaimingStakeRewardsTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusClaimingStakeRewardsIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusConvertTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusConvertIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSConvert;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusConvertTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusConvertIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusRedeemIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemLockTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemLockIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSRedeemLock;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusRedeemLockTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusRedeemLockIntention(data);\n }\n}\n","import { CancelStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CancelStreamIntention extends StreamIntention<CancelStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CANCEL;\n\n constructor(public readonly data: CancelStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.cancel();\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternalLegacy<T> {\n application: string;\n supportSDK: '@mysten/sui.js';\n\n deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n }>;\n\n build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock>;\n}\n\nexport interface TransactionIntentionLegacy<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n\n serialize(): string;\n\n build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<TransactionBlock>;\n}\n\nexport abstract class BaseIntentionLegacy<D> implements TransactionIntentionLegacy<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock>;\n}\n","import { getFullnodeUrl } from '@mysten/sui.js/client';\n\nimport * as devContractConfig from '../config/dev.json';\nimport * as prodContractConfig from '../config/prod.json';\n\nexport enum Env {\n dev = 'dev',\n stg = 'stg',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface EnvConfig {\n env: Env;\n rpc: SuiConfig;\n backend: BackendConfig;\n contract: ContractConfig;\n}\n\nexport interface EnvConfigOptions {\n rpc?: SuiConfig;\n backend?: BackendConfig;\n contract?: ContractConfig;\n}\n\nexport interface BackendConfig {\n url: string;\n}\n\nexport interface SuiConfig {\n url: string;\n}\n\nexport interface ContractConfig {\n contractId: string;\n roleObjId: string;\n vaultObjId: string;\n feeObjId: string;\n}\n\nexport const DEV_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const STG_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const PREV_RPC_ENDPOINT = getFullnodeUrl('mainnet');\nexport const PROD_RPC_ENDPOINT = getFullnodeUrl('mainnet');\n\nexport const DEV_BE_API = 'https://bc3p6l5unl.execute-api.us-west-1.amazonaws.com/prod';\nexport const STG_BE_API = 'https://rolsbkota7.execute-api.us-west-1.amazonaws.com/prod';\nexport const PREV_BE_API = 'https://6p6mkx33ne.execute-api.us-west-1.amazonaws.com/prod';\nexport const PROD_BE_API = 'https://xrae3mrjv5.execute-api.us-west-1.amazonaws.com/prod';\n\nexport const CONTRACT_DEV: ContractConfig = devContractConfig;\nexport const CONTRACT_PROD: ContractConfig = prodContractConfig;\n\nconst ENV_CONFIG: Map<Env, EnvConfig> = new Map([\n [\n Env.dev,\n {\n env: Env.dev,\n rpc: {\n url: DEV_RPC_ENDPOINT,\n },\n backend: {\n url: DEV_BE_API,\n },\n contract: CONTRACT_DEV,\n },\n ],\n [\n Env.stg,\n {\n env: Env.stg,\n rpc: {\n url: STG_RPC_ENDPOINT,\n },\n backend: {\n url: STG_BE_API,\n },\n contract: CONTRACT_DEV,\n },\n ],\n [\n Env.prev,\n {\n env: Env.prev,\n rpc: {\n url: PREV_RPC_ENDPOINT,\n },\n backend: {\n url: PREV_BE_API,\n },\n contract: CONTRACT_PROD,\n },\n ],\n [\n Env.prod,\n {\n env: Env.prod,\n rpc: {\n url: PROD_RPC_ENDPOINT,\n },\n backend: {\n url: PROD_BE_API,\n },\n contract: CONTRACT_PROD,\n },\n ],\n]);\n\nexport function getConfig(env: Env, options?: EnvConfigOptions): EnvConfig {\n const ec = ENV_CONFIG.get(env);\n if (!ec) {\n throw new Error(`Env not supported: ${env}`);\n }\n if (options && options.rpc) {\n ec.rpc = options.rpc;\n }\n if (options && options.backend) {\n ec.backend = options.backend;\n }\n if (options && options.contract) {\n ec.contract = options.contract;\n }\n return ec;\n}\n","{\n \"transaction\": \"DiBZq4UmVVYiRL6ZJmFKYoHcxtxqrhsCXSkFyT7wUr3j\",\n \"status\": \"success\",\n \"contractId\": \"0x81c960dc653975fbd0072deca8afb92d322898c911622898ba1b2e3ad0c4bd8d\",\n \"roleObjId\": \"0xc6ec0bdee0bb59a72077e9acd2f42457043cf47080b3d3fad4d39abf28bba63a\",\n \"vaultObjId\": \"0xbc4021387fbac149119fd24e92be9e58f745774292f3a2a12e2ac6daf5363e1d\",\n \"feeObjId\": \"0x4178f63970fe2daeb256dc5730ad172e82b3e8eb45f31b33e0daae72cd35e1e1\",\n \"upgradeCapObjId\": \"0xe1e9aa7d222d151bfe6dd83358b0d7fdcb11260f710800cfaf7ccc1b1e245115\"\n}","{\n \"transaction\": \"855FNDV8o8Z3fWULPnQo9qdhLJpsg7wZrkCpNyfw9KfB\",\n \"status\": \"success\",\n \"contractId\": \"0xc357c3985e8fb875d6b37141497af660779aa1bab0ec489b2213efd74067d1fa\",\n \"roleObjId\": \"0x5ab49bdf9fd1413e328ef242b3f8d83dde791b38a0b627bfc87fb25c010d34f1\",\n \"vaultObjId\": \"0xb483558770d8eb26007f193b75db40f0a45f2e36863a687625885d4de6993378\",\n \"feeObjId\": \"0x48453fc4d7cde3fe35aad89e5dfb496608a6a55ea529a1c0274681a808627f94\",\n \"upgradeCapObjId\": \"0x34279779a0d0d36bd5044b04830d607fa1b0ecf316548c8ac3a44151e4f1a42a\"\n}","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { EnvConfig, Env, EnvConfigOptions, getConfig } from './env';\nimport { NoBackendError } from '../error/NoBackendError';\nimport { WalletNotConnectedError } from '../error/WalletNotConnectedError';\nimport { Backend } from '../stream/backend';\nimport { IBackend } from '../types/backend';\nimport { IWallet, WalletType } from '../types/wallet';\n\nexport class Globals {\n public signer: IWallet | undefined;\n\n public readonly suiClient: SuiClient;\n\n public readonly envConfig: EnvConfig;\n\n public _backend?: IBackend;\n\n constructor(envConfig: EnvConfig) {\n this.envConfig = envConfig;\n this.suiClient = new SuiClient({ url: envConfig.rpc.url });\n if (envConfig.backend) {\n this._backend = new Backend(envConfig.backend.url);\n }\n }\n\n static new(env: Env, options?: EnvConfigOptions) {\n const ec = getConfig(env, options);\n return new Globals(ec);\n }\n\n get walletType(): WalletType | 'disconnected' {\n if (!this.wallet) {\n return 'disconnected';\n }\n return this.wallet.type;\n }\n\n get backend(): IBackend {\n if (!this._backend) {\n throw new NoBackendError();\n }\n return this._backend;\n }\n\n // Used for test cases\n set backend(b: IBackend) {\n this._backend = b;\n }\n\n connectWallet(wallet: IWallet) {\n this.signer = wallet;\n }\n\n disconnect() {\n this.signer = undefined;\n }\n\n get wallet(): IWallet {\n if (!this.signer) {\n throw new WalletNotConnectedError();\n }\n return this.signer;\n }\n\n async walletAddress() {\n return this.wallet.address();\n }\n}\n","export enum MPayErrorCode {\n sanity,\n walletNotConnected,\n InvalidInput,\n InvalidRpcResult,\n NotEnoughBalance,\n StreamNotFound,\n RpcError,\n NotCreator,\n NotRecipient,\n InvalidStreamGroup,\n BackendError,\n NoBackend,\n TransactionFailed,\n}\n\nexport type JsonObject =\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | readonly JsonObject[]\n | { readonly [key: string]: JsonObject }\n | { toJSON(): JsonObject };\n\nexport class MPayError extends Error {\n public readonly mpayErrorCode: number;\n\n public readonly context?: JsonObject;\n\n constructor(mpayErrorCode: number, msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n const { cause, context } = options;\n if (cause) {\n super(`[MPay] ${msg}: ${cause}`);\n } else {\n super(`[MPay] ${msg}`);\n }\n this.mpayErrorCode = mpayErrorCode;\n this.context = context;\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NoBackendError extends MPayError {\n constructor() {\n super(MPayErrorCode.NoBackend, 'Backend is not specified');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class WalletNotConnectedError extends MPayError {\n constructor() {\n super(MPayErrorCode.walletNotConnected, 'Wallet not connected');\n }\n}\n","import axios, { AxiosError, AxiosResponse } from 'axios';\n\nimport { BackendError } from '../error/BackendError';\nimport {\n IBackend,\n BackendIncomingStreamFilterOptions,\n StreamRef,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\n\nexport class Backend implements IBackend {\n constructor(private apiURL: string) {}\n\n private static parseResponseData(response: AxiosError | AxiosResponse) {\n if (response instanceof AxiosError) {\n throw new BackendError(response.response?.statusText as string);\n }\n if (response.status === 200) {\n if (response.data.success) {\n return response.data.data;\n }\n throw new BackendError(response.data.code);\n }\n throw new BackendError(response.status.toString());\n }\n\n async getIncomingStreams(recipient: string, options?: BackendIncomingStreamFilterOptions): Promise<StreamRef[]> {\n const res = await axios.post(`${this.apiURL}/stream`, {\n recipient,\n ...options,\n });\n return Backend.parseResponseData(res) as StreamRef[];\n }\n\n async getOutgoingStreams(sender: string, options?: BackendOutgoingStreamFilterOptions): Promise<StreamRef[]> {\n const res = await axios.post(`${this.apiURL}/stream`, {\n sender,\n ...options,\n });\n return Backend.parseResponseData(res);\n }\n\n async getStreamHistory(query: {\n streamId?: string;\n groupId?: string;\n pagination?: PaginationOptions;\n }): Promise<Paginated<StreamEvent>> {\n const res = await axios.post(`${this.apiURL}/stream-events`, query);\n const paginatedData = Backend.parseResponseData(res);\n paginatedData.data.forEach((event: StreamEvent) => {\n const formalizedEvent = event;\n if (formalizedEvent.data.type === 'create_stream') {\n formalizedEvent.data.balance = BigInt(formalizedEvent.data.balance);\n } else if (formalizedEvent.data.type === 'cancel_stream') {\n formalizedEvent.data.withdrawAmount = BigInt(formalizedEvent.data.withdrawAmount);\n } else if (formalizedEvent.data.type === 'claim' || formalizedEvent.data.type === 'auto_claim') {\n formalizedEvent.data.claimAmount = BigInt(formalizedEvent.data.claimAmount);\n } else if (formalizedEvent.data.type === 'set_auto_claim') {\n formalizedEvent.data.enabled = !!formalizedEvent.data.enabled;\n }\n formalizedEvent.createdAt = new Date(formalizedEvent.createdAt);\n return formalizedEvent;\n });\n\n return paginatedData;\n }\n\n async getAllCoinTypes(address: string): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { address });\n return Backend.parseResponseData(res);\n }\n\n async getAllRecipients(sender: string, options?: StreamFilterStatus): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { sender, status: options });\n return Backend.parseResponseData(res);\n }\n\n async getAllSenders(recipient: string, options?: StreamFilterStatus): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { recipient, status: options });\n return Backend.parseResponseData(res);\n }\n}\n","import { JsonObject, MPayError, MPayErrorCode } from './base';\n\nexport class BackendError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.BackendError, msg, { context });\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Env, EnvConfigOptions, Globals } from '../common';\nimport { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\nimport { Stream } from './Stream';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { getCoinsWithAmount } from '../sui/iterator/coin';\nimport { isSameCoinType } from '../sui/utils';\nimport { StreamFilterStatus } from '../types/backend';\nimport {\n CreateStreamInfo,\n IMPayClient,\n IPagedStreamListIterator,\n IncomingStreamQuery,\n OutgoingStreamQuery,\n} from '../types/client';\nimport {\n CoinRequest,\n CoinRequestResponse,\n GAS_OBJECT_SPEC,\n IMSafeAccount,\n ISingleWallet,\n IWallet,\n WalletType,\n} from '../types/wallet';\n\nexport class MSafeAccountAdapter implements IWallet {\n constructor(private readonly msafe: IMSafeAccount) {}\n\n get type() {\n return WalletType.msafe;\n }\n\n async address() {\n return this.msafe.address();\n }\n\n async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n return this.msafe.requestCoins(reqs);\n }\n}\n\nexport class MSafeSingleWallet {\n constructor(private account: WalletAccount) {}\n\n async address(): Promise<string> {\n return this.account.address;\n }\n}\n\nexport class SingleWalletAdapter implements IWallet {\n constructor(\n private readonly singleWallet: ISingleWallet,\n private readonly suiClient: SuiClient,\n ) {}\n\n get type() {\n return WalletType.single;\n }\n\n async address() {\n return this.singleWallet.address();\n }\n\n async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n return Promise.all(reqs.map((req) => this.requestCoin(req)));\n }\n\n async requestCoin(req: CoinRequest): Promise<CoinRequestResponse> {\n if (isSameCoinType(req.coinType, SUI_TYPE_ARG)) {\n return {\n primaryCoin: GAS_OBJECT_SPEC,\n };\n }\n if (req.amount <= 0) {\n throw new InvalidInputError('Invalid coin request', 'coinAmount', req.amount);\n }\n const coins = await getCoinsWithAmount(this.suiClient, await this.address(), req.amount, req.coinType);\n if (coins.length === 0) {\n throw new SanityError('no coins available');\n }\n return {\n primaryCoin: coins[0].coinObjectId,\n mergedCoins: coins.slice(1).map((coin) => coin.coinObjectId),\n };\n }\n}\n\nexport class MPayClient implements IMPayClient {\n public readonly globals: Globals;\n\n public readonly helper: MPayHelper;\n\n constructor(env: Env, options?: EnvConfigOptions) {\n this.globals = Globals.new(env, options);\n this.helper = new MPayHelper(this.globals);\n }\n\n connectSingleWallet(wallet: ISingleWallet) {\n const adapter = new SingleWalletAdapter(wallet, this.globals.suiClient);\n this.globals.connectWallet(adapter);\n }\n\n connectMSafeAccount(msafe: IMSafeAccount) {\n const adapter = new MSafeAccountAdapter(msafe);\n this.globals.connectWallet(adapter);\n }\n\n async createStream(info: CreateStreamInfo): Promise<TransactionBlock> {\n return this.builder().createStreams(info);\n }\n\n async getStream(streamId: string) {\n return Stream.new(this.globals, streamId);\n }\n\n async getIncomingStreams(query?: IncomingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n return PagedStreamListIterator.newIncoming({\n globals: this.globals,\n query,\n pageSize,\n });\n }\n\n async getOutgoingStreams(query?: OutgoingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n return PagedStreamListIterator.newOutgoing({\n globals: this.globals,\n query,\n pageSize,\n });\n }\n\n async getCoinTypesForStreamFilter(): Promise<string[]> {\n const address = await this.wallet.address();\n const coinTypes = await this.globals.backend.getAllCoinTypes(address);\n return coinTypes.map((coinType) => normalizeStructTag(coinType));\n }\n\n async getRecipientsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n const address = await this.wallet.address();\n const recipients = await this.globals.backend.getAllRecipients(address, options);\n return recipients.map((recipient) => normalizeSuiAddress(recipient));\n }\n\n async getCreatorsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n const address = await this.wallet.address();\n const creators = await this.globals.backend.getAllSenders(address, options);\n return creators.map((creator) => normalizeSuiAddress(creator));\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n private builder() {\n return new MPayBuilder(this.globals);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamHelper } from './CreateStreamHelper';\nimport { Globals } from '../common';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { CreateStreamInfo } from '../types/client';\n\n// TODO: add vault and admin control related code.\nexport class MPayBuilder {\n private readonly feeContract: FeeContract;\n\n private readonly streamContract: StreamContract;\n\n constructor(public readonly globals: Globals) {\n const config = globals.envConfig.contract;\n this.feeContract = new FeeContract(config, globals);\n this.streamContract = new StreamContract(config, globals);\n }\n\n async createStreams(info: CreateStreamInfo) {\n const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(info);\n return this.createStreamHelper().buildCreateStreamTransactionBlock(infoInternal);\n }\n\n createStreamHelper() {\n return new CreateStreamHelper(this.globals, this.feeContract, this.streamContract);\n }\n\n setAutoClaim(streamId: string, enabled: boolean, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.setAutoClaim(txb, {\n streamId,\n enabled,\n coinType,\n });\n }\n\n claimStream(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.claimStream(txb, {\n streamId,\n coinType,\n });\n }\n\n claimStreamByProxy(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.claimStreamByProxy(txb, {\n streamId,\n coinType,\n });\n }\n\n cancelStream(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId,\n coinType,\n });\n return txb;\n }\n}\n","import { TransactionArgument, TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { CLAIM_FEE_NUMERATOR, FEE_DENOMINATOR, FEE_NUMERATOR, FLAT_FEE_SUI } from './const';\nimport { Globals } from '../common';\nimport { ResultRef } from '../common/transaction';\nimport { FeeContract } from '../contract/FeeContract';\nimport { InspectViewer } from '../contract/InspectViewer';\nimport { StreamContract } from '../contract/StreamContract';\nimport { encodeMetadata } from '../stream/metadata';\nimport { isSameCoinType } from '../sui/utils';\nimport {\n CreateStreamInfo,\n CreateStreamInfoInternal,\n MPayFees,\n PaymentWithFee,\n RecipientInfoInternal,\n} from '../types/client';\nimport { CoinRequest, CoinRequestResponse, GAS_OBJECT_SPEC } from '../types/wallet';\nimport { generateGroupId } from '../utils/random';\n\nexport class CreateStreamHelper {\n constructor(\n public readonly globals: Globals,\n private readonly feeContract: FeeContract,\n private readonly streamContract: StreamContract,\n ) {}\n\n static convertCreateStreamInfoToInternal(info: CreateStreamInfo): CreateStreamInfoInternal {\n return {\n metadata: encodeMetadata({\n name: info.name,\n groupId: generateGroupId(),\n }),\n coinType: normalizeStructTag(info.coinType),\n recipients: info.recipients.map((recipient) => ({\n address: recipient.address,\n cliffAmount: recipient.cliffAmount,\n amountPerEpoch: recipient.amountPerStep,\n })),\n epochInterval: info.interval,\n numberEpoch: info.steps,\n startTime: info.startTimeMs,\n cancelable: info.cancelable,\n };\n }\n\n async buildCreateStreamTransactionBlock(info: CreateStreamInfoInternal): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n const paymentWithFee = this.calculateFeesInternal(info);\n const coinReqs = this.getCreateStreamCoinRequests(info, paymentWithFee);\n const coinResp = await this.wallet.requestCoins(coinReqs);\n\n const paymentMergedObject = await this.addMergeCoins(txb, coinResp[0]);\n let flatFeeMergedObject: TransactionArgument;\n if (coinReqs.length > 1) {\n flatFeeMergedObject = await this.addMergeCoins(txb, coinResp[1]);\n } else {\n flatFeeMergedObject = paymentMergedObject;\n }\n\n // Create streams\n for (let i = 0; i < info.recipients.length; i++) {\n const recipient = info.recipients[i];\n const paymentAmount = this.amountForRecipient(recipient, info.numberEpoch);\n const feeAmount = this.getStreamFeeLocal(paymentAmount);\n const [paymentCoin] = txb.splitCoins(paymentMergedObject, [txb.pure(paymentAmount + feeAmount, 'u64')]);\n const [flatFeeCoin] = txb.splitCoins(flatFeeMergedObject, [txb.pure(this.flatSuiFee, 'u64')]);\n this.streamContract.createStream(txb, {\n paymentCoin: new ResultRef(paymentCoin as TransactionArgument & TransactionArgument[]),\n flatFeeCoin: new ResultRef(flatFeeCoin as TransactionArgument & TransactionArgument[]),\n metadata: info.metadata,\n recipient: recipient.address,\n timeStart: info.startTime,\n cliff: recipient.cliffAmount,\n epochInterval: info.epochInterval,\n numEpoch: info.numberEpoch,\n amountPerEpoch: recipient.amountPerEpoch,\n cancelable: info.cancelable,\n coinType: info.coinType,\n });\n }\n return txb;\n }\n\n calculateCreateStreamFees(createInfo: CreateStreamInfo) {\n const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(createInfo);\n return this.calculateFeesInternal(infoInternal);\n }\n\n feeParams(): MPayFees {\n return {\n createFeePercent: {\n numerator: FEE_NUMERATOR,\n denominator: FEE_DENOMINATOR,\n },\n claimFeePercent: {\n numerator: CLAIM_FEE_NUMERATOR,\n denominator: FEE_DENOMINATOR,\n },\n flatFeePerStream: FLAT_FEE_SUI,\n };\n }\n\n private async addMergeCoins(txb: TransactionBlock, coins: CoinRequestResponse): Promise<TransactionObjectArgument> {\n let mergedCoin: TransactionObjectArgument;\n if (coins.mergedCoins && coins.mergedCoins.length) {\n txb.mergeCoins(\n txb.object(coins.primaryCoin),\n coins.mergedCoins.map((coinId) => txb.object(coinId)),\n );\n mergedCoin = txb.object(coins.primaryCoin);\n } else if (coins.primaryCoin === GAS_OBJECT_SPEC) {\n mergedCoin = txb.gas;\n } else {\n mergedCoin = txb.object(coins.primaryCoin);\n }\n return mergedCoin;\n }\n\n getCreateStreamCoinRequests(info: CreateStreamInfoInternal, payment: PaymentWithFee): CoinRequest[] {\n const streamCoinType = info.coinType;\n\n if (isSameCoinType(streamCoinType, SUI_TYPE_ARG)) {\n return [\n {\n coinType: streamCoinType,\n amount: payment.totalAmount + payment.streamFeeAmount + payment.flatFeeAmount,\n },\n ];\n }\n return [\n {\n coinType: streamCoinType,\n amount: payment.totalAmount + payment.streamFeeAmount,\n },\n {\n coinType: SUI_TYPE_ARG,\n amount: payment.flatFeeAmount,\n },\n ];\n }\n\n calculateFeesInternal(info: CreateStreamInfoInternal): PaymentWithFee {\n const streamPayment = info.recipients.reduce(\n (sum, recipient) => {\n const totalAmount = this.amountForRecipient(recipient, info.numberEpoch);\n const fee = this.getStreamFeeLocal(totalAmount);\n return {\n totalAmount: sum.totalAmount + totalAmount,\n streamFeeAmount: sum.streamFeeAmount + fee,\n };\n },\n {\n totalAmount: 0n,\n streamFeeAmount: 0n,\n },\n );\n const flatFeeAmount = BigInt(info.recipients.length) * this.flatSuiFee;\n return {\n flatFeeAmount,\n ...streamPayment,\n };\n }\n\n private amountForRecipient(recipient: RecipientInfoInternal, numEpoch: bigint) {\n return BigInt(recipient.amountPerEpoch) * BigInt(numEpoch) + BigInt(recipient.cliffAmount);\n }\n\n get flatSuiFee() {\n return FLAT_FEE_SUI;\n }\n\n getStreamFeeLocal(streamAmount: bigint) {\n return (streamAmount * FEE_NUMERATOR) / FEE_DENOMINATOR;\n }\n\n async getStreamFeeRemote(streamAmount: bigint) {\n const txb = this.feeContract.streamingFee(new TransactionBlock(), streamAmount);\n const res = await this.globals.suiClient.devInspectTransactionBlock({\n sender: await this.globals.walletAddress(),\n transactionBlock: txb,\n });\n const iv = new InspectViewer(res);\n return iv.getU64();\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n}\n","export const FEE_NUMERATOR = 50n;\nexport const FEE_DENOMINATOR = 10000n;\nexport const CLAIM_FEE_NUMERATOR = 25n;\nexport const FLAT_FEE_SUI = 100000000n;\n","import { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nexport type MoveNumber = bigint | string | number;\nexport type Ref<T> = T | ResultRef;\nexport type ObjectId = string;\n\nexport class MoveObject {\n constructor(public readonly object: string) {}\n\n moveArg(txb: TransactionBlock) {\n return txb.object(this.object);\n }\n}\n\nexport class ObjectVector {\n constructor(public readonly objects: string[]) {}\n\n moveArgs(txb: TransactionBlock) {\n return txb.makeMoveVec({ objects: this.objects.map((o) => txb.object(o)) });\n }\n}\n\nexport class ResultRef {\n constructor(public readonly result: TransactionArgument & TransactionArgument[]) {\n // eslint-disable-next-line no-constructor-return\n return new Proxy(this, {\n set() {\n throw new Error('The transaction result is a proxy, and does not support setting properties directly');\n },\n get(target, property) {\n // This allows this transaction argument to be used in the singular form:\n if (property in target) {\n return Reflect.get(target, property);\n }\n\n const nestedResultFor = (resultIndex: number) => new ResultRef(target.result[resultIndex] as any);\n\n // Support destructuring:\n if (property === Symbol.iterator) {\n // eslint-disable-next-line func-names\n return function* () {\n let i = 0;\n while (true) {\n yield nestedResultFor(i);\n i++;\n }\n };\n }\n\n if (typeof property === 'symbol') {\n // eslint-disable-next-line consistent-return\n return;\n }\n\n const resultIndex = parseInt(property, 10);\n if (Number.isNaN(resultIndex) || resultIndex < 0) {\n // eslint-disable-next-line consistent-return\n return;\n }\n return nestedResultFor(resultIndex);\n },\n });\n }\n\n moveArg() {\n return this.result;\n }\n}\n","import { Buffer } from 'buffer';\n\nimport { DevInspectResults, SuiExecutionResult } from '@mysten/sui.js/client';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { InvalidRpcResultError } from '../error/InvalidRpcResultError';\n\nexport class InspectViewer {\n constructor(readonly results: DevInspectResults) {}\n\n callResult(index: number) {\n return this.results.results![index];\n }\n\n returnValue(returned: SuiExecutionResult, index: number) {\n return returned.returnValues![index];\n }\n\n getValue(callIndex = 0, returnIndex = 0) {\n const callResult = this.callResult(callIndex);\n return this.returnValue(callResult, returnIndex);\n }\n\n getAddress(callIndex = 0, returnIndex = 0) {\n const [value, type] = this.getValue(callIndex, returnIndex);\n if (type !== 'address') {\n throw new InvalidRpcResultError('Invalid contract return type.', {\n ctx: {\n expectType: 'address',\n gotType: type,\n },\n });\n }\n return normalizeSuiAddress(Buffer.from(value).toString('hex'));\n }\n\n getU64(callIndex = 0, returnIndex = 0) {\n const [value, type] = this.getValue(callIndex, returnIndex);\n if (type !== 'u64') {\n throw new InvalidRpcResultError('Invalid contract return type.', {\n ctx: {\n expectType: 'u64',\n gotType: type,\n },\n });\n }\n return Buffer.from(value).readBigInt64LE();\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidRpcResultError extends MPayError {\n constructor(msg: string, ctx?: JsonObject) {\n super(MPayErrorCode.InvalidRpcResult, msg, { context: ctx });\n }\n}\n","import { bcs } from '@mysten/sui.js/bcs';\n\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { StreamMetadata } from '../types/stream';\n\nexport const metadataBcsType = {\n groupId: 'string',\n name: 'string',\n};\n\nconst MAX_NAME_SIZE = 64;\n\nexport function encodeMetadata(metadata: StreamMetadata) {\n validateMetadata(metadata);\n return bcs.ser(metadataBcsType, metadata).toString('base64');\n}\n\nexport function decodeMetadata(metaStr: string) {\n const metadata = bcs.de(metadataBcsType, metaStr, 'base64') as StreamMetadata;\n validateMetadata(metadata);\n return metadata;\n}\n\nexport function validateMetadata(metadata: StreamMetadata) {\n if (!isAsciiString(metadata.name)) {\n throw new InvalidInputError('Invalid metadata: Name contains unknown character');\n }\n if (!isAsciiString(metadata.groupId)) {\n throw new InvalidInputError('Invalid metadata: Group ID contains unknown character');\n }\n if (metadata.name.length > MAX_NAME_SIZE) {\n throw new InvalidInputError('Invalid metadata: Name exceed max length 64');\n }\n}\n\nfunction isAsciiString(str: string) {\n // eslint-disable-next-line no-control-regex\n const asciiPattern = /^[\\x00-\\x7F]+$/;\n return asciiPattern.test(str);\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class InvalidInputError extends MPayError {\n constructor(msg: string, fieldKey?: string, fieldValue?: any) {\n super(MPayErrorCode.InvalidInput, `Invalid input: ${msg}`, {\n context: {\n fieldKey,\n fieldValue,\n },\n });\n }\n}\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n","export enum WalletType {\n single = 'single',\n msafe = 'msafe',\n}\n\nexport const GAS_OBJECT_SPEC = 'txn.gas';\n\n/**\n * IWallet is the adapted interface of wallet. Supports both single wallet and msafe.\n */\nexport interface IWallet {\n type: WalletType;\n\n address(): Promise<string>;\n\n requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of msafe account.\n * Need to adapt to IWallet interface\n */\nexport interface IMSafeAccount {\n address(): Promise<string>;\n\n // return coin objects by amount.\n requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of single signer wallet.\n * Need to adapt to IWallet interface\n */\nexport interface ISingleWallet {\n address(): Promise<string>;\n}\n\nexport interface CoinRequest {\n coinType: string;\n amount: bigint;\n}\n\nexport interface CoinRequestResponse {\n primaryCoin: string;\n mergedCoins?: string[];\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateGroupId() {\n return nanoid();\n}\n","import { TransactionBlock, Transactions } from '@mysten/sui.js/transactions';\n\nimport { ContractConfig, Globals } from '../common';\nimport { ObjectVector, MoveObject, ResultRef, Ref, ObjectId } from '../common/transaction';\nimport { CLOCK_ID } from '../const';\n\nexport class BaseContract {\n constructor(\n public readonly moduleName: string,\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {}\n\n addContractCall(txb: TransactionBlock, input: { method: string; arguments: any[]; typeArgs?: string[] }) {\n const target =\n `${this.config.contractId}::${this.moduleName}::${input.method}` as `${string}::${string}::${string}`;\n txb.add(\n Transactions.MoveCall({\n target,\n arguments: input.arguments.map((arg) => {\n if (arg instanceof ObjectVector) {\n return arg.moveArgs(txb);\n }\n if (arg instanceof MoveObject) {\n return arg.moveArg(txb);\n }\n if (arg instanceof ResultRef) {\n return arg.moveArg();\n }\n return txb.pure(arg);\n }),\n typeArguments: input.typeArgs,\n }),\n );\n return txb;\n }\n\n private addTransactionBlock(txb: TransactionBlock, target: string, callArgs: any[] = [], typeArgs: string[] = []) {\n txb.add(\n Transactions.MoveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: callArgs.map((arg) => {\n if (arg instanceof ObjectVector) {\n return arg.moveArgs(txb);\n }\n if (arg instanceof MoveObject) {\n return arg.moveArg(txb);\n }\n if (arg instanceof ResultRef) {\n return arg.moveArg();\n }\n return txb.pure(arg);\n }),\n typeArguments: typeArgs,\n }),\n );\n }\n\n makeObject(object: Ref<ObjectId>) {\n return typeof object === 'string' ? new MoveObject(object) : object;\n }\n\n vaultObject() {\n return new MoveObject(this.config.vaultObjId);\n }\n\n roleObject() {\n return new MoveObject(this.config.roleObjId);\n }\n\n feeObject() {\n return new MoveObject(this.config.feeObjId);\n }\n\n clockObject() {\n return new MoveObject(CLOCK_ID);\n }\n}\n","export const CLOCK_ID = '0x0000000000000000000000000000000000000000000000000000000000000006';\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { MoveNumber } from '../common/transaction';\n\nexport class FeeContract extends BaseContract {\n static ModuleName = 'fee_module';\n\n static MethodName = {\n set_streaming_fee: 'set_streaming_fee',\n set_claim_fee: 'set_claim_fee',\n set_streaming_flat_fee: 'set_streaming_flat_fee',\n streaming_flat_fee: 'streaming_flat_fee',\n streaming_fee: 'streaming_fee',\n claim_fee: 'claim_fee',\n fee_denominator: 'fee_denominator',\n } as const;\n\n constructor(\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {\n super(FeeContract.ModuleName, config, globals);\n }\n\n setStreamingFee(txb: TransactionBlock, createFeeNumerator: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_streaming_fee,\n arguments: [roleObject, feeObject, createFeeNumerator],\n typeArgs: [],\n });\n }\n\n setStreamingFlatFee(txb: TransactionBlock, flatFee: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_streaming_flat_fee,\n arguments: [roleObject, feeObject, flatFee],\n typeArgs: [],\n });\n }\n\n setClaimFee(txb: TransactionBlock, claimFee: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_claim_fee,\n arguments: [roleObject, feeObject, claimFee],\n typeArgs: [],\n });\n }\n\n streamingFee(txb: TransactionBlock, amount: MoveNumber) {\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.streaming_fee,\n arguments: [feeObject, amount],\n typeArgs: [],\n });\n }\n\n claimFee(txb: TransactionBlock, amount: MoveNumber) {\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.claim_fee,\n arguments: [this.feeObject(), amount],\n typeArgs: [],\n });\n }\n\n feeDenominator(txb: TransactionBlock) {\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.fee_denominator,\n arguments: [this.feeObject()],\n typeArgs: [],\n });\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { Ref, ObjectId, MoveNumber } from '../common/transaction';\n\nexport class StreamContract extends BaseContract {\n static ModuleName = 'stream';\n\n static MethodName = {\n create_stream: 'create_stream',\n set_auto_claim: 'set_auto_claim',\n cancel_stream: 'cancel_stream',\n claim_stream: 'claim_stream',\n claim_stream_by_proxy: 'claim_stream_by_proxy',\n stream_current_epoch: 'stream_current_epoch',\n now_milli_seconds: 'now_milli_seconds',\n } as const;\n\n constructor(\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {\n super(StreamContract.ModuleName, config, globals);\n }\n\n createStream(\n txb: TransactionBlock,\n input: {\n paymentCoin: Ref<ObjectId>;\n flatFeeCoin: Ref<ObjectId>;\n metadata: string;\n recipient: string;\n timeStart: Ref<MoveNumber>;\n cliff: Ref<MoveNumber>;\n epochInterval: Ref<MoveNumber>;\n numEpoch: Ref<MoveNumber>;\n amountPerEpoch: Ref<MoveNumber>;\n cancelable: boolean;\n coinType: string;\n },\n ) {\n const feeObject = this.feeObject();\n const vaultObject = this.vaultObject();\n const paymentCoinObject = this.makeObject(input.paymentCoin);\n const flatFeeObject = this.makeObject(input.flatFeeCoin);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.create_stream,\n arguments: [\n feeObject,\n vaultObject,\n paymentCoinObject,\n flatFeeObject,\n input.metadata,\n input.recipient,\n input.timeStart,\n input.cliff,\n input.epochInterval,\n input.numEpoch,\n input.amountPerEpoch,\n input.cancelable,\n clockObject,\n ],\n typeArgs: [input.coinType],\n });\n }\n\n setAutoClaim(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n enabled: boolean;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.set_auto_claim,\n arguments: [streamObject, input.enabled],\n typeArgs: [input.coinType],\n });\n }\n\n cancelStream(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.cancel_stream,\n arguments: [streamObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n claimStream(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.claim_stream,\n arguments: [streamObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n claimStreamByProxy(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const vaultObject = this.vaultObject();\n const feeObject = this.feeObject();\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.claim_stream_by_proxy,\n arguments: [streamObject, vaultObject, feeObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n get createStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.create_stream}`;\n }\n\n get setAutoClaimTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.set_auto_claim}`;\n }\n\n get cancelStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.cancel_stream}`;\n }\n\n get claimStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream}`;\n }\n\n get claimStreamByProxyTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream_by_proxy}`;\n }\n}\n","import {\n CoinMetadata,\n SuiClient,\n SuiObjectChangeCreated,\n SuiTransactionBlockResponse,\n DevInspectResults,\n} from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { TransactionFailedError } from '../error/TransactionFailedError';\nimport {\n IMPayHelper,\n CreateStreamInfo,\n PaymentWithFee,\n MPayFees,\n Fraction,\n CalculatedStreamAmount,\n CalculatedTimeline,\n} from '../types/client';\n\n// Minimum time interval is 1 second\nexport const MIN_INTERVAL_MS = 1000;\n\nexport class MPayHelper implements IMPayHelper {\n private readonly coinMetaHelper: CoinMetaHelper;\n\n private readonly createStreamHelper: CreateStreamHelper;\n\n constructor(public readonly globals: Globals) {\n this.coinMetaHelper = new CoinMetaHelper(globals.suiClient);\n this.createStreamHelper = new MPayBuilder(globals).createStreamHelper();\n }\n\n getStreamIdsFromCreateStreamResponse(res: SuiTransactionBlockResponse) {\n if (res.effects?.status.status !== 'success') {\n throw new TransactionFailedError(res.effects?.status.status, res.effects?.status.error);\n }\n return res\n .objectChanges!.filter(\n (change) =>\n change.type === 'created' &&\n change.objectType.startsWith(`${this.globals.envConfig.contract.contractId}::stream::Stream`),\n )\n .map((change) => (change as SuiObjectChangeCreated).objectId);\n }\n\n calculateCreateStreamFees(info: CreateStreamInfo): PaymentWithFee {\n return this.createStreamHelper.calculateCreateStreamFees(info);\n }\n\n feeParams(): MPayFees {\n return this.createStreamHelper.feeParams();\n }\n\n calculateStreamAmount(input: { totalAmount: bigint; steps: bigint; cliff?: Fraction }): CalculatedStreamAmount {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const cliffFraction = input.cliff\n ? input.cliff\n : {\n numerator: 0n,\n denominator: 100n,\n };\n const cliffAmount = (input.totalAmount * cliffFraction.numerator) / cliffFraction.denominator;\n const amountPerStep = (input.totalAmount - cliffAmount) / input.steps;\n const realTotalAmount = amountPerStep * input.steps + cliffAmount;\n\n const res = {\n realTotalAmount,\n cliffAmount,\n amountPerStep,\n };\n this.validateStreamAmount(res, input.totalAmount);\n return res;\n }\n\n calculateTimelineByInterval(input: { timeStart: DateTime; interval: Duration; steps: bigint }): CalculatedTimeline {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const timeEnd = input.timeStart.plus(input.interval.toMillis() * Number(input.steps));\n\n const res = {\n timeStart: input.timeStart,\n timeEnd,\n interval: input.interval,\n steps: input.steps,\n };\n this.validateTimeline(res);\n return res;\n }\n\n calculateTimelineByTotalDuration(input: { timeStart: DateTime; total: Duration; steps: bigint }): CalculatedTimeline {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const intervalMilli = BigInt(input.total.toMillis()) / input.steps;\n const timeEnd = input.timeStart.plus(Duration.fromMillis(Number(intervalMilli * input.steps)));\n const res = {\n timeStart: input.timeStart,\n timeEnd,\n interval: Duration.fromMillis(Number(intervalMilli)),\n steps: input.steps,\n };\n this.validateTimeline(res);\n return res;\n }\n\n async getBalance(address: string, coinType?: string | null) {\n const balance = await this.globals.suiClient.getBalance({\n owner: address,\n coinType,\n });\n const coinMeta = await this.getCoinMeta(coinType);\n return {\n ...balance,\n coinType: normalizeStructTag(balance.coinType),\n coinMeta,\n };\n }\n\n async getAllBalance(address: string) {\n const allBalance = await this.globals.suiClient.getAllBalances({\n owner: address,\n });\n const coinMetas = await Promise.all(allBalance.map((bal) => this.getCoinMeta(bal.coinType)));\n return allBalance.map((bal, i) => ({\n ...bal,\n coinType: normalizeStructTag(bal.coinType),\n coinMeta: coinMetas[i],\n }));\n }\n\n async getCoinMeta(coinType: string | null | undefined) {\n return this.coinMetaHelper.getCoinMeta(coinType);\n }\n\n async simulateTransactionBlock(txb: TransactionBlock): Promise<DevInspectResults> {\n return this.globals.suiClient.devInspectTransactionBlock({\n transactionBlock: txb,\n sender: await this.globals.wallet.address(),\n });\n }\n\n private validateStreamAmount(val: CalculatedStreamAmount, originTotalAmount: bigint) {\n if (val.amountPerStep === 0n) {\n throw new InvalidInputError('Stream amount too small', 'totalAmount', originTotalAmount);\n }\n if (val.cliffAmount > val.realTotalAmount) {\n throw new InvalidInputError('Invalid cliff settings');\n }\n }\n\n private validateTimeline(val: CalculatedTimeline) {\n if (val.interval.toMillis() < MIN_INTERVAL_MS) {\n throw new InvalidInputError('Interval shall be at least 1 second', 'interval', val.interval);\n }\n }\n}\n\nexport class CoinMetaHelper {\n private coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(private readonly suiClient: SuiClient) {\n this.coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string | null | undefined): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType || SUI_TYPE_ARG);\n if (this.coinMetaReg.has(normalized)) {\n return this.coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this.coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this.suiClient.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class TransactionFailedError extends MPayError {\n constructor(status: string | undefined, msg: string | undefined) {\n super(MPayErrorCode.TransactionFailed, `Transaction failed: ${msg}`, {\n context: {\n status,\n msg,\n },\n });\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { DateTime } from 'luxon';\n\nimport { Stream } from './Stream';\nimport { StreamGroup } from './StreamGroup';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { SuiIterator } from '../sui/iterator/iterator';\nimport { ObjectBatchIterator, ListOidIterator } from '../sui/iterator/object';\nimport {\n StreamRef,\n BackendIncomingStreamFilterOptions,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { IPagedStreamListIterator, IncomingStreamQuery, OutgoingStreamQuery } from '../types/client';\nimport { IStream, IStreamGroup, StreamStatus } from '../types/stream';\n\nexport class PagedStreamListIterator implements IPagedStreamListIterator {\n private constructor(\n public readonly it: StreamListIterator,\n public readonly pageSize: number,\n ) {}\n\n static async newIncoming(input: {\n globals: Globals;\n query?: IncomingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newIncoming(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n static async newOutgoing(input: {\n globals: Globals;\n query?: OutgoingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newOutgoing(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n async hasNext() {\n return this.it.hasNext();\n }\n\n async next(): Promise<(IStream | IStreamGroup)[]> {\n const res: (IStream | IStreamGroup)[] = [];\n while (res.length < this.pageSize && (await this.it.hasNext())) {\n res.push(await this.it.next());\n }\n return res;\n }\n}\n\nexport class StreamListIterator implements SuiIterator<IStream | IStreamGroup> {\n cachedNext: IStream | IStreamGroup | undefined | null;\n\n private constructor(private readonly requester: StreamListRequester) {}\n\n static async newIncoming(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const requester = await StreamListRequester.newIncomingQuery(input);\n return new StreamListIterator(requester);\n }\n\n static async newOutgoing(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const requester = await StreamListRequester.newOutgoingQuery(input);\n return new StreamListIterator(requester);\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cachedNext === undefined) {\n this.cachedNext = await this.requester.doNextRequest();\n }\n return this.cachedNext !== null;\n }\n\n async next(): Promise<IStream | IStreamGroup> {\n if (this.cachedNext === undefined) {\n const res = await this.requester.doNextRequest();\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res;\n }\n const res = this.cachedNext;\n this.cachedNext = undefined;\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res as IStream | IStreamGroup;\n }\n}\n\nexport class StreamListRequester {\n public current = 0;\n\n public objectIter: ObjectBatchIterator;\n\n private constructor(\n public readonly globals: Globals,\n public readonly recipient: string,\n public readonly groupRefs: StreamRef[][],\n public readonly query?: IncomingStreamQuery | OutgoingStreamQuery,\n ) {\n this.current = 0;\n const oidIter = new ListOidIterator(groupRefs.flat().map((ref) => ref.streamId));\n this.objectIter = new ObjectBatchIterator(globals.suiClient, oidIter);\n }\n\n static async newIncomingQuery(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const backendQuery = convertToIncomingBackendQuery(input.query);\n const recipient = await input.globals.walletAddress();\n const refs = await input.globals.backend.getIncomingStreams(recipient, backendQuery);\n const filtered = refs.filter((ref: any) => normalizeSuiAddress(ref.recipient) === normalizeSuiAddress(recipient));\n const groupedRefs = groupAndSortRefs(filtered);\n\n return new StreamListRequester(input.globals, recipient, groupedRefs, input.query);\n }\n\n static async newOutgoingQuery(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const backendQuery = convertToOutgoingBackendQuery(input.query);\n const sender = await input.globals.walletAddress();\n const refs = await input.globals.backend.getOutgoingStreams(sender, backendQuery);\n const groupedRefs = groupAndSortRefs(refs);\n return new StreamListRequester(input.globals, sender, groupedRefs, input.query);\n }\n\n async doNextRequest(): Promise<IStream | IStreamGroup | null> {\n if (this.current >= this.groupRefs.length) {\n return null;\n }\n const stRefs = this.groupRefs[this.current];\n if (stRefs.length === 1) {\n const stream = await getStreamFromIterator(this.globals, stRefs[0].streamId, this.objectIter);\n this.current++;\n return isStreamOfQuery(stream, this.query) ? stream : this.doNextRequest();\n }\n if (stRefs.length > 1) {\n const sg = await getStreamGroupFromIterator(\n this.globals,\n stRefs.map((ref) => ref.streamId),\n this.objectIter,\n );\n this.current++;\n return isStreamGroupOfQuery(sg, this.query) ? sg : this.doNextRequest();\n }\n throw new SanityError('Stream group with no stream');\n }\n}\n\nexport function groupAndSortRefs(refs: StreamRef[]) {\n const m = new Map<string, StreamRef[]>();\n refs.forEach((ref) => {\n const groupList = m.get(ref.groupId);\n if (groupList) {\n groupList.push(ref);\n m.set(ref.groupId, groupList);\n } else {\n m.set(ref.groupId, [ref]);\n }\n });\n return Array.from(m.values()).sort(\n (gl1, gl2) => DateTime.fromISO(gl2[0].createDate).toMillis() - DateTime.fromISO(gl1[0].createDate).toMillis(),\n );\n}\n\nfunction isStreamOfQuery(stream: IStream, query: IncomingStreamQuery | OutgoingStreamQuery | undefined) {\n if (query === undefined) {\n return true;\n }\n const isStatus = isStreamOfStatus(stream, query.status);\n if (query && 'claimable' in query && query.claimable !== undefined) {\n const isClaimable = query.claimable ? stream.progress.claimable !== 0n : stream.progress.claimable === 0n;\n return isStatus && isClaimable;\n }\n return isStatus;\n}\n\nfunction isStreamOfStatus(stream: IStream, filter: StreamStatus | StreamStatus[] | undefined): boolean {\n if (filter === undefined) {\n return true;\n }\n if (!Array.isArray(filter)) {\n return stream.progress.status === filter;\n }\n return filter.includes(stream.progress.status);\n}\n\nfunction isStreamGroupOfQuery(sg: IStreamGroup, query: IncomingStreamQuery | OutgoingStreamQuery | undefined): boolean {\n if (!query) {\n return true;\n }\n let isStatus = false;\n sg.streams.forEach((stream) => {\n if (isStreamOfQuery(stream, query)) {\n isStatus = true;\n }\n });\n return isStatus;\n}\n\nasync function getStreamFromIterator(globals: Globals, streamId: string, it: ObjectBatchIterator) {\n const data = await getStreamObjectResponseFromIter(it, streamId);\n return Stream.fromObjectData(globals, streamId, data);\n}\n\nasync function getStreamGroupFromIterator(globals: Globals, streamIds: string[], it: ObjectBatchIterator) {\n const objResponses: SuiObjectResponse[] = [];\n while (objResponses.length < streamIds.length) {\n const data = await getStreamObjectResponseFromIter(it, streamIds[objResponses.length]);\n objResponses.push(data);\n }\n return StreamGroup.newFromObjectResponse(globals, streamIds, objResponses);\n}\n\nasync function getStreamObjectResponseFromIter(it: ObjectBatchIterator, streamId: string) {\n if (!(await it.hasNext())) {\n throw new SanityError('object iterator has been consumed');\n }\n const data = await it.next();\n if (!data || data.error || data.data === undefined || data.data === null) {\n throw new SanityError(`object iterator undefined response`, {\n cause: data?.error,\n });\n }\n if (data?.data?.objectId !== streamId) {\n throw new SanityError('stream id not aligned');\n }\n return data;\n}\n\n// Convert IncomingStreamQuery to BackendIncomingStreamFilterOptions\nfunction convertToIncomingBackendQuery(query?: IncomingStreamQuery): BackendIncomingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n sender: normalizeAddressFilter(query?.sender),\n };\n}\n\nfunction convertToOutgoingBackendQuery(query?: OutgoingStreamQuery): BackendOutgoingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n recipient: normalizeAddressFilter(query?.recipient),\n };\n}\n\nexport function convertStreamStatus(status: undefined | StreamStatus | StreamStatus[]): StreamFilterStatus {\n if (status === undefined || status.length === 0) {\n return 'all';\n }\n if (!Array.isArray(status)) {\n return convertStreamStatusSingle(status);\n }\n return status.reduce((res: StreamFilterStatus | undefined, st) => {\n const sts = convertStreamStatus(st);\n if (!res) {\n return sts;\n }\n if (res === sts) {\n return sts;\n }\n return 'all';\n }, undefined) as StreamFilterStatus;\n}\n\nfunction convertStreamStatusSingle(status: StreamStatus): StreamFilterStatus {\n switch (status) {\n case 'STREAMING':\n case 'STREAMED':\n case 'CANCELED':\n return 'active';\n case 'COMPLETED':\n case 'SETTLED':\n return 'inactive';\n default:\n throw new InvalidInputError('Unknown stream filtered status');\n }\n}\n\nfunction normalizeCoinTypeFilter(coinType: string | string[] | undefined) {\n if (!coinType) {\n return undefined;\n }\n if (!Array.isArray(coinType)) {\n return normalizeStructTag(coinType);\n }\n return coinType.length !== 0 ? coinType.map((ct) => normalizeStructTag(ct)) : undefined;\n}\n\nfunction normalizeAddressFilter(address: string | string[] | undefined) {\n if (!address) {\n return undefined;\n }\n if (!Array.isArray(address)) {\n return normalizeSuiAddress(address);\n }\n return address.length !== 0 ? address.map((addr) => normalizeSuiAddress(addr)) : undefined;\n}\n","import { SuiObjectData, SuiObjectResponse, SuiParsedData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { decodeMetadata } from './metadata';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { NotCreatorError } from '../error/NotCreatorError';\nimport { NotRecipientError } from '../error/NotRecipientError';\nimport { RpcError } from '../error/RpcError';\nimport { SanityError } from '../error/SanityError';\nimport { StreamNotFoundError } from '../error/StreamNotFoundError';\nimport { RawStreamData, RawStreamStatusEnum } from '../types/data';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStream, StreamInfo, StreamGroupCommonInfo, StreamProgress, StreamStatus } from '../types/stream';\nimport { MAX_U64, roundDateTime, roundDuration } from '../utils/utils';\n\nexport class Stream implements IStream {\n private readonly streamContract: StreamContract;\n\n public readonly type = 'Stream';\n\n constructor(\n public readonly globals: Globals,\n public readonly streamId: string,\n public rawData: RawStreamData,\n ) {\n this.streamContract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n static async new(globals: Globals, streamId: string) {\n const rawData = await Stream.fetchStreamData(globals, streamId);\n return new Stream(globals, streamId, rawData);\n }\n\n static fromObjectData(globals: Globals, streamId: string, data: SuiObjectResponse) {\n const rawData = Stream.parseRawStreamData(streamId, data);\n return new Stream(globals, streamId, rawData);\n }\n\n get info(): StreamInfo {\n return {\n name: this.name,\n creator: this.creator,\n coinType: this.coinType,\n totalAmount: this.totalAmount,\n start: this.timeStart,\n end: this.timeEnd,\n cancelable: this.cancelable,\n cliffAmount: this.cliff,\n duration: this.duration,\n interval: this.interval,\n steps: this.totalSteps,\n nextReleaseDate: this.nextReleaseDate,\n nextReleaseAmount: this.nextReleaseAmount,\n\n groupId: this.groupId,\n streamId: this.streamId,\n recipient: this.recipient,\n progress: this.progress,\n autoClaim: this.autoClaim,\n };\n }\n\n get groupCommonInfo(): StreamGroupCommonInfo {\n return {\n name: this.name,\n groupId: this.groupId,\n creator: this.creator,\n start: this.timeStart,\n interval: this.interval,\n steps: this.totalSteps,\n cancelable: this.cancelable,\n };\n }\n\n async refresh() {\n this.rawData = await Stream.fetchStreamData(this.globals, this.streamId);\n }\n\n refreshWithData(data: SuiObjectResponse) {\n if (data.data?.objectId !== this.streamId) {\n throw new SanityError('Object Id does not align');\n }\n this.rawData = Stream.parseRawStreamData(this.streamId, data);\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n streamId: this.streamId,\n pagination,\n });\n }\n\n async cancel() {\n if ((await this.globals.walletAddress()) !== this.creator) {\n throw new NotCreatorError();\n }\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async claim() {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.claimStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async setAutoClaim(enabled: boolean) {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.setAutoClaim(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n enabled,\n });\n return txb;\n }\n\n async claimByProxy() {\n const txb = new TransactionBlock();\n this.streamContract.claimStreamByProxy(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get client() {\n return this.globals.suiClient;\n }\n\n get coinType() {\n return normalizeStructTag(this.rawData.coinType);\n }\n\n get progress(): StreamProgress {\n return {\n status: this.streamStatus,\n total: this.totalAmount,\n streamed: this.streamedAmount,\n claimed: this.claimedAmount,\n claimable: this.claimable,\n canceled: this.canceledAmount,\n };\n }\n\n get balance() {\n return this.rawData.balance;\n }\n\n get autoClaim() {\n return this.rawData.autoClaim;\n }\n\n get amountPerEpoch() {\n return this.rawData.config.amountPerEpoch;\n }\n\n get cancelable() {\n return this.rawData.config.cancelable;\n }\n\n get cliff() {\n return this.rawData.config.cliff;\n }\n\n get creator() {\n return this.rawData.config.creator;\n }\n\n get interval(): Duration {\n return roundDuration(this.rawData.config.epochInterval);\n }\n\n get groupId() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.groupId;\n }\n\n get name() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.name;\n }\n\n get recipient() {\n return this.rawData.config.recipient;\n }\n\n get timeStart(): DateTime {\n return roundDateTime(this.rawData.config.timeStart);\n }\n\n get duration(): Duration {\n const rawConfig = this.rawData.config;\n const duration = rawConfig.epochInterval * rawConfig.totalEpoch;\n return roundDuration(duration);\n }\n\n get timeEnd(): DateTime {\n return this.timeStart.plus(this.duration);\n }\n\n get totalSteps(): bigint {\n return this.rawData.config.totalEpoch;\n }\n\n get claimable(): bigint {\n return this.streamedAmount - this.claimedAmount;\n }\n\n get nextReleaseDate(): DateTime | null {\n if (this.currentEpoch === -1n) {\n return this.timeStart;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return roundDateTime((this.currentEpoch + 1n) * this.rawData.config.epochInterval + this.rawData.config.timeStart);\n }\n\n get nextReleaseAmount(): bigint | null {\n if (this.currentEpoch === -1n) {\n return this.cliff;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return this.amountPerEpoch;\n }\n\n get streamStatus(): StreamStatus {\n const rawStatus = this.rawData.status.status;\n if (rawStatus === RawStreamStatusEnum.CANCELED) {\n return StreamStatus.CANCELED;\n }\n if (rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED) {\n return StreamStatus.SETTLED;\n }\n if (rawStatus === RawStreamStatusEnum.COMPLETED) {\n return StreamStatus.COMPLETED;\n }\n if (this.currentEpoch >= this.totalSteps) {\n return StreamStatus.STREAMED;\n }\n return StreamStatus.STREAMING;\n }\n\n get streamedAmount() {\n if (this.currentEpoch === -1n) {\n return 0n;\n }\n if (this.isCanceled) {\n return this.rawData.status.epochCanceled * this.amountPerEpoch + this.cliff;\n }\n return this.currentEpoch * this.amountPerEpoch + this.cliff;\n }\n\n get claimedAmount() {\n if (this.rawData.status.epochClaimed === MAX_U64) {\n return 0n;\n }\n return this.rawData.status.epochClaimed * this.amountPerEpoch + this.cliff;\n }\n\n get currentEpoch() {\n const timeNowMs = DateTime.now().toMillis();\n const timeStartMs = this.timeStart.toMillis();\n if (timeNowMs < timeStartMs) {\n return -1n;\n }\n const epoch = Math.floor((timeNowMs - timeStartMs) / Number(this.rawData.config.epochInterval));\n return BigInt(epoch) > Number(this.rawData.config.totalEpoch) ? this.rawData.config.totalEpoch : BigInt(epoch);\n }\n\n get totalAmount() {\n const rawConfig = this.rawData.config;\n return rawConfig.amountPerEpoch * rawConfig.totalEpoch + rawConfig.cliff;\n }\n\n get isCanceled() {\n const rawStatus = this.rawData.status.status;\n return rawStatus === RawStreamStatusEnum.CANCELED || rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED;\n }\n\n get canceledAmount() {\n return this.isCanceled ? this.totalAmount - this.streamedAmount : 0n;\n }\n\n private static async fetchStreamData(globals: Globals, streamId: string) {\n const res = await globals.suiClient.getObject({\n id: streamId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n return Stream.parseRawStreamData(streamId, res);\n }\n\n static parseRawStreamData(streamId: string, res: SuiObjectResponse): RawStreamData {\n if (res.error) {\n if (res.error.code === 'notExists') {\n throw new StreamNotFoundError(streamId);\n }\n throw new RpcError(`get stream data: ${res.error.code}`, {\n streamId,\n ...res.error,\n });\n }\n const content = (res.data as SuiObjectData).content as SuiParsedData;\n if (content.dataType !== 'moveObject') {\n throw new RpcError('Unexpected object type', {\n gotType: content.dataType,\n });\n }\n const { typeParams } = parseStructTag(content.type);\n const coinType = normalizeStructTag(typeParams[0]);\n\n const dataFields = content.fields as any;\n const config = dataFields.config.fields as any;\n const status = dataFields.status.fields as any;\n\n return {\n coinType,\n autoClaim: dataFields.auto_claim as boolean,\n balance: BigInt(dataFields.balance.fields.balance),\n config: {\n amountPerEpoch: BigInt(config.amount_per_epoch),\n cancelable: config.cancelable,\n cliff: BigInt(config.cliff),\n creator: config.creator,\n epochInterval: BigInt(config.epoch_interval),\n metadata: config.metadata,\n recipient: config.recipient,\n timeStart: BigInt(config.time_start),\n totalEpoch: BigInt(config.total_epoch),\n },\n status: {\n status: status.status as RawStreamStatusEnum,\n epochCanceled: BigInt(status.epoch_canceled),\n epochClaimed: BigInt(status.epoch_claimed),\n },\n };\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotCreatorError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotCreator, 'Connected wallet is not creator');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotRecipientError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class RpcError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.RpcError, msg, {\n context,\n });\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\n/**\n * SanityError is the error reported because of error in code.\n * For normal user process, the sanity error shall never be thrown.\n */\nexport class SanityError extends MPayError {\n constructor(msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n super(MPayErrorCode.sanity, msg, options);\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class StreamNotFoundError extends MPayError {\n constructor(streamId: string) {\n super(MPayErrorCode.StreamNotFound, 'Stream not found', {\n context: {\n streamId,\n },\n });\n }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\n// eslint-disable-next-line no-bitwise\nexport const MAX_U64 = (1n << 64n) - 1n;\n\nexport const TIME_ROUND_UNIT = 1000;\n\n// roundTime round date to seconds\nexport function roundDateTime(date: DateTime | number | bigint) {\n let dateMs: number;\n if (typeof date === 'number') {\n dateMs = date;\n } else if (typeof date === 'bigint') {\n dateMs = Number(date);\n } else {\n dateMs = date.toMillis();\n }\n const roundMs = Math.round(dateMs / TIME_ROUND_UNIT);\n return DateTime.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n\nexport function roundDuration(duration: Duration | number | bigint) {\n let durationMs: number;\n if (typeof duration === 'number') {\n durationMs = duration;\n } else if (typeof duration === 'bigint') {\n durationMs = Number(duration);\n } else {\n durationMs = duration.toMillis();\n }\n const roundMs = Math.round(durationMs / TIME_ROUND_UNIT);\n return Duration.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidStreamGroupError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.InvalidStreamGroup, `Invalid stream group: ${msg}`, { context });\n }\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiClient, SuiObjectDataOptions, SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { SuiIterator, getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\nexport const REQUEST_PAGE_SIZE = 25;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n suiClient: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectResponse | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(suiClient, oidIter, options);\n return (await getAllFromIterator(iter)) as SuiObjectResponse[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectResponse> {\n constructor(\n public readonly suiClient: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(suiClient, idIter, options));\n }\n}\n\n// TODO: Unit test this class\nexport class ObjectBatchRequester implements Requester<SuiObjectResponse> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly suiClient: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectResponse>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res = await this.suiClient.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { Stream } from './Stream';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { InvalidStreamGroupError } from '../error/InvalidStreamGroupError';\nimport { SanityError } from '../error/SanityError';\nimport { getObjectsById } from '../sui/iterator/object';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStreamGroup, StreamGroupInfo, StreamGroupProgress, StreamGroupCommonInfo } from '../types/stream';\n\nexport class StreamGroup implements IStreamGroup {\n public readonly type = 'StreamGroup';\n\n constructor(\n public readonly globals: Globals,\n public readonly streams: Stream[],\n ) {\n if (streams.length === 0) {\n throw new InvalidStreamGroupError('stream size 0');\n }\n const gids = streams.map((st) => st.groupId);\n const set = new Set(gids);\n if (set.size !== 1) {\n throw new InvalidInputError('Stream does not have same group ID');\n }\n }\n\n static async new(globals: Globals, ids: string[]) {\n const streamObjs = await getObjectsById(globals.suiClient, ids);\n streamObjs.forEach((obj) => {\n if (!obj) {\n throw new SanityError('stream group object data undefined');\n }\n });\n return StreamGroup.newFromObjectResponse(globals, ids, streamObjs as SuiObjectResponse[]);\n }\n\n static async newFromObjectResponse(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = await StreamGroup.parseGroupStreams(globals, ids, responses);\n return new StreamGroup(globals, streams);\n }\n\n static checkStreamGroup(streams: Stream[]) {\n const commonInfos = streams.map((stream) => stream.groupCommonInfo);\n const expInfo = commonInfos[0];\n let isEqual = true;\n commonInfos.forEach((info) => {\n if (!isEqualStreamGroupCommonInfo(expInfo, info)) {\n isEqual = false;\n }\n });\n return isEqual;\n }\n\n async refresh() {\n const streamObjs = await getObjectsById(\n this.globals.suiClient,\n this.streams.map((stream) => stream.streamId),\n );\n this.streams.forEach((stream, i) => {\n stream.refreshWithData(streamObjs[i] as SuiObjectResponse);\n });\n }\n\n get groupId() {\n return this.streams[0].groupId;\n }\n\n get creator() {\n return this.streams[0].creator;\n }\n\n get info(): StreamGroupInfo {\n return {\n groupId: this.groupId,\n streamIds: this.streams.map((st) => st.streamId),\n progress: this.progress,\n\n name: this.streams[0].name,\n creator: this.creator,\n coinType: this.streams[0].coinType,\n totalAmount: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n start: this.streams[0].timeStart,\n end: this.streams[0].timeEnd,\n cancelable: this.streams[0].cancelable,\n cliffAmount: this.streams.reduce((sum, st) => sum + st.cliff, 0n),\n duration: this.streams[0].duration,\n interval: this.streams[0].interval,\n steps: this.streams[0].totalSteps,\n nextReleaseAmount: this.streams.reduce((sum, st) => {\n if (st.nextReleaseAmount === null) {\n return sum;\n }\n return sum + st.nextReleaseAmount;\n }, 0n),\n nextReleaseDate: this.streams[0].nextReleaseDate,\n };\n }\n\n get progress(): StreamGroupProgress {\n return {\n total: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n streamed: this.streams.reduce((sum, st) => sum + st.streamedAmount, 0n),\n claimed: this.streams.reduce((sum, st) => sum + st.claimedAmount, 0n),\n claimable: this.streams.reduce((sum, st) => sum + st.claimable, 0n),\n canceled: this.streams.reduce((sum, st) => sum + st.canceledAmount, 0n),\n };\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n groupId: this.groupId,\n pagination,\n });\n }\n\n private static async parseGroupStreams(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = responses\n .map((obj, i) => Stream.fromObjectData(globals, ids[i], obj))\n .filter((stream) => !!stream) as Stream[];\n\n if (new Set(streams.map((st) => st.groupId)).size !== 1) {\n throw new InvalidStreamGroupError('Not same group ID');\n }\n if (!this.checkStreamGroup(streams)) {\n throw new InvalidStreamGroupError('Not same stream settings');\n }\n return streams;\n }\n}\n\nfunction isEqualStreamGroupCommonInfo(info1: StreamGroupCommonInfo, info2: StreamGroupCommonInfo): boolean {\n return (\n info1.name === info2.name &&\n info1.groupId === info2.groupId &&\n info1.creator === info2.creator &&\n info1.start.toMillis() === info2.start.toMillis() &&\n info1.interval.toMillis() === info2.interval.toMillis() &&\n info1.steps === info2.steps &&\n info1.cancelable === info2.cancelable\n );\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotEnoughBalanceError extends MPayError {\n constructor(\n public readonly coinType: string,\n public readonly requestAmount: bigint,\n public readonly gotAmount: bigint,\n ) {\n super(MPayErrorCode.NotEnoughBalance, `Not enough balance: ${coinType}`, {\n context: {\n coinType,\n requestAmount,\n gotAmount,\n },\n });\n }\n}\n","import { SuiClient, CoinStruct } from '@mysten/sui.js/client';\n\nimport { getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { NotEnoughBalanceError } from '../../error/NotEnoughBalanceError';\nimport { SanityError } from '../../error/SanityError';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n suiClient: SuiClient,\n owner: string,\n requestAmount: bigint,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const it = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n let totalAmount = BigInt(0);\n const res: CoinStruct[] = [];\n while ((await it.hasNext()) && totalAmount < requestAmount) {\n const val = await it.next();\n if (!val) {\n continue;\n }\n res.push(val);\n totalAmount += BigInt(val.balance);\n }\n if (totalAmount < requestAmount) {\n throw new NotEnoughBalanceError(coinType, requestAmount, totalAmount);\n }\n return res;\n}\n\nexport async function getAllOwnedCoins(\n suiClient: SuiClient,\n owner: string,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const iter = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n return (await getAllFromIterator(iter)) as CoinStruct[];\n}\n\nexport class OwnedCoinIterator extends EntryIterator<CoinStruct> {\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n super(new OwnedCoinRequester(suiClient, owner, coinType, reqPageSize));\n }\n}\n\nexport class OwnedCoinRequester implements Requester<CoinStruct> {\n nextCursor: string | null | undefined;\n\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n if (reqPageSize <= 0) {\n throw new SanityError('Invalid reqPageSize');\n }\n }\n\n async doNextRequest(): Promise<PagedData<CoinStruct>> {\n const res = await this.suiClient.getCoins({\n owner: this.owner,\n coinType: this.coinType,\n cursor: this.nextCursor,\n limit: this.reqPageSize,\n });\n this.nextCursor = res.nextCursor;\n return {\n data: res.data,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\n\nexport abstract class StreamIntention<T> extends BaseIntentionLegacy<T> {\n public application = 'mpay';\n\n getClient(network: SuiNetworks, account: WalletAccount): MPayClient {\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n return mpayClient;\n }\n}\n","import { ClaimByProxyStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimByProxyStreamIntention extends StreamIntention<ClaimByProxyStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CLAIM_BY_PROXY;\n\n constructor(public readonly data: ClaimByProxyStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.claimByProxy();\n }\n}\n","import { ClaimStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimStreamIntention extends StreamIntention<ClaimStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.claim();\n }\n}\n","import { CreateStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CreateStreamIntention extends StreamIntention<CreateStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CREATE_STREAM;\n\n constructor(public readonly data: CreateStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n return mpayClient.createStream(this.data);\n }\n}\n","// Helper class to decode move call\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return BigInt(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { Globals } from '../common';\nimport { MoveCallHelper } from './moveCall';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { decodeMetadata } from '../stream/metadata';\nimport { isSameTarget } from '../sui/utils';\nimport { CreateStreamInfo, RecipientWithAmount } from '../types/client';\nimport { DecodedCreateStream, StreamTransactionType } from '../types/decode';\n\nexport class CreateStreamDecodeHelper {\n constructor(\n public readonly globals: Globals,\n public readonly txb: TransactionBlock,\n ) {}\n\n decode(): DecodedCreateStream {\n const streamInfo = this.decodeCreateStreamInfo();\n const fees = this.createStreamHelper().calculateCreateStreamFees(streamInfo);\n return {\n type: StreamTransactionType.CREATE_STREAM,\n info: streamInfo,\n fees,\n };\n }\n\n private decodeCreateStreamInfo(): CreateStreamInfo {\n const moveCalls = this.createStreamTransactions();\n const infos = moveCalls.map((moveCall) => this.getCreationInfoFromMoveCall(moveCall));\n return this.aggregateGroupStreamInfo(infos);\n }\n\n private createStreamTransactions(): MoveCallHelper[] {\n const txs = this.transactions.filter(\n (tx) => tx.kind === 'MoveCall' && isSameTarget(tx.target, this.contract.createStreamTarget),\n ) as MoveCallTransaction[];\n if (txs.length === 0) {\n throw new SanityError('No create stream transactions');\n }\n return txs.map((tx) => new MoveCallHelper(tx, this.txb));\n }\n\n private getCreationInfoFromMoveCall(moveCall: MoveCallHelper): SingleStreamCreationInfo {\n const metadata = moveCall.decodeInputString(4);\n const { name, groupId } = decodeMetadata(metadata);\n\n const recipient = moveCall.decodeInputAddress(5);\n const timeStart = moveCall.decodeInputU64(6);\n const cliff = moveCall.decodeInputU64(7);\n const epochInterval = moveCall.decodeInputU64(8);\n const totalEpoch = moveCall.decodeInputU64(9);\n const amountPerEpoch = moveCall.decodeInputU64(10);\n const cancelable = moveCall.decodeInputBool(11);\n const coinType = moveCall.typeArg(0);\n\n return {\n name,\n groupId,\n recipient,\n timeStart,\n cliff,\n epochInterval,\n totalEpoch,\n amountPerEpoch,\n cancelable,\n coinType,\n };\n }\n\n private aggregateGroupStreamInfo(infos: SingleStreamCreationInfo[]): CreateStreamInfo {\n const commonInfoSet = new Set(\n infos.map((info) =>\n JSON.stringify({\n name: info.name,\n groupId: info.groupId,\n timeStart: String(info.timeStart),\n epochInterval: String(info.epochInterval),\n totalEpoch: String(info.totalEpoch),\n cancelable: info.cancelable,\n coinType: info.coinType,\n }),\n ),\n );\n if (commonInfoSet.size !== 1) {\n throw new InvalidInputError('Stream group not have common info');\n }\n const recipients: RecipientWithAmount[] = infos.map((info) => ({\n address: info.recipient,\n amountPerStep: info.amountPerEpoch,\n cliffAmount: info.cliff,\n }));\n return {\n name: infos[0].name,\n coinType: infos[0].coinType,\n recipients,\n interval: infos[0].epochInterval,\n steps: infos[0].totalEpoch,\n startTimeMs: infos[0].timeStart,\n cancelable: infos[0].cancelable,\n };\n }\n\n private mergeCoinTransactions() {\n return this.transactions.filter((tx) => tx.kind === 'MergeCoins');\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get contract() {\n return new StreamContract(this.globals.envConfig.contract, this.globals);\n }\n\n private get feeContract() {\n return new FeeContract(this.globals.envConfig.contract, this.globals);\n }\n\n private createStreamHelper() {\n return new CreateStreamHelper(this.globals, this.feeContract, this.contract);\n }\n\n private getInputArg(arg: TransactionArgument) {\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return 'value' in arg ? arg : this.txb.blockData.inputs[arg.index];\n }\n}\n\ninterface SingleStreamCreationInfo {\n name: string;\n groupId: string;\n recipient: string;\n timeStart: bigint;\n cliff: bigint;\n epochInterval: bigint;\n totalEpoch: bigint;\n amountPerEpoch: bigint;\n cancelable: boolean;\n coinType: string;\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamDecodeHelper } from './create';\nimport { MoveCallHelper } from './moveCall';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { isSameTarget } from '../sui/utils';\nimport {\n DecodedCancelStream,\n DecodedClaimByProxy,\n DecodedClaimStream,\n DecodedCreateStream,\n DecodedSetAutoClaim,\n StreamDecodedTransaction,\n StreamTransactionType,\n} from '../types/decode';\n\nexport class StreamTransactionDecoder {\n static decodeTransaction(globals: Globals, txb: TransactionBlock): StreamDecodedTransaction {\n const helper = new DecodeHelper(globals, txb);\n return helper.decode();\n }\n}\n\nexport class DecodeHelper {\n private readonly contract: StreamContract;\n\n constructor(\n public readonly globals: Globals,\n public readonly txb: TransactionBlock,\n ) {\n this.contract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n decode(): StreamDecodedTransaction {\n if (this.isCreateStreamTransaction()) {\n return this.decodeCreateStreamTransaction();\n }\n if (this.isClaimByProxyTransaction()) {\n return this.decodeClaimByProxyTransaction();\n }\n if (this.isSetAutoClaimTransaction()) {\n return this.decodeSetAutoClaimTransaction();\n }\n if (this.isCancelStreamTransaction()) {\n return this.decodeCancelStreamTransaction();\n }\n if (this.isClaimStreamTransaction()) {\n return this.decodeClaimTransaction();\n }\n throw new Error('Unknown stream transaction type');\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private isCreateStreamTransaction() {\n const createStreamIndex = this.transactions.findIndex(\n (tx) => tx.kind === 'MoveCall' && isSameTarget(tx.target, this.contract.createStreamTarget),\n );\n return createStreamIndex !== -1;\n }\n\n private isSetAutoClaimTransaction() {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.setAutoClaimTarget)\n );\n }\n\n private isCancelStreamTransaction() {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.cancelStreamTarget)\n );\n }\n\n private isClaimStreamTransaction(): boolean {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.claimStreamTarget)\n );\n }\n\n private isClaimByProxyTransaction(): boolean {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.claimStreamByProxyTarget)\n );\n }\n\n private decodeCreateStreamTransaction(): DecodedCreateStream {\n const helper = new CreateStreamDecodeHelper(this.globals, this.txb);\n return helper.decode();\n }\n\n private decodeSetAutoClaimTransaction(): DecodedSetAutoClaim {\n const streamId = this.helper.decodeSharedObjectId(0);\n const enabled = this.helper.decodeInputBool(1);\n return {\n type: StreamTransactionType.SET_AUTO_CLAIM,\n streamId,\n enabled,\n };\n }\n\n private decodeClaimTransaction(): DecodedClaimStream {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CLAIM,\n streamId,\n };\n }\n\n private decodeClaimByProxyTransaction(): DecodedClaimByProxy {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CLAIM_BY_PROXY,\n streamId,\n };\n }\n\n private decodeCancelStreamTransaction(): DecodedCancelStream {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CANCEL,\n streamId,\n };\n }\n\n private get helper() {\n const moveCall = this.transactions[0] as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n","import { SetAutoClaimIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class SetAutoClaimStreamIntention extends StreamIntention<SetAutoClaimIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.SET_AUTO_CLAIM;\n\n constructor(public readonly data: SetAutoClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.setAutoClaim(this.data.enabled);\n }\n}\n","import {\n CancelStreamIntentionData,\n ClaimByProxyStreamIntentionData,\n ClaimStreamIntentionData,\n CreateStreamIntentionData,\n SetAutoClaimIntentionData,\n TransactionType,\n} from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { CancelStreamIntention } from './cancel-stream';\nimport { ClaimByProxyStreamIntention } from './claim-by-proxy-stream';\nimport { ClaimStreamIntention } from './claim-stream';\nimport { Env, Globals } from './common';\nimport { CreateStreamIntention } from './create-stream';\nimport { DecodeHelper } from './decoder/decoder';\nimport { SetAutoClaimStreamIntention } from './set-auto-claim-stream';\nimport { StreamTransactionType } from './types/decode';\n\nexport type MPayIntention =\n | CreateStreamIntention\n | SetAutoClaimStreamIntention\n | ClaimStreamIntention\n | CancelStreamIntention\n | ClaimByProxyStreamIntention;\n\nexport type MPayIntentionData =\n | CreateStreamIntentionData\n | SetAutoClaimIntentionData\n | ClaimStreamIntentionData\n | ClaimByProxyStreamIntentionData\n | CancelStreamIntentionData;\n\nexport class MPayAppHelper implements IAppHelperInternalLegacy<MPayIntentionData> {\n application = 'mpay';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: string; intentionData: MPayIntentionData }> {\n const { network, transactionBlock } = input;\n const globals = Globals.new(network === 'sui:mainnet' ? Env.prod : Env.dev);\n const decoder = new DecodeHelper(globals, transactionBlock);\n const result = decoder.decode();\n\n let intention: MPayIntention;\n\n switch (result.type) {\n case StreamTransactionType.CREATE_STREAM:\n intention = new CreateStreamIntention(result.info);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = new SetAutoClaimStreamIntention({ streamId: result.streamId, enabled: result.enabled });\n break;\n case StreamTransactionType.CLAIM:\n intention = new ClaimStreamIntention({ streamId: result.streamId });\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = new ClaimByProxyStreamIntention({ streamId: result.streamId });\n break;\n case StreamTransactionType.CANCEL:\n intention = new CancelStreamIntention({ streamId: result.streamId });\n break;\n default:\n throw new Error(`Unknown transaction type: ${result}`);\n }\n\n return {\n txType: intention.txType,\n txSubType: intention.txSubType,\n intentionData: intention.data,\n };\n }\n\n async build(input: {\n intentionData: MPayIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { intentionData } = input;\n let intention: MPayIntention;\n switch (input.txSubType as StreamTransactionType) {\n case StreamTransactionType.CREATE_STREAM:\n intention = new CreateStreamIntention(intentionData as CreateStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM:\n intention = new ClaimStreamIntention(intentionData as ClaimStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = new ClaimByProxyStreamIntention(intentionData as ClaimByProxyStreamIntentionData);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = new SetAutoClaimStreamIntention(intentionData as SetAutoClaimIntentionData);\n break;\n case StreamTransactionType.CANCEL:\n intention = new CancelStreamIntention(intentionData as CancelStreamIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ ...input });\n }\n}\n","import { TransactionDefaultApplication, TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { CoinTransferIntention, CoinTransferIntentionData } from '@/apps/msafe-core/coin-transfer';\n\nimport { ObjectTransferIntention, ObjectTransferIntentionData } from './object-transfer';\n\nexport type CoreIntention = CoinTransferIntention | ObjectTransferIntention;\n\nexport type CoreIntentionData = CoinTransferIntentionData | ObjectTransferIntentionData;\n\nexport class CoreHelper implements IAppHelperInternalLegacy<CoreIntentionData> {\n application = 'msafe-core';\n\n supportSDK = '@mysten/sui.js' as const;\n\n constructor() {\n this.application = TransactionDefaultApplication;\n }\n\n deserialize(): Promise<{ txType: TransactionType; txSubType: string; intentionData: CoreIntentionData }> {\n throw new Error('MSafe core transaction intention should be build from API');\n }\n\n async build(input: {\n intentionData: CoreIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: CoreIntention;\n switch (input.txSubType) {\n case TransactionSubTypes.assets.coin.send:\n intention = CoinTransferIntention.fromData(input.intentionData as CoinTransferIntentionData);\n break;\n case TransactionSubTypes.assets.object.send:\n intention = ObjectTransferIntention.fromData(input.intentionData as ObjectTransferIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { TransactionType, buildCoinTransferTxb } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nexport interface CoinTransferIntentionData {\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport class CoinTransferIntention extends BaseIntentionLegacy<CoinTransferIntentionData> {\n txType: TransactionType.Assets;\n\n txSubType: 'SendCoin';\n\n constructor(public readonly data: CoinTransferIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n return buildCoinTransferTxb(suiClient, this.data, account.address);\n }\n\n static fromData(data: CoinTransferIntentionData) {\n return new CoinTransferIntention(data);\n }\n}\n","import { TransactionType, buildObjectTransferTxb } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nexport interface ObjectTransferIntentionData {\n receiver: string;\n objectType: string;\n objectId: string;\n}\n\nexport class ObjectTransferIntention extends BaseIntentionLegacy<ObjectTransferIntentionData> {\n txType: TransactionType.Assets;\n\n txSubType: 'SendObject';\n\n constructor(public readonly data: ObjectTransferIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n return buildObjectTransferTxb(suiClient, this.data, account.address);\n }\n\n static fromData(data: ObjectTransferIntentionData) {\n return new ObjectTransferIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount, SuiSignTransactionBlockInput } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { updatePackageId } from './config';\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention, ClaimRewardIntentionData } from './intentions/claim-reward';\nimport { ClaimSupplyIntention, ClaimSupplyIntentionData } from './intentions/claim-supply';\nimport { EntryBorrowIntention, EntryBorrowIntentionData } from './intentions/entry-borrow';\nimport { EntryDepositIntention, EntryDepositIntentionData } from './intentions/entry-deposit';\nimport { EntryRepayIntention, EntryRepayIntentionData } from './intentions/entry-repay';\nimport { EntryWithdrawIntention, EntryWithdrawIntentionData } from './intentions/entry-withdraw';\nimport { EntryMultiDepositIntention, EntryMultiDepositIntentionData } from './intentions/multi-deposit';\nimport { TransactionSubType } from './types';\n\nexport type NAVIIntention =\n | EntryDepositIntention\n | EntryBorrowIntention\n | EntryRepayIntention\n | EntryWithdrawIntention\n | EntryMultiDepositIntention\n | ClaimRewardIntention\n | ClaimSupplyIntention;\n\nexport type NAVIIntentionData =\n | EntryDepositIntentionData\n | EntryBorrowIntentionData\n | EntryRepayIntentionData\n | EntryWithdrawIntentionData\n | EntryMultiDepositIntentionData\n | ClaimRewardIntentionData\n | ClaimSupplyIntentionData;\n\nexport class NAVIAppHelper implements IAppHelperInternalLegacy<NAVIIntentionData> {\n application = 'navi';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: TransactionSubType; intentionData: NAVIIntentionData }> {\n await updatePackageId();\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: NAVIIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: NAVIIntention;\n await updatePackageId();\n switch (input.txSubType) {\n case TransactionSubType.EntryDeposit:\n intention = EntryDepositIntention.fromData(input.intentionData as EntryDepositIntentionData);\n break;\n case TransactionSubType.EntryBorrow:\n intention = EntryBorrowIntention.fromData(input.intentionData as EntryBorrowIntentionData);\n break;\n case TransactionSubType.EntryRepay:\n intention = EntryRepayIntention.fromData(input.intentionData as EntryRepayIntentionData);\n break;\n case TransactionSubType.EntryWithdraw:\n intention = EntryWithdrawIntention.fromData(input.intentionData as EntryWithdrawIntentionData);\n break;\n case TransactionSubType.EntryMultiDeposit:\n intention = EntryMultiDepositIntention.fromData(input.intentionData as EntryMultiDepositIntentionData);\n break;\n case TransactionSubType.ClaimReward:\n intention = ClaimRewardIntention.fromData(input.intentionData as ClaimRewardIntentionData);\n break;\n case TransactionSubType.EntryClaimAndDeposit:\n intention = ClaimSupplyIntention.fromData(input.intentionData as ClaimSupplyIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { CoinType, type Pool } from './types';\n\nlet updated = false;\n\nconst config = {\n ProtocolPackage: '0x81c408448d0d57b3e371ea94de1d40bf852784d3e225de1e74acab3e8395c18f',\n StorageId: '0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe',\n Incentive: '0xaaf735bf83ff564e1b219a0d644de894ef5bdc4b2250b126b2a46dd002331821',\n IncentiveV2: '0xf87a8acb8b81d14307894d12595541a73f19933f88e1326d5be349c7a6f7559c', // The new incentive version: V2\n gasBudget: 50_000_000,\n PriceOracle: '0x1568865ed9a0b5ec414220e8f79b3d04c77acc82358f6e5ae4635687392ffbef',\n ReserveParentId: '0xe6d4c6610b86ce7735ea754596d71d72d10c7980b5052fc3c8cdf8d09fea9b4b', // get it from storage object id. storage.reserves\n pool: {\n sui: {\n name: 'SUI',\n assetId: 0,\n poolId: '0x96df0fce3c471489f4debaaa762cf960b3d97820bd1f3f025ff8190730e958c5',\n fondPoolId: '0xf975bc2d4cca10e3ace8887e20afd77b46c383b4465eac694c4688344955dea4',\n type: '0x2::sui::SUI',\n coinType: CoinType.sui,\n reserveObjectId: '0xab644b5fd11aa11e930d1c7bc903ef609a9feaf9ffe1b23532ad8441854fbfaf',\n borrowBalanceParentId: '0xe7ff0daa9d090727210abe6a8b6c0c5cd483f3692a10610386e4dc9c57871ba7',\n supplyBalanceParentId: '0x589c83af4b035a3bc64c40d9011397b539b97ea47edf7be8f33d643606bf96f8',\n },\n wusdc: {\n name: 'wUSDC',\n assetId: 1,\n coinType: CoinType.wusdc,\n poolId: '0xa02a98f9c88db51c6f5efaaf2261c81f34dd56d86073387e0ef1805ca22e39c8',\n type: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n reserveObjectId: '0xeb3903f7748ace73429bd52a70fff278aac1725d3b58afa781f25ce3450ac203',\n borrowBalanceParentId: '0x8a3aaa817a811131c624658f6e77cba04ab5829293d2c49c1a9cce8ac9c8dec4',\n supplyBalanceParentId: '0x8d0a4467806458052d577c8cd2be6031e972f2b8f5f77fce98aa12cd85330da9',\n },\n usdt: {\n name: 'USDT',\n coinType: CoinType.usdt,\n assetId: 2,\n poolId: '0x0e060c3b5b8de00fb50511b7a45188c8e34b6995c01f69d98ea5a466fe10d103',\n type: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n reserveObjectId: '0xb8c5eab02a0202f638958cc79a69a2d30055565caad1684b3c8bbca3bddcb322',\n borrowBalanceParentId: '0xc14d8292a7d69ae31164bafab7ca8a5bfda11f998540fe976a674ed0673e448f',\n supplyBalanceParentId: '0x7e2a49ff9d2edd875f82b76a9b21e2a5a098e7130abfd510a203b6ea08ab9257',\n },\n weth: {\n name: 'WETH',\n coinType: CoinType.weth,\n assetId: 3,\n poolId: '0x71b9f6e822c48ce827bceadce82201d6a7559f7b0350ed1daa1dc2ba3ac41b56',\n type: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n reserveObjectId: '0xafecf4b57899d377cc8c9de75854c68925d9f512d0c47150ca52a0d3a442b735',\n borrowBalanceParentId: '0x7568d06a1b6ffc416a36c82791e3daf0e621cf19d4a2724fc6f74842661b6323',\n supplyBalanceParentId: '0xa668905b1ad445a3159b4d29b1181c4a62d864861b463dd9106cc0d97ffe8f7f',\n },\n cetus: {\n name: 'CETUS',\n coinType: CoinType.cetus,\n assetId: 4,\n poolId: '0x3c376f857ec4247b8ee456c1db19e9c74e0154d4876915e54221b5052d5b1e2e',\n type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n reserveObjectId: '0x66a807c06212537fe46aa6719a00e4fa1e85a932d0b53ce7c4b1041983645133',\n borrowBalanceParentId: '0x4c3da45ffff6432b4592a39cdb3ce12f4a28034cbcb804bb071facc81fdd923d',\n supplyBalanceParentId: '0x6adc72faf2a9a15a583c9fb04f457c6a5f0b456bc9b4832413a131dfd4faddae',\n },\n voloSui: {\n name: 'VoloSui',\n coinType: CoinType.voloSui,\n assetId: 5,\n poolId: '0x9790c2c272e15b6bf9b341eb531ef16bcc8ed2b20dfda25d060bf47f5dd88d01',\n fondPoolId: '0xe2b5ada45273676e0da8ae10f8fe079a7cec3d0f59187d3d20b1549c275b07ea',\n type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n reserveObjectId: '0xd4fd7e094af9819b06ea3136c13a6ae8da184016b78cf19773ac26d2095793e2',\n borrowBalanceParentId: '0x8fa5eccbca2c4ba9aae3b87fd44aa75aa5f5b41ea2d9be4d5321379384974984',\n supplyBalanceParentId: '0xe6457d247b6661b1cac123351998f88f3e724ff6e9ea542127b5dcb3176b3841',\n },\n haSui: {\n name: 'HaedalSui',\n coinType: CoinType.haSui,\n assetId: 6,\n poolId: '0x6fd9cb6ebd76bc80340a9443d72ea0ae282ee20e2fd7544f6ffcd2c070d9557a',\n fondPoolId: '0xa20e18085ce04be8aa722fbe85423f1ad6b1ae3b1be81ffac00a30f1d6d6ab51',\n type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n reserveObjectId: '0x0c9f7a6ca561dc566bd75744bcc71a6af1dc3caf7bd32c099cd640bb5f3bb0e3',\n borrowBalanceParentId: '0x01f36898e020be6c3423e5c95d9f348868813cd4d0be39b0c8df9d8de4722b00',\n supplyBalanceParentId: '0x278b8e3d09c3548c60c51ed2f8eed281876ea58c392f71b7ff650cc9286d095b',\n },\n navx: {\n name: 'NAVX',\n coinType: CoinType.navx,\n assetId: 7,\n poolId: '0xc0e02e7a245e855dd365422faf76f87d9f5b2148a26d48dda6e8253c3fe9fa60',\n fondPoolId: '0x9dae0cf104a193217904f88a48ce2cf0221e8cd9073878edd05101d6b771fa09',\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n reserveObjectId: '0x2e13b2f1f714c0c5fa72264f147ef7632b48ec2501f810c07df3ccb59d6fdc81',\n borrowBalanceParentId: '0xa5bf13075aa400cbdd4690a617c5f008e1fae0511dcd4f7121f09817df6c8d8b',\n supplyBalanceParentId: '0x59dedca8dc44e8df50b190f8b5fe673098c1273ac6168c0a4addf3613afcdee5',\n },\n wbtc: {\n name: 'WBTC',\n coinType: CoinType.wbtc,\n assetId: 8,\n poolId: '0xd162cbe40f8829ce71c9b3d3bf3a83859689a79fa220b23d70dc0300b777ae6e',\n type: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN',\n reserveObjectId: '0x8b4d81f004e4e9faf4540951a896b6d96e42598a270e6375f598b99742db767e',\n borrowBalanceParentId: '0x55e1f3c9e6e5cf9fff563bdd61db07a3826458c56ef72c455e049ab3b1b0e99c',\n supplyBalanceParentId: '0x821e505a0091b089edba94deaa14c2f2230d026bbaa7b85680554441aad447e0',\n },\n ausd: {\n name: 'AUSD',\n coinType: CoinType.ausd,\n assetId: 9,\n poolId: '0xc9208c1e75f990b2c814fa3a45f1bf0e85bb78404cfdb2ae6bb97de58bb30932',\n type: '0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD',\n reserveObjectId: '0x918889c6a9d9b93108531d4d59a4ebb9cc4d41689798ffc1d4aed6e1ae816ec0',\n borrowBalanceParentId: '0x551300b9441c9a3a16ca1d7972c1dbb4715e15004ccd5f001b2c2eee22fd92c1',\n supplyBalanceParentId: '0xe151af690355de8be1c0281fbd0d483c099ea51920a57c4bf8c9666fd36808fd',\n },\n nusdc: {\n name: 'USDC',\n assetId: 10,\n coinType: CoinType.nusdc,\n poolId: '0xa3582097b4c57630046c0c49a88bfc6b202a3ec0a9db5597c31765f7563755a8',\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n reserveObjectId: '0x4c8a2c72a22ae8da803a8519798d312c86e74a9e0d6ec0eec2bfcf7e4b3fef5e',\n borrowBalanceParentId: '0xb0b0c7470e96cabbb4f1e8d06bef2fbea65f4dbac52afae8635d9286b1ea9a09',\n supplyBalanceParentId: '0x08b5ce8574ac3bc9327e66ad5decd34d07ee798f724ad01058e8855ac9acb605',\n },\n eth: {\n name: 'ETH',\n assetId: 11,\n coinType: CoinType.eth,\n poolId: '0x78ba01c21d8301be15690d3c30dc9f111871e38cfb0b2dd4b70cc6052fba41bb',\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n reserveObjectId: '0x376faea6dfbffab9ea808474cb751d91222b6d664f38c0f1d23de442a8edb1ce',\n borrowBalanceParentId: '0xf0c6ce5cfaee96073876a5fab7426043f3a798b79502c4caeb6d9772cd35af1f',\n supplyBalanceParentId: '0xc0a0cb43620eb8a84d5a4a50a85650e7fa7ba81e660f9cc2863404fd84591d4b',\n },\n usdy: {\n name: 'USDY',\n assetId: 12,\n coinType: CoinType.usdy,\n poolId: '0x4b6253a9f8cf7f5d31e6d04aed4046b9e325a1681d34e0eff11a8441525d4563',\n type: '0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY',\n reserveObjectId: '',\n borrowBalanceParentId: '',\n supplyBalanceParentId: '',\n },\n } as Pool,\n borrowFee: 0.003,\n borrowFeeAddress: '0x70b9b10704263cf53392849e33b1f5fd16005869b4198ed5524836bad1234ea2',\n};\n\nexport async function updatePackageId() {\n if (updated) {\n return;\n }\n try {\n const data = await fetch('https://open-api.naviprotocol.io/api/msafe').then((res) => res.json());\n const { packageId, borrowFee, borrowFeeAddress, pool } = data;\n if (packageId) {\n config.ProtocolPackage = packageId;\n }\n if (borrowFee) {\n config.borrowFee = borrowFee;\n }\n if (borrowFeeAddress) {\n config.borrowFeeAddress = borrowFeeAddress;\n }\n if (pool) {\n config.pool = pool;\n }\n updated = true;\n } catch (e: any) {\n console.error(e.message);\n }\n}\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n decode() {\n console.log('txb', this.txb);\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isEntryBorrowTransaction()) {\n return this.decodeEntryBorrow();\n }\n if (this.isEntryBorrowWithFeeTransaction()) {\n return this.decodeEntryBorrow();\n }\n if (this.isEntryMultiDepositTransaction()) {\n return this.decodeEntryMultiDeposit();\n }\n if (this.isEntryDepositTransaction()) {\n return this.decodeEntryDeposit();\n }\n if (this.isEntryRepayTransaction()) {\n return this.decodeEntryRepay();\n }\n if (this.isEntryWithdrawTransaction()) {\n return this.decodeEntryWithdraw();\n }\n if (this.isEntryClaimAndDepositTransaction()) {\n return this.decodeEntryClaimAndDeposit();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isClaimRewardTransaction() {\n const claimTrans = this.transactions.find((trans) => {\n if (trans.kind === 'MoveCall' && trans.target.includes('claim_reward')) {\n return true;\n }\n return false;\n });\n return !!claimTrans;\n }\n\n private isEntryBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_borrow`);\n }\n\n private isEntryBorrowWithFeeTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::borrow`);\n }\n\n private isEntryMultiDepositTransaction() {\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n const transactions = this.transactions.filter((trans) => trans.kind === 'MoveCall' && trans.target === target);\n const claimTransaction = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.includes('claim_reward'),\n );\n if (claimTransaction) {\n return false;\n }\n return transactions.length > 1;\n }\n\n private isEntryClaimAndDepositTransaction() {\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n const transactions = this.transactions.filter((trans) => trans.kind === 'MoveCall' && trans.target === target);\n const claimTransaction = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.includes('claim_reward'),\n );\n if (claimTransaction && transactions.length > 0) {\n return true;\n }\n return false;\n }\n\n private isEntryDepositTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_deposit`);\n }\n\n private isEntryRepayTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_repay`);\n }\n\n private isEntryWithdrawTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::withdraw`);\n }\n\n private findPoolByAssetId(assetId: number) {\n const findPool = Object.values(config.pool).find((pool) => pool.assetId === assetId);\n if (!findPool) {\n throw new Error('Pool not found');\n }\n return findPool;\n }\n\n private decodeEntryClaimAndDeposit(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryClaimAndDeposit,\n intentionData: {\n type: 'entry_claim_and_deposit',\n },\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n console.log('decode claims');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimReward,\n intentionData: {\n type: 'claim_reward',\n },\n };\n }\n\n private decodeEntryBorrow(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryBorrow,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryMultiDeposit(): DecodeResult {\n const list = [] as {\n amount: number;\n assetId: number;\n }[];\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n this.transactions.forEach((trans) => {\n if (trans.kind === 'MoveCall' && trans.target === target) {\n const helper = new MoveCallHelper(trans, this.txb);\n const assetId = helper.decodeInputU8(3);\n const amount = helper.decodeInputU64(5);\n list.push({\n assetId,\n amount,\n });\n }\n });\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryMultiDeposit,\n intentionData: {\n list,\n },\n };\n }\n\n private decodeEntryDeposit(): DecodeResult {\n const assetId = this.helper.decodeInputU8(3);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryDeposit,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryRepay(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(6);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryRepay,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryWithdraw(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryWithdraw,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(config.ProtocolPackage),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport type { TransactionBlock } from '@mysten/sui.js/transactions';\nimport {\n depositCoin,\n withdrawCoin,\n repayDebt,\n borrowCoin,\n claimAllRewardsPTB,\n claimAllRewardsResupplyPTB,\n} from 'navi-sdk';\nimport { PoolConfig } from 'navi-sdk/dist/types';\n\nexport async function depositToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n await depositCoin(txb as any, pool, coinObject, amount);\n return txb;\n}\n\nexport async function withdrawToken(txb: TransactionBlock, pool: PoolConfig, amount: number, userAddress: string) {\n const [coin] = await withdrawCoin(txb as any, pool, amount);\n txb.transferObjects([coin as any], txb.pure(userAddress));\n return txb;\n}\n\nexport async function borrowToken(tx: TransactionBlock, pool: PoolConfig, amount: number, userAddress: string) {\n const [borrowedCoin] = await borrowCoin(tx as any, pool, amount);\n tx.transferObjects([borrowedCoin as any], tx.pure.address(userAddress));\n\n return tx;\n}\n\nexport async function repayToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n await repayDebt(txb as any, pool, coinObject, amount);\n return txb;\n}\n\nexport async function claimReward(client: SuiClient, userAddress: string) {\n const txb = await claimAllRewardsPTB(client as any, userAddress);\n return txb as any;\n}\n\nexport async function claimSupply(client: SuiClient, userAddress: string) {\n const txb = await claimAllRewardsResupplyPTB(client as any, userAddress);\n return txb as any;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { claimReward } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimRewardIntentionData {\n type: string;\n}\n\nexport class ClaimRewardIntention extends BaseIntentionLegacy<ClaimRewardIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimReward;\n\n constructor(public readonly data: ClaimRewardIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { type } = this.data;\n console.log('claim reward', type);\n const txb = await claimReward(input.suiClient, input.account.address);\n return txb;\n }\n\n static fromData(data: ClaimRewardIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { claimSupply } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimSupplyIntentionData {\n type: string;\n}\n\nexport class ClaimSupplyIntention extends BaseIntentionLegacy<ClaimSupplyIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryClaimAndDeposit;\n\n constructor(public readonly data: ClaimSupplyIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { type } = this.data;\n console.log('claim reward and supply', type);\n const txb = await claimSupply(input.suiClient, input.account.address);\n return txb;\n }\n\n static fromData(data: ClaimSupplyIntentionData) {\n return new ClaimSupplyIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { borrowToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryBorrowIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryBorrowIntention extends BaseIntentionLegacy<EntryBorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryBorrow;\n\n constructor(public readonly data: EntryBorrowIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<TransactionBlock> {\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n const txb = await borrowToken(tx, pool, amount, input.account.address);\n return txb;\n }\n\n static fromData(data: EntryBorrowIntentionData) {\n return new EntryBorrowIntention(data);\n }\n}\n","import { pool } from 'navi-sdk';\n\nexport function getPoolConfigByAssetId(assetId: string | number) {\n return Object.values(pool).find((item) => String(item.assetId) === String(assetId));\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryDepositIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryDepositIntention extends BaseIntentionLegacy<EntryDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryDeposit;\n\n constructor(public readonly data: EntryDepositIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n const txb = await depositToken(tx, pool, toDeposit, amount);\n return txb;\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let i = 1;\n while (i < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n i++;\n }\n }\n\n const txb = await depositToken(tx, pool, tx.object(coinObj), amount);\n return txb;\n }\n\n static fromData(data: EntryDepositIntentionData) {\n return new EntryDepositIntention(data);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nexport async function getTokenAmount(client: SuiClient, sender: string, coinType: string): Promise<number> {\n if (!sender) {\n throw new Error('Sender is undefined.');\n }\n if (!client) {\n throw new Error('Client is undefined.');\n }\n const coinInfo = await client.getBalance({\n owner: sender,\n coinType,\n });\n const tokenBalance = Number(coinInfo.totalBalance);\n return tokenBalance;\n}\n\nexport async function getTokenObjs(client: SuiClient, sender: string, coinType: string): Promise<any> {\n const result = await client.getCoins({\n owner: sender,\n coinType,\n });\n console.log('getTokenObjs', sender, result);\n return result;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { repayToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryRepayIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryRepayIntention extends BaseIntentionLegacy<EntryRepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryRepay;\n\n constructor(public readonly data: EntryRepayIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return repayToken(tx, pool, toDeposit, amount);\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let i = 1;\n while (i < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n i++;\n }\n }\n\n return repayToken(tx, pool, tx.object(coinObj), amount);\n }\n\n static fromData(data: EntryRepayIntentionData) {\n return new EntryRepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { withdrawToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryWithdrawIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryWithdrawIntention extends BaseIntentionLegacy<EntryWithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryWithdraw;\n\n constructor(public readonly data: EntryWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<TransactionBlock> {\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n const txb = await withdrawToken(tx, pool, amount, input.account.address);\n return txb;\n }\n\n static fromData(data: EntryWithdrawIntentionData) {\n return new EntryWithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryMultiDepositIntentionData {\n list: {\n amount: number;\n assetId: number;\n }[];\n}\n\nexport class EntryMultiDepositIntention extends BaseIntentionLegacy<EntryMultiDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryDeposit;\n\n constructor(public readonly data: EntryMultiDepositIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { list } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n for (let i = 0; i < list.length; i++) {\n const { assetId, amount } = list[i];\n const pool = getPoolConfigByAssetId(assetId);\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n await depositToken(tx, pool, toDeposit, amount);\n continue;\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let j = 1;\n while (j < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[j].coinObjectId]);\n j++;\n }\n }\n\n await depositToken(tx, pool, tx.object(coinObj), amount);\n }\n\n return tx;\n }\n\n static fromData(data: EntryMultiDepositIntentionData) {\n return new EntryMultiDepositIntention(data);\n }\n}\n","import { TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { fromHex } from '@mysten/bcs';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { IAppHelperInternal, TransactionIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nexport type PlainTransactionData = {\n content: string;\n};\n\nexport const PlainTransactionApplication = 'msafe-plain-tx';\nexport const PlainTransactionType = TransactionSubTypes.others.plain;\n\nexport class PlainTransactionIntention implements TransactionIntention<PlainTransactionData> {\n application = PlainTransactionApplication;\n\n txType = TransactionType.Other;\n\n txSubType = PlainTransactionType;\n\n protected constructor(public readonly data: PlainTransactionData) {}\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n return Transaction.from(fromHex(this.data.content));\n }\n\n static fromData(data: PlainTransactionData) {\n return new PlainTransactionIntention(data);\n }\n}\n\nexport class PlainTransactionHelper implements IAppHelperInternal<PlainTransactionData> {\n application: string;\n\n supportSDK = '@mysten/sui' as const;\n\n constructor() {\n this.application = PlainTransactionApplication;\n }\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext: {\n content: string;\n };\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {\n const { content } = input.appContext;\n\n return {\n txType: TransactionType.Other,\n txSubType: PlainTransactionType,\n intentionData: { content },\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: PlainTransactionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { suiClient, network, account } = input;\n const intention = PlainTransactionIntention.fromData(input.intentionData);\n return intention.build({ suiClient, network, account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiClient as SuiClientLegacy } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelper } from '@/apps/interface/common';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { MSafeHTTPTransport } from '@/lib/MSafeHTTPTransport';\nimport { SuiNetworks } from '@/types';\n\nexport class MSafeApps {\n apps: Map<string, IAppHelper<any>>;\n\n private constructor() {\n this.apps = new Map<string, IAppHelper<any>>();\n }\n\n static fromHelpers(apps: (IAppHelperInternalLegacy<any> | IAppHelperInternal<any>)[]) {\n const mApps = new MSafeApps();\n for (let i = 0; i < apps.length; i++) {\n const app = apps[i];\n switch (app.supportSDK) {\n case '@mysten/sui.js':\n mApps.addLegacyHelper(app);\n break;\n case '@mysten/sui':\n mApps.addHelper(app);\n break;\n default:\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n throw new Error(`${app.application}: ${app.supportSDK} SDK not supported`);\n }\n }\n return mApps;\n }\n\n addLegacyHelper(app: IAppHelperInternalLegacy<any>) {\n this.apps.set(app.application, new SuiJsSdkAdapter(app));\n }\n\n addHelper(app: IAppHelperInternal<any>) {\n this.apps.set(app.application, new SuiSdkAdapter(app));\n }\n\n getAppHelper(appName: string): IAppHelper<any> {\n const app = this.apps.get(appName);\n if (!app) {\n throw new Error(`${appName} not registered`);\n }\n return app;\n }\n}\n\n/*\n SuiSdkAdapter adapts IAppHelperInternal with @mysten/sui to IAppHelper\n TODO: build to @mysten/sui Transaction after update sdk and api\n */\nexport class SuiSdkAdapter implements IAppHelper<any> {\n constructor(public helper: IAppHelperInternal<any>) {}\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n clientUrl: string;\n account: WalletAccount;\n },\n ) {\n const client = new SuiClient({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n const clientLegacy = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n const build = await input.transactionBlock.build({ client: clientLegacy });\n const tx = Transaction.from(build);\n return this.helper.deserialize({ ...input, suiClient: client, transaction: tx });\n }\n\n async build(input: {\n intentionData: any;\n txType: TransactionType;\n txSubType: string;\n clientUrl: string;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const client = new SuiClient({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n // fetch account sui balance, check if sui balance is greater or equal to 0.1 SUI\n const accountSuiBalance = await client.getBalance({ owner: input.account.address });\n if (Number(accountSuiBalance.totalBalance) < 100000000) {\n throw new Error('Insufficient gas fee');\n }\n const tx = await this.helper.build({ ...input, suiClient: client });\n tx.setSender(input.account.address);\n const bytes = await tx.build({ client });\n return TransactionBlock.from(bytes);\n }\n}\n\n/*\n SuiJsSdkAdapter adapts IAppHelperInternalLegacy with @mysten/sui.js to IAppHelper\n TODO: build to @mysten/sui Transaction after update sdk and api\n */\nexport class SuiJsSdkAdapter implements IAppHelper<any> {\n constructor(public helper: IAppHelperInternalLegacy<any>) {}\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n clientUrl: string;\n account: WalletAccount;\n },\n ) {\n const client = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n return this.helper.deserialize({ ...input, transactionBlock: input.transactionBlock, suiClient: client });\n }\n\n async build(input: {\n intentionData: any;\n txType: TransactionType;\n txSubType: string;\n clientUrl: string;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const client = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n // fetch account sui balance, check if sui balance is greater or equal to 0.1 SUI\n const accountSuiBalance = await client.getBalance({ owner: input.account.address });\n if (Number(accountSuiBalance.totalBalance) < 100000000) {\n throw new Error('Insufficient gas fee');\n }\n return this.helper.build({ ...input, suiClient: client });\n }\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestManager, HTTPTransport, Client } from '@open-rpc/client-js';\n\nimport { WebsocketClient, WebsocketClientOptions } from './rpc-websocket-client';\n\n/**\n * An object defining headers to be passed to the RPC server\n */\nexport type HttpHeaders = { [header: string]: string };\n\ninterface SuiHTTPTransportOptions {\n url: string;\n rpc?: {\n headers?: HttpHeaders;\n url?: string;\n };\n websocket?: WebsocketClientOptions & {\n url?: string;\n };\n}\n\nexport interface SuiTransportRequestOptions {\n method: string;\n params: unknown[];\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\n\nexport interface SuiTransportSubscribeOptions<T> {\n method: string;\n unsubscribe: string;\n params: unknown[];\n onMessage: (event: T) => void;\n}\n\nexport interface SuiTransport {\n request<T = unknown>(input: SuiTransportRequestOptions): Promise<T>;\n subscribe<T = unknown>(input: SuiTransportSubscribeOptions<T>): Promise<() => Promise<boolean>>;\n}\n\nexport class MSafeHTTPTransport implements SuiTransport {\n private rpcClient: Client;\n\n private websocketClient: WebsocketClient;\n\n constructor({\n url,\n websocket: { url: websocketUrl, ...websocketOptions } = {} as WebsocketClientOptions,\n rpc,\n }: SuiHTTPTransportOptions) {\n const transport = new HTTPTransport(rpc?.url ?? url, {\n headers: {\n 'Content-Type': 'application/json',\n ...rpc?.headers,\n },\n });\n\n this.rpcClient = new Client(new RequestManager([transport]));\n this.websocketClient = new WebsocketClient(websocketUrl ?? url, websocketOptions);\n }\n\n async request<T>(input: SuiTransportRequestOptions): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/return-await\n return await this.rpcClient.request(input);\n }\n\n async subscribe<T>(input: SuiTransportSubscribeOptions<T>): Promise<() => Promise<boolean>> {\n const unsubscribe = await this.websocketClient.subscribe(input);\n\n return async () => !!(await unsubscribe());\n }\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nconst CODE_TO_ERROR_TYPE: Record<number, string> = {\n '-32700': 'ParseError',\n '-32600': 'InvalidRequest',\n '-32601': 'MethodNotFound',\n '-32602': 'InvalidParams',\n '-32603': 'InternalError',\n};\n\nexport class SuiHTTPTransportError extends Error {}\n\nexport class JsonRpcError extends SuiHTTPTransportError {\n code: number;\n\n type: string;\n\n constructor(message: string, code: number) {\n super(message);\n this.code = code;\n this.type = CODE_TO_ERROR_TYPE[code] ?? 'ServerError';\n }\n}\n\nexport class SuiHTTPStatusError extends SuiHTTPTransportError {\n status: number;\n\n statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.status = status;\n this.statusText = statusText;\n }\n}\n","/* eslint-disable object-shorthand */\n/* eslint-disable curly */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/lines-between-class-members */\n// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcError } from './errors';\n\nfunction getWebsocketUrl(httpUrl: string): string {\n const url = new URL(httpUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n return url.toString();\n}\n\ntype JsonRpcMessage =\n | {\n id: number;\n result: never;\n error: {\n code: number;\n message: string;\n };\n }\n | {\n id: number;\n result: unknown;\n error: never;\n }\n | {\n method: string;\n params: NotificationMessageParams;\n };\n\ntype NotificationMessageParams = {\n subscription?: number;\n result: object;\n};\n\ntype SubscriptionRequest<T = any> = {\n method: string;\n unsubscribe: string;\n params: any[];\n onMessage: (event: T) => void;\n};\n\n/**\n * Configuration options for the websocket connection\n */\nexport type WebsocketClientOptions = {\n /**\n * Custom WebSocket class to use. Defaults to the global WebSocket class, if available.\n */\n WebSocketConstructor?: typeof WebSocket;\n /**\n * Milliseconds before timing out while calling an RPC method\n */\n callTimeout?: number;\n /**\n * Milliseconds between attempts to connect\n */\n reconnectTimeout?: number;\n /**\n * Maximum number of times to try connecting before giving up\n */\n maxReconnects?: number;\n};\n\nexport const DEFAULT_CLIENT_OPTIONS = {\n // We fudge the typing because we also check for undefined in the constructor:\n WebSocketConstructor: (typeof WebSocket !== 'undefined' ? WebSocket : undefined) as typeof WebSocket,\n callTimeout: 30000,\n reconnectTimeout: 3000,\n maxReconnects: 5,\n} satisfies WebsocketClientOptions;\n\nexport class WebsocketClient {\n endpoint: string;\n options: Required<WebsocketClientOptions>;\n #requestId = 0;\n #disconnects = 0;\n #webSocket: WebSocket | null = null;\n #connectionPromise: Promise<WebSocket> | null = null;\n #subscriptions = new Set<RpcSubscription>();\n #pendingRequests = new Map<\n number,\n {\n resolve: (result: Extract<JsonRpcMessage, { id: number }>) => void;\n reject: (reason: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n constructor(endpoint: string, options: WebsocketClientOptions = {}) {\n this.endpoint = endpoint;\n this.options = { ...DEFAULT_CLIENT_OPTIONS, ...options };\n\n // not support websocket in node currently\n // if (!this.options.WebSocketConstructor) {\n // throw new Error('Missing WebSocket constructor');\n // }\n\n if (this.endpoint && this.endpoint.startsWith('http')) {\n this.endpoint = getWebsocketUrl(this.endpoint);\n }\n }\n\n async makeRequest<T>(method: string, params: any[]): Promise<T> {\n const webSocket = await this.#setupWebSocket();\n\n return new Promise<Extract<JsonRpcMessage, { id: number }>>((resolve, reject) => {\n this.#requestId += 1;\n this.#pendingRequests.set(this.#requestId, {\n resolve: resolve,\n reject,\n timeout: setTimeout(() => {\n this.#pendingRequests.delete(this.#requestId);\n reject(new Error(`Request timeout: ${method}`));\n }, this.options.callTimeout),\n });\n\n webSocket.send(JSON.stringify({ jsonrpc: '2.0', id: this.#requestId, method, params }));\n }).then(({ error, result }) => {\n if (error) {\n throw new JsonRpcError(error.message, error.code);\n }\n\n return result as T;\n });\n }\n\n #setupWebSocket() {\n if (this.#connectionPromise) {\n return this.#connectionPromise;\n }\n\n this.#connectionPromise = new Promise<WebSocket>((resolve) => {\n this.#webSocket?.close();\n this.#webSocket = new this.options.WebSocketConstructor(this.endpoint);\n\n this.#webSocket.addEventListener('open', () => {\n this.#disconnects = 0;\n resolve(this.#webSocket!);\n });\n\n this.#webSocket.addEventListener('close', () => {\n this.#disconnects++;\n if (this.#disconnects <= this.options.maxReconnects) {\n setTimeout(() => {\n this.#reconnect();\n }, this.options.reconnectTimeout);\n }\n });\n\n this.#webSocket.addEventListener('message', ({ data }: { data: string }) => {\n let json: JsonRpcMessage;\n try {\n json = JSON.parse(data) as JsonRpcMessage;\n } catch (error) {\n console.error(new Error(`Failed to parse RPC message: ${data}`, { cause: error }));\n return;\n }\n\n if ('id' in json && json.id != null && this.#pendingRequests.has(json.id)) {\n const { resolve, timeout } = this.#pendingRequests.get(json.id)!;\n\n clearTimeout(timeout);\n resolve(json);\n } else if ('params' in json) {\n const { params } = json;\n this.#subscriptions.forEach((subscription) => {\n if (subscription.subscriptionId === params.subscription)\n if (params.subscription === subscription.subscriptionId) {\n subscription.onMessage(params.result);\n }\n });\n }\n });\n });\n\n return this.#connectionPromise;\n }\n\n async #reconnect() {\n this.#webSocket?.close();\n this.#connectionPromise = null;\n\n return Promise.allSettled([...this.#subscriptions].map((subscription) => subscription.subscribe(this)));\n }\n\n async subscribe<T>(input: SubscriptionRequest<T>) {\n const subscription = new RpcSubscription(input);\n this.#subscriptions.add(subscription);\n await subscription.subscribe(this);\n return () => subscription.unsubscribe(this);\n }\n}\n\nclass RpcSubscription {\n subscriptionId: number | null = null;\n input: SubscriptionRequest<any>;\n subscribed = false;\n\n constructor(input: SubscriptionRequest) {\n this.input = input;\n }\n\n onMessage(message: unknown) {\n if (this.subscribed) {\n this.input.onMessage(message);\n }\n }\n\n async unsubscribe(client: WebsocketClient) {\n const { subscriptionId } = this;\n this.subscribed = false;\n if (subscriptionId == null) return false;\n this.subscriptionId = null;\n\n return client.makeRequest(this.input.unsubscribe, [subscriptionId]);\n }\n\n async subscribe(client: WebsocketClient) {\n this.subscriptionId = null;\n this.subscribed = true;\n const newSubscriptionId = await client.makeRequest<number>(this.input.method, this.input.params);\n\n if (this.subscribed) {\n this.subscriptionId = newSubscriptionId;\n }\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { Scallop, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { DecoderLending } from './decoders/decoderLending';\nimport { DecoderReferral } from './decoders/decoderReferral';\nimport { DecoderVeSca } from './decoders/decoderVesca';\nimport { BorrowIntention, BorrowIntentionData } from './intentions/lending/borrow';\nimport { BorrowWithBoostIntention, BorrowWithBoostIntentionData } from './intentions/lending/borrow-with-boost';\nimport {\n BorrowWithReferralIntention,\n BorrowWithReferralIntentionData,\n} from './intentions/lending/borrow-with-referral';\nimport { ClaimIncentiveRewardIntention } from './intentions/lending/claim-incentive-reward';\nimport { DepositCollateralIntention, DepositCollateralIntentionData } from './intentions/lending/deposit-collateral';\nimport { MigrateAndClaimIntention, MigrateAndClaimIntentionData } from './intentions/lending/migrate-and-claim';\nimport { MigrateScoinIntention, MigrateScoinIntentionData } from './intentions/lending/migrate-scoin';\nimport { OpenObligationIntention, OpenObligationIntentionData } from './intentions/lending/open-obligation';\nimport { RepayIntention, RepayIntentionData } from './intentions/lending/repay';\nimport { RepayWithBoostIntention, RepayWithBoostIntentionData } from './intentions/lending/repay-with-boost';\nimport { SupplyLendingIntention, SupplyLendingIntentionData } from './intentions/lending/supply-lending';\nimport { UnstakeSpoolIntention, UnstakeSpoolIntentionData } from './intentions/lending/unstake-spool';\nimport {\n WithdrawAndUnstakeLendingIntention,\n WithdrawAndUnstakeLendingIntentionData,\n} from './intentions/lending/withdraw-and-unstake-lending';\nimport { WithdrawCollateralIntention, WithdrawCollateralIntentionData } from './intentions/lending/withdraw-collateral';\nimport { WithdrawLendingIntention, WithdrawLendingIntentionData } from './intentions/lending/withdraw-lending';\nimport { BindReferralIntention, BindReferralIntentionData } from './intentions/referral/bind-referral';\nimport {\n ClaimRevenueReferralIntention,\n ClaimRevenueReferralIntentionData,\n} from './intentions/referral/claim-revenue-referral';\nimport {\n CreateReferralLinkIntention,\n CreateReferralLinkIntentionData,\n} from './intentions/referral/create-referral-link';\nimport {\n ExtendPeriodAndStakeMoreIntention,\n ExtendPeriodAndStakeMoreIntentionData,\n} from './intentions/staking/extend-period-and-stake-more';\nimport { ExtendStakePeriodIntention, ExtendStakePeriodIntentionData } from './intentions/staking/extend-stake-period';\nimport { RedeemScaIntention, RedeemScaIntentionData } from './intentions/staking/redeem-sca';\nimport {\n RenewExpStakePeriodIntention,\n RenewExpStakePeriodIntentionData,\n} from './intentions/staking/renew-exp-stake-period';\nimport { StakeScaIntention, StakeScaIntentionData } from './intentions/staking/stake-sca';\nimport {\n SupplyAndStakeLendingIntention,\n SupplyAndStakeLendingIntentionData,\n} from './intentions/staking/supply-and-stake-lending';\nimport { WithdrawStakedScaIntention, WithdrawStakedScaIntentionData } from './intentions/staking/withdraw-staked-sca';\nimport { SuiNetworks } from './types';\nimport { TransactionSubType } from './types/utils';\nimport { IAppHelperInternal } from '../interface/sui';\n\nexport type ScallopIntention =\n | SupplyLendingIntention\n | WithdrawLendingIntention\n | BorrowIntention\n | RepayIntention\n | DepositCollateralIntention\n | WithdrawCollateralIntention\n | OpenObligationIntention\n | UnstakeSpoolIntention\n | ClaimIncentiveRewardIntention\n | BorrowWithBoostIntention\n | StakeScaIntention\n | ExtendStakePeriodIntention\n | ExtendPeriodAndStakeMoreIntention\n | RenewExpStakePeriodIntention\n | WithdrawStakedScaIntention\n | SupplyAndStakeLendingIntention\n | WithdrawAndUnstakeLendingIntention\n | RedeemScaIntention\n | MigrateAndClaimIntention\n | BorrowWithReferralIntention\n | CreateReferralLinkIntention\n | ClaimRevenueReferralIntention\n | BindReferralIntention\n | MigrateScoinIntention\n | RepayWithBoostIntention;\n\nexport type ScallopIntentionData =\n | SupplyLendingIntentionData\n | WithdrawLendingIntentionData\n | BorrowIntentionData\n | RepayIntentionData\n | DepositCollateralIntentionData\n | WithdrawCollateralIntentionData\n | OpenObligationIntentionData\n | UnstakeSpoolIntentionData\n | BorrowWithBoostIntentionData\n | StakeScaIntentionData\n | ExtendStakePeriodIntentionData\n | ExtendPeriodAndStakeMoreIntentionData\n | RenewExpStakePeriodIntentionData\n | WithdrawStakedScaIntentionData\n | SupplyAndStakeLendingIntentionData\n | WithdrawAndUnstakeLendingIntentionData\n | RedeemScaIntentionData\n | MigrateAndClaimIntentionData\n | BorrowWithReferralIntentionData\n | CreateReferralLinkIntentionData\n | ClaimRevenueReferralIntentionData\n | BindReferralIntentionData\n | MigrateScoinIntentionData\n | RepayWithBoostIntentionData;\n\nexport class ScallopAppHelper implements IAppHelperInternal<ScallopIntentionData> {\n application = 'scallop';\n\n supportSDK = '@mysten/sui' as const;\n\n private scallopClient: ScallopClient | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: ScallopIntentionData;\n }> {\n if (!this.scallopClient) {\n const scallop = new Scallop({\n addressId: '67c44a103fe1b8c454eb9699',\n walletAddress: input.account.address,\n suiClients: [input.suiClient],\n });\n this.scallopClient = await scallop.createScallopClient();\n }\n\n const { transaction } = input;\n console.log('transaction', transaction);\n\n // const devInspectResult = await input.suiClient.devInspectTransactionBlock({\n // transactionBlock: transaction,\n // sender: input.account.address,\n // });\n\n const decoderLending = new DecoderLending(transaction, this.scallopClient);\n const decoderReferral = new DecoderReferral(transaction, this.scallopClient);\n const decoderVesca = new DecoderVeSca(transaction, this.scallopClient);\n\n const result = decoderLending.decode() || decoderReferral.decode() || decoderVesca.decode();\n if (!result) {\n throw new Error('Unknown transaction type');\n }\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: ScallopIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network, txSubType, intentionData } = input;\n if (!this.scallopClient) {\n const scallop = new Scallop({\n addressId: '67c44a103fe1b8c454eb9699',\n walletAddress: input.account.address,\n suiClients: [input.suiClient],\n });\n this.scallopClient = await scallop.createScallopClient();\n }\n\n let intention: ScallopIntention;\n switch (txSubType) {\n case TransactionSubType.SupplyLending:\n intention = SupplyLendingIntention.fromData(intentionData as SupplyLendingIntentionData);\n break;\n case TransactionSubType.WithdrawLending:\n intention = WithdrawLendingIntention.fromData(intentionData as WithdrawLendingIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n break;\n case TransactionSubType.DepositCollateral:\n intention = DepositCollateralIntention.fromData(intentionData as DepositCollateralIntentionData);\n break;\n case TransactionSubType.WithdrawCollateral:\n intention = WithdrawCollateralIntention.fromData(intentionData as WithdrawCollateralIntentionData);\n break;\n case TransactionSubType.OpenObligation:\n intention = OpenObligationIntention.fromData(intentionData as OpenObligationIntentionData);\n break;\n case TransactionSubType.UnstakeSpool:\n intention = UnstakeSpoolIntention.fromData(intentionData as UnstakeSpoolIntentionData);\n break;\n case TransactionSubType.ClaimIncentiveReward:\n intention = ClaimIncentiveRewardIntention.fromData(intentionData);\n break;\n case TransactionSubType.BorrowWithBoost:\n intention = BorrowWithBoostIntention.fromData(intentionData as BorrowWithBoostIntentionData);\n break;\n case TransactionSubType.StakeSca:\n intention = StakeScaIntention.fromData(intentionData as StakeScaIntentionData);\n break;\n case TransactionSubType.ExtendStakePeriod:\n intention = ExtendStakePeriodIntention.fromData(intentionData as ExtendStakePeriodIntentionData);\n break;\n case TransactionSubType.ExtendPeriodAndStakeMore:\n intention = ExtendPeriodAndStakeMoreIntention.fromData(intentionData as ExtendPeriodAndStakeMoreIntentionData);\n break;\n case TransactionSubType.RenewExpStakePeriod:\n intention = RenewExpStakePeriodIntention.fromData(intentionData as RenewExpStakePeriodIntentionData);\n break;\n case TransactionSubType.WithdrawStakedSca:\n intention = WithdrawStakedScaIntention.fromData(intentionData as WithdrawStakedScaIntentionData);\n break;\n case TransactionSubType.SupplyAndStakeLending:\n intention = SupplyAndStakeLendingIntention.fromData(intentionData as SupplyAndStakeLendingIntentionData);\n break;\n case TransactionSubType.WithdrawAndUnstakeLending:\n intention = WithdrawAndUnstakeLendingIntention.fromData(\n intentionData as WithdrawAndUnstakeLendingIntentionData,\n );\n break;\n case TransactionSubType.RedeemSca:\n intention = RedeemScaIntention.fromData(intentionData as RedeemScaIntentionData);\n break;\n case TransactionSubType.MigrateAndClaim:\n intention = MigrateAndClaimIntention.fromData(intentionData as MigrateAndClaimIntentionData);\n break;\n case TransactionSubType.BorrowWithReferral:\n intention = BorrowWithReferralIntention.fromData(intentionData as BorrowWithReferralIntentionData);\n break;\n case TransactionSubType.CreateReferralLink:\n intention = CreateReferralLinkIntention.fromData(intentionData as CreateReferralLinkIntentionData);\n break;\n case TransactionSubType.ClaimRevenueReferral:\n intention = ClaimRevenueReferralIntention.fromData(intentionData as ClaimRevenueReferralIntentionData);\n break;\n case TransactionSubType.BindReferral:\n intention = BindReferralIntention.fromData(intentionData as BindReferralIntentionData);\n break;\n case TransactionSubType.MigrateScoin:\n intention = MigrateScoinIntention.fromData(intentionData as MigrateScoinIntentionData);\n break;\n case TransactionSubType.RepayWithBoost:\n intention = RepayWithBoostIntention.fromData(intentionData as RepayWithBoostIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account, network, scallopClient: this.scallopClient });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { SplitCoinTransactionType } from '../types/sui';\nimport { DecodeResult, TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, SplitCoinHelper } from '../utils';\n\nexport class DecoderLending extends Decoder {\n decode() {\n // if (this.isMoveAsset()) {\n // return this.decodeMoveAsset();\n // }\n if (this.isSupplyWithStakeSpoolTransaction()) {\n return this.decodeSupplyWithStakeSpool();\n }\n if (this.isUnstakeAndWithdrawTransaction()) {\n return this.decodeUnstakeAndWithdraw();\n }\n if (this.isStakeSpoolTransaction()) {\n return this.decodeStakeSpool();\n }\n if (this.isDepositCollateralTransaction()) {\n return this.decodeDepositCollateral();\n }\n if (this.isWithdrawCollateralTransaction()) {\n return this.decodeWithdrawCollateral();\n }\n if (this.isWithdrawLendingScoinTransaction()) {\n return this.decodeWithdrawLendingScoin();\n }\n if (this.isWithdrawLendingTransaction()) {\n return this.decodeWithdrawLending();\n }\n if (this.isSupplyLendingTransaction()) {\n return this.decodeSupplyLending();\n }\n if (this.isBorrowWithReferralTransaction()) {\n return this.decodeBorrowWithReferral();\n }\n if (this.isBorrowWithBoostTransaction()) {\n return this.decodeBorrowWithBoost();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayWithBoostTransaction()) {\n return this.decodeRepayWithBoost();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isUnstakeSpoolTransaction()) {\n return this.decodeUnstakeSpool();\n }\n if (this.isMigrateAndClaim()) {\n return this.decodeMigrateAndClaim();\n }\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isOpenObligationTransaction()) {\n return this.decodeOpenObligation();\n }\n if (this.isMigrateScoinTransaction()) {\n return this.decodeMigrateScoin();\n }\n return undefined;\n }\n\n private isMigrateScoinTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::mint_s_coin`);\n }\n\n private isSupplyLendingTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n }\n\n private isSupplyWithStakeSpoolTransaction() {\n const supplyMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n return supplyMoveCall && stakeMoveCall;\n }\n\n private isUnstakeAndWithdrawTransaction() {\n const unstakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n const withdrawMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n return unstakeMoveCall && withdrawMoveCall;\n }\n\n private isStakeSpoolTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n }\n\n private isWithdrawLendingTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n }\n\n private isWithdrawLendingScoinTransaction() {\n const redeem = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n const burnScoin = this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::burn_s_coin`);\n return redeem && burnScoin;\n }\n\n private isDepositCollateralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`);\n }\n\n private isWithdrawCollateralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`);\n }\n\n private isBorrowTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n }\n\n private isBorrowWithBoostTransaction() {\n const borrowMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return borrowMoveCall && stakeMoveCall;\n }\n\n private isBorrowWithReferralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow_with_referral`);\n }\n\n private isRepayTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n }\n\n private isRepayWithBoostTransaction() {\n const repayMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return repayMoveCall && stakeMoveCall;\n }\n\n private isUnstakeSpoolTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n }\n\n private isCreateStakeAccountTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::new_spool_account`);\n }\n\n private isClaimRewardTransaction() {\n const lendingIncentive = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::redeem_rewards`);\n const borrowIncentiveV2 = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`);\n return lendingIncentive || borrowIncentiveV2;\n }\n\n private isOpenObligationTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::open_obligation::open_obligation`);\n }\n\n private isMigrateAndClaim() {\n const oldBorrowIncentive = this.hasMoveCallCommand(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`);\n const stakeWithVeSca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n const stakeWithoutVesca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake`);\n return oldBorrowIncentive && (stakeWithVeSca || stakeWithoutVesca);\n }\n\n private get helperClaimLendingReward() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::redeem_rewards`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperClaimBorrowV2Reward() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::redeem_rewards`),\n )\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperClaimBorrowReward() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`),\n )\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperMint() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::mint::mint`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstakes() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperRedeems() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperRedeem() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBurnScoin() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.scoin}::s_coin_converter::burn_s_coin`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n // private get helperSlippage() {\n // const moveCall = this.commands.find((command) =>\n // this.filterMoveCallCommands(\n // command,\n // `0x5857d185897aaff40ae37b2eecc895efc1a9dff1b210c4fb894eabbce4ac2603::slippage_check::check_slippage`,\n // ),\n // );\n // return new MoveCallHelper(moveCall, this.transaction);\n // }\n\n private get helperStake() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::stake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstake() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperDepositCollateral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperWithdrawCollateral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBorrow() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBorrowWithReferral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow_with_referral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRepay() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::repay::repay`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeMigrateScoin(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateScoin,\n intentionData: {},\n };\n }\n\n private decodeMigrateAndClaim(): DecodeResult {\n let veScaKey;\n if (this.helperStakeObligationWithVeSca.moveCall) {\n veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n }\n const obligationKey = this.helperClaimBorrowReward[0].decodeOwnedObjectId(2);\n const obligationId = this.helperClaimBorrowReward[0].decodeSharedObjectId(3);\n const rewardCoinName = this.utils.parseCoinNameFromType(this.helperClaimBorrowReward[0].typeArg(0));\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateAndClaim,\n intentionData: {\n obligationKey,\n obligationId,\n rewardCoinName,\n veScaKey,\n },\n };\n }\n\n private decodeOpenObligation(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenObligation,\n intentionData: {},\n };\n }\n\n // @TODO: Decode from event rather than from transaction block\n private decodeSupplyLending(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SupplyLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeWithdrawLending(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n const amount = this.helperRedeem.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeWithdrawLendingScoin(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n console.log({ coinName });\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeDepositCollateral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperDepositCollateral.typeArg(0));\n const amount = this.helperDepositCollateral.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperDepositCollateral.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DepositCollateral,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n collateralCoinName: coinName,\n },\n };\n }\n\n private decodeWithdrawCollateral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperWithdrawCollateral.typeArg(0));\n const amount = this.helperWithdrawCollateral.decodeInputU64(5);\n const obligationId = this.helperWithdrawCollateral.decodeSharedObjectId(1);\n const obligationKey = this.helperWithdrawCollateral.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawCollateral,\n intentionData: {\n amount,\n collateralCoinName: coinName,\n obligationKey,\n obligationId,\n },\n };\n }\n\n private decodeBorrow(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n const amount = this.helperBorrow.decodeInputU64(5);\n const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Borrow,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n },\n };\n }\n\n private decodeBorrowWithBoost(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const amount = this.helperBorrow.decodeInputU64(5);\n const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BorrowWithBoost,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n veScaKey,\n },\n };\n }\n\n private decodeBorrowWithReferral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrowWithReferral.typeArg(0));\n let veScaKey;\n if (this.helperStakeObligationWithVeSca.moveCall) {\n veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n }\n const amount = this.helperBorrowWithReferral.decodeInputU64(6);\n const obligationId = this.helperBorrowWithReferral.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrowWithReferral.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BorrowWithReferral,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n veScaKey,\n },\n };\n }\n\n private decodeRepay(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperRepay.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Repay,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n coinName,\n },\n };\n }\n\n private decodeRepayWithBoost(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperRepay.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RepayWithBoost,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n coinName,\n veScaKey,\n },\n };\n }\n\n private decodeStakeSpool(): DecodeResult {\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n let amountFromSplitCoin = 0;\n if (this.helperBurnScoin.moveCall) {\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n if (this.helperStake.moveCall && amountFromSplitCoin === 0) {\n const amount = this.helperStake.getNestedInputParam<SplitCoinTransactionType>(2);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n const coinType = this.helperStake.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(coinType);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeSpool,\n intentionData: {\n amount: amountFromSplitCoin,\n marketCoinName: coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeUnstakeSpool(): DecodeResult {\n const stakeSpoolAccount = this.helperUnstake.decodeOwnedObjectId(1);\n const amount = this.helperUnstake.decodeInputU64(2);\n const coinType = this.helperUnstake.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(coinType);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnstakeSpool,\n intentionData: {\n amount,\n marketCoinName: coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeSupplyWithStakeSpool(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SupplyAndStakeLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeUnstakeAndWithdraw(): DecodeResult {\n const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n this.helperUnstakes.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(1);\n const amount = tx.decodeInputU64(2);\n stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n });\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n let amountFromSplitCoin = 0;\n if (this.helperBurnScoin.moveCall) {\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawAndUnstakeLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n stakeAccountId: stakeAccountWithAmount,\n },\n };\n }\n\n // private decodeMoveAsset(): DecodeResult {\n // const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n // this.helperUnstakes.forEach((tx) => {\n // const stakeAccountId = tx.decodeOwnedObjectId(1);\n // const amount = tx.decodeInputU64(2);\n // stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n // });\n // const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n // let amountFromSplitCoin = 0;\n // if (this.helperBurnScoin.moveCall) {\n // const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n // amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n // }\n // const slippage = this.helperSlippage.decodePureArg(1, 'U64');\n // const validSwapAmount = this.helperSlippage.decodePureArg(2, 'String');\n\n // return {\n // txType: TransactionType.Other,\n // type: TransactionSubType.MigrateWusdcToUsdc,\n // intentionData: {\n // amount: amountFromSplitCoin,\n // coinName,\n // slippage,\n // validSwapAmount,\n // stakeAccountId: stakeAccountWithAmount,\n // },\n // };\n // }\n\n private decodeClaimReward(): DecodeResult {\n const lendingReward: {\n stakeMarketCoinName: string;\n stakeAccountId: string;\n }[] = [];\n const borrowRewardV2: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: string;\n }[] = [];\n\n const borrowReward: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: string;\n }[] = [];\n\n this.helperClaimLendingReward.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(2);\n const stakeMarketCoinName = tx.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(stakeMarketCoinName);\n lendingReward.push({ stakeMarketCoinName: coinName as string, stakeAccountId });\n });\n\n this.helperClaimBorrowV2Reward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(3);\n const obligationId = tx.decodeOwnedObjectId(4);\n const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n borrowRewardV2.push({ obligationId, obligationKey, rewardCoinName });\n });\n\n this.helperClaimBorrowReward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(2);\n const obligationId = tx.decodeOwnedObjectId(3);\n const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n borrowReward.push({ obligationId, obligationKey, rewardCoinName });\n });\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimIncentiveReward,\n intentionData: {\n lendingIncentive: lendingReward,\n borrowIncentiveV2: borrowRewardV2,\n borrowIncentive: borrowReward,\n },\n };\n }\n}\n","// import { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { parseStructTag } from '@mysten/sui/utils';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { MoveCallCommand, TransactionCommand, TransactionCommands, TransactionInputs } from '../types/sui';\n\nexport class Decoder {\n protected inputs: TransactionInputs;\n\n protected commands: TransactionCommands;\n\n protected movecallsAsSet: Set<string>;\n\n constructor(\n public readonly transaction: Transaction,\n protected scallopClient: ScallopClient,\n // protected devInspectResult: DevInspectResults,\n ) {\n this.scallopClient = scallopClient;\n this.inputs = transaction.getData().inputs;\n this.commands = transaction.getData().commands;\n this.movecallsAsSet = new Set(\n this.commands\n .filter(this.isMoveCall)\n .map((command) => `${command.MoveCall!.package}::${command.MoveCall!.module}::${command.MoveCall!.function}`),\n );\n }\n\n get address() {\n return this.scallopClient.address;\n }\n\n get utils() {\n return this.scallopClient.utils;\n }\n\n protected get coreId() {\n return {\n protocolPkg: this.address.get('core.packages.protocol.id'),\n market: this.address.get('core.market'),\n version: this.address.get('core.version'),\n coinDecimalsRegistry: this.address.get('core.coinDecimalsRegistry'),\n xOracle: this.address.get('core.oracles.xOracle'),\n spoolPkg: this.address.get('spool.id'),\n borrowIncentivePkg: this.address.get('borrowIncentive.id'),\n veScaPkgId: this.address.get('vesca.id'),\n scoin: this.address.get('scoin.id'),\n referral: this.address.get('referral.id'),\n };\n }\n\n protected matchMoveCallCommand(moveCall: MoveCallCommand, target: string) {\n const { address, module, name } = parseStructTag(target);\n if (!moveCall) {\n return false;\n }\n return moveCall.package === address && moveCall.module === module && moveCall.function === name;\n }\n\n private isMoveCall(\n command: TransactionCommand,\n ): command is typeof command & NonNullable<{ MoveCall: MoveCallCommand }> {\n return command.$kind === 'MoveCall' && !!command.MoveCall;\n }\n\n protected filterMoveCallCommands(command: TransactionCommand, target: string) {\n return this.isMoveCall(command) && this.matchMoveCallCommand(command.MoveCall, target);\n }\n\n protected getMoveCallCommands(targets: string[]): MoveCallCommand[] {\n const targetSet = new Set(targets);\n const targetToIdxMap = targets.reduce(\n (acc, target, idx) => {\n acc[target] = idx;\n return acc;\n },\n {} as Record<string, number>,\n );\n\n const moveCallCommands: MoveCallCommand[] = [];\n this.commands.forEach((command) => {\n if (this.isMoveCall(command) && command.MoveCall && targetSet.has(command.MoveCall.package)) {\n moveCallCommands[targetToIdxMap[command.MoveCall.package]] = command.MoveCall;\n }\n });\n\n return moveCallCommands;\n }\n\n protected hasMoveCallCommand(target: string) {\n return this.movecallsAsSet.has(target);\n }\n}\n","import { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { TransactionBlockInput } from '@mysten/sui.js/transactions';\n\nimport {\n BcsType,\n MoveCallTransactionArgumentType,\n MoveCallTransactionType,\n SplitCoinTransactionType,\n TransactionCommand,\n} from '../types/sui';\n\nclass MoveCallHelper {\n private cmdIdx: number;\n\n constructor(\n public readonly moveCall: TransactionCommand | undefined,\n public readonly transaction: Transaction,\n ) {\n this.cmdIdx = moveCall?.MoveCall\n ? transaction.getData().commands.findIndex((t) => {\n if (t.$kind === 'MoveCall') {\n const target = `${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`;\n const moveCallTarget = `${moveCall.MoveCall.package}::${moveCall.MoveCall.module}::${moveCall.MoveCall.function}`;\n return target === moveCallTarget;\n }\n return false;\n })\n : -1;\n }\n\n get txBlockTransactions(): MoveCallTransactionType {\n return this.transaction.blockData.transactions[this.cmdIdx] as MoveCallTransactionType;\n }\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'U64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'U8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'Address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'String');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'Bool');\n }\n\n decodePureArg<T>(argIndex: number, type: BcsType) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, type);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return arg;\n }\n\n getNestedInputParam<T = SplitCoinTransactionType>(argIndex: number) {\n const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n if (arg.kind !== 'NestedResult') {\n throw new Error('not input type');\n }\n return this.transaction.blockData.transactions[arg.index] as T;\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, type: BcsType) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n const a = bcs[type];\n return bcs[type].parse(new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.U64.parse(new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.txBlockTransactions.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.transaction.blockData.inputs[index];\n }\n}\n\nexport default MoveCallHelper;\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport MoveCallHelper from './moveCallHelper';\nimport { SplitCoinTransactionType } from '../types/sui';\n\nclass SplitCoinHelper {\n constructor(\n public readonly splitCoin: SplitCoinTransactionType,\n public readonly txb: Transaction,\n ) {}\n\n getAmountInput() {\n return this.splitCoin.amounts\n .map((input) => {\n if (input.kind === 'Input') {\n return Number(MoveCallHelper.getPureInputValue<number>(input, 'U64'));\n }\n return undefined;\n })\n .filter((input) => input !== undefined);\n }\n}\n\nexport default SplitCoinHelper;\n","import { normalizeStructTag, SUI_CLOCK_OBJECT_ID, SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { ScallopQuery, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nexport const isObligationMigrated = async (query: ScallopQuery, obligationId: string) => {\n const obligation = await query.suiKit.client().getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n\n if (obligation?.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const fields = obligation.data.content.fields as any;\n const lockKey = fields.lock_key?.fields.name as string;\n if (!lockKey) {\n return false;\n }\n const borrowIncentiveObjectId = query.address.get('borrowIncentive.object');\n return lockKey === `${borrowIncentiveObjectId.slice(2)}::incentive_account::IncentiveProgramLockKey`;\n};\n\nconst OldBorrowIncentiveContract = {\n id: '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410',\n incentivePools: '0x64972b713ccec45ec3964809e477cea6f97350c0c50ca3aec85bb631639266ec',\n incentiveAccounts: '0x3c0b707068bdcea8bb859d751ad3e2149a9f83c13fcf4054ef91372a00bccdd3',\n} as const;\n\nexport const OldBorrowIncentiveTxBuilder = {\n unstakeObligation: (tx: ScallopTxBlock, obligationKey: string, obligationId: string) =>\n tx.moveCall(\n `${OldBorrowIncentiveContract.id}::user::unstake`,\n [\n OldBorrowIncentiveContract.incentivePools,\n OldBorrowIncentiveContract.incentiveAccounts,\n tx.object(obligationKey),\n tx.object(obligationId),\n SUI_CLOCK_OBJECT_ID,\n ],\n [normalizeStructTag(SUI_TYPE_ARG)],\n ),\n redeem_rewards: (tx: ScallopTxBlock, obligationKey: string, obligationId: string, rewardType: string) =>\n tx.moveCall(\n `${OldBorrowIncentiveContract.id}::user::redeem_rewards`,\n [\n OldBorrowIncentiveContract.incentivePools,\n OldBorrowIncentiveContract.incentiveAccounts,\n tx.object(obligationKey),\n tx.object(obligationId),\n SUI_CLOCK_OBJECT_ID,\n ],\n [normalizeStructTag(rewardType)],\n ),\n} as const;\n","import { TransactionType } from '@msafe/sui3-utils';\n\nimport { Decoder } from './decoder';\nimport { DecodeResult } from '../types';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper } from '../utils';\n\nexport class DecoderReferral extends Decoder {\n decode() {\n if (this.isCreateReferralLink()) {\n return this.decodeCreateReferralLink();\n }\n if (this.isClaimRevenueReferral()) {\n return this.decodeClaimRevenueReferral();\n }\n if (this.isBindReferral()) {\n return this.decodeBindReferral();\n }\n return undefined;\n }\n\n private isClaimRevenueReferral() {\n return this.hasMoveCallCommand(`${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`);\n }\n\n private isCreateReferralLink() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_placeholder_key`);\n }\n\n private isBindReferral() {\n return this.hasMoveCallCommand(`${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`);\n }\n\n private get helperClaimRevenueReferral() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(\n command,\n `${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,\n ),\n )\n .map((trans) => new MoveCallHelper(trans, this.transaction));\n return moveCalls;\n }\n\n private get helperBindReferral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeCreateReferralLink(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CreateReferralLink,\n intentionData: {},\n };\n }\n\n private decodeClaimRevenueReferral(): DecodeResult {\n const veScaKey = this.helperClaimRevenueReferral[0].decodeOwnedObjectId(2);\n const coins = this.helperClaimRevenueReferral.map((helper) => helper.typeArg(0));\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimRevenueReferral,\n intentionData: {\n veScaKey,\n coins,\n },\n };\n }\n\n private decodeBindReferral(): DecodeResult {\n const veScaKey = this.helperBindReferral.decodePureArg(1, 'Address');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BindReferral,\n intentionData: {\n veScaKey,\n },\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { DecodeResult } from '../types';\nimport { SplitCoinTransactionType } from '../types/sui';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, SplitCoinHelper } from '../utils';\n\nexport class DecoderVeSca extends Decoder {\n decode() {\n if (this.isExtendPeriodAndStakeMoreSca()) {\n return this.decodePeriodAndStakeMoreSca();\n }\n if (this.isStakeScaFirsTime() || this.isStakeMoreSca()) {\n return this.decodeStakeSca();\n }\n if (this.isRenewExpiredVeSca()) {\n return this.decodeRenewExpiredVeSca();\n }\n if (this.isExtendPeriod()) {\n return this.decodeExtendStakePeriod();\n }\n if (this.isRedeemSca()) {\n return this.decodeRedeemSca();\n }\n return undefined;\n }\n\n private isStakeScaFirsTime() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`);\n }\n\n private isExtendPeriodAndStakeMoreSca() {\n const extendPeriod = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n const stakeMoreSca = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n return !!extendPeriod && !!stakeMoreSca;\n }\n\n private isRedeemSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::redeem`);\n }\n\n private isStakeMoreSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n }\n\n private isExtendPeriod() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n }\n\n private isRenewExpiredVeSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`);\n }\n\n private get helperStakeMoreSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperStakeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperExtendStakePeriod() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRedeemSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::redeem`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRenewExpired() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperOldUnstakeObligation() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstakeObligation() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeRedeemSca(): DecodeResult {\n const veScaKey = this.helperRedeemSca.decodeOwnedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RedeemSca,\n intentionData: {\n veScaKey,\n },\n };\n }\n\n private decodeRenewExpiredVeSca(): DecodeResult {\n const lockSca = this.helperRenewExpired.getNestedInputParam<SplitCoinTransactionType>(4);\n const unlockTime = this.helperRenewExpired.decodeInputU64(5);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const veScaKey = this.helperRenewExpired.decodeOwnedObjectId(1);\n const isHaveRedeem = !!this.helperRedeemSca.moveCall;\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RenewExpStakePeriod,\n intentionData: {\n amount: amountFromSplitCoin,\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isHaveRedeem,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodeExtendStakePeriod(): DecodeResult {\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const veScaKey = this.helperExtendStakePeriod.decodeOwnedObjectId(1);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ExtendStakePeriod,\n intentionData: {\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodePeriodAndStakeMoreSca(): DecodeResult {\n const lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let veScaKey;\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeMoreSca.moveCall) {\n veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ExtendPeriodAndStakeMore,\n intentionData: {\n amount: amountFromSplitCoin,\n veScaKey,\n unlockTime,\n obligationId,\n obligationKey,\n isOldBorrowIncentive,\n isObligationLocked,\n },\n };\n }\n\n private decodeStakeSca(): DecodeResult {\n let lockSca;\n let unlockTime;\n if (this.helperStakeSca.moveCall && this.helperStakeMoreSca.moveCall === undefined) {\n lockSca = this.helperStakeSca.getNestedInputParam<SplitCoinTransactionType>(3);\n unlockTime = this.helperStakeSca.decodeInputU64(4);\n } else {\n lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n }\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let veScaKey;\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeMoreSca.moveCall) {\n veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeSca,\n intentionData: {\n amount: amountFromSplitCoin,\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { SuiObjectArg } from '../types';\n\nexport abstract class ScallopCoreBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n get application() {\n return 'msafe-core';\n }\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n private isObligationLocked = async (suiClient: SuiClient, obligationId: SuiObjectArg) => {\n const obligationObjectData = await suiClient.getObject({\n id: typeof obligationId === 'string' ? obligationId : obligationId.objectId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectData &&\n obligationObjectData?.data.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectData.data.content.fields\n ) {\n obligationLocked = Boolean(obligationObjectData.data.content.fields.lock_key);\n }\n\n return obligationLocked;\n };\n\n protected async buildTxWithRefreshObligation(\n client: ScallopClient,\n input: {\n walletAddress: string;\n obligationId: string;\n obligationKey: string;\n veScaKey?: string;\n },\n callback: (\n client: ScallopClient,\n txBlock: ScallopTxBlock,\n args: {\n walletAddress: string;\n obligationId: string;\n obligationKey: string;\n veScaKey?: string;\n },\n ) => Promise<void>,\n ) {\n const txb = client.builder.createTxBlock();\n txb.setSender(input.walletAddress);\n\n const { obligationId, obligationKey } = input;\n\n // unstake obligation if it is locked\n const locked = await this.isObligationLocked(client.suiKit.client(), obligationId);\n if (locked) {\n await txb.unstakeObligationQuick(obligationId, obligationKey);\n await callback(client, txb, input);\n await txb.stakeObligationWithVeScaQuick(obligationId, obligationKey, input.veScaKey);\n } else {\n await callback(client, txb, input);\n }\n\n return txb;\n }\n\n abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction>;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class BorrowIntention extends ScallopCoreBaseIntention<BorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async borrow({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const { coinName, amount, obligationId, obligationKey } = this.data;\n const sender = account.address;\n const tx = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress: sender,\n obligationId,\n obligationKey,\n },\n async (_, innerTx) => {\n const coin = await innerTx.borrowQuick(+amount, coinName, obligationId, obligationKey);\n innerTx.transferObjects([coin], sender);\n },\n );\n\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrow(input);\n }\n\n static fromData(data: BorrowIntentionData): BorrowIntention {\n return new BorrowIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithBoostIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string;\n}\n\nexport class BorrowWithBoostIntention extends ScallopCoreBaseIntention<BorrowWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowWithBoostIntentionData) {\n super(data);\n }\n\n public async borrowWithBoost(\n client: ScallopClient,\n data: BorrowWithBoostIntentionData,\n walletAddress: string,\n ): Promise<Transaction> {\n const { obligationId, obligationKey, veScaKey, amount, coinName: poolCoinName } = this.data;\n const txb = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress,\n obligationId,\n obligationKey,\n veScaKey,\n },\n async (_, scallopTxBlock) => {\n const coin = await scallopTxBlock.borrowQuick(+amount, poolCoinName, obligationId, obligationKey);\n scallopTxBlock.transferObjects([coin], walletAddress);\n },\n );\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrowWithBoost(input.scallopClient, this.data, input.account.address);\n }\n\n static fromData(data: BorrowWithBoostIntentionData): BorrowWithBoostIntention {\n return new BorrowWithBoostIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithReferralIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string | undefined;\n}\n\nexport class BorrowWithReferralIntention extends ScallopCoreBaseIntention<BorrowWithReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BorrowWithReferral;\n\n constructor(public readonly data: BorrowWithReferralIntentionData) {\n super(data);\n }\n\n async borrowWithReferral({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const walletAddress = account.address;\n const { obligationId, obligationKey, veScaKey, coinName: poolCoinName, amount } = this.data;\n const txb = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress,\n obligationId,\n obligationKey,\n veScaKey,\n },\n async (_, scallopTxBlock) => {\n const borrowReferral = scallopTxBlock.claimReferralTicket(poolCoinName);\n const coin = await scallopTxBlock.borrowWithReferralQuick(\n +amount,\n poolCoinName,\n borrowReferral,\n obligationId,\n obligationKey,\n );\n scallopTxBlock.burnReferralTicket(borrowReferral, poolCoinName);\n scallopTxBlock.transferObjects([coin], walletAddress);\n },\n );\n\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrowWithReferral(input);\n }\n\n static fromData(data: BorrowWithReferralIntentionData): BorrowWithReferralIntention {\n return new BorrowWithReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport { SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Lending, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { isObligationMigrated, OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport class ClaimIncentiveRewardIntention extends ScallopCoreBaseIntention<any> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimIncentiveReward;\n\n constructor(data = {}) {\n super(data);\n }\n\n async claimIncentiveRewards(client: ScallopClient, walletAddress: string) {\n const txb = client.builder.createTxBlock();\n txb.setSender(walletAddress);\n\n const allStakeAccounts = await client.query.getAllStakeAccounts(walletAddress);\n const lendings = await client.query.getLendings(undefined, walletAddress);\n const obligations = await client.query.getObligations(walletAddress);\n const obligationAccounts = Object.values((await client.query.getObligationAccounts(walletAddress)) ?? []);\n\n const lendingInfos = (() => {\n const spoolCoinNames = [...client.constants.whitelist.spool].map((marketCoinName) =>\n client.utils.parseCoinName(marketCoinName),\n );\n\n return (\n Object.values(lendings ?? []).filter(\n (lendingInfo) => !!lendingInfo && spoolCoinNames.includes(lendingInfo.coinName),\n ) as Lending[]\n ).reduce(\n (acc, lendingInfo) => {\n const marketCoinName = client.utils.parseMarketCoinName(lendingInfo.coinName);\n if (!acc[marketCoinName]) {\n acc[marketCoinName] = 0;\n }\n acc[marketCoinName] += lendingInfo.availableClaimCoin;\n return acc;\n },\n {} as Record<string, number>,\n );\n })();\n\n const rewardCoinCollection: Record<string, TransactionResult[]> = {};\n\n Object.entries(allStakeAccounts).forEach(([stakeMarketCoinName, stakeAccounts]) => {\n for (let i = 0; i < stakeAccounts.length; i++) {\n const stakeAccount = stakeAccounts[i];\n // skip if no points to save gas\n if (!lendingInfos[stakeMarketCoinName as string]) {\n continue;\n }\n const rewardCoin = txb.claim(stakeAccount.id, stakeMarketCoinName as string);\n\n // supposed to be all SUI reward for sCoin pool\n if (!rewardCoinCollection.sui) {\n rewardCoinCollection.sui = [rewardCoin];\n } else {\n rewardCoinCollection.sui.push(rewardCoin);\n }\n }\n });\n\n const totalClaimCoin = (() => {\n const coins = {} as Record<string, number>;\n coins.sui = Object.values(lendingInfos).reduce(\n (totalClaim, availableClaimCoin) => totalClaim + availableClaimCoin,\n 0,\n );\n\n obligationAccounts.forEach((obligationAccount) => {\n Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n if (borrowIncentive) {\n borrowIncentive.rewards.forEach((reward) => {\n if (!coins[reward.coinName]) {\n coins[reward.coinName] = 0;\n }\n if (coins[reward.coinName]) {\n coins[reward.coinName] += reward.availableClaimCoin;\n } else {\n coins[reward.coinName] = reward.availableClaimCoin;\n }\n });\n }\n });\n });\n return coins;\n })();\n\n if (obligations.length > 0 && obligationAccounts.length > 0) {\n for (let i = 0; i < obligationAccounts.length; i++) {\n const obligationAccount = obligationAccounts[i];\n\n let obligationHasReward = false;\n const obligationKeyId = obligations.find(\n (obligation) => obligation.id === obligationAccount.obligationId,\n )?.keyId;\n\n const isRewardCoinClaimed: Partial<Record<string, boolean>> = {};\n if (obligationKeyId) {\n Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n if (borrowIncentive) {\n const filteredBorrowIncentives = borrowIncentive.rewards.filter((reward) => {\n const rewardCoinName = reward.coinName as string;\n // determine if this obligation has rewards at all to reduce overall movecalls\n return reward.availableClaimCoin > 0 && !isRewardCoinClaimed[rewardCoinName];\n });\n obligationHasReward = filteredBorrowIncentives.length > 0;\n filteredBorrowIncentives.forEach((filteredBorrowIncentive) => {\n const rewardCoin = txb.claimBorrowIncentive(\n obligationAccount.obligationId,\n obligationKeyId,\n filteredBorrowIncentive.coinName,\n );\n\n isRewardCoinClaimed[filteredBorrowIncentive.coinName] = true;\n if (!rewardCoinCollection[filteredBorrowIncentive.coinName]) {\n rewardCoinCollection[filteredBorrowIncentive.coinName] = [rewardCoin];\n } else {\n rewardCoinCollection[filteredBorrowIncentive.coinName].push(rewardCoin);\n }\n });\n }\n });\n\n // claim old reward\n // if no claim coin in sui, skip\n if (totalClaimCoin.sui > 0) {\n const oldRewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n txb,\n obligationKeyId,\n obligationAccount.obligationId,\n SUI_TYPE_ARG,\n );\n // should all be SUI\n if (rewardCoinCollection.sui) {\n rewardCoinCollection.sui.push(oldRewardCoin);\n } else {\n rewardCoinCollection.sui = [oldRewardCoin];\n }\n }\n\n if (obligationHasReward) {\n const isMigrated = await isObligationMigrated(client.query, obligationAccount.obligationId);\n\n // only restake if the obligation is migrated\n if (isMigrated) {\n txb.unstakeObligation(obligationAccount.obligationId, obligationKeyId);\n // Check if current obligationId is binded with veSCA before restake\n const bindedVeScaKey = await client.query.getBindedVeScaKey(obligationAccount.obligationId);\n if (bindedVeScaKey) {\n txb.stakeObligationWithVesca(obligationAccount.obligationId, obligationKeyId, bindedVeScaKey);\n } else {\n txb.stakeObligation(obligationAccount.obligationId, obligationKeyId);\n }\n }\n }\n }\n }\n }\n\n const objectsNeedToTransfer = (\n await Promise.all(\n Object.entries(rewardCoinCollection).map(async ([coinName, rewardCoins]) => {\n const mergeDest = rewardCoins[0];\n if (rewardCoins.length > 1) {\n txb.mergeCoins(mergeDest, rewardCoins.slice(1));\n }\n if (coinName === 'sui') {\n txb.mergeCoins(txb.gas, [mergeDest]);\n return undefined;\n }\n await client.builder.utils.mergeSimilarCoins(\n txb,\n mergeDest,\n client.utils.parseCoinType(coinName as string),\n walletAddress,\n );\n return mergeDest;\n }),\n )\n ).filter((t) => !!t);\n\n if (objectsNeedToTransfer.length > 0) {\n txb.transferObjects(objectsNeedToTransfer, walletAddress);\n }\n\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.claimIncentiveRewards(input.scallopClient, input.account.address);\n }\n\n static fromData(data = {}): ClaimIncentiveRewardIntention {\n return new ClaimIncentiveRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface DepositCollateralIntentionData {\n collateralCoinName: string;\n amount: number | string;\n obligationId: string;\n}\n\nexport class DepositCollateralIntention extends ScallopCoreBaseIntention<DepositCollateralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DepositCollateral;\n\n constructor(public readonly data: DepositCollateralIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.depositCollateral(\n this.data.collateralCoinName,\n +this.data.amount,\n false,\n this.data.obligationId,\n );\n }\n\n static fromData(data: DepositCollateralIntentionData): DepositCollateralIntention {\n return new DepositCollateralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface MigrateAndClaimIntentionData {\n obligationKey: string;\n obligationId: string;\n rewardCoinName: string;\n veScaKey?: string;\n}\n\nexport class MigrateAndClaimIntention extends ScallopCoreBaseIntention<MigrateAndClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateAndClaim;\n\n constructor(public readonly data: MigrateAndClaimIntentionData) {\n super(data);\n }\n\n async migrateAndClaim({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { obligationKey, obligationId, rewardCoinName, veScaKey } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const rewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n tx,\n obligationKey,\n obligationId,\n client.utils.parseCoinType(rewardCoinName),\n );\n tx.transferObjects([rewardCoin], sender);\n await tx.unstakeObligationQuick(obligationId, obligationKey);\n if (veScaKey) {\n await tx.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n } else {\n await tx.stakeObligationQuick(obligationId, obligationKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.migrateAndClaim(input);\n }\n\n static fromData(data: MigrateAndClaimIntentionData): MigrateAndClaimIntention {\n return new MigrateAndClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MigrateScoinIntentionData {}\n\nexport class MigrateScoinIntention extends ScallopCoreBaseIntention<MigrateScoinIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateScoin;\n\n constructor(public readonly data: MigrateScoinIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.migrateAllMarketCoin(false, false);\n }\n\n static fromData(data: MigrateScoinIntentionData): MigrateScoinIntention {\n return new MigrateScoinIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface OpenObligationIntentionData {}\n\nexport class OpenObligationIntention extends ScallopCoreBaseIntention<OpenObligationIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.OpenObligation;\n\n constructor(public readonly data: OpenObligationIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.openObligation(false);\n }\n\n static fromData(data: OpenObligationIntentionData): OpenObligationIntention {\n return new OpenObligationIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class RepayIntention extends ScallopCoreBaseIntention<RepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Repay;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async repay({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { coinName, amount, obligationId, obligationKey } = this.data;\n\n const tx = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress: sender,\n obligationId,\n obligationKey,\n },\n async (_, innerTx) => {\n await innerTx.repayQuick(+amount, coinName, obligationId);\n },\n );\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.repay(input);\n }\n\n static fromData(data: RepayIntentionData): RepayIntention {\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayWithBoostIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n veScaKey: string;\n}\n\nexport class RepayWithBoostIntention extends ScallopCoreBaseIntention<RepayWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RepayWithBoost;\n\n constructor(public readonly data: RepayWithBoostIntentionData) {\n super(data);\n }\n\n async repayWithBoost({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { coinName, amount, obligationId, veScaKey } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const availableStake = client.constants.whitelist.borrowing.has(coinName);\n if (availableStake) {\n await tx.unstakeObligationQuick(obligationId, undefined);\n }\n await tx.repayQuick(+amount, coinName, obligationId);\n if (availableStake) {\n await tx.stakeObligationWithVeScaQuick(obligationId, undefined, veScaKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.repayWithBoost(input);\n }\n\n static fromData(data: RepayWithBoostIntentionData): RepayWithBoostIntention {\n return new RepayWithBoostIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyLendingIntentionData {\n amount: number | string;\n coinName: string;\n}\n\nexport class SupplyLendingIntention extends ScallopCoreBaseIntention<SupplyLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyLending;\n\n constructor(public readonly data: SupplyLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.deposit(this.data.coinName, +this.data.amount, false, input.account.address);\n }\n\n static fromData(data: SupplyLendingIntentionData): SupplyLendingIntention {\n return new SupplyLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface UnstakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: string;\n stakeAccountId: string | null;\n}\n\nexport class UnstakeSpoolIntention extends ScallopCoreBaseIntention<UnstakeSpoolIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.UnstakeSpool;\n\n constructor(public readonly data: UnstakeSpoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.unstake(this.data.marketCoinName, +this.data.amount, false);\n }\n\n static fromData(data: UnstakeSpoolIntentionData): UnstakeSpoolIntention {\n return new UnstakeSpoolIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawAndUnstakeLendingIntentionData {\n amount: number | undefined;\n coinName: string;\n stakeAccountId: { id: string; coin: number }[];\n}\n\nexport class WithdrawAndUnstakeLendingIntention extends ScallopCoreBaseIntention<WithdrawAndUnstakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawAndUnstakeLending;\n\n constructor(public readonly data: WithdrawAndUnstakeLendingIntentionData) {\n super(data);\n }\n\n async unstakeAndWithdraw(client: ScallopClient, data: WithdrawAndUnstakeLendingIntentionData, walletAddress: string) {\n const tx = client.builder.createTxBlock();\n tx.setSender(walletAddress);\n\n const { stakeAccountId, amount: totalAmount, coinName } = this.data;\n const withdrawCoins = [];\n for (let i = 0; i < stakeAccountId.length; i++) {\n const { id: stakeAccount, coin: amount } = stakeAccountId[i];\n const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n const [marketCoin] = await tx.unstakeQuick(amount, stakeMarketCoinName, stakeAccount);\n if (marketCoin) {\n const wdScoin = tx.withdraw(marketCoin, coinName);\n withdrawCoins.push(wdScoin);\n }\n }\n if (totalAmount > 0) {\n const wdCoin = await tx.withdrawQuick(totalAmount, coinName);\n withdrawCoins.push(wdCoin);\n }\n if (withdrawCoins.length > 1) {\n tx.mergeCoins(withdrawCoins[0], withdrawCoins.slice(1));\n }\n tx.transferObjects(withdrawCoins, walletAddress);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.unstakeAndWithdraw(input.scallopClient, this.data, input.account.address);\n }\n\n static fromData(data: WithdrawAndUnstakeLendingIntentionData): WithdrawAndUnstakeLendingIntention {\n return new WithdrawAndUnstakeLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawCollateralIntentionData {\n collateralCoinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class WithdrawCollateralIntention extends ScallopCoreBaseIntention<WithdrawCollateralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawCollateral;\n\n constructor(public readonly data: WithdrawCollateralIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.withdrawCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\n false,\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\n }\n\n static fromData(data: WithdrawCollateralIntentionData): WithdrawCollateralIntention {\n return new WithdrawCollateralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks, TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawLendingIntentionData {\n amount: string | number;\n coinName: string;\n}\n\nexport class WithdrawLendingIntention extends ScallopCoreBaseIntention<WithdrawLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawLending;\n\n constructor(public readonly data: WithdrawLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.withdraw(this.data.coinName, Number(this.data.amount), false, input.account.address);\n }\n\n static fromData(data: WithdrawLendingIntentionData): WithdrawLendingIntention {\n return new WithdrawLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BindReferralIntentionData {\n veScaKey: string;\n}\n\nexport class BindReferralIntention extends ScallopCoreBaseIntention<BindReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BindReferral;\n\n constructor(public readonly data: BindReferralIntentionData) {\n super(data);\n }\n\n async bindReferral({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n tx.bindToReferral(this.data.veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.bindReferral(input);\n }\n\n static fromData(data: BindReferralIntentionData): BindReferralIntention {\n return new BindReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ClaimRevenueReferralIntentionData {\n veScaKey: string;\n coins: string[];\n}\n\nexport class ClaimRevenueReferralIntention extends ScallopCoreBaseIntention<ClaimRevenueReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimRevenueReferral;\n\n constructor(public readonly data: ClaimRevenueReferralIntentionData) {\n super(data);\n }\n\n async claimRevenueReferral({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { veScaKey, coins } = this.data;\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const coinsName = coins.map((coin) => client.utils.parseCoinNameFromType(coin));\n\n await tx.claimReferralRevenueQuick(veScaKey, coinsName);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.claimRevenueReferral(input);\n }\n\n static fromData(data: ClaimRevenueReferralIntentionData): ClaimRevenueReferralIntention {\n return new ClaimRevenueReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface CreateReferralLinkIntentionData {}\n\nexport class CreateReferralLinkIntention extends ScallopCoreBaseIntention<CreateReferralLinkIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CreateReferralLink;\n\n constructor(public readonly data: CreateReferralLinkIntentionData) {\n super(data);\n }\n\n async createReferralLink({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const referralTicket = tx.mintEmptyVeSca();\n tx.transferObjects([referralTicket], sender);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.createReferralLink(input);\n }\n\n static fromData(data: CreateReferralLinkIntentionData): CreateReferralLinkIntention {\n return new CreateReferralLinkIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendPeriodAndStakeMoreIntentionData {\n amount: number;\n veScaKey: string;\n unlockTime: number;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n isOldBorrowIncentive: boolean;\n isObligationLocked: boolean;\n}\n\nexport class ExtendPeriodAndStakeMoreIntention extends ScallopCoreBaseIntention<ExtendPeriodAndStakeMoreIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendPeriodAndStakeMore;\n\n constructor(public readonly data: ExtendPeriodAndStakeMoreIntentionData) {\n super(data);\n }\n\n async extendPeriodAndStakeMoreSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { amount, veScaKey, unlockTime, obligationId, obligationKey, isOldBorrowIncentive, isObligationLocked } =\n this.data;\n\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n tx.extendLockPeriod(veScaKey, unlockTime);\n tx.extendLockAmount(veScaKey, takeCoin);\n tx.transferObjects([leftCoin], sender);\n if (!obligationId || !obligationKey) {\n return tx.txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationId, obligationKey);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.extendPeriodAndStakeMoreSca(input);\n }\n\n static fromData(data: ExtendPeriodAndStakeMoreIntentionData): ExtendPeriodAndStakeMoreIntention {\n return new ExtendPeriodAndStakeMoreIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendStakePeriodIntentionData {\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n unlockTime: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class ExtendStakePeriodIntention extends ScallopCoreBaseIntention<ExtendStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendStakePeriod;\n\n constructor(public readonly data: ExtendStakePeriodIntentionData) {\n super(data);\n }\n\n async extendStakeScaLockPeriod({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n const { veScaKey, unlockTime, obligationId, obligationKey, isObligationLocked, isOldBorrowIncentive } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n tx.extendLockPeriod(veScaKey, unlockTime);\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.extendStakeScaLockPeriod(input);\n }\n\n static fromData(data: ExtendStakePeriodIntentionData): ExtendStakePeriodIntention {\n return new ExtendStakePeriodIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RedeemScaIntentionData {\n veScaKey: string;\n}\n\nexport class RedeemScaIntention extends ScallopCoreBaseIntention<RedeemScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RedeemSca;\n\n constructor(public readonly data: RedeemScaIntentionData) {\n super(data);\n }\n\n async redeemSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const { veScaKey } = this.data;\n const sender = account.address;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n await tx.redeemScaQuick(veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.redeemSca(input);\n }\n\n static fromData(data: RedeemScaIntentionData): RedeemScaIntention {\n return new RedeemScaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RenewExpStakePeriodIntentionData {\n amount: number;\n unlockTime: number;\n vescaKey: string;\n isHaveRedeem: boolean;\n obligation?: string;\n obligationKey?: string;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n}\n\nexport class RenewExpStakePeriodIntention extends ScallopCoreBaseIntention<RenewExpStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RenewExpStakePeriod;\n\n constructor(public readonly data: RenewExpStakePeriodIntentionData) {\n super(data);\n }\n\n async renewExpiredStakeSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n const {\n amount,\n unlockTime,\n vescaKey,\n isHaveRedeem,\n obligation,\n obligationKey,\n isObligationLocked,\n isOldBorrowIncentive,\n } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n if (isHaveRedeem) {\n const redeem = tx.redeemSca(vescaKey);\n tx.transferObjects([redeem], sender);\n }\n\n // Get all SCA and merge them into one.\n const coins = await client.builder.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n tx.transferObjects([leftCoin], sender);\n\n // renew veSCA\n tx.renewExpiredVeSca(vescaKey, takeCoin, unlockTime);\n if (!obligation || !obligationKey) {\n return tx.txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligation);\n } else {\n tx.unstakeObligation(obligation, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.renewExpiredStakeSca(input);\n }\n\n static fromData(data: RenewExpStakePeriodIntentionData): RenewExpStakePeriodIntention {\n return new RenewExpStakePeriodIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface StakeScaIntentionData {\n amount: number;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n unlockTime: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class StakeScaIntention extends ScallopCoreBaseIntention<StakeScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSca;\n\n constructor(public readonly data: StakeScaIntentionData) {\n super(data);\n }\n\n async stakeSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { amount, isObligationLocked, isOldBorrowIncentive, obligationId, obligationKey, unlockTime, veScaKey } =\n this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n\n let newVescaKey;\n if (!veScaKey) {\n newVescaKey = tx.lockSca(takeCoin, unlockTime);\n } else {\n tx.extendLockAmount(veScaKey, takeCoin);\n }\n\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey || newVescaKey);\n }\n\n if (!veScaKey) {\n tx.transferObjects([newVescaKey, leftCoin], sender);\n }\n\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.stakeSca(input);\n }\n\n static fromData(data: StakeScaIntentionData): StakeScaIntention {\n return new StakeScaIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyAndStakeLendingIntentionData {\n amount: number | string;\n coinName: string;\n stakeAccountId?: string | null;\n}\n\nexport class SupplyAndStakeLendingIntention extends ScallopCoreBaseIntention<SupplyAndStakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyAndStakeLending;\n\n constructor(public readonly data: SupplyAndStakeLendingIntentionData) {\n super(data);\n }\n\n async supplyAndStake({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { amount, coinName, stakeAccountId } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const marketCoin = await tx.depositQuick(+amount, coinName);\n const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n if (client.constants.whitelist.spool.has(stakeMarketCoinName)) {\n return tx.txBlock;\n }\n const stakeAccounts = await client.query.getStakeAccounts(stakeMarketCoinName, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await tx.stakeQuick(marketCoin, stakeMarketCoinName, targetStakeAccount);\n } else {\n const newStakeAccount = tx.createStakeAccount(stakeMarketCoinName);\n await tx.stakeQuick(marketCoin, stakeMarketCoinName, newStakeAccount);\n tx.transferObjects([newStakeAccount], sender);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.supplyAndStake(input);\n }\n\n static fromData(data: SupplyAndStakeLendingIntentionData): SupplyAndStakeLendingIntention {\n return new SupplyAndStakeLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawStakedScaIntentionData {\n vescaKey?: string;\n}\n\nexport class WithdrawStakedScaIntention extends ScallopCoreBaseIntention<WithdrawStakedScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawStakedSca;\n\n constructor(public readonly data: WithdrawStakedScaIntentionData) {\n super(data);\n }\n\n async withdrawUnlockedSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { vescaKey } = this.data;\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n await tx.redeemScaQuick(vescaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.withdrawUnlockedSca(input);\n }\n\n static fromData(data: WithdrawStakedScaIntentionData): WithdrawStakedScaIntention {\n return new WithdrawStakedScaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n ConvertAndDepositIntentionData,\n ConvertIntentionData,\n SpringSuiIntentionData,\n StakeAndDepositIntentionData,\n StakeIntentionData,\n UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ConvertIntention } from './intentions/convert';\nimport { ConvertAndDepositIntention } from './intentions/convertAndDeposit';\nimport { StakeIntention } from './intentions/stake';\nimport { StakeAndDepositIntention } from './intentions/stakeAndDeposit';\nimport { UnstakeIntention } from './intentions/unstake';\nimport { Utils, TransactionSubType, getUtils, IntentionInput } from './types/helper';\n\nexport type SpringSuiIntention =\n | StakeIntention\n | StakeAndDepositIntention\n | ConvertIntention\n | ConvertAndDepositIntention\n | UnstakeIntention;\n\nexport class SpringSuiAppHelper implements IAppHelperInternal<SpringSuiIntentionData> {\n application = 'SpringSui';\n\n supportSDK = '@mysten/sui' as const;\n\n private utils: Utils | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SpringSuiIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: account.address,\n transactionBlock: transaction,\n });\n console.log('SpringSuiAppHelper.deserialize', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: SpringSuiIntentionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { network, txSubType, intentionData, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n let intention: SpringSuiIntention;\n switch (txSubType) {\n case TransactionSubType.STAKE:\n intention = StakeIntention.fromData(intentionData as StakeIntentionData);\n break;\n case TransactionSubType.STAKE_AND_DEPOSIT:\n intention = StakeAndDepositIntention.fromData(intentionData as StakeAndDepositIntentionData);\n break;\n case TransactionSubType.CONVERT:\n intention = ConvertIntention.fromData(intentionData as ConvertIntentionData);\n break;\n case TransactionSubType.CONVERT_AND_DEPOSIT:\n intention = ConvertAndDepositIntention.fromData(intentionData as ConvertAndDepositIntentionData);\n break;\n case TransactionSubType.UNSTAKE:\n intention = UnstakeIntention.fromData(intentionData as UnstakeIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({\n network,\n suiClient,\n account,\n\n suilendClient: this.utils.suilendClient,\n LIQUID_STAKING_INFO_MAP: this.utils.LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap: this.utils.obligationOwnerCaps?.[0],\n obligation: this.utils.obligations?.[0],\n } as IntentionInput);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\n\nimport {\n ConvertAndDepositIntentionData,\n ConvertIntentionData,\n StakeAndDepositIntentionData,\n StakeIntentionData,\n UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\n\nimport { DecodeResult, TransactionSubType } from './types/helper';\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n decode() {\n if (this.isStakeTransaction()) {\n return this.decodeStake();\n }\n if (this.isStakeAndDepositTransaction()) {\n return this.decodeStakeAndDeposit();\n }\n if (this.isConvertTransaction()) {\n return this.decodeConvert();\n }\n if (this.isConvertAndDepositTransaction()) {\n return this.decodeConvertAndDeposit();\n }\n if (this.isUnstakeTransaction()) {\n return this.decodeUnstake();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private hasSuilendDepositTransactionMoveCallCommands() {\n return (\n !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n );\n }\n\n private hasMintMoveCallCommands() {\n return !!this.getMoveCallCommand('mint');\n }\n\n private hasRedeemMoveCallCommands() {\n return !!this.getMoveCallCommand('redeem');\n }\n\n // is*\n private isStakeTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n !this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isStakeAndDepositTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n !this.hasRedeemMoveCallCommands() &&\n this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isConvertTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isConvertAndDepositTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isUnstakeTransaction() {\n return (\n !this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n // decode*\n private decodeStake(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n console.log('Decoder.decodeStake', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.STAKE,\n intentionData: {\n amount,\n outCoinType,\n } as StakeIntentionData,\n };\n }\n\n private decodeStakeAndDeposit(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n console.log('Decoder.decodeStakeAndDeposit', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.STAKE_AND_DEPOSIT,\n intentionData: {\n amount,\n outCoinType,\n } as StakeAndDepositIntentionData,\n };\n }\n\n private decodeConvert(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeConvert', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CONVERT,\n intentionData: {\n amount,\n inCoinType,\n outCoinType,\n } as ConvertIntentionData,\n };\n }\n\n private decodeConvertAndDeposit(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeConvertAndDeposit', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CONVERT_AND_DEPOSIT,\n intentionData: {\n amount,\n inCoinType,\n outCoinType,\n } as ConvertAndDepositIntentionData,\n };\n }\n\n private decodeUnstake(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeUnstake', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UNSTAKE,\n intentionData: {\n amount,\n inCoinType,\n } as UnstakeIntentionData,\n };\n }\n}\n","export const ASSETS_URL = 'https://suilend-assets.s3.us-east-2.amazonaws.com/springsui';\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { LENDING_MARKET_ID, LENDING_MARKET_TYPE, SuilendClient } from '@suilend/sdk';\nimport { ObligationOwnerCap } from '@suilend/sdk/_generated/suilend/lending-market/structs';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n BorrowIntentionData,\n ClaimAndDepositIntentionData,\n ClaimIntentionData,\n DepositIntentionData,\n RepayIntentionData,\n SuilendIntentionData,\n WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { BorrowIntention } from './intentions/borrow';\nimport { ClaimIntention } from './intentions/claim';\nimport { ClaimAndDepositIntention } from './intentions/claimAndDeposit';\nimport { DepositIntention } from './intentions/deposit';\nimport { RepayIntention } from './intentions/repay';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { TransactionSubType } from './types';\n\nexport type Utils = {\n suilendClient: SuilendClient;\n obligationOwnerCaps: ObligationOwnerCap<string>[];\n obligations: Obligation<string>[];\n};\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n const suilendClient = await SuilendClient.initialize(LENDING_MARKET_ID, LENDING_MARKET_TYPE, suiClient);\n\n const obligationOwnerCaps = await SuilendClient.getObligationOwnerCaps(\n account.address,\n suilendClient.lendingMarket.$typeArgs,\n suiClient,\n );\n\n const obligations = await Promise.all(\n obligationOwnerCaps.map((ownerCap) =>\n SuilendClient.getObligation(ownerCap.obligationId, suilendClient.lendingMarket.$typeArgs, suiClient),\n ),\n );\n\n console.log(\n 'XXX getUtils - suilendClient:',\n suilendClient,\n 'obligations:',\n obligations,\n 'obligationOwnerCaps:',\n obligationOwnerCaps,\n );\n\n return { suilendClient, obligationOwnerCaps, obligations };\n};\n\nexport type SuilendIntention =\n | DepositIntention\n | WithdrawIntention\n | BorrowIntention\n | RepayIntention\n | ClaimIntention\n | ClaimAndDepositIntention;\n\nexport class SuilendAppHelper implements IAppHelperInternal<SuilendIntentionData> {\n application = 'Suilend';\n\n supportSDK = '@mysten/sui' as const;\n\n private utils: Utils | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SuilendIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: account.address,\n transactionBlock: transaction,\n });\n\n console.log('SuilendAppHelper.deserialize - simResult:', simResult, 'utils:', this.utils, 'suiClient:', suiClient);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: SuilendIntentionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { network, txSubType, intentionData, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n let intention: SuilendIntention;\n switch (txSubType) {\n case TransactionSubType.DEPOSIT:\n intention = DepositIntention.fromData(intentionData as DepositIntentionData);\n break;\n case TransactionSubType.WITHDRAW:\n intention = WithdrawIntention.fromData(intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.BORROW:\n intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.REPAY:\n intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n break;\n case TransactionSubType.CLAIM:\n intention = ClaimIntention.fromData(intentionData as ClaimIntentionData);\n break;\n case TransactionSubType.CLAIM_AND_DEPOSIT:\n intention = ClaimAndDepositIntention.fromData(intentionData as ClaimAndDepositIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n const obligationId = window.localStorage.getItem('obligationId');\n const obligation = this.utils.obligations?.find((o) => o.id === obligationId) ?? this.utils.obligations?.[0];\n const obligationOwnerCap = this.utils.obligationOwnerCaps?.find((o) => o.obligationId === obligation?.id);\n\n return intention.build({\n network,\n suiClient,\n account,\n\n suilendClient: this.utils.suilendClient,\n obligationOwnerCap,\n obligation,\n } as IntentionInput);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64, toHex } from '@mysten/bcs';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport { MAX_U64 } from '@suilend/frontend-sui';\nimport BigNumber from 'bignumber.js';\n\nimport {\n BorrowIntentionData,\n ClaimAndDepositIntentionData,\n ClaimIntentionData,\n DepositIntentionData,\n RepayIntentionData,\n SuilendIntentionData,\n WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\n\nimport { TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: SuilendIntentionData;\n};\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n decode() {\n if (this.isDepositTransaction()) {\n return this.decodeDeposit();\n }\n if (this.isWithdrawTransaction()) {\n return this.decodeWithdraw();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isClaimTransaction()) {\n return this.decodeClaim();\n }\n if (this.isClaimAndDepositTransaction()) {\n return this.decodeClaimAndDeposit();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get inputs() {\n console.log('this.transaction.getData().inputs', this.transaction.getData().inputs);\n return this.transaction.getData().inputs;\n }\n\n private get commands() {\n console.log('this.transaction.getData().commands', this.transaction.getData().commands);\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private hasDepositTransactionMoveCallCommands() {\n return (\n !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n );\n }\n\n private hasClaimTransactionMoveCallCommands() {\n return !!this.getMoveCallCommand('claim_rewards');\n }\n\n // is*\n private isDepositTransaction() {\n return !this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n }\n\n private isWithdrawTransaction() {\n return (\n !!this.getMoveCallCommand('withdraw_ctokens') &&\n !!this.getMoveCallCommand('redeem_ctokens_and_withdraw_liquidity_request')\n );\n }\n\n private isBorrowTransaction() {\n return !!this.getMoveCallCommand('borrow_request');\n }\n\n private isRepayTransaction() {\n return !!this.getMoveCallCommand('repay');\n }\n\n private isClaimTransaction() {\n return this.hasClaimTransactionMoveCallCommands() && !this.hasDepositTransactionMoveCallCommands();\n }\n\n private isClaimAndDepositTransaction() {\n return this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n }\n\n // decode*\n private decodeDeposit(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('lending_market::MintEvent')),\n };\n\n const coinType = normalizeStructTag((events.MintEvent.parsedJson as any).coin_type.name as string);\n const value = (events.MintEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeDeposit', coinType, value);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT,\n intentionData: {\n coinType,\n value,\n } as DepositIntentionData,\n };\n }\n\n private decodeWithdraw(): DecodeResult {\n const commands = {\n withdraw_ctokens: this.getMoveCallCommand('withdraw_ctokens'),\n };\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RedeemEvent')),\n };\n\n const coinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).coin_type.name as string);\n let value = (events.RedeemEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeWithdraw', coinType, value);\n\n const inputIndex = (commands.withdraw_ctokens.MoveCall.arguments[4] as any).Input as number;\n const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n const isMax = inputValue === MAX_U64.toString();\n console.log(\n 'decodeWithdraw - isMax:',\n isMax,\n 'inputIndex:',\n inputIndex,\n 'inputValue:',\n inputValue,\n 'MAX_U64.toString():',\n MAX_U64.toString(),\n );\n if (isMax) {\n value = MAX_U64.toString();\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW,\n intentionData: {\n coinType,\n value,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeBorrow(): DecodeResult {\n const commands = {\n borrow_request: this.getMoveCallCommand('borrow_request'),\n };\n const events = {\n BorrowEvent: this.simResult.events.find((event) => event.type.includes('lending_market::BorrowEvent')),\n };\n\n const coinType = normalizeStructTag((events.BorrowEvent.parsedJson as any).coin_type.name as string);\n let value = `${+(events.BorrowEvent.parsedJson as any).liquidity_amount - +(events.BorrowEvent.parsedJson as any).origination_fee_amount}`;\n console.log('Decoder.decodeBorrow', coinType, value);\n\n const inputIndex = (commands.borrow_request.MoveCall.arguments[4] as any).Input as number;\n const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n const isMax = inputValue === MAX_U64.toString();\n console.log(\n 'decodeBorrow - isMax:',\n isMax,\n 'inputIndex:',\n inputIndex,\n 'inputValue:',\n inputValue,\n 'MAX_U64.toString():',\n MAX_U64.toString(),\n );\n if (isMax) {\n value = MAX_U64.toString();\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BORROW,\n intentionData: {\n coinType,\n value,\n } as BorrowIntentionData,\n };\n }\n\n private decodeRepay(): DecodeResult {\n const events = {\n RepayEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RepayEvent')),\n };\n\n const coinType = normalizeStructTag((events.RepayEvent.parsedJson as any).coin_type.name as string);\n const value = (events.RepayEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeRepay', coinType, value);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.REPAY,\n intentionData: {\n coinType,\n value,\n } as RepayIntentionData,\n };\n }\n\n private decodeClaim(): DecodeResult {\n const events = {\n ClaimReward: this.simResult.events.filter((event) => event.type.includes('lending_market::ClaimReward')),\n };\n\n const result: Record<string, string> = {};\n for (let i = 0; i < events.ClaimReward.length; i++) {\n const claimRewardEvent = events.ClaimReward[i];\n\n const coinType = normalizeStructTag((claimRewardEvent.parsedJson as any).coin_type.name as string);\n const value = (claimRewardEvent.parsedJson as any).liquidity_amount as string;\n\n result[coinType] = `${+(result[coinType] ?? '0') + +value}`;\n }\n console.log('Decoder.decodeClaimRewards', result);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM,\n intentionData: {\n value: result,\n } as ClaimIntentionData,\n };\n }\n\n private decodeClaimAndDeposit(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM_AND_DEPOSIT,\n intentionData: this.decodeClaim().intentionData as ClaimAndDepositIntentionData,\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BorrowIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class BorrowIntention extends SuilendBaseIntention<BorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BORROW;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('BorrowIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.borrowAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: BorrowIntentionData) {\n console.log('BorrowIntention.fromData', data);\n return new BorrowIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SuilendBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: IntentionInput): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimIntention extends SuilendBaseIntention<ClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM;\n\n constructor(public readonly data: ClaimIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('ClaimIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n suilendClient.claimRewardsAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n getRewards(suilendClient, obligation),\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: ClaimIntentionData) {\n console.log('ClaimIntention.fromData', data);\n return new ClaimIntention(data);\n }\n}\n","import { normalizeStructTag } from '@mysten/sui/utils';\nimport { isSendPoints } from '@suilend/frontend-sui';\nimport { ClaimRewardsReward, Side, SuilendClient } from '@suilend/sdk';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\nimport BigNumber from 'bignumber.js';\n\nconst getRewards = (suilendClient: SuilendClient, obligation: Obligation<string>) => {\n const rewardsMap: Record<Side, ClaimRewardsReward[]> = {\n [Side.DEPOSIT]: [],\n [Side.BORROW]: [],\n };\n\n suilendClient.lendingMarket.reserves.forEach((reserve) => {\n [Side.DEPOSIT, Side.BORROW].forEach((side) => {\n const reservePrm = side === Side.DEPOSIT ? reserve.depositsPoolRewardManager : reserve.borrowsPoolRewardManager;\n\n const sideUrm = obligation.userRewardManagers.find((urm) => urm.poolRewardManagerId === reservePrm.id);\n if (!sideUrm) {\n return;\n }\n\n rewardsMap[side] = reservePrm.poolRewards\n .map((pr, index) => ({\n reserveArrayIndex: reserve.arrayIndex,\n rewardIndex: BigInt(index),\n rewardCoinType: normalizeStructTag(pr.coinType.name),\n side,\n }))\n .filter(\n (r) =>\n !isSendPoints(r.rewardCoinType) &&\n !!sideUrm.rewards[Number(r.rewardIndex)] &&\n new BigNumber(sideUrm.rewards[Number(r.rewardIndex)].earnedRewards.value.toString()).gt(0),\n );\n });\n });\n\n return Object.values(rewardsMap).flat();\n};\n\nexport default getRewards;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimAndDepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimAndDepositIntention extends SuilendBaseIntention<ClaimAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM_AND_DEPOSIT;\n\n constructor(public readonly data: ClaimAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('ClaimAndDepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n suilendClient.claimRewardsAndDeposit(\n account.address,\n obligationOwnerCap.id,\n getRewards(suilendClient, obligation),\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: ClaimAndDepositIntentionData) {\n console.log('ClaimAndDepositIntention.fromData', data);\n return new ClaimAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { DepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class DepositIntention extends SuilendBaseIntention<DepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT;\n\n constructor(public readonly data: DepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('DepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n const transaction = new Transaction();\n await suilendClient.depositIntoObligation(\n account.address,\n this.data.coinType,\n this.data.value,\n transaction,\n obligationOwnerCap?.id,\n );\n\n return transaction;\n }\n\n static fromData(data: DepositIntentionData) {\n console.log('DepositIntention.fromData', data);\n return new DepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { RepayIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class RepayIntention extends SuilendBaseIntention<RepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.REPAY;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('RepayIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.repayIntoObligation(\n account.address,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: RepayIntentionData) {\n console.log('RepayIntention.fromData', data);\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { WithdrawIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class WithdrawIntention extends SuilendBaseIntention<WithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('WithdrawIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.withdrawAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: WithdrawIntentionData) {\n console.log('WithdrawIntention.fromData', data);\n return new WithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { LiquidStakingObjectInfo } from '@suilend/springsui-sdk/client';\n\nimport { ASSETS_URL } from '@/apps/springSui/constants';\nimport { SpringSuiIntentionData } from '@/apps/springSui/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { getUtils as getSuilendUtils, Utils as SuilendUtils } from '../../suilend/helper';\n\nexport enum TransactionSubType {\n STAKE = 'stake',\n STAKE_AND_DEPOSIT = 'stakeAndDeposit',\n CONVERT = 'convert',\n CONVERT_AND_DEPOSIT = 'convertAndDeposit',\n UNSTAKE = 'unstake',\n}\n\nexport type DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: SpringSuiIntentionData;\n};\n\nexport type Utils = {\n LIQUID_STAKING_INFO_MAP: Record<string, LiquidStakingObjectInfo>;\n} & SuilendUtils;\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n const suilendUtils = await getSuilendUtils(suiClient, account);\n\n const LIQUID_STAKING_INFO_MAP = await (await fetch(`${ASSETS_URL}/liquid-staking-info-map.json`)).json();\n\n return { ...suilendUtils, LIQUID_STAKING_INFO_MAP };\n};\n\nexport type IntentionInput = {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n\n suilendClient: Utils['suilendClient'];\n LIQUID_STAKING_INFO_MAP: Utils['LIQUID_STAKING_INFO_MAP'];\n obligationOwnerCap: Utils['obligationOwnerCaps'][0] | undefined;\n obligation: Utils['obligations'][0] | undefined;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { convertLstsAndSendToUser, LstClient } from '@suilend/springsui-sdk';\n\nimport { ConvertIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertIntention extends SpringSuiBaseIntention<ConvertIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CONVERT;\n\n constructor(public readonly data: ConvertIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'ConvertIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n convertLstsAndSendToUser(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: ConvertIntentionData) {\n console.log('ConvertIntention.fromData', data);\n return new ConvertIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SpringSuiBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: IntentionInput): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { convertLsts, LstClient } from '@suilend/springsui-sdk';\n\nimport { ConvertAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertAndDepositIntention extends SpringSuiBaseIntention<ConvertAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CONVERT_AND_DEPOSIT;\n\n constructor(public readonly data: ConvertAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'ConvertAndDepositIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n\n const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n suilendClient,\n transaction,\n obligationOwnerCap,\n );\n\n const lstCoin = convertLsts(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n if (didCreate) {\n sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n }\n\n return transaction;\n }\n\n static fromData(data: ConvertAndDepositIntentionData) {\n console.log('ConvertAndDepositIntention.fromData', data);\n return new ConvertAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeIntention extends SpringSuiBaseIntention<StakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.STAKE;\n\n constructor(public readonly data: StakeIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'StakeIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n outLstClient.mintAmountAndRebalanceAndSendToUser(transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: StakeIntentionData) {\n console.log('StakeIntention.fromData', data);\n return new StakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeAndDepositIntention extends SpringSuiBaseIntention<StakeAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.STAKE_AND_DEPOSIT;\n\n constructor(public readonly data: StakeAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'StakeAndDepositIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n\n const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n suilendClient,\n transaction,\n obligationOwnerCap,\n );\n\n const lstCoin = outLstClient.mintAmountAndRebalance(transaction, account.address, this.data.amount);\n suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n if (didCreate) {\n sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n }\n\n return transaction;\n }\n\n static fromData(data: StakeAndDepositIntentionData) {\n console.log('StakeAndDepositIntention.fromData', data);\n return new StakeAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { UnstakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class UnstakeIntention extends SpringSuiBaseIntention<UnstakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.UNSTAKE;\n\n constructor(public readonly data: UnstakeIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'UnstakeIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n inLstClient.redeemAmountAndSendToUser(transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: UnstakeIntentionData) {\n console.log('UnstakeIntention.fromData', data);\n return new UnstakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { MintIntention } from './intentions/mint';\nimport { RedeemIntention } from './intentions/redeem';\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\nexport type StSuiIntention = MintIntention | RedeemIntention;\n\nexport class StSuiHelper implements IAppHelperInternal<StSuiIntentionData> {\n application = 'stsui';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: StSuiIntentionData }> {\n const { transaction, suiClient } = input;\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: transaction.getData().sender,\n transactionBlock: transaction,\n });\n console.log('StSuiHelper Sim result - ', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: StSuiIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { account } = input;\n console.log('StSui build transaction type', input.txSubType);\n\n let intention: StSuiIntention;\n switch (input.txSubType) {\n case TransactionSubType.MINT:\n intention = MintIntention.fromData(input.intentionData as MintIntentionData);\n break;\n case TransactionSubType.REDEEM:\n intention = RedeemIntention.fromData(input.intentionData as RedeemIntentionData);\n break;\n default:\n throw new Error('build not implemented');\n }\n\n return intention.build({ account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: StSuiIntentionData;\n};\n\ntype MintEventType = {\n event: {\n sui_amount_in: string;\n };\n};\n\ntype RedeemEventType = {\n event: {\n lst_amount_in: string;\n };\n};\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n /**\n * Entry point for decoding the transaction. Determines the type of transaction\n * and calls the appropriate decode method.\n */\n decode(): DecodeResult {\n if (this.isMintTransaction()) {\n const liquidityChangeEvent = this.getLiquidityChangeEvent('MintEvent');\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as MintEventType;\n console.log('Decoder event data - ', eventData);\n\n return this.decodeMint(eventData);\n }\n\n if (this.isRedeemTransaction()) {\n const liquidityChangeEvent = this.getLiquidityChangeEvent('RedeemEvent');\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as RedeemEventType;\n console.log('Decoder event data - ', eventData);\n\n return this.decodeRedeem(eventData);\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n // ---- Private Helpers ----\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getLiquidityChangeEvent(arg: string) {\n return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type, arg));\n }\n\n // is*\n\n private isLiquidityChangeEventType(eventType: string, arg: string) {\n return eventType.includes(arg);\n }\n\n private isMintTransaction() {\n return !!this.getMoveCallCommand('mint');\n }\n\n private isRedeemTransaction() {\n return !!this.getMoveCallCommand('redeem');\n }\n\n // ---- Decode Methods ----\n\n private decodeMint(eventData: MintEventType): DecodeResult {\n const {\n event: { sui_amount_in: amount },\n } = eventData;\n console.log('Decoder.decodeMint', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MINT,\n intentionData: {\n amount,\n } as MintIntentionData,\n };\n }\n\n private decodeRedeem(eventData: RedeemEventType): DecodeResult {\n const {\n event: { lst_amount_in: amount },\n } = eventData;\n console.log('Decoder.decodeRedeem', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.REDEEM,\n intentionData: {\n amount,\n } as RedeemIntentionData,\n };\n }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { MintIntentionData, TransactionSubType } from '../types';\n\nexport class MintIntention extends BaseIntention<MintIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MINT;\n\n constructor(public readonly data: MintIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { amount } = this.data;\n const lstParams: LstParams = {\n lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n };\n const lst = new LST(lstParams);\n const txb = await lst.mint(amount, account.address);\n txb.setGasBudget(100_000_000);\n return txb;\n }\n\n static fromData(data: MintIntentionData) {\n console.log('MintIntention.fromData', data);\n return new MintIntention(data);\n }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { RedeemIntentionData, TransactionSubType } from '../types';\n\nexport class RedeemIntention extends BaseIntention<RedeemIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.REDEEM;\n\n constructor(public readonly data: RedeemIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { amount } = this.data;\n const lstParams: LstParams = {\n lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n };\n const lst = new LST(lstParams);\n const txb = await lst.redeem(amount, account.address);\n txb.setGasBudget(100_000_000);\n return txb;\n }\n\n static fromData(data: RedeemIntentionData) {\n console.log('RedeemIntention.fromData', data);\n return new RedeemIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\n// eslint-disable-next-line import/no-cycle\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\n\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { BurnIntention } from './intentions/burn';\nimport { CollectFeeIntention } from './intentions/collect-fee';\nimport { CollectRewardIntention } from './intentions/collect-reward';\nimport { CreatePoolIntention } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { PrixClaimIntention } from './intentions/prix-claim';\nimport { PrixJoinIntention } from './intentions/prix-join';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport { SwapExactBaseForQuoteIntention } from './intentions/swap-exact-base-for-quote';\nimport { SwapExactQuoteForBaseIntention } from './intentions/swap-exact-quote-for-base';\nimport {\n AddLiquidityIntentionData,\n BurnIntentionData,\n CollectFeeIntentionData,\n CollectRewardIntentionData,\n CreatePoolIntentionData,\n DecreaseLiquidityIntentionData,\n IncreaseLiquidityIntentionData,\n PrixClaimIntentionData,\n PrixJoinIntentionData,\n RemoveLiquidityIntentionData,\n SuiNetworks,\n SwapExactBaseForQuoteIntentionData,\n SwapExactQuoteForBaseIntentionData,\n SwapIntentionData,\n TransactionSubType,\n TURBOSIntentionData,\n} from './types';\n\nexport type TURBOSIntention =\n | CreatePoolIntention\n | AddLiquidityIntention\n | IncreaseLiquidityIntention\n | DecreaseLiquidityIntention\n | CollectFeeIntention\n | CollectRewardIntention\n | RemoveLiquidityIntention\n | BurnIntention\n | SwapIntention\n | PrixClaimIntention\n | PrixJoinIntention\n | SwapExactQuoteForBaseIntention\n | SwapExactBaseForQuoteIntention;\n\nexport class TURBOSAppHelper implements IAppHelperInternalLegacy<TURBOSIntentionData> {\n application = 'turbos';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount } & {\n action?: string;\n txbParams?: any;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: TURBOSIntentionData;\n }> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const contract = await turbosSdk.contract.getConfig();\n const { transactionBlock, account } = input;\n console.log(input, 'input');\n const decoder = new Decoder(transactionBlock, turbosSdk, contract);\n const result = await decoder.decode(account.address);\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: TURBOSIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { suiClient, account, network } = input;\n let intention: TURBOSIntention;\n console.log(input.intentionData, 'intentionData');\n switch (input.txSubType) {\n case TransactionSubType.CreatePool:\n intention = CreatePoolIntention.fromData(input.intentionData as CreatePoolIntentionData);\n break;\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n break;\n case TransactionSubType.IncreaseLiquidity:\n intention = IncreaseLiquidityIntention.fromData(input.intentionData as IncreaseLiquidityIntentionData);\n break;\n case TransactionSubType.DecreaseLiquidity:\n intention = DecreaseLiquidityIntention.fromData(input.intentionData as DecreaseLiquidityIntentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n break;\n case TransactionSubType.CollectFee:\n intention = CollectFeeIntention.fromData(input.intentionData as CollectFeeIntentionData);\n break;\n case TransactionSubType.CollectReward:\n intention = CollectRewardIntention.fromData(input.intentionData as CollectRewardIntentionData);\n break;\n case TransactionSubType.Burn:\n intention = BurnIntention.fromData(input.intentionData as BurnIntentionData);\n break;\n case TransactionSubType.Swap:\n intention = SwapIntention.fromData(input.intentionData as SwapIntentionData);\n break;\n case TransactionSubType.PrixJoin:\n intention = PrixJoinIntention.fromData(input.intentionData as PrixJoinIntentionData);\n break;\n case TransactionSubType.PrixClaim:\n intention = PrixClaimIntention.fromData(input.intentionData as PrixClaimIntentionData);\n break;\n case TransactionSubType.SwapExactBaseForQuote:\n intention = SwapExactBaseForQuoteIntention.fromData(input.intentionData as SwapExactBaseForQuoteIntentionData);\n break;\n case TransactionSubType.SwapExactQuoteForBase:\n intention = SwapExactQuoteForBaseIntention.fromData(input.intentionData as SwapExactQuoteForBaseIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { BN, Contract, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig, prixConfig } from './config';\nimport { TransactionSubType, TURBOSIntentionData } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: TURBOSIntentionData;\n};\n\nconst getAtoB = (layer: 0 | 1, target: string, swap1Layer: string[], swap2Layer: string[]): boolean[] => {\n if (layer === 1) {\n const index = swap2Layer.findIndex((item) => item === target);\n switch (index) {\n case 0:\n return [true, true];\n case 1:\n return [true, false];\n case 2:\n return [false, true];\n case 3:\n return [false, false];\n default:\n throw new Error(`not target: ${target}`);\n }\n }\n const index = swap1Layer.findIndex((item) => item === target);\n switch (index) {\n case 0:\n return [true];\n case 1:\n return [false];\n default:\n throw new Error(`not target: ${target}`);\n }\n};\n\nexport class Decoder {\n constructor(\n public readonly txb: TransactionBlock,\n public readonly turbosSdk: TurbosSdk,\n public readonly config: Contract.Config,\n ) {}\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get swap1Layer() {\n return [`${this.config.PackageId}::swap_router::swap_a_b`, `${this.config.PackageId}::swap_router::swap_b_a`];\n }\n\n private get swap2Layer() {\n return [\n `${this.config.PackageId}::swap_router::swap_a_b_b_c`,\n `${this.config.PackageId}::swap_router::swap_a_b_c_b`,\n `${this.config.PackageId}::swap_router::swap_b_a_b_c`,\n `${this.config.PackageId}::swap_router::swap_b_a_c_b`,\n ];\n }\n\n async decode(address: string) {\n if (this.isSwapTransaction()) {\n return this.decodeSwap();\n }\n\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n\n if (this.isIncreaseLiquidityTransaction()) {\n return this.decodeIncreaseLiquidity(address);\n }\n\n if (this.isRemoveLiquidityTransaction()) {\n return this.decodeRemoveLiquidity(address);\n }\n\n if (this.isDecreaseLiquidityTransaction()) {\n return this.decodeDecreaseLiquidity(address);\n }\n\n if (this.isCollectFeeTransaction()) {\n return this.decodeCollectFee();\n }\n\n if (this.isCollectRewardTransaction()) {\n return this.decodeCollectReward();\n }\n\n if (this.isBurnTransaction()) {\n return this.decodeBurn();\n }\n\n if (this.isPrixClaimTransaction()) {\n return this.decodePrixClaim();\n }\n\n if (this.isPrixJoinTransaction()) {\n return this.decodePrixJoin();\n }\n\n if (this.isSwapExactBaseForQuoteTransaction()) {\n return this.decodeSwapExactBaseForQuote();\n }\n\n if (this.isSwapExactQuoteForBaseTransaction()) {\n return this.decodeSwapExactQuoteForBase();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private getMoveCallsTransaction(targets: string[]) {\n return targets.every((target) =>\n this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target),\n );\n }\n\n private getSwapMoveCallTransaction(targets: string[]) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && targets.includes(trans.target));\n }\n\n private isSwapTransaction() {\n return !!this.getSwapMoveCallTransaction([...this.swap1Layer, ...this.swap2Layer]);\n }\n\n private isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::mint`);\n }\n\n private isIncreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::increase_liquidity`);\n }\n\n private isDecreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::decrease_liquidity`);\n }\n\n private isCollectFeeTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect`);\n }\n\n private isCollectRewardTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect_reward`);\n }\n\n private isBurnTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::burn`);\n }\n\n private isPrixJoinTransaction() {\n return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::join`);\n }\n\n private isPrixClaimTransaction() {\n return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::claim`);\n }\n\n private isRemoveLiquidityTransaction() {\n return !!this.getMoveCallsTransaction([\n `${this.config.PackageId}::position_manager::decrease_liquidity`,\n `${this.config.PackageId}::position_manager::burn`,\n ]);\n }\n\n private isSwapExactBaseForQuoteTransaction() {\n return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`);\n }\n\n private isSwapExactQuoteForBaseTransaction() {\n return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`);\n }\n\n private async decodeSwap(): Promise<DecodeResult> {\n const moveCall = this.transactions.find((trans) => trans.kind === 'MoveCall') as MoveCallTransaction;\n let layer: 0 | 1 = 0;\n if (this.swap2Layer.includes(moveCall.target)) {\n layer = 1;\n }\n\n const atob = getAtoB(layer, moveCall.target, this.swap1Layer, this.swap2Layer);\n\n const routes = atob.map((item, index) => {\n const pool = this.helper.decodeSharedObjectId(index);\n const sqrtPrice = this.helper.decodeInputU128(4 + index + layer);\n const nextTickIndex = this.turbosSdk.math.sqrtPriceX64ToTickIndex(new BN(sqrtPrice.toString()));\n\n return {\n pool,\n a2b: item,\n nextTickIndex,\n };\n });\n\n // eslint-disable-next-line no-nested-ternary\n const coinTypeA = atob[0]\n ? moveCall.typeArguments[0]\n : layer === 1\n ? moveCall.typeArguments[0]\n : moveCall.typeArguments[1];\n const coinTypeB =\n // eslint-disable-next-line no-nested-ternary\n layer === 1 ? moveCall.typeArguments[4] : atob[0] ? moveCall.typeArguments[1] : moveCall.typeArguments[0];\n\n const address = this.helper.decodeInputAddress(6 + 2 * layer);\n const deadline = this.helper.decodeInputU64(7 + 2 * layer);\n const amountSpecifiedIsInput = this.helper.decodeInputBool(5 + 2 * layer);\n const amountA = this.helper.decodeInputU64(2 + layer);\n const amountB = this.helper.decodeInputU64(3 + layer);\n\n const result = await this.turbosSdk.trade.computeSwapResultV2({\n pools: [{ pool: routes[0].pool, a2b: routes[0].a2b, amountSpecified: amountA }],\n address,\n amountSpecifiedIsInput,\n });\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Swap,\n intentionData: {\n routes,\n coinTypeA,\n coinTypeB,\n address,\n amountA: amountSpecifiedIsInput ? amountA : amountB,\n amountB: amountSpecifiedIsInput ? amountB : amountA,\n amountSpecifiedIsInput,\n slippage: '0.1',\n deadline,\n },\n };\n }\n\n private decodeAddLiquidity(): DecodeResult {\n console.log(this.helper, 'decodeAddLiquidity this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const address = this.helper.decodeInputAddress(12);\n\n const amountA = this.helper.decodeInputU64(8);\n const amountB = this.helper.decodeInputU64(9);\n const tickLower = this.helper.decodeInputU32(4);\n const tickLowerIsNeg = this.helper.decodeInputBool(5);\n const tickUpper = this.helper.decodeInputU32(6);\n const tickUpperIsNeg = this.helper.decodeInputBool(7);\n\n const deadline = this.helper.decodeInputU64(13);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n pool,\n slippage: 10,\n address,\n amountA,\n amountB,\n tickLower: tickLowerIsNeg ? -tickLower : tickLower,\n tickUpper: tickUpperIsNeg ? -tickUpper : tickUpper,\n deadline,\n },\n };\n }\n\n private decodeIncreaseLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeIncreaseLiquidity this.helper');\n\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(4);\n const amountA = this.helper.decodeInputU64(5);\n const amountB = this.helper.decodeInputU64(6);\n\n const deadline = this.helper.decodeInputU64(9);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.IncreaseLiquidity,\n intentionData: {\n pool,\n slippage: 10,\n address,\n amountA,\n amountB,\n nft,\n deadline,\n },\n };\n }\n\n private decodeDecreaseLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeDecreaseLiquidity this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const decreaseLiquidity = this.helper.decodeInputU64(3);\n const amountA = this.helper.decodeInputU64(4);\n const amountB = this.helper.decodeInputU64(5);\n\n const deadline = this.helper.decodeInputU64(6);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DecreaseLiquidity,\n intentionData: {\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage: 10, // DO NOT use slippage by user setting for now.\n address,\n deadline,\n },\n };\n }\n\n private decodeCollectFee(): DecodeResult {\n console.log(this.helper, 'decodeCollectFee this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const address = this.helper.decodeInputAddress(5);\n const collectAmountA = this.helper.decodeInputU64(3);\n const collectAmountB = this.helper.decodeInputU64(4);\n\n const deadline = this.helper.decodeInputU64(6);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectFee,\n intentionData: {\n pool,\n address,\n collectAmountA,\n collectAmountB,\n nft,\n deadline,\n },\n };\n }\n\n private decodeCollectReward(): DecodeResult {\n console.log(this.helper, 'decodeCollectReward this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const address = this.helper.decodeInputAddress(6);\n const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n const deadline = this.helper.decodeInputU64(7);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectReward,\n intentionData: {\n pool,\n address,\n rewardAmounts,\n nft,\n deadline,\n },\n };\n }\n\n private decodeBurn(): DecodeResult {\n console.log(this.helper, 'decodeBurn this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Burn,\n intentionData: {\n pool,\n nft,\n },\n };\n }\n\n private decodeRemoveLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeRemoveLiquidity this.helper');\n const pool = this.decreaseLiquidityHelper.decodeSharedObjectId(0);\n const nft = this.decreaseLiquidityHelper.decodeSharedObjectId(2);\n const decreaseLiquidity = this.decreaseLiquidityHelper.decodeInputU64(3);\n const amountA = this.decreaseLiquidityHelper.decodeInputU64(4);\n const amountB = this.decreaseLiquidityHelper.decodeInputU64(5);\n\n const deadline = this.decreaseLiquidityHelper.decodeInputU64(6);\n const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n const collectAmountA = this.collectFeeHelper.decodeInputU64(3) || 0;\n const collectAmountB = this.collectFeeHelper.decodeInputU64(4) || 0;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage: 10,\n address,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n },\n };\n }\n\n private decodePrixClaim(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixClaim,\n intentionData: {},\n };\n }\n\n private decodePrixJoin(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixJoin,\n intentionData: {},\n };\n }\n\n private decodeSwapExactBaseForQuote(): DecodeResult {\n const poolId = this.swapExactBaseForQuoteHelper.decodeSharedObjectId(0);\n const amountIn = this.swapExactBaseForQuoteHelper.decodeInputU64(3);\n const token1 = this.swapExactBaseForQuoteHelper.shortTypeArg(0);\n const token2 = this.swapExactBaseForQuoteHelper.shortTypeArg(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SwapExactBaseForQuote,\n intentionData: {\n poolId,\n amountIn,\n token1,\n token2,\n },\n };\n }\n\n private decodeSwapExactQuoteForBase(): DecodeResult {\n const poolId = this.swapExactQuoteForBaseHelper.decodeSharedObjectId(0);\n const amountIn = this.swapExactQuoteForBaseHelper.decodeInputU64(3);\n const token1 = this.swapExactQuoteForBaseHelper.shortTypeArg(0);\n const token2 = this.swapExactQuoteForBaseHelper.shortTypeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SwapExactQuoteForBase,\n intentionData: {\n poolId,\n amountIn,\n token1,\n token2,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target !== '0x2::coin::zero' &&\n trans.target !== '0x0000000000000000000000000000000000000000000000000000000000000002::coin::zero',\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get collectRewardHelper() {\n const moveCalls = this.transactions.filter(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::collect_reward`,\n ) as MoveCallTransaction[];\n return moveCalls.map((moveCall) => new MoveCallHelper(moveCall, this.txb));\n }\n\n private get collectFeeHelper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::collect`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get decreaseLiquidityHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::decrease_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get swapExactBaseForQuoteHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get swapExactQuoteForBaseHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU128(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u128');\n return Number(strVal);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU32(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u32');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n shortTypeArg(index: number) {\n return this.moveCall.typeArguments[index];\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","export const prixConfig = {\n PackageId: '0x02fe4933f4521250e55a15441096d1d4a38a7311195b0bca126fc0138c1f5a97',\n Claim: '0x0c822cec42f7ca703696b4232f1c47b348330c23580172a29aab465bc071d894',\n turbosCoinType: '0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c355171f84bb1ba4a::turbos::TURBOS',\n};\n\nexport const deepbookConfig = {\n PackageId: '0xdee9',\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { AddLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntentionLegacy<AddLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: AddLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, tickLower, tickUpper, deadline, txb } = this.data;\n\n return turbosSdk.pool.addLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n tickLower,\n tickUpper,\n deadline,\n txb,\n });\n }\n\n static fromData(data: AddLiquidityIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { BurnIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class BurnIntention extends BaseIntentionLegacy<BurnIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: BurnIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, nft, txb } = this.data;\n\n return turbosSdk.nft.burn({\n pool,\n nft,\n txb,\n });\n }\n\n static fromData(data: BurnIntentionData) {\n return new BurnIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CollectFeeIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectFeeIntention extends BaseIntentionLegacy<CollectFeeIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CollectFeeIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, nft, collectAmountA, collectAmountB, deadline, txb } = this.data;\n\n return turbosSdk.pool.collectFee({\n pool,\n address,\n collectAmountA,\n collectAmountB,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CollectFeeIntentionData) {\n return new CollectFeeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CollectRewardIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectRewardIntention extends BaseIntentionLegacy<CollectRewardIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CollectRewardIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, nft, rewardAmounts, deadline, txb } = this.data;\n\n return turbosSdk.pool.collectReward({\n pool,\n address,\n rewardAmounts,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CollectRewardIntentionData) {\n return new CollectRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CreatePoolIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CreatePoolIntention extends BaseIntentionLegacy<CreatePoolIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CreatePoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const {\n fee,\n address,\n tickLower,\n tickUpper,\n sqrtPrice,\n slippage,\n coinTypeA,\n coinTypeB,\n amountA,\n amountB,\n deadline,\n txb,\n } = this.data;\n\n return turbosSdk.pool.createPool({\n fee,\n amountA,\n amountB,\n address,\n tickLower,\n tickUpper,\n sqrtPrice,\n slippage,\n coinTypeA,\n coinTypeB,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CreatePoolIntentionData) {\n return new CreatePoolIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { DecreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntentionLegacy<DecreaseLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: DecreaseLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, nft, decreaseLiquidity, deadline, txb } = this.data;\n\n return turbosSdk.pool.decreaseLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n nft,\n decreaseLiquidity,\n deadline,\n txb,\n });\n }\n\n static fromData(data: DecreaseLiquidityIntentionData) {\n return new DecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { IncreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntentionLegacy<IncreaseLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: IncreaseLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, nft, deadline, txb } = this.data;\n\n return turbosSdk.pool.increaseLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: IncreaseLiquidityIntentionData) {\n return new IncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { prixConfig } from '../config';\nimport { PrixClaimIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixClaimIntention extends BaseIntentionLegacy<PrixClaimIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixClaim;\n\n constructor(public override readonly data: PrixClaimIntentionData) {\n super(data);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n txb.moveCall({\n target: `${prixConfig.PackageId}::claim::claim`,\n typeArguments: [prixConfig.turbosCoinType],\n arguments: [txb.object(prixConfig.Claim), txb.object(SUI_CLOCK_OBJECT_ID)],\n });\n return txb;\n }\n\n static fromData(data: PrixClaimIntentionData) {\n return new PrixClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { prixConfig } from '../config';\nimport { PrixJoinIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixJoinIntention extends BaseIntentionLegacy<PrixJoinIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixJoin;\n\n constructor(public override readonly data: PrixJoinIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n txb.moveCall({\n target: `${prixConfig.PackageId}::claim::join`,\n typeArguments: [prixConfig.turbosCoinType],\n arguments: [txb.object(prixConfig.Claim)],\n });\n return txb;\n }\n\n static fromData(data: PrixJoinIntentionData) {\n return new PrixJoinIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { RemoveLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntentionLegacy<RemoveLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: RemoveLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n let txb = new TransactionBlock();\n txb = await turbosSdk.pool.collectFee({ txb, ...this.data });\n txb = await turbosSdk.pool.collectReward({ txb, ...this.data });\n txb = await turbosSdk.pool.decreaseLiquidity({ txb, ...this.data });\n txb = await turbosSdk.nft.burn({ txb, nft: this.data.nft, pool: this.data.pool });\n return txb;\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { SuiNetworks, SwapIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntentionLegacy<SwapIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: SwapIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n console.log(this.data, 'this.data');\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { routes, coinTypeA, coinTypeB, address, amountA, amountB, slippage, amountSpecifiedIsInput, deadline, txb } =\n this.data;\n return turbosSdk.trade.swap({\n routes,\n coinTypeA,\n coinTypeB,\n address,\n amountA,\n amountB,\n amountSpecifiedIsInput,\n slippage,\n deadline,\n txb,\n });\n }\n\n static fromData(data: SwapIntentionData) {\n return new SwapIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { swap_exact_base_for_quote } from '../api/deepbook';\nimport { SuiNetworks, SwapExactBaseForQuoteIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactBaseForQuoteIntention extends BaseIntentionLegacy<SwapExactBaseForQuoteIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.SwapExactBaseForQuote;\n\n constructor(public override readonly data: SwapExactBaseForQuoteIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const txb = await swap_exact_base_for_quote({ ...this.data, turbosSdk, currentAddress: input.account.address });\n return txb;\n }\n\n static fromData(data: SwapExactBaseForQuoteIntentionData) {\n return new SwapExactBaseForQuoteIntention(data);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeSuiObjectId } from '@mysten/sui.js/utils';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\nimport { SuiKit } from '../utils/sui-kit';\n\nconst client_order_id = 89;\nconst gasBudget = 1_000_000;\n\ninterface SwapExactOptions {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n turbosSdk: TurbosSdk;\n currentAddress: string;\n}\n\nexport const swap_exact_quote_for_base = async (options: SwapExactOptions) => {\n const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n const txb = new TransactionBlock();\n\n const suiKit = new SuiKit(turbosSdk);\n // get token objectId\n const coinsData = await suiKit.getCoinsData(currentAddress, token2, amountIn);\n const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n if (!sendCoin) {\n throw new Error(`Not enough balance: ${token2}`);\n }\n\n // get accountCap id\n const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n typeArguments: [token1, token2],\n target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`,\n arguments: [\n txb.object(String(poolId)),\n txb.pure(client_order_id),\n accountCap,\n txb.pure(amountIn),\n txb.object(normalizeSuiObjectId('0x6')),\n sendCoin,\n ],\n });\n\n if (mergeCoin) {\n txb.transferObjects([mergeCoin], txb.pure(currentAddress));\n }\n\n txb.transferObjects([base_coin_ret!], txb.pure(currentAddress));\n txb.transferObjects([quote_coin_ret!], txb.pure(currentAddress));\n\n if (!currentAccountCap) {\n txb.transferObjects([accountCap], txb.pure(currentAddress));\n }\n\n txb.setSenderIfNotSet(currentAddress);\n txb.setGasBudget(gasBudget);\n\n return txb;\n};\n\nexport const swap_exact_base_for_quote = async (options: SwapExactOptions) => {\n const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n const txb = new TransactionBlock();\n\n const suiKit = new SuiKit(turbosSdk);\n // get token objectId\n const coinsData = await suiKit.getCoinsData(currentAddress, token1, amountIn);\n const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n\n if (!sendCoin) {\n throw new Error(`Not enough balance: ${token1}`);\n }\n\n // get accountCap id\n const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n const zero = suiKit.zero(token2, txb);\n\n const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n typeArguments: [token1, token2],\n target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`,\n arguments: [\n txb.object(String(poolId)),\n txb.pure(client_order_id),\n accountCap,\n txb.pure(amountIn),\n sendCoin,\n zero,\n txb.object(normalizeSuiObjectId('0x6')),\n ],\n });\n if (mergeCoin) {\n txb.transferObjects([mergeCoin], txb.pure(currentAddress));\n }\n\n txb.transferObjects([base_coin_ret!], txb.pure(currentAddress));\n txb.transferObjects([quote_coin_ret!], txb.pure(currentAddress));\n\n if (!currentAccountCap) {\n txb.transferObjects([accountCap], txb.pure(currentAddress));\n }\n\n txb.setSenderIfNotSet(currentAddress);\n txb.setGasBudget(gasBudget);\n\n return txb;\n};\n","import { PaginatedCoins } from '@mysten/sui.js/client';\nimport { TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { TurbosSdk, unstable_getObjectId } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\n\ntype CoinData = PaginatedCoins['data'];\n\nexport class SuiKit {\n constructor(public readonly turbosSdk: TurbosSdk) {}\n\n async getCoinsData(currentAddress: string, type: string, amount: number): Promise<CoinData> {\n const coinObjects: CoinData = [];\n let coinFields: PaginatedCoins | undefined;\n do {\n coinFields = await this.turbosSdk.provider.getCoins({\n owner: currentAddress,\n coinType: type,\n cursor: coinFields?.nextCursor,\n });\n coinObjects.push(...coinFields.data);\n } while (coinFields.hasNextPage);\n\n const resultCoinObjects: CoinData = [];\n let currentBalance = 0;\n coinObjects\n .sort((coinA, coinB) => Number(coinB.balance) - Number(coinA.balance))\n .some((object) => {\n if (currentBalance >= amount) {\n return true;\n }\n currentBalance += Number(object.balance);\n resultCoinObjects.push(object);\n return false;\n });\n return resultCoinObjects;\n }\n\n splitAndMergeCoin(\n coins: CoinData | undefined,\n amount: number,\n txb: TransactionBlock,\n ): [TransactionObjectArgument | undefined, TransactionObjectArgument | undefined] {\n if (!coins || coins.length < 1) {\n return [undefined, undefined];\n }\n\n if (this.isSuiCoinAddress(coins[0]!.coinType)) {\n const [sendCoin] = txb.splitCoins(txb.gas, [txb.pure(amount)]);\n return [sendCoin, undefined];\n }\n\n const mergeCoin = txb.object(coins[0]!.coinObjectId);\n if (coins.length > 1) {\n txb.mergeCoins(\n mergeCoin,\n coins.slice(1).map((coin) => txb.object(coin.coinObjectId)),\n );\n }\n\n const [sendCoin] = txb.splitCoins(mergeCoin, [txb.pure(amount)]);\n return [sendCoin, mergeCoin];\n }\n\n isSuiCoinAddress(type: string) {\n return type.toLocaleLowerCase() === '0x2::sui::sui';\n }\n\n async IsAccountCap(currentAddress: string): Promise<string | undefined> {\n const dynamicFields = await this.turbosSdk.provider.getOwnedObjects({\n owner: currentAddress,\n options: { showContent: true, showType: true, showOwner: true },\n filter: {\n StructType: `${deepbookConfig.PackageId}::custodian_v2::AccountCap`,\n },\n });\n return dynamicFields.data[0]?.data ? unstable_getObjectId(dynamicFields.data[0].data) : undefined;\n }\n\n createAccount(txb: TransactionBlock): TransactionObjectArgument {\n const [cap] = txb.moveCall({\n typeArguments: [],\n target: `${deepbookConfig.PackageId}::clob_v2::create_account`,\n arguments: [],\n });\n return cap;\n }\n\n zero(token: string, txb: TransactionBlock): TransactionObjectArgument {\n return txb.moveCall({\n typeArguments: [token],\n target: `0x2::coin::zero`,\n arguments: [],\n });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { swap_exact_quote_for_base } from '../api/deepbook';\nimport { SuiNetworks, SwapExactQuoteForBaseIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactQuoteForBaseIntention extends BaseIntentionLegacy<SwapExactQuoteForBaseIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.SwapExactQuoteForBase;\n\n constructor(public override readonly data: SwapExactQuoteForBaseIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const txb = await swap_exact_quote_for_base({ ...this.data, turbosSdk, currentAddress: input.account.address });\n return txb;\n }\n\n static fromData(data: SwapExactQuoteForBaseIntentionData) {\n return new SwapExactQuoteForBaseIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimTicketIntention, ClaimTicketIntentionData } from './intentions/claimTicket';\nimport { StakeIntention, StakeIntentionData } from './intentions/stake';\nimport { UnStakeIntention, UnStakeIntentionData } from './intentions/unStake';\nimport { TransactionSubType } from './types';\n\nexport type VoloIntention = StakeIntention | UnStakeIntention | ClaimTicketIntention;\n\nexport type VoloIntentionData = StakeIntentionData | UnStakeIntentionData | ClaimTicketIntentionData;\n\nexport class VoloAppHelper implements IAppHelperInternalLegacy<VoloIntentionData> {\n application = 'volo';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: TransactionSubType; intentionData: VoloIntentionData }> {\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: VoloIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: VoloIntention;\n switch (input.txSubType) {\n case TransactionSubType.Stake:\n intention = StakeIntention.fromData(input.intentionData as StakeIntentionData);\n break;\n case TransactionSubType.UnStake:\n intention = UnStakeIntention.fromData(input.intentionData as UnStakeIntentionData);\n break;\n case TransactionSubType.ClaimTicket:\n intention = ClaimTicketIntention.fromData(input.intentionData as ClaimTicketIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n decode() {\n console.log('txb', this.txb);\n if (this.isStakeTransaction()) {\n return this.decodeStake();\n }\n\n if (this.isUnStakeTransaction()) {\n return this.decodeUnStake();\n }\n\n if (this.isClaimTicketTransaction()) {\n return this.decodeClaimTicket();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isStakeTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::stake`);\n }\n\n private isUnStakeTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::unstake`);\n }\n\n private isClaimTicketTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::burn_ticket`);\n }\n\n private decodeStake(): DecodeResult {\n const amount = (this.transactions[0] as any).amounts[0].value.toNumber() as number;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Stake,\n intentionData: {\n amount,\n },\n };\n }\n\n private decodeUnStake(): DecodeResult {\n const splitCoinTrans = this.transactions.find((trans) => trans.kind === 'SplitCoins') as any;\n const amount = splitCoinTrans.amounts[0].value.toNumber() as number;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnStake,\n intentionData: {\n amount,\n },\n };\n }\n\n private decodeClaimTicket(): DecodeResult {\n const ticketId = this.helper.decodeOwnedObjectId(2);\n console.log(ticketId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimTicket,\n intentionData: {\n ticketId,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(config.packageId),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","const config = {\n packageId: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n poolObjectId: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n metadataObjectId: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n systemStateObjectId: '0x0000000000000000000000000000000000000000000000000000000000000005',\n certType: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n gasBudget: 50_000_000,\n};\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimTicketIntentionData {\n ticketId: string;\n}\n\nexport class ClaimTicketIntention extends BaseIntentionLegacy<ClaimTicketIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: ClaimTicketIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { ticketId } = this.data;\n tx.moveCall({\n target: `${config.packageId}::native_pool::burn_ticket`,\n arguments: [tx.object(config.poolObjectId), tx.object(config.systemStateObjectId), tx.object(ticketId)],\n });\n return tx;\n }\n\n static fromData(data: ClaimTicketIntentionData) {\n return new ClaimTicketIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface StakeIntentionData {\n amount: number;\n}\n\nexport class StakeIntention extends BaseIntentionLegacy<StakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: StakeIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { amount } = this.data;\n const [coin] = tx.splitCoins(tx.gas, [tx.pure(amount)]);\n tx.moveCall({\n target: `${config.packageId}::native_pool::stake`,\n arguments: [\n tx.object(config.poolObjectId),\n tx.object(config.metadataObjectId),\n tx.object(config.systemStateObjectId),\n coin,\n ],\n });\n return tx;\n }\n\n static fromData(data: StakeIntentionData) {\n return new StakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface UnStakeIntentionData {\n amount: number;\n}\n\nexport class UnStakeIntention extends BaseIntentionLegacy<UnStakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: UnStakeIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { amount } = this.data;\n const coins = (\n await input.suiClient.getAllCoins({\n owner: input.account.address,\n limit: 100,\n })\n ).data;\n const [primaryCoin, ...mergeCoins] = coins.filter(\n (coin) => coin.coinType.split('::')[0] === config.certType.split('::')[0],\n );\n\n const primaryCoinInput = tx.object(primaryCoin.coinObjectId);\n if (mergeCoins.length) {\n tx.mergeCoins(\n primaryCoinInput,\n mergeCoins.map((coin) => tx.object(coin.coinObjectId)),\n );\n }\n const coin = tx.splitCoins(tx.object(primaryCoin.coinObjectId), [tx.pure(amount)]);\n\n tx.moveCall({\n target: `${config.packageId}::native_pool::unstake`,\n arguments: [\n tx.object(config.poolObjectId),\n tx.object(config.metadataObjectId),\n tx.object(config.systemStateObjectId),\n coin,\n ],\n });\n return tx;\n }\n\n static fromData(data: UnStakeIntentionData) {\n return new UnStakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\n\nimport { Decoder } from './decoder';\nimport { ClosePosition } from './intentions/close-position';\nimport { CollectFee } from './intentions/collect-fee';\nimport { CollectRewards } from './intentions/collect-rewards';\nimport { CollectRewardsAndFee } from './intentions/collect-rewards-and-fee';\nimport { OpenAndAddLiquidity } from './intentions/open-position-with-liquidity';\nimport { ProvideLiquidity } from './intentions/provide-liquidity';\nimport { RemoveLiquidity } from './intentions/remove-liquidity';\nimport { SuiNetworks, BluefinIntentionData, TransactionSubType } from './types';\n\nexport type BluefinIntention =\n | OpenAndAddLiquidity\n | ProvideLiquidity\n | RemoveLiquidity\n | ClosePosition\n | CollectFee\n | CollectRewards\n | CollectRewardsAndFee;\nexport class BluefinHelper implements IAppHelperInternal<BluefinIntentionData> {\n application = 'bluefin';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n action?: string;\n txbParams?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: BluefinIntentionData }> {\n console.log('Bluefin helper deserialize input: ', input);\n const { transaction } = input;\n\n const decoder = new Decoder(transaction);\n\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: BluefinIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n console.log(input.txSubType);\n let intention: BluefinIntention;\n switch (input.txSubType) {\n case TransactionSubType.OpenPosition:\n intention = OpenAndAddLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.ProvideLiquidity:\n intention = ProvideLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.ClosePosition:\n intention = ClosePosition.fromData(input.intentionData);\n break;\n\n case TransactionSubType.CollectFee:\n intention = CollectFee.fromData(input.intentionData);\n break;\n case TransactionSubType.CollectRewards:\n intention = CollectRewards.fromData(input.intentionData);\n break;\n case TransactionSubType.CollectRewardsAndFee:\n intention = CollectRewardsAndFee.fromData(input.intentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { asIntN } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64 } from '@mysten/bcs';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport {\n ClosePositionIntentionData,\n CollectFeeIntentionData,\n CollectRewardsAndFeeIntentionData,\n CollectRewardsIntentionData,\n CollectTokens,\n DecodeResult,\n FeeTokens,\n OpenPositionIntentionData,\n ProvideLiquidityIntentionData,\n RemoveLiquidityIntentionData,\n RewardCollection,\n RewardTokens,\n TransactionSubType,\n} from './types';\n\nexport class Decoder {\n constructor(public readonly transaction: Transaction) {}\n\n decode() {\n if (this.isOpenPositionTx()) {\n return this.decodeOpenPositionTx();\n }\n if (this.isClosePositionTx()) {\n return this.decodeClosePositionTx();\n }\n if (this.isProvideLiquidityTx()) {\n return this.decodeProvideLiquidityTx();\n }\n if (this.isRemoveLiquidityTx()) {\n return this.decodeRemoveLiquidityTx();\n }\n if (this.isCollectRewardsAndFeeTx()) {\n return this.decodeCollectRewardsAndFeeTx();\n }\n if (this.isCollectRewardsTx()) {\n return this.decodeCollectRewardsTx();\n }\n if (this.isCollectFeeTx()) {\n return this.decodeCollectFeeTx();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private decodeOpenPositionTx(): DecodeResult {\n const openPosCommand = this.getMoveCallCommand('open_position');\n const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenPosition,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(openPosCommand, 1)),\n lowerTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 2)))).toString()),\n upperTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 3)))).toString()),\n tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n } as OpenPositionIntentionData,\n };\n }\n\n private decodeClosePositionTx(): DecodeResult {\n const closePosCommand = this.getMoveCallCommand('close_position');\n\n const rewardsCallData = this.getCollectRewardCallData();\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClosePosition,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(closePosCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(closePosCommand, 3)),\n transferTokensTo: this.getAddress(this.getInputIndex(closePosCommand, 4)),\n collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType) as RewardTokens,\n collectFeeTokens: this.getTypeArguments(closePosCommand) as FeeTokens,\n } as ClosePositionIntentionData,\n };\n }\n\n private decodeProvideLiquidityTx(): DecodeResult {\n const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ProvideLiquidity,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(addLiqCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(addLiqCommand, 3)),\n tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n } as ProvideLiquidityIntentionData,\n };\n }\n\n private decodeRemoveLiquidityTx(): DecodeResult {\n const removeLiqCommand = this.getMoveCallCommand('remove_liquidity');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(removeLiqCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(removeLiqCommand, 3)),\n liquidity: this.getU128(this.getInputIndex(removeLiqCommand, 4)),\n maxAmountTokenA: this.getU64(this.getInputIndex(removeLiqCommand, 5)),\n maxAmountTokenB: this.getU64(this.getInputIndex(removeLiqCommand, 6)),\n transferTokensTo: this.getAddress(this.getInputIndex(removeLiqCommand, 7)),\n ...this.collectTokens(),\n } as RemoveLiquidityIntentionData,\n };\n }\n\n private decodeCollectRewardsTx(): DecodeResult {\n const rewardsCallData = this.getCollectRewardCallData();\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectRewards,\n intentionData: {\n pool: rewardsCallData[0].pool,\n position: rewardsCallData[0].position,\n collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType),\n } as CollectRewardsIntentionData,\n };\n }\n\n private decodeCollectFeeTx(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectFee,\n intentionData: this.getFeeCallData() as CollectFeeIntentionData,\n };\n }\n\n private decodeCollectRewardsAndFeeTx(): DecodeResult {\n const callData = this.getFeeCallData();\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectRewardsAndFee,\n intentionData: {\n pool: callData.pool,\n position: callData.position,\n ...this.collectTokens(),\n } as CollectRewardsAndFeeIntentionData,\n };\n }\n\n private getFeeCallData(): CollectFeeIntentionData {\n const collectFeeCommand = this.getMoveCallCommand('collect_fee');\n return {\n pool: this.getSharedObjectID(this.getInputIndex(collectFeeCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(collectFeeCommand, 3)),\n collectFeeTokens: this.getTypeArguments(collectFeeCommand) as FeeTokens,\n };\n }\n\n private getCollectRewardCallData(): Array<RewardCollection> {\n const collectRewards: RewardCollection[] = [];\n this.commands.forEach((command) => {\n if (command.$kind === 'MoveCall' && command.MoveCall.function === 'collect_reward') {\n collectRewards.push({\n pool: this.getSharedObjectID(this.getInputIndex(command, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(command, 3)),\n rewardCoinType: this.getTypeArguments(command)[2],\n });\n }\n });\n return collectRewards;\n }\n\n private collectTokens(): CollectTokens {\n const fee = this.getFeeCallData();\n const rewards = this.getCollectRewardCallData();\n\n return {\n collectFeeTokens: fee.collectFeeTokens,\n collectRewardTokens: rewards.map((r) => r.rewardCoinType) as RewardTokens,\n };\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private isOpenPositionTx() {\n return !!this.getMoveCallCommand('open_position');\n }\n\n private isProvideLiquidityTx() {\n return !!this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n }\n\n private isRemoveLiquidityTx() {\n return !!this.getMoveCallCommand('remove_liquidity');\n }\n\n private isCollectRewardsTx() {\n return !!this.getMoveCallCommand('collect_reward');\n }\n\n private isCollectFeeTx() {\n return !!this.getMoveCallCommand('collect_fee');\n }\n\n private isCollectRewardsAndFeeTx() {\n return this.isCollectRewardsTx() && this.isCollectFeeTx();\n }\n\n private isClosePositionTx() {\n return !!this.getMoveCallCommand('close_position');\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getSharedObjectID(index: number): string {\n return this.inputs[index].Object.SharedObject.objectId as string;\n }\n\n private getOwnedObjectID(index: number): string {\n return this.inputs[index].Object.ImmOrOwnedObject.objectId as string;\n }\n\n private getU32(index: number): string {\n return String(bcs.u32().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes))));\n }\n\n private getU64(index: number): string {\n return bcs.u64().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getU128(index: number): string {\n return bcs.u128().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getBoolean(index: number): boolean {\n return bcs.bool().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getAddress(index: number): string {\n return bcs.Address.parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getTypeArguments(command: any): Array<string> {\n return command.MoveCall.typeArguments || [];\n }\n\n private getInputIndex(command: any, index: number): number {\n return command.MoveCall.arguments[index].Input;\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ClosePositionIntentionData } from '../types';\n\nexport class ClosePosition extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ClosePosition;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.closePosition(this.data as ClosePositionIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new ClosePosition(data);\n }\n}\n","import { BN, ClmmPoolUtil, LiquidityInput } from '@firefly-exchange/library-sui';\nimport { Pool } from '@firefly-exchange/library-sui/dist/src/spot/types';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { getBluefinSpotSDK } from './config';\nimport {\n ClosePositionIntentionData,\n CollectRewardsAndFeeIntentionData,\n CollectFeeIntentionData,\n CollectRewardsIntentionData,\n OpenPositionIntentionData,\n ProvideLiquidityIntentionData,\n RemoveLiquidityIntentionData,\n SuiNetworks,\n} from './types';\n\nexport default class TxBuilder {\n static async OpenPosition(\n txParams: OpenPositionIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const liquidityInput = this.prototype.buildLiqInput(pool, { ...txParams, slippage: 0 });\n\n const txb: Transaction = (await sdk.openPositionWithFixedAmount(\n pool,\n txParams.lowerTick,\n txParams.upperTick,\n liquidityInput,\n {\n returnTx: true,\n sender: account.address,\n },\n )) as unknown as Transaction;\n\n return txb;\n }\n\n static async provideLiquidity(\n txParams: ProvideLiquidityIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const res = this.prototype.buildLiqInput(pool, txParams);\n\n const txb = (await sdk.provideLiquidityWithFixedAmount(pool, txParams.position, res, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async removeLiquidity(\n txParams: RemoveLiquidityIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb = (await sdk.removeLiquidity(\n pool,\n txParams.position,\n {\n liquidityAmount: new BN(txParams.liquidity),\n tokenMaxA: new BN(txParams.maxAmountTokenA),\n tokenMaxB: new BN(txParams.maxAmountTokenB),\n } as any as LiquidityInput,\n {\n returnTx: true,\n sender: account.address,\n },\n )) as any as Transaction;\n\n return txb;\n }\n\n static async closePosition(\n txParams: ClosePositionIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb = (await sdk.closePosition(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectRewards(\n txParams: CollectRewardsIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb: Transaction = (await sdk.collectRewards(pool, txParams.position, {\n rewardCoinsType: txParams.collectRewardTokens,\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectFee(\n txParams: CollectFeeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb: Transaction = (await sdk.collectFee(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectRewardsAndFee(\n txParams: CollectRewardsAndFeeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n console.log(txParams.position);\n const txb: Transaction = (await sdk.collectFeeAndRewards(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n /// Method to create the liquidity input payload\n private buildLiqInput(pool: Pool, params: any): LiquidityInput {\n const res = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n params.lowerTick,\n params.upperTick,\n new BN(params.tokenAmount),\n params.isTokenAFixed,\n true,\n 0,\n new BN(pool.current_sqrt_price),\n );\n return { ...res, tokenMaxA: new BN(params.maxAmountTokenA), tokenMaxB: new BN(params.maxAmountTokenB) };\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { SuiClient } from '@firefly-exchange/library-sui';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { IBluefinSpotContracts, OnChainCalls } from '@firefly-exchange/library-sui/dist/src/spot';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from './types';\n\nexport const config = {\n rpc: 'https://fullnode.mainnet.sui.io/',\n objects: {\n GlobalConfig: '0x03db251ba509a8d5d8777b6338836082335d93eecbdd09a11e190a1cff51c352',\n BasePackage: '0x3492c874c1e3b3e2984e8c41b589e642d4d0a5d6459e5a9cfc2d52fd7c89c267',\n CurrentPackage: '0x6c796c3ab3421a68158e0df18e4657b2827b1f8fed5ed4b82dba9c935988711b',\n } as any as IBluefinSpotContracts,\n};\n\nexport const getBluefinSpotSDK = (network: SuiNetworks, account: WalletAccount) => {\n if (network !== 'sui:mainnet') {\n throw new Error('Bluefin spot protocol is only available on sui::mainnet');\n }\n\n const client = new SuiClient({ url: config.rpc });\n\n const spotSDK = new OnChainCalls(client, config.objects, { address: account.address, isUIWallet: false });\n\n return spotSDK;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectFeeIntentionData } from '../types';\n\nexport class CollectFee extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectFee;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectFee(this.data as CollectFeeIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectFee(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsIntentionData } from '../types';\n\nexport class CollectRewards extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectRewards;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectRewards(this.data as CollectRewardsIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectRewards(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsAndFeeIntentionData } from '../types';\n\nexport class CollectRewardsAndFee extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectRewardsAndFee;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectRewardsAndFee(this.data as CollectRewardsAndFeeIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectRewardsAndFee(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, OpenPositionIntentionData } from '../types';\n\nexport class OpenAndAddLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.OpenPosition;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.OpenPosition(this.data as OpenPositionIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new OpenAndAddLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ProvideLiquidityIntentionData } from '../types';\n\nexport class ProvideLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ProvideLiquidity;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.provideLiquidity(this.data as ProvideLiquidityIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new ProvideLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, RemoveLiquidityIntentionData } from '../types';\n\nexport class RemoveLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveLiquidity;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.removeLiquidity(this.data as RemoveLiquidityIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new RemoveLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { AddLiquidityIntention } from './intentions/v2/add-liquidity';\nimport { AddLiquiditySingleSideIntention } from './intentions/v2/add-liquidity-single-side';\nimport { ClaimRewardsIntention } from './intentions/v2/claim-rewards';\nimport { RemoveLiquidityIntention } from './intentions/v2/remove-liquidity';\nimport { AddLiquiditySingleSideV3Intention } from './intentions/v3/add-liquidity-single-side-v3';\nimport { AddLiquidityV3Intention } from './intentions/v3/add-liquidity-v3';\nimport { ClaimV3MayaRewardsIntention } from './intentions/v3/claim-maya-rewards';\nimport { ClaimRewardsV3Intention } from './intentions/v3/claim-rewards';\nimport { RemoveLiquidityV3Intention } from './intentions/v3/remove-liquidity';\nimport { KRIYAIntentionData, TransactionSubType } from './types';\n\nexport type KRIYAIntention =\n | AddLiquidityIntention\n | AddLiquiditySingleSideIntention\n | ClaimRewardsIntention\n | RemoveLiquidityIntention\n | AddLiquidityV3Intention\n | AddLiquiditySingleSideV3Intention\n | RemoveLiquidityV3Intention\n | ClaimRewardsV3Intention\n | ClaimV3MayaRewardsIntention;\n\nexport class KRIYAAppHelper implements IAppHelperInternal<KRIYAIntentionData> {\n application = 'kriya';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n transaction: Transaction;\n appContext: KRIYAIntentionData;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: KRIYAIntentionData;\n }> {\n const { appContext } = input;\n return {\n txType: TransactionType.Other,\n txSubType: appContext.action,\n intentionData: appContext,\n };\n }\n\n async build(input: {\n intentionData: KRIYAIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n let intention: KRIYAIntention;\n switch (input.txSubType) {\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.AddLiquiditySingleSided:\n intention = AddLiquiditySingleSideIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.ClaimRewards:\n intention = ClaimRewardsIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.ClaimRewardsV3:\n intention = ClaimRewardsV3Intention.fromData(input.intentionData);\n break;\n case TransactionSubType.ClaimV3MayaRewards:\n intention = ClaimV3MayaRewardsIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.AddLiquidityV3:\n intention = AddLiquidityV3Intention.fromData(input.intentionData);\n break;\n case TransactionSubType.AddLiquiditySingleSideV3:\n intention = AddLiquiditySingleSideV3Intention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveLiquidityV3:\n intention = RemoveLiquidityV3Intention.fromData(input.intentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build();\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, KRIYAIntentionData } from '../../types';\n\nexport class AddLiquidityIntention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Amm.getTxbAddLiquidity(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, KRIYAIntentionData } from '../../types';\n\nexport class AddLiquiditySingleSideIntention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquiditySingleSided;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Amm.getTxbAddLiquiditySingleSided(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new AddLiquiditySingleSideIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { KRIYAIntentionData, TransactionSubType } from '../../types';\n\nexport class ClaimRewardsIntention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.ClaimRewards;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Amm.getTxbClaimRewards(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new ClaimRewardsIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { KRIYAIntentionData, TransactionSubType } from '../../types';\n\nexport class RemoveLiquidityIntention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.RemoveLiquidity;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Amm.getTxbRemoveLiquidity(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, KRIYAIntentionData } from '../../types';\n\nexport class AddLiquiditySingleSideV3Intention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquiditySingleSided;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Clmm.getTxbAddLiquiditySingleSided(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new AddLiquiditySingleSideV3Intention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, KRIYAIntentionData } from '../../types';\n\nexport class AddLiquidityV3Intention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Clmm.getTxbAddLiquidity(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new AddLiquidityV3Intention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { KRIYAIntentionData, TransactionSubType } from '../../types';\n\nexport class ClaimV3MayaRewardsIntention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.ClaimV3MayaRewards;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Clmm.getTxbClaimMayaRewards(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new ClaimV3MayaRewardsIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { KRIYAIntentionData, TransactionSubType } from '../../types';\n\nexport class ClaimRewardsV3Intention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.ClaimRewardsV3;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Clmm.getTxbClaimRewards(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new ClaimRewardsV3Intention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { KriyaSDK } from 'kriya-dev-sdk';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, KRIYAIntentionData } from '../../types';\n\nexport class RemoveLiquidityV3Intention extends BaseIntention<KRIYAIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.RemoveLiquidity;\n\n constructor(public override readonly data: KRIYAIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = new KriyaSDK();\n const { params } = this.data;\n\n return sdk.Clmm.getTxbRemoveLiquidity(params);\n }\n\n static fromData(data: KRIYAIntentionData) {\n return new RemoveLiquidityV3Intention(data);\n }\n}\n"],"mappings":"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","names":["index_exports","__export","appHelpers","__toCommonJS","import_sui3_utils","import_alphafi_sdk","import_sui3_utils","import_bcs","Decoder","transaction","simResult","liquidityChangeEvent","eventData","poolId","poolName","fn","command","event","type","inputWithPure","input","bytes","res","amount_a","amount_b","isAmountA","amount","coin","expo","xTokensAmount","amount_withdrawn_from_locked","import_alphafi_sdk","import_sort_keys_recursive","BaseIntention","data","sortKeys","ClaimRewardIntention","_ClaimRewardIntention","BaseIntention","data","input","account","import_alphafi_sdk","DepositDoubleAssetIntention","_DepositDoubleAssetIntention","BaseIntention","data","input","account","poolName","amount","isAmountA","import_alphafi_sdk","DepositSingleAssetIntention","_DepositSingleAssetIntention","BaseIntention","data","input","account","poolName","amount","import_alphafi_sdk","WithdrawIntention","_WithdrawIntention","BaseIntention","data","input","account","poolName","xTokensAmount","import_alphafi_sdk","WithdrawAlphaIntention","_WithdrawAlphaIntention","BaseIntention","data","input","account","withdrawFromLocked","xTokensAmount","AlphaFiHelper","input","transaction","suiClient","account","simResult","result","Decoder","intention","DepositSingleAssetIntention","DepositDoubleAssetIntention","WithdrawIntention","WithdrawAlphaIntention","ClaimRewardIntention","import_sui3_utils","import_sui3_utils","import_bcs","import_bucket_protocol_sdk","Decoder","transaction","fn","command","module","package_","coinType","buckToCoin","amount","inputCoinObject","collateralType","borrowAmount","insertionPlace","strapId","collateralAmount","buckAmount","insertPlaceArg","insertionPlaces","buckOutput","repayAmount","withdrawAmount","withdrawArg","inputAmount","isStake","stakeProofs","unlockCommands","i","unstakeCommands","argument","objectId","toBuck","intentionData","commands","amountArg","proofCount","sbuckClaimCommands","lstClaimCommands","idx","strapArg","input","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","import_bucket_protocol_sdk","getBucketClient","network","account","config","getPsmTx","txbParams","account","network","coinType","amount","buckToCoin","tx","client","getBucketClient","PsmIntention","_PsmIntention","BaseIntention","data","input","account","network","getPsmTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getBorrowTx","txbParams","account","network","collateralType","collateralAmount","borrowAmount","insertionPlace","strapId","tx","client","getBucketClient","getWithdrawTx","withdrawAmount","getRepayTx","repayAmount","isSurplus","getCloseTx","recipient","BorrowIntention","_BorrowIntention","BaseIntention","data","input","account","network","getBorrowTx","import_sui3_utils","RepayIntention","_RepayIntention","BaseIntention","data","input","account","network","getRepayTx","import_sui3_utils","WithdrawIntention","_WithdrawIntention","BaseIntention","data","input","account","network","getWithdrawTx","import_sui3_utils","CloseIntention","_CloseIntention","BaseIntention","data","input","account","network","getCloseTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getSBUCKDepositTx","txbParams","account","network","coinType","amount","isStake","tx","client","getBucketClient","getSBUCKUnstakeTx","stakeProofs","toBuck","getSBUCKWithdrawTx","getSBUCKClaimTx","SBUCKDepositIntention","_SBUCKDepositIntention","BaseIntention","data","input","account","network","getSBUCKDepositTx","SBUCKUnstakeIntention","_SBUCKUnstakeIntention","getSBUCKUnstakeTx","SBUCKWithdrawIntention","_SBUCKWithdrawIntention","getSBUCKWithdrawTx","SBUCKClaimIntention","_SBUCKClaimIntention","getSBUCKClaimTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getTankDepositTx","txbParams","account","network","coinType","amount","tx","client","getBucketClient","getTankWithdrawTx","getTankClaimTx","import_transactions","import_bucket_protocol_sdk","getLockClaimTx","txbParams","account","network","coinType","proofCount","tx","client","getBucketClient","TankDepositIntention","_TankDepositIntention","BaseIntention","data","input","account","network","getTankDepositTx","TankWithdrawIntention","_TankWithdrawIntention","getTankWithdrawTx","TankClaimIntention","_TankClaimIntention","getTankClaimTx","import_sui3_utils","LockClaimIntention","_LockClaimIntention","BaseIntention","data","input","account","network","getLockClaimTx","BucketHelper","input","transaction","result","Decoder","suiClient","account","network","intention","PsmIntention","BorrowIntention","WithdrawIntention","RepayIntention","CloseIntention","TankDepositIntention","TankWithdrawIntention","TankClaimIntention","SBUCKDepositIntention","SBUCKUnstakeIntention","SBUCKWithdrawIntention","SBUCKClaimIntention","LockClaimIntention","import_sui3_utils","import_sui3_utils","import_aggregator_sdk","import_cetus_periphery_sdk","import_cetus_sui_clmm_sdk","import_cetus_xcetus_sdk","import_vaults_sdk","import_client","clmmConfig","peripheryConfig","xcetusConfig","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","aggregatorURL","getAggregatorSdk","suiClient","vaultsSDKOptions","getVaultsSdk","vaultsSDK","CetusVaultsSDK","getXcetusSdk","xcetusSDk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getAddLiquidityTxb","import_sui3_utils","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","BaseIntention","data","input","account","network","txbParams","getClaimFeeAndMiningTxb","import_sui3_utils","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getDecreaseLiquidityTxb","import_sui3_utils","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","getFarmingBatchHarvest","peripherySdk","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingAddLiquidityTxb","import_sui3_utils","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","BaseIntention","data","input","account","network","txbParams","getFarmingBatchHarvest","import_sui3_utils","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","BaseIntention","data","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","import_sui3_utils","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","import_sui3_utils","FarmingHarvestIntention","_FarmingHarvestIntention","BaseIntention","data","input","account","network","txbParams","getFarmingHarvest","import_sui3_utils","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","import_sui3_utils","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","import_sui3_utils","FarmingStakeIntention","_FarmingStakeIntention","BaseIntention","data","input","account","network","txbParams","getFarmingStake","import_sui3_utils","FarmingUnstakeIntention","_FarmingUnstakeIntention","BaseIntention","data","input","account","network","txbParams","getFarmingUnstake","import_sui3_utils","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getIncreaseLiquidityTxb","import_sui3_utils","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getRemoveLiquidityTxb","import_sui3_utils","import_aggregator_sdk","import_transactions","getSwapRouterTxb","txbParams","account","network","aggregatorSdk","getAggregatorSdk","txb","SwapIntention","_SwapIntention","BaseIntention","data","input","account","network","txbParams","getSwapRouterTxb","import_sui3_utils","getAddVaultsPositionPayload","txbParams","account","network","getVaultsSdk","getRemoveVaultsPositionPayload","AddVaultsPositionIntention","_AddVaultsPositionIntention","BaseIntention","data","input","account","network","txbParams","getAddVaultsPositionPayload","import_sui3_utils","RemoveVaultsPositionIntention","_RemoveVaultsPositionIntention","BaseIntention","data","input","account","network","txbParams","getRemoveVaultsPositionPayload","import_sui3_utils","import_transactions","VestingConfing","getVestingRedeemTxb","txbParams","account","network","pool","nftId","periods","CLOCK_ADDRESS","txb","period","VestingRedeemIntention","_VestingRedeemIntention","BaseIntention","data","input","account","network","txbParams","getVestingRedeemTxb","import_sui3_utils","getXcetusConvertTxb","txbParams","account","network","getXcetusSdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","BaseIntention","data","input","account","network","txbParams","getXcetusCancelRedeemTxb","import_sui3_utils","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","BaseIntention","data","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","import_sui3_utils","XcetusConvertIntention","_XcetusConvertIntention","BaseIntention","data","input","account","network","txbParams","getXcetusConvertTxb","import_sui3_utils","XcetusRedeemIntention","_XcetusRedeemIntention","BaseIntention","data","input","account","network","txbParams","getXcetusRedeemTxb","import_sui3_utils","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","BaseIntention","data","input","account","network","txbParams","getXcetusRedeemLockTxb","CetusHelper","input","txbParams","action","suiClient","account","network","intention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","ClaimFeeAndMiningIntention","FarmingAddLiquidityIntention","FarmingIncreaseLiquidityIntention","FarmingDecreaseLiquidityIntention","FarmingRemoveLiquidityIntention","FarmingClaimFeeAndRewardIntention","FarmingHarvestIntention","FarmingBatchHarvestIntention","FarmingStakeIntention","FarmingUnstakeIntention","XcetusConvertIntention","XcetusRedeemLockIntention","XcetusClaimingStakeRewardsIntention","XcetusCancelIntention","XcetusRedeemIntention","VestingRedeemIntention","SwapIntention","AddVaultsPositionIntention","RemoveVaultsPositionIntention","import_sui3_utils","import_sort_keys_recursive","BaseIntentionLegacy","data","sortKeys","import_client","dev_exports","__export","contractId","dev_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","prod_exports","__export","contractId","prod_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","DEV_RPC_ENDPOINT","STG_RPC_ENDPOINT","PREV_RPC_ENDPOINT","PROD_RPC_ENDPOINT","DEV_BE_API","STG_BE_API","PREV_BE_API","PROD_BE_API","CONTRACT_DEV","dev_exports","CONTRACT_PROD","prod_exports","ENV_CONFIG","getConfig","env","options","ec","import_client","MPayError","mpayErrorCode","msg","options","cause","context","NoBackendError","MPayError","WalletNotConnectedError","MPayError","import_axios","BackendError","MPayError","msg","context","Backend","_Backend","apiURL","response","BackendError","recipient","options","res","axios","sender","query","paginatedData","event","formalizedEvent","address","Globals","_Globals","envConfig","Backend","env","options","ec","getConfig","NoBackendError","b","wallet","WalletNotConnectedError","import_utils","import_transactions","import_transactions","import_utils","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","MoveObject","object","txb","ObjectVector","objects","o","ResultRef","_ResultRef","result","target","property","nestedResultFor","resultIndex","import_buffer","import_utils","InvalidRpcResultError","MPayError","msg","ctx","InspectViewer","results","index","returned","callIndex","returnIndex","callResult","value","type","InvalidRpcResultError","import_bcs","InvalidInputError","MPayError","msg","fieldKey","fieldValue","metadataBcsType","MAX_NAME_SIZE","encodeMetadata","metadata","validateMetadata","decodeMetadata","metaStr","isAsciiString","InvalidInputError","str","import_utils","isSameCoinType","type1","type2","isSameTarget","target1","target2","GAS_OBJECT_SPEC","import_nanoid","generateGroupId","CreateStreamHelper","_CreateStreamHelper","globals","feeContract","streamContract","info","encodeMetadata","generateGroupId","recipient","txb","paymentWithFee","coinReqs","coinResp","paymentMergedObject","flatFeeMergedObject","i","paymentAmount","feeAmount","paymentCoin","flatFeeCoin","ResultRef","createInfo","infoInternal","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","coins","mergedCoin","coinId","GAS_OBJECT_SPEC","payment","streamCoinType","isSameCoinType","streamPayment","sum","totalAmount","fee","numEpoch","streamAmount","res","InspectViewer","import_transactions","CLOCK_ID","BaseContract","moduleName","config","globals","txb","input","target","arg","ObjectVector","MoveObject","ResultRef","callArgs","typeArgs","object","CLOCK_ID","FeeContract","_FeeContract","BaseContract","config","globals","txb","createFeeNumerator","roleObject","feeObject","flatFee","claimFee","amount","StreamContract","_StreamContract","BaseContract","config","globals","txb","input","feeObject","vaultObject","paymentCoinObject","flatFeeObject","clockObject","streamObject","MPayBuilder","globals","config","FeeContract","StreamContract","info","infoInternal","CreateStreamHelper","streamId","enabled","coinType","txb","import_utils","import_luxon","TransactionFailedError","MPayError","status","msg","MIN_INTERVAL_MS","MPayHelper","globals","CoinMetaHelper","MPayBuilder","res","TransactionFailedError","change","info","input","InvalidInputError","cliffFraction","cliffAmount","amountPerStep","timeEnd","intervalMilli","address","coinType","balance","coinMeta","allBalance","coinMetas","bal","i","txb","val","originTotalAmount","suiClient","normalized","meta","import_utils","import_luxon","import_transactions","import_utils","import_luxon","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","SanityError","MPayError","msg","options","StreamNotFoundError","MPayError","streamId","import_luxon","MAX_U64","TIME_ROUND_UNIT","roundDateTime","date","dateMs","roundMs","roundDuration","duration","durationMs","Stream","_Stream","globals","streamId","rawData","StreamContract","data","SanityError","pagination","NotCreatorError","txb","NotRecipientError","enabled","roundDuration","metadata","decodeMetadata","roundDateTime","rawConfig","duration","rawStatus","MAX_U64","timeNowMs","timeStartMs","epoch","res","StreamNotFoundError","RpcError","content","typeParams","coinType","dataFields","config","status","InvalidStreamGroupError","MPayError","msg","context","getAllFromIterator","it","res","val","PagedIterator","requester","EntryIterator","REQUEST_PAGE_SIZE","getObjectsById","suiClient","ids","options","oidIter","ListOidIterator","iter","ObjectBatchIterator","getAllFromIterator","EntryIterator","idIter","ObjectBatchRequester","stringIter","requestPage","objId","res","filtered","filter","StreamGroup","_StreamGroup","globals","streams","InvalidStreamGroupError","gids","st","InvalidInputError","ids","streamObjs","getObjectsById","obj","SanityError","responses","commonInfos","stream","expInfo","isEqual","info","isEqualStreamGroupCommonInfo","i","sum","pagination","Stream","info1","info2","PagedStreamListIterator","_PagedStreamListIterator","it","pageSize","input","StreamListIterator","res","_StreamListIterator","requester","StreamListRequester","SanityError","_StreamListRequester","globals","recipient","groupRefs","query","oidIter","ListOidIterator","ref","ObjectBatchIterator","backendQuery","convertToIncomingBackendQuery","filtered","groupedRefs","groupAndSortRefs","convertToOutgoingBackendQuery","sender","refs","stRefs","stream","getStreamFromIterator","isStreamOfQuery","sg","getStreamGroupFromIterator","isStreamGroupOfQuery","m","groupList","gl1","gl2","isStatus","isStreamOfStatus","isClaimable","filter","streamId","data","getStreamObjectResponseFromIter","Stream","streamIds","objResponses","StreamGroup","convertStreamStatus","normalizeCoinTypeFilter","normalizeAddressFilter","status","st","sts","convertStreamStatusSingle","InvalidInputError","coinType","ct","address","addr","NotEnoughBalanceError","MPayError","coinType","requestAmount","gotAmount","DEF_REQ_PAGE_SIZE","getCoinsWithAmount","suiClient","owner","requestAmount","coinType","pageSize","it","OwnedCoinIterator","totalAmount","res","val","NotEnoughBalanceError","OwnedCoinIterator","EntryIterator","suiClient","owner","coinType","reqPageSize","OwnedCoinRequester","SanityError","res","MSafeAccountAdapter","msafe","reqs","MSafeSingleWallet","account","SingleWalletAdapter","singleWallet","suiClient","req","isSameCoinType","GAS_OBJECT_SPEC","InvalidInputError","coins","getCoinsWithAmount","SanityError","coin","MPayClient","env","options","Globals","MPayHelper","wallet","adapter","info","streamId","Stream","query","pageSize","PagedStreamListIterator","address","coinType","recipient","creator","MPayBuilder","StreamIntention","BaseIntentionLegacy","network","account","mpayClient","MPayClient","MSafeSingleWallet","CancelStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","ClaimByProxyStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","ClaimStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","CreateStreamIntention","StreamIntention","data","input","network","account","import_bcs","import_utils","MoveCallHelper","_MoveCallHelper","moveCall","txb","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","CreateStreamDecodeHelper","globals","txb","streamInfo","fees","infos","moveCall","txs","tx","isSameTarget","SanityError","MoveCallHelper","metadata","name","groupId","decodeMetadata","recipient","timeStart","cliff","epochInterval","totalEpoch","amountPerEpoch","cancelable","coinType","info","InvalidInputError","recipients","StreamContract","FeeContract","CreateStreamHelper","arg","DecodeHelper","globals","txb","StreamContract","tx","isSameTarget","CreateStreamDecodeHelper","streamId","enabled","moveCall","MoveCallHelper","import_sui3_utils","SetAutoClaimStreamIntention","StreamIntention","data","input","network","account","MPayAppHelper","input","network","transactionBlock","globals","Globals","result","DecodeHelper","intention","CreateStreamIntention","SetAutoClaimStreamIntention","ClaimStreamIntention","ClaimByProxyStreamIntention","CancelStreamIntention","intentionData","import_sui3_utils","import_sui3_utils","CoinTransferIntention","_CoinTransferIntention","BaseIntentionLegacy","data","input","suiClient","account","import_sui3_utils","ObjectTransferIntention","_ObjectTransferIntention","BaseIntentionLegacy","data","input","suiClient","account","CoreHelper","input","suiClient","account","intention","CoinTransferIntention","ObjectTransferIntention","import_sui3_utils","updated","config","updatePackageId","data","res","packageId","borrowFee","borrowFeeAddress","pool","e","config_default","import_sui3_utils","import_bcs","import_utils","Decoder","txb","target","trans","config_default","transactions","assetId","findPool","pool","amount","list","helper","MoveCallHelper","moveCall","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_navi_sdk","depositToken","txb","pool","coinObject","amount","withdrawToken","userAddress","coin","borrowToken","tx","borrowedCoin","repayToken","claimReward","client","claimSupply","ClaimRewardIntention","_ClaimRewardIntention","BaseIntentionLegacy","data","input","type","claimReward","ClaimSupplyIntention","_ClaimSupplyIntention","BaseIntentionLegacy","data","input","type","claimSupply","import_transactions","import_navi_sdk","getPoolConfigByAssetId","assetId","item","EntryBorrowIntention","_EntryBorrowIntention","BaseIntentionLegacy","data","input","assetId","amount","tx","pool","getPoolConfigByAssetId","borrowToken","import_transactions","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","BaseIntentionLegacy","data","input","suiClient","account","assetId","amount","tx","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryRepayIntention","_EntryRepayIntention","BaseIntentionLegacy","data","input","suiClient","account","assetId","amount","tx","pool","getPoolConfigByAssetId","toDeposit","repayToken","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryWithdrawIntention","_EntryWithdrawIntention","BaseIntentionLegacy","data","input","assetId","amount","tx","pool","getPoolConfigByAssetId","withdrawToken","import_transactions","EntryMultiDepositIntention","_EntryMultiDepositIntention","BaseIntentionLegacy","data","input","suiClient","account","list","tx","i","assetId","amount","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","j","NAVIAppHelper","input","updatePackageId","transactionBlock","result","Decoder","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","EntryMultiDepositIntention","ClaimRewardIntention","ClaimSupplyIntention","import_sui3_utils","import_bcs","import_transactions","import_sort_keys_recursive","PlainTransactionApplication","PlainTransactionType","PlainTransactionIntention","_PlainTransactionIntention","data","sortKeys","input","PlainTransactionHelper","content","suiClient","network","account","import_client","import_transactions","import_client_js","CODE_TO_ERROR_TYPE","SuiHTTPTransportError","JsonRpcError","message","code","getWebsocketUrl","httpUrl","url","DEFAULT_CLIENT_OPTIONS","WebsocketClient","#requestId","#disconnects","#webSocket","#connectionPromise","#subscriptions","#pendingRequests","endpoint","options","method","params","webSocket","#setupWebSocket","resolve","reject","error","result","JsonRpcError","#reconnect","data","json","timeout","subscription","input","RpcSubscription","message","client","subscriptionId","newSubscriptionId","MSafeHTTPTransport","url","websocketUrl","websocketOptions","rpc","transport","WebsocketClient","input","unsubscribe","MSafeApps","_MSafeApps","apps","mApps","i","app","SuiJsSdkAdapter","SuiSdkAdapter","appName","helper","input","client","MSafeHTTPTransport","clientLegacy","SuiClientLegacy","build","tx","accountSuiBalance","bytes","import_sui3_utils","import_sui_scallop_sdk","import_sui3_utils","import_sui_scallop_sdk","import_utils","Decoder","transaction","scallopClient","command","moveCall","target","address","module","name","targets","targetSet","targetToIdxMap","acc","idx","moveCallCommands","import_bcs","import_utils","MoveCallHelper","_MoveCallHelper","moveCall","transaction","t","target","moveCallTarget","argIndex","input","strVal","type","arg","bcsNums","bcsVal","index","moveCallHelper_default","SplitCoinHelper","splitCoin","txb","input","moveCallHelper_default","splitCoinHelper_default","import_utils","isObligationMigrated","query","obligationId","obligation","lockKey","borrowIncentiveObjectId","OldBorrowIncentiveContract","OldBorrowIncentiveTxBuilder","tx","obligationKey","rewardType","DecoderLending","Decoder","supplyMoveCall","stakeMoveCall","unstakeMoveCall","withdrawMoveCall","redeem","burnScoin","borrowMoveCall","repayMoveCall","lendingIncentive","borrowIncentiveV2","oldBorrowIncentive","stakeWithVeSca","stakeWithoutVesca","command","moveCallHelper_default","moveCall","veScaKey","obligationKey","obligationId","rewardCoinName","coinName","amount","amountFromSplitCoin","splitCoinHelper_default","b","a","stakeSpoolAccount","coinType","stakeAccountWithAmount","tx","stakeAccountId","lendingReward","borrowRewardV2","borrowReward","stakeMarketCoinName","import_sui3_utils","DecoderReferral","Decoder","command","trans","moveCallHelper_default","moveCall","veScaKey","coins","helper","import_sui3_utils","import_sui_scallop_sdk","DecoderVeSca","Decoder","extendPeriod","stakeMoreSca","moveCall","command","moveCallHelper_default","veScaKey","lockSca","unlockTime","amountFromSplitCoin","splitCoinHelper_default","a","b","isHaveRedeem","oldUnstakeObligation","unstakeObligation","stakeObligation","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","operations","i","import_sort_keys_recursive","ScallopCoreBaseIntention","data","sortKeys","suiClient","obligationId","obligationObjectData","obligationLocked","client","input","callback","txb","obligationKey","BorrowIntention","_BorrowIntention","ScallopCoreBaseIntention","data","account","client","coinName","amount","obligationId","obligationKey","sender","_","innerTx","coin","input","BorrowWithBoostIntention","_BorrowWithBoostIntention","ScallopCoreBaseIntention","data","client","walletAddress","obligationId","obligationKey","veScaKey","amount","poolCoinName","_","scallopTxBlock","coin","input","BorrowWithReferralIntention","_BorrowWithReferralIntention","ScallopCoreBaseIntention","data","account","client","walletAddress","obligationId","obligationKey","veScaKey","poolCoinName","amount","_","scallopTxBlock","borrowReferral","coin","input","import_utils","ClaimIncentiveRewardIntention","_ClaimIncentiveRewardIntention","ScallopCoreBaseIntention","data","client","walletAddress","txb","allStakeAccounts","lendings","obligations","obligationAccounts","lendingInfos","spoolCoinNames","marketCoinName","lendingInfo","acc","rewardCoinCollection","stakeMarketCoinName","stakeAccounts","i","stakeAccount","rewardCoin","totalClaimCoin","coins","totalClaim","availableClaimCoin","obligationAccount","borrowIncentive","reward","obligationHasReward","obligationKeyId","obligation","isRewardCoinClaimed","filteredBorrowIncentives","rewardCoinName","filteredBorrowIncentive","oldRewardCoin","OldBorrowIncentiveTxBuilder","isObligationMigrated","bindedVeScaKey","objectsNeedToTransfer","coinName","rewardCoins","mergeDest","t","input","DepositCollateralIntention","_DepositCollateralIntention","ScallopCoreBaseIntention","data","input","MigrateAndClaimIntention","_MigrateAndClaimIntention","ScallopCoreBaseIntention","data","account","client","sender","obligationKey","obligationId","rewardCoinName","veScaKey","tx","rewardCoin","OldBorrowIncentiveTxBuilder","input","MigrateScoinIntention","_MigrateScoinIntention","ScallopCoreBaseIntention","data","input","OpenObligationIntention","_OpenObligationIntention","ScallopCoreBaseIntention","data","input","RepayIntention","_RepayIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","obligationKey","_","innerTx","input","RepayWithBoostIntention","_RepayWithBoostIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","veScaKey","tx","availableStake","input","SupplyLendingIntention","_SupplyLendingIntention","ScallopCoreBaseIntention","data","input","UnstakeSpoolIntention","_UnstakeSpoolIntention","ScallopCoreBaseIntention","data","input","WithdrawAndUnstakeLendingIntention","_WithdrawAndUnstakeLendingIntention","ScallopCoreBaseIntention","data","client","walletAddress","tx","stakeAccountId","totalAmount","coinName","withdrawCoins","i","stakeAccount","amount","stakeMarketCoinName","marketCoin","wdScoin","wdCoin","input","WithdrawCollateralIntention","_WithdrawCollateralIntention","ScallopCoreBaseIntention","data","input","WithdrawLendingIntention","_WithdrawLendingIntention","ScallopCoreBaseIntention","data","input","BindReferralIntention","_BindReferralIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","input","ClaimRevenueReferralIntention","_ClaimRevenueReferralIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","coins","sender","tx","coinsName","coin","input","CreateReferralLinkIntention","_CreateReferralLinkIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","referralTicket","input","import_sui_scallop_sdk","ExtendPeriodAndStakeMoreIntention","_ExtendPeriodAndStakeMoreIntention","ScallopCoreBaseIntention","data","account","client","amount","veScaKey","unlockTime","obligationId","obligationKey","isOldBorrowIncentive","isObligationLocked","sender","tx","coins","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","ExtendStakePeriodIntention","_ExtendStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","veScaKey","unlockTime","obligationId","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","OldBorrowIncentiveTxBuilder","input","RedeemScaIntention","_RedeemScaIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","sender","tx","input","import_sui_scallop_sdk","RenewExpStakePeriodIntention","_RenewExpStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","unlockTime","vescaKey","isHaveRedeem","obligation","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","redeem","coins","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","import_sui_scallop_sdk","StakeScaIntention","_StakeScaIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","unlockTime","veScaKey","tx","coins","takeCoin","leftCoin","newVescaKey","OldBorrowIncentiveTxBuilder","input","SupplyAndStakeLendingIntention","_SupplyAndStakeLendingIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","coinName","stakeAccountId","tx","marketCoin","stakeMarketCoinName","stakeAccounts","targetStakeAccount","newStakeAccount","input","WithdrawStakedScaIntention","_WithdrawStakedScaIntention","ScallopCoreBaseIntention","data","account","client","vescaKey","sender","tx","input","ScallopAppHelper","input","scallop","transaction","decoderLending","DecoderLending","decoderReferral","DecoderReferral","decoderVesca","DecoderVeSca","result","suiClient","account","network","txSubType","intentionData","intention","SupplyLendingIntention","WithdrawLendingIntention","BorrowIntention","RepayIntention","DepositCollateralIntention","WithdrawCollateralIntention","OpenObligationIntention","UnstakeSpoolIntention","ClaimIncentiveRewardIntention","BorrowWithBoostIntention","StakeScaIntention","ExtendStakePeriodIntention","ExtendPeriodAndStakeMoreIntention","RenewExpStakePeriodIntention","WithdrawStakedScaIntention","SupplyAndStakeLendingIntention","WithdrawAndUnstakeLendingIntention","RedeemScaIntention","MigrateAndClaimIntention","BorrowWithReferralIntention","CreateReferralLinkIntention","ClaimRevenueReferralIntention","BindReferralIntention","MigrateScoinIntention","RepayWithBoostIntention","import_sui3_utils","import_sui3_utils","import_utils","ASSETS_URL","import_sui3_utils","import_sdk","import_sui3_utils","import_bcs","import_utils","import_frontend_sui","import_bignumber","Decoder","transaction","simResult","fn","command","events","event","coinType","value","commands","inputIndex","inputValue","BigNumber","isMax","result","i","claimRewardEvent","import_transactions","import_sort_keys_recursive","SuilendBaseIntention","data","sortKeys","BorrowIntention","_BorrowIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","import_utils","import_frontend_sui","import_sdk","import_bignumber","getRewards","suilendClient","obligation","rewardsMap","reserve","side","reservePrm","sideUrm","urm","pr","index","r","BigNumber","getRewards_default","ClaimIntention","_ClaimIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getRewards_default","import_transactions","ClaimAndDepositIntention","_ClaimAndDepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getRewards_default","import_transactions","DepositIntention","_DepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","RepayIntention","_RepayIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","WithdrawIntention","_WithdrawIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getUtils","suiClient","account","suilendClient","obligationOwnerCaps","obligations","ownerCap","SuilendAppHelper","input","transaction","simResult","result","Decoder","network","txSubType","intentionData","intention","DepositIntention","WithdrawIntention","BorrowIntention","RepayIntention","ClaimIntention","ClaimAndDepositIntention","obligationId","obligation","o","obligationOwnerCap","getUtils","suiClient","account","suilendUtils","LIQUID_STAKING_INFO_MAP","ASSETS_URL","Decoder","transaction","simResult","fn","command","events","event","outCoinType","amount","inCoinType","import_transactions","import_springsui_sdk","import_sort_keys_recursive","SpringSuiBaseIntention","data","sortKeys","ConvertIntention","_ConvertIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","outLstClient","transaction","import_transactions","import_sdk","import_springsui_sdk","ConvertAndDepositIntention","_ConvertAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","outLstClient","transaction","obligationOwnerCapId","didCreate","lstCoin","import_transactions","import_springsui_sdk","StakeIntention","_StakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","info","transaction","import_transactions","import_sdk","import_springsui_sdk","StakeAndDepositIntention","_StakeAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","info","transaction","obligationOwnerCapId","didCreate","lstCoin","import_transactions","import_springsui_sdk","UnstakeIntention","_UnstakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","transaction","SpringSuiAppHelper","input","transaction","suiClient","account","getUtils","simResult","result","Decoder","network","txSubType","intentionData","intention","StakeIntention","StakeAndDepositIntention","ConvertIntention","ConvertAndDepositIntention","UnstakeIntention","import_sui3_utils","import_sui3_utils","Decoder","transaction","simResult","liquidityChangeEvent","eventData","fn","command","arg","event","eventType","amount","import_stsui_sdk","MintIntention","_MintIntention","BaseIntention","data","input","account","amount","lstParams","txb","import_stsui_sdk","RedeemIntention","_RedeemIntention","BaseIntention","data","input","account","amount","lstParams","txb","StSuiHelper","input","transaction","suiClient","simResult","result","Decoder","account","intention","MintIntention","RedeemIntention","import_sui3_utils","import_turbos_clmm_sdk","import_sui3_utils","import_bcs","import_utils","import_turbos_clmm_sdk","prixConfig","deepbookConfig","getAtoB","layer","target","swap1Layer","swap2Layer","item","Decoder","txb","turbosSdk","config","address","trans","targets","prixConfig","deepbookConfig","moveCall","atob","routes","index","pool","sqrtPrice","nextTickIndex","coinTypeA","coinTypeB","deadline","amountSpecifiedIsInput","amountA","amountB","result","tickLower","tickLowerIsNeg","tickUpper","tickUpperIsNeg","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","helper","poolId","amountIn","token1","token2","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","import_turbos_clmm_sdk","AddLiquidityIntention","_AddLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","import_turbos_clmm_sdk","BurnIntention","_BurnIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","nft","txb","import_turbos_clmm_sdk","CollectFeeIntention","_CollectFeeIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","import_turbos_clmm_sdk","CollectRewardIntention","_CollectRewardIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","nft","rewardAmounts","deadline","txb","import_turbos_clmm_sdk","CreatePoolIntention","_CreatePoolIntention","BaseIntentionLegacy","data","input","turbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","import_turbos_clmm_sdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","import_turbos_clmm_sdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","import_transactions","import_utils","PrixClaimIntention","_PrixClaimIntention","BaseIntentionLegacy","data","input","txb","prixConfig","import_transactions","PrixJoinIntention","_PrixJoinIntention","BaseIntentionLegacy","data","input","txb","prixConfig","import_transactions","import_turbos_clmm_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","txb","import_turbos_clmm_sdk","SwapIntention","_SwapIntention","BaseIntentionLegacy","data","input","turbosSdk","routes","coinTypeA","coinTypeB","address","amountA","amountB","slippage","amountSpecifiedIsInput","deadline","txb","import_turbos_clmm_sdk","import_transactions","import_utils","import_turbos_clmm_sdk","SuiKit","turbosSdk","currentAddress","type","amount","coinObjects","coinFields","resultCoinObjects","currentBalance","coinA","coinB","object","coins","txb","sendCoin","mergeCoin","coin","dynamicFields","deepbookConfig","cap","token","client_order_id","gasBudget","swap_exact_quote_for_base","options","token1","token2","poolId","amountIn","currentAddress","turbosSdk","txb","suiKit","SuiKit","coinsData","sendCoin","mergeCoin","currentAccountCap","accountCap","base_coin_ret","quote_coin_ret","_amount","deepbookConfig","swap_exact_base_for_quote","zero","SwapExactBaseForQuoteIntention","_SwapExactBaseForQuoteIntention","BaseIntentionLegacy","data","input","turbosSdk","swap_exact_base_for_quote","import_turbos_clmm_sdk","SwapExactQuoteForBaseIntention","_SwapExactQuoteForBaseIntention","BaseIntentionLegacy","data","input","turbosSdk","swap_exact_quote_for_base","TURBOSAppHelper","input","turbosSdk","contract","transactionBlock","account","result","Decoder","suiClient","network","intention","CreatePoolIntention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","CollectFeeIntention","CollectRewardIntention","BurnIntention","SwapIntention","PrixJoinIntention","PrixClaimIntention","SwapExactBaseForQuoteIntention","SwapExactQuoteForBaseIntention","import_sui3_utils","import_sui3_utils","import_bcs","import_utils","config","config_default","Decoder","txb","target","trans","config_default","amount","ticketId","moveCall","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","ClaimTicketIntention","_ClaimTicketIntention","BaseIntentionLegacy","data","input","tx","ticketId","config_default","import_transactions","StakeIntention","_StakeIntention","BaseIntentionLegacy","data","input","tx","amount","coin","config_default","import_transactions","UnStakeIntention","_UnStakeIntention","BaseIntentionLegacy","data","input","tx","amount","coins","primaryCoin","mergeCoins","coin","config_default","primaryCoinInput","VoloAppHelper","input","transactionBlock","result","Decoder","suiClient","account","intention","StakeIntention","UnStakeIntention","ClaimTicketIntention","import_sui3_utils","import_cetus_sui_clmm_sdk","import_sui3_utils","import_bcs","Decoder","transaction","openPosCommand","addLiqCommand","closePosCommand","rewardsCallData","r","removeLiqCommand","callData","collectFeeCommand","collectRewards","command","fee","rewards","fn","index","import_sui3_utils","import_library_sui","import_library_sui","import_spot","config","getBluefinSpotSDK","network","account","client","TxBuilder","txParams","account","network","sdk","getBluefinSpotSDK","pool","liquidityInput","res","params","ClosePosition","_ClosePosition","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectFee","_CollectFee","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectRewards","_CollectRewards","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectRewardsAndFee","_CollectRewardsAndFee","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","OpenAndAddLiquidity","_OpenAndAddLiquidity","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","ProvideLiquidity","_ProvideLiquidity","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","RemoveLiquidity","_RemoveLiquidity","BaseIntention","data","input","account","network","TxBuilder","BluefinHelper","input","transaction","result","Decoder","suiClient","account","network","intention","OpenAndAddLiquidity","ProvideLiquidity","RemoveLiquidity","ClosePosition","CollectFee","CollectRewards","CollectRewardsAndFee","import_sui3_utils","import_kriya_dev_sdk","AddLiquidityIntention","_AddLiquidityIntention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","AddLiquiditySingleSideIntention","_AddLiquiditySingleSideIntention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","ClaimRewardsIntention","_ClaimRewardsIntention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","AddLiquiditySingleSideV3Intention","_AddLiquiditySingleSideV3Intention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","AddLiquidityV3Intention","_AddLiquidityV3Intention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","ClaimV3MayaRewardsIntention","_ClaimV3MayaRewardsIntention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","ClaimRewardsV3Intention","_ClaimRewardsV3Intention","BaseIntention","data","sdk","params","import_kriya_dev_sdk","RemoveLiquidityV3Intention","_RemoveLiquidityV3Intention","BaseIntention","data","sdk","params","KRIYAAppHelper","input","appContext","intention","AddLiquidityIntention","AddLiquiditySingleSideIntention","RemoveLiquidityIntention","ClaimRewardsIntention","ClaimRewardsV3Intention","ClaimV3MayaRewardsIntention","AddLiquidityV3Intention","AddLiquiditySingleSideV3Intention","RemoveLiquidityV3Intention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper","KRIYAAppHelper","ScallopAppHelper","VoloAppHelper","BucketHelper","SuilendAppHelper","SpringSuiAppHelper","AlphaFiHelper","BluefinHelper","StSuiHelper"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/bn.js/lib/bn.js","../src/index.ts","../src/apps/alphafi/helper.ts","../src/apps/alphafi/decoder.ts","../src/apps/alphafi/intentions/claim-reward.ts","../src/apps/interface/sui.ts","../src/apps/alphafi/intentions/deposit-double-asset.ts","../src/apps/alphafi/intentions/deposit-single-asset.ts","../src/apps/alphafi/intentions/withdraw.ts","../src/apps/alphafi/intentions/withdraw-alpha.ts","../src/apps/bucket/helper.ts","../src/apps/bucket/decoder.ts","../src/apps/bucket/intentions/psm.ts","../src/apps/bucket/api/psm.ts","../src/apps/bucket/api/config.ts","../src/apps/bucket/intentions/borrow.ts","../src/apps/bucket/api/lending.ts","../src/apps/bucket/intentions/repay.ts","../src/apps/bucket/intentions/withdraw.ts","../src/apps/bucket/intentions/close.ts","../src/apps/bucket/intentions/sbuck.ts","../src/apps/bucket/api/sbuck.ts","../src/apps/bucket/intentions/tank.ts","../src/apps/bucket/api/tank.ts","../src/apps/bucket/api/lock.ts","../src/apps/bucket/intentions/lock.ts","../src/apps/cetus/helper.ts","../src/apps/cetus/intentions/add-liquidity.ts","../src/apps/cetus/api/config.ts","../src/apps/cetus/api/position.ts","../src/apps/cetus/intentions/claim-fee-and-mining.ts","../src/apps/cetus/intentions/decrease-liquidity.ts","../src/apps/cetus/intentions/farming-add.ts","../src/apps/cetus/api/farming.ts","../src/apps/cetus/intentions/farming-batch-harvest.ts","../src/apps/cetus/intentions/farming-claim-fee-and-rewards.ts","../src/apps/cetus/intentions/farming-decrease.ts","../src/apps/cetus/intentions/farming-harvest.ts","../src/apps/cetus/intentions/farming-increase.ts","../src/apps/cetus/intentions/farming-remove.ts","../src/apps/cetus/intentions/farming-stake.ts","../src/apps/cetus/intentions/farming-unstake.ts","../src/apps/cetus/intentions/increase-liquidity.ts","../src/apps/cetus/intentions/remove-liquidity.ts","../src/apps/cetus/intentions/swap.ts","../src/apps/cetus/api/swap.ts","../src/apps/cetus/intentions/vaults-add.ts","../src/apps/cetus/api/vaults.ts","../src/apps/cetus/intentions/vaults-remove.ts","../src/apps/cetus/intentions/vesting-redeem.ts","../src/apps/cetus/api/vesting.ts","../src/apps/cetus/intentions/xcetus-cancel.ts","../src/apps/cetus/api/xcetus.ts","../src/apps/cetus/intentions/xcetus-claim.ts","../src/apps/cetus/intentions/xcetus-convert.ts","../src/apps/cetus/intentions/xcetus-redeem.ts","../src/apps/cetus/intentions/xcetus-redeem-lock.ts","../src/apps/mpay/cancel-stream.ts","../src/apps/interface/sui-js.ts","../src/apps/mpay/common/env.ts","../src/apps/mpay/config/dev.json","../src/apps/mpay/config/prod.json","../src/apps/mpay/common/globals.ts","../src/apps/mpay/error/base.ts","../src/apps/mpay/error/NoBackendError.ts","../src/apps/mpay/error/WalletNotConnectedError.ts","../src/apps/mpay/stream/backend.ts","../src/apps/mpay/error/BackendError.ts","../src/apps/mpay/stream/client.ts","../src/apps/mpay/builder/MPayBuilder.ts","../src/apps/mpay/builder/CreateStreamHelper.ts","../src/apps/mpay/builder/const.ts","../src/apps/mpay/common/transaction.ts","../src/apps/mpay/contract/InspectViewer.ts","../src/apps/mpay/error/InvalidRpcResultError.ts","../src/apps/mpay/stream/metadata.ts","../src/apps/mpay/error/InvalidInputError.ts","../src/apps/mpay/sui/utils.ts","../src/apps/mpay/types/wallet.ts","../src/apps/mpay/utils/random.ts","../src/apps/mpay/contract/BaseContract.ts","../src/apps/mpay/const.ts","../src/apps/mpay/contract/FeeContract.ts","../src/apps/mpay/contract/StreamContract.ts","../src/apps/mpay/stream/helper.ts","../src/apps/mpay/error/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/stream/Stream.ts","../src/apps/mpay/error/NotCreatorError.ts","../src/apps/mpay/error/NotRecipientError.ts","../src/apps/mpay/error/RpcError.ts","../src/apps/mpay/error/SanityError.ts","../src/apps/mpay/error/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.ts","../src/apps/mpay/intention.ts","../src/apps/mpay/claim-by-proxy-stream.ts","../src/apps/mpay/claim-stream.ts","../src/apps/mpay/create-stream.ts","../src/apps/mpay/decoder/moveCall.ts","../src/apps/mpay/decoder/create.ts","../src/apps/mpay/decoder/decoder.ts","../src/apps/mpay/set-auto-claim-stream.ts","../src/apps/mpay/helper.ts","../src/apps/msafe-core/helper.ts","../src/apps/msafe-core/coin-transfer.ts","../src/apps/msafe-core/object-transfer.ts","../src/apps/navi/helper.ts","../src/apps/navi/config.ts","../src/apps/navi/decoder.ts","../src/apps/navi/api/incentiveV2.ts","../src/apps/navi/intentions/claim-reward.ts","../src/apps/navi/intentions/claim-supply.ts","../src/apps/navi/intentions/entry-borrow.ts","../src/apps/navi/utils/tools.ts","../src/apps/navi/intentions/entry-deposit.ts","../src/apps/navi/utils/token.ts","../src/apps/navi/intentions/entry-repay.ts","../src/apps/navi/intentions/entry-withdraw.ts","../src/apps/navi/intentions/multi-deposit.ts","../src/apps/plain-transaction/helper.ts","../src/apps/registry.ts","../src/lib/MSafeHTTPTransport/index.ts","../src/lib/MSafeHTTPTransport/errors.ts","../src/lib/MSafeHTTPTransport/rpc-websocket-client.ts","../src/apps/scallop/helper.ts","../src/apps/scallop/decoders/decoderLending.ts","../src/apps/scallop/decoders/decoder.ts","../src/apps/scallop/utils/moveCallHelper.ts","../src/apps/scallop/utils/splitCoinHelper.ts","../src/apps/scallop/utils/obligation.ts","../src/apps/scallop/decoders/decoderReferral.ts","../src/apps/scallop/decoders/decoderVesca.ts","../src/apps/scallop/intentions/scallopCoreBaseIntention.ts","../src/apps/scallop/intentions/lending/borrow.ts","../src/apps/scallop/intentions/lending/borrow-with-boost.ts","../src/apps/scallop/intentions/lending/borrow-with-referral.ts","../src/apps/scallop/intentions/lending/claim-incentive-reward.ts","../src/apps/scallop/intentions/lending/deposit-collateral.ts","../src/apps/scallop/intentions/lending/migrate-and-claim.ts","../src/apps/scallop/intentions/lending/migrate-scoin.ts","../src/apps/scallop/intentions/lending/open-obligation.ts","../src/apps/scallop/intentions/lending/repay.ts","../src/apps/scallop/intentions/lending/repay-with-boost.ts","../src/apps/scallop/intentions/lending/supply-lending.ts","../src/apps/scallop/intentions/lending/unstake-spool.ts","../src/apps/scallop/intentions/lending/withdraw-and-unstake-lending.ts","../src/apps/scallop/intentions/lending/withdraw-collateral.ts","../src/apps/scallop/intentions/lending/withdraw-lending.ts","../src/apps/scallop/intentions/referral/bind-referral.ts","../src/apps/scallop/intentions/referral/claim-revenue-referral.ts","../src/apps/scallop/intentions/referral/create-referral-link.ts","../src/apps/scallop/intentions/staking/extend-period-and-stake-more.ts","../src/apps/scallop/intentions/staking/extend-stake-period.ts","../src/apps/scallop/intentions/staking/redeem-sca.ts","../src/apps/scallop/intentions/staking/renew-exp-stake-period.ts","../src/apps/scallop/intentions/staking/stake-sca.ts","../src/apps/scallop/intentions/staking/supply-and-stake-lending.ts","../src/apps/scallop/intentions/staking/withdraw-staked-sca.ts","../src/apps/springSui/helper.ts","../src/apps/springSui/decoder.ts","../src/apps/springSui/types/helper.ts","../src/apps/suilend/helper.ts","../src/apps/suilend/decoder.ts","../src/apps/suilend/intentions/borrow.ts","../src/apps/suilend/intentions/suilendBaseIntention.ts","../src/apps/suilend/intentions/claim.ts","../src/apps/suilend/utils/getRewards.ts","../src/apps/suilend/intentions/claimAndDeposit.ts","../src/apps/suilend/intentions/deposit.ts","../src/apps/suilend/intentions/repay.ts","../src/apps/suilend/intentions/withdraw.ts","../src/apps/springSui/intentions/convert.ts","../src/apps/springSui/intentions/springSuiBaseIntention.ts","../src/apps/springSui/intentions/convertAndDeposit.ts","../src/apps/springSui/intentions/stake.ts","../src/apps/springSui/intentions/stakeAndDeposit.ts","../src/apps/springSui/intentions/unstake.ts","../src/apps/stsui/helper.ts","../src/apps/stsui/decoder.ts","../src/apps/stsui/intentions/mint.ts","../src/apps/stsui/intentions/redeem.ts","../src/apps/turbos/helper.ts","../src/apps/turbos/decoder.ts","../src/apps/turbos/config.ts","../src/apps/turbos/intentions/add-liquidity.ts","../src/apps/turbos/intentions/burn.ts","../src/apps/turbos/intentions/collect-fee.ts","../src/apps/turbos/intentions/collect-reward.ts","../src/apps/turbos/intentions/create-pool.ts","../src/apps/turbos/intentions/decrease-liquidity.ts","../src/apps/turbos/intentions/increase-liquidity.ts","../src/apps/turbos/intentions/prix-claim.ts","../src/apps/turbos/intentions/prix-join.ts","../src/apps/turbos/intentions/remove-liquidity.ts","../src/apps/turbos/intentions/swap.ts","../src/apps/turbos/intentions/swap-exact-base-for-quote.ts","../src/apps/turbos/api/deepbook.ts","../src/apps/turbos/utils/sui-kit.ts","../src/apps/turbos/intentions/swap-exact-quote-for-base.ts","../src/apps/volo/helper.ts","../src/apps/volo/decoder.ts","../src/apps/volo/config.ts","../src/apps/volo/intentions/claimTicket.ts","../src/apps/volo/intentions/stake.ts","../src/apps/volo/intentions/unStake.ts","../src/apps/bluefin/helper.ts","../src/apps/bluefin/decoder.ts","../src/apps/bluefin/intentions/close-position.ts","../src/apps/bluefin/tx-builder.ts","../src/apps/bluefin/config.ts","../src/apps/bluefin/intentions/collect-fee.ts","../src/apps/bluefin/intentions/collect-rewards.ts","../src/apps/bluefin/intentions/collect-rewards-and-fee.ts","../src/apps/bluefin/intentions/open-position-with-liquidity.ts","../src/apps/bluefin/intentions/provide-liquidity.ts","../src/apps/bluefin/intentions/remove-liquidity.ts","../src/apps/mmt-dex/helper.ts","../src/apps/mmt-dex/intentions/add-liquidity.ts","../src/apps/mmt-dex/utils/liquidity.ts","../src/apps/mmt-dex/utils/common.ts","../src/apps/mmt-dex/intentions/add-liquidity-single-side.ts","../src/apps/mmt-dex/intentions/claim-all-rewards.ts","../src/apps/mmt-dex/utils/reward.ts","../src/apps/mmt-dex/intentions/claim-rewards.ts","../src/apps/mmt-dex/intentions/remove-liquidity.ts","../src/apps/mmt-dex/intentions/swap.ts","../src/apps/mmt-dex/utils/swap.ts"],"sourcesContent":["(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [number & 0x3ffffff];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [0];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this._strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // '0' - '9'\n if (c >= 48 && c <= 57) {\n return c - 48;\n // 'A' - 'F'\n } else if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n } else {\n assert(false, 'Invalid character in ' + string);\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this._strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var b = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n b = c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n b = c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n b = c;\n }\n assert(c >= 0 && b < mul, 'Invalid character');\n r += b;\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [0];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this._strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n function move (dest, src) {\n dest.words = src.words;\n dest.length = src.length;\n dest.negative = src.negative;\n dest.red = src.red;\n }\n\n BN.prototype._move = function _move (dest) {\n move(dest, this);\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype._strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n // Check Symbol.for because not everywhere where Symbol defined\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n try {\n BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n } catch (e) {\n BN.prototype.inspect = inspect;\n }\n } else {\n BN.prototype.inspect = inspect;\n }\n\n function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n }\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modrn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16, 2);\n };\n\n if (Buffer) {\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n return this.toArrayLike(Buffer, endian, length);\n };\n }\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n var allocate = function allocate (ArrayType, size) {\n if (ArrayType.allocUnsafe) {\n return ArrayType.allocUnsafe(size);\n }\n return new ArrayType(size);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n this._strip();\n\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n var res = allocate(ArrayType, reqLength);\n var postfix = endian === 'le' ? 'LE' : 'BE';\n this['_toArrayLike' + postfix](res, byteLength);\n return res;\n };\n\n BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n var position = 0;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position++] = word & 0xff;\n if (position < res.length) {\n res[position++] = (word >> 8) & 0xff;\n }\n if (position < res.length) {\n res[position++] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position < res.length) {\n res[position++] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position < res.length) {\n res[position++] = carry;\n\n while (position < res.length) {\n res[position++] = 0;\n }\n }\n };\n\n BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n var position = res.length - 1;\n var carry = 0;\n\n for (var i = 0, shift = 0; i < this.length; i++) {\n var word = (this.words[i] << shift) | carry;\n\n res[position--] = word & 0xff;\n if (position >= 0) {\n res[position--] = (word >> 8) & 0xff;\n }\n if (position >= 0) {\n res[position--] = (word >> 16) & 0xff;\n }\n\n if (shift === 6) {\n if (position >= 0) {\n res[position--] = (word >> 24) & 0xff;\n }\n carry = 0;\n shift = 0;\n } else {\n carry = word >>> 24;\n shift += 2;\n }\n }\n\n if (position >= 0) {\n res[position--] = carry;\n\n while (position >= 0) {\n res[position--] = 0;\n }\n }\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] >>> wbit) & 0x01;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this._strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this._strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this._strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this._strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this._strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this._strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out._strip();\n }\n\n function jumboMulTo (self, num, out) {\n // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n // var fftm = new FFTM();\n // return fftm.mulp(self, num, out);\n return bigMulTo(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out._strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this._strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this._strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) <= num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this._strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this._strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this._strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q._strip();\n }\n a._strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modrn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modrn = function modrn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return isNegNum ? -acc : acc;\n };\n\n // WARNING: DEPRECATED\n BN.prototype.modn = function modn (num) {\n return this.modrn(num);\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n var isNegNum = num < 0;\n if (isNegNum) num = -num;\n\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n this._strip();\n return isNegNum ? this.ineg() : this;\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this._strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is a BN v4 instance\n r.strip();\n } else {\n // r is a BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n move(a, a.umod(this.m)._forceRed(this));\n return a;\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","import { AlphaFiHelper } from '@/apps/alphafi/helper';\nimport { BucketHelper } from '@/apps/bucket/helper';\nimport { CetusHelper } from '@/apps/cetus/helper';\nimport { MPayAppHelper } from '@/apps/mpay/helper';\nimport { CoreHelper } from '@/apps/msafe-core/helper';\nimport { NAVIAppHelper } from '@/apps/navi/helper';\nimport { PlainTransactionHelper } from '@/apps/plain-transaction/helper';\nimport { MSafeApps } from '@/apps/registry';\nimport { ScallopAppHelper } from '@/apps/scallop/helper';\nimport { SpringSuiAppHelper } from '@/apps/springSui/helper';\nimport { StSuiHelper } from '@/apps/stsui/helper';\nimport { SuilendAppHelper } from '@/apps/suilend/helper';\nimport { TURBOSAppHelper } from '@/apps/turbos/helper';\nimport { VoloAppHelper } from '@/apps/volo/helper';\n\nimport { BluefinHelper } from './apps/bluefin/helper';\nimport { MMTDEXAppHelper } from './apps/mmt-dex/helper';\n\nexport const appHelpers = MSafeApps.fromHelpers([\n new CoreHelper(),\n new NAVIAppHelper(),\n new MPayAppHelper(),\n new PlainTransactionHelper(),\n new CetusHelper(),\n new TURBOSAppHelper(),\n new MMTDEXAppHelper(),\n new ScallopAppHelper(),\n new VoloAppHelper(),\n new BucketHelper(),\n new SuilendAppHelper(),\n new SpringSuiAppHelper(),\n new AlphaFiHelper(),\n new BluefinHelper(),\n new StSuiHelper(),\n]);\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention } from './intentions/claim-reward';\nimport { DepositDoubleAssetIntention } from './intentions/deposit-double-asset';\nimport { DepositSingleAssetIntention } from './intentions/deposit-single-asset';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { WithdrawAlphaIntention } from './intentions/withdraw-alpha';\nimport {\n AlphaFiIntentionData,\n DepositDoubleAssetIntentionData,\n DepositSingleAssetIntentionData,\n EmptyIntentionData,\n TransactionSubType,\n WithdrawAlphaIntentionData,\n WithdrawIntentionData,\n} from './types';\n\nexport type AlphaFiIntention =\n | DepositDoubleAssetIntention\n | DepositSingleAssetIntention\n | WithdrawAlphaIntention\n | WithdrawIntention\n | ClaimRewardIntention;\n\nexport class AlphaFiHelper implements IAppHelperInternal<AlphaFiIntentionData> {\n application = 'alphafi';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: AlphaFiIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: transaction.getData().sender,\n transactionBlock: transaction,\n });\n console.log('AlphaFiHelper Sim result - ', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: AlphaFiIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { account } = input;\n console.log('AlphaFi build transaction type', input.txSubType);\n\n let intention: AlphaFiIntention;\n switch (input.txSubType) {\n case TransactionSubType.DEPOSIT_SINGLE_ASSET:\n intention = DepositSingleAssetIntention.fromData(input.intentionData as DepositSingleAssetIntentionData);\n break;\n case TransactionSubType.DEPOSIT_DOUBLE_ASSET:\n intention = DepositDoubleAssetIntention.fromData(input.intentionData as DepositDoubleAssetIntentionData);\n break;\n case TransactionSubType.WITHDRAW:\n intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.WITHDRAW_ALPHA:\n intention = WithdrawAlphaIntention.fromData(input.intentionData as WithdrawAlphaIntentionData);\n break;\n case TransactionSubType.CLAIM_REWARD:\n intention = ClaimRewardIntention.fromData(input.intentionData as EmptyIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ account });\n }\n}\n","import { coinsList, poolIdPoolNameMap, poolInfo, PoolName, singleAssetPoolCoinMap } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { bcs, fromBase64 } from '@mysten/bcs';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport {\n DecodeResult,\n DepositDoubleAssetIntentionData,\n DepositSingleAssetIntentionData,\n EmptyIntentionData,\n EventType,\n TransactionSubType,\n WithdrawAlphaIntentionData,\n WithdrawIntentionData,\n} from './types';\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n /**\n * Entry point for decoding the transaction. Determines the type of transaction\n * and calls the appropriate decode method.\n */\n decode(): DecodeResult {\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n\n const liquidityChangeEvent = this.getLiquidityChangeEvent();\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as EventType;\n const poolId = eventData.pool_id;\n const poolName = poolIdPoolNameMap[poolId];\n\n console.log('Decoder event data - ', eventData);\n console.log('Decoder poolName - ', poolName);\n\n if (this.isWithdrawAlphaEvent(liquidityChangeEvent)) {\n return this.decodeWithdrawAlpha(eventData);\n }\n\n if (this.isWithdrawEvent(eventData)) {\n return this.decodeWithdraw(poolName);\n }\n\n if (this.isDoubleAssetDepositEvent(eventData, poolName)) {\n return this.decodeDoubleAssetDeposit(poolName, eventData);\n }\n\n if (this.isSingleAssetDepositEvent(eventData, poolName)) {\n return this.decodeSingleAssetDeposit(poolName, eventData);\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n // ---- Private Helpers ----\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getLiquidityChangeEvent() {\n return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type));\n }\n\n // is*\n private isClaimRewardTransaction() {\n return !!this.getMoveCallCommand('get_user_rewards_all');\n }\n\n private isLiquidityChangeEventType(type: string) {\n return (\n type.includes('LiquidityChangeEvent') ||\n type.includes('LiquidityChangeNewNewEvent') ||\n type.includes('WithdrawEventV2')\n );\n }\n\n private isWithdrawAlphaEvent(event: { type: string }) {\n return event.type.includes('WithdrawEventV2');\n }\n\n private isWithdrawEvent(eventData: EventType) {\n return eventData.event_type === 1;\n }\n\n private isDoubleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 2;\n }\n\n private isSingleAssetDepositEvent(eventData: EventType, poolName: PoolName) {\n return eventData.event_type === 0 && poolInfo[poolName].assetTypes.length === 1;\n }\n\n /**\n * Extracts the xTokensAmount from transaction inputs.\n */\n private extractXTokensAmount(): string {\n const inputWithPure = this.inputs.find((input) => input.Pure !== undefined);\n if (!inputWithPure || !inputWithPure.Pure?.bytes) {\n throw new Error('Unable to extract xTokensAmount from inputs');\n }\n const { bytes } = inputWithPure.Pure;\n\n let res;\n if (bytes.length === 12) {\n res = bcs.u64().parse(fromBase64(bytes));\n } else if (bytes.length === 24) {\n res = bcs.u128().parse(fromBase64(bytes));\n } else if (bytes.length === 44) {\n res = bcs.u256().parse(fromBase64(bytes));\n } else {\n res = bcs.u64().parse(fromBase64(bytes));\n }\n\n return res;\n }\n\n // ---- Decode Methods ----\n\n private decodeDoubleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n const { amount_a, amount_b } = eventData;\n const isAmountA = Number(amount_a) > 0;\n console.log('Decoder.decodeDoubleAssetDeposit', amount_a, amount_b, isAmountA);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT_DOUBLE_ASSET,\n intentionData: {\n poolName,\n amount: isAmountA ? amount_a : amount_b,\n isAmountA,\n } as DepositDoubleAssetIntentionData,\n };\n }\n\n private decodeSingleAssetDeposit(poolName: PoolName, eventData: EventType): DecodeResult {\n let { amount } = eventData;\n console.log('Decoder.decodeSingleAssetDeposit', amount);\n const liquidityChangeEvent = this.getLiquidityChangeEvent();\n if (liquidityChangeEvent.type.includes(':alphafi_navi_pool:')) {\n const { coin } = singleAssetPoolCoinMap[poolName];\n const { expo } = coinsList[coin];\n amount = Math.floor(Number(amount) / 10 ** (9 - expo)).toString();\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT_SINGLE_ASSET,\n intentionData: {\n poolName,\n amount,\n } as DepositSingleAssetIntentionData,\n };\n }\n\n private decodeWithdraw(poolName: PoolName): DecodeResult {\n const xTokensAmount = this.extractXTokensAmount();\n console.log('Decoder.decodeWithdraw', xTokensAmount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW,\n intentionData: {\n poolName,\n xTokensAmount,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeWithdrawAlpha(eventData: EventType): DecodeResult {\n const xTokensAmount = this.extractXTokensAmount();\n const { amount_withdrawn_from_locked } = eventData;\n console.log('Decoder.decodeWithdrawAlpha', xTokensAmount, amount_withdrawn_from_locked);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW_ALPHA,\n intentionData: {\n withdrawFromLocked: Number(amount_withdrawn_from_locked) > 0,\n xTokensAmount,\n } as WithdrawAlphaIntentionData,\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM_REWARD,\n intentionData: {} as EmptyIntentionData,\n };\n }\n}\n","import { claimRewardTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { EmptyIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimRewardIntention extends BaseIntention<EmptyIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM_REWARD;\n\n constructor(public readonly data: EmptyIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const txb = await claimRewardTxb(account.address);\n return txb;\n }\n\n static fromData(data: EmptyIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","// interface for @mysten/sui package\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternal<T> {\n application: string;\n supportSDK: '@mysten/sui';\n\n deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n }>;\n\n build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction>;\n}\n\nexport interface TransactionIntention<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n\n serialize(): string;\n\n build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction>;\n}\n\nexport abstract class BaseIntention<D> implements TransactionIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { depositDoubleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositDoubleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositDoubleAssetIntention extends BaseIntention<DepositDoubleAssetIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT_DOUBLE_ASSET;\n\n constructor(public readonly data: DepositDoubleAssetIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, amount, isAmountA } = this.data;\n const txb = await depositDoubleAssetTxb(poolName, account.address, amount, isAmountA);\n return txb;\n }\n\n static fromData(data: DepositDoubleAssetIntentionData) {\n console.log('DepositDoubleAssetIntention.fromData', data);\n return new DepositDoubleAssetIntention(data);\n }\n}\n","import { depositSingleAssetTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { DepositSingleAssetIntentionData, TransactionSubType } from '../types';\n\nexport class DepositSingleAssetIntention extends BaseIntention<DepositSingleAssetIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT_SINGLE_ASSET;\n\n constructor(public readonly data: DepositSingleAssetIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, amount } = this.data;\n const txb = await depositSingleAssetTxb(poolName, account.address, amount);\n return txb;\n }\n\n static fromData(data: DepositSingleAssetIntentionData) {\n console.log('DepositSingleAssetIntention.fromData', data);\n return new DepositSingleAssetIntention(data);\n }\n}\n","import { withdrawTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawIntentionData } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { poolName, xTokensAmount } = this.data;\n const txb = await withdrawTxb(xTokensAmount, poolName, account.address);\n return txb;\n }\n\n static fromData(data: WithdrawIntentionData) {\n console.log('WithdrawIntention.fromData', data);\n return new WithdrawIntention(data);\n }\n}\n","import { withdrawAlphaTxb } from '@alphafi/alphafi-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, WithdrawAlphaIntentionData } from '../types';\n\nexport class WithdrawAlphaIntention extends BaseIntention<WithdrawAlphaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW_ALPHA;\n\n constructor(public readonly data: WithdrawAlphaIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { withdrawFromLocked, xTokensAmount } = this.data;\n const txb = await withdrawAlphaTxb(xTokensAmount, withdrawFromLocked, account.address);\n return txb;\n }\n\n static fromData(data: WithdrawAlphaIntentionData) {\n console.log('WithdrawAlphaIntention.fromData', data);\n return new WithdrawAlphaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { BucketIntentionData } from '@/apps/bucket/types/helper';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n LockClaimIntentionData,\n PsmIntentionData,\n RepayIntentionData,\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n WithdrawIntentionData,\n} from './api';\nimport { Decoder } from './decoder';\nimport {\n BorrowIntention,\n CloseIntention,\n LockClaimIntention,\n PsmIntention,\n RepayIntention,\n SBUCKClaimIntention,\n SBUCKDepositIntention,\n SBUCKUnstakeIntention,\n SBUCKWithdrawIntention,\n TankClaimIntention,\n TankDepositIntention,\n TankWithdrawIntention,\n WithdrawIntention,\n} from './intentions';\nimport { TransactionSubType } from './types';\n\nexport type BucketIntention =\n | PsmIntention\n | BorrowIntention\n | WithdrawIntention\n | RepayIntention\n | CloseIntention\n | TankDepositIntention\n | TankWithdrawIntention\n | TankClaimIntention\n | SBUCKDepositIntention\n | SBUCKWithdrawIntention\n | SBUCKUnstakeIntention\n | SBUCKClaimIntention\n | LockClaimIntention;\n\nexport class BucketHelper implements IAppHelperInternal<BucketIntentionData> {\n application = 'bucket';\n\n supportSDK = '@mysten/sui' as const;\n\n // TODO: Please refer to the documentation and move the `action` and `txbParams` params into the `appContext` structure.\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: BucketIntentionData }> {\n console.log('Bucket helper deserialize input: ', input);\n const { transaction } = input;\n const decoder = new Decoder(transaction);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: BucketIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n let intention: BucketIntention;\n switch (input.txSubType) {\n case TransactionSubType.Psm:\n intention = PsmIntention.fromData(input.intentionData as PsmIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(input.intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Withdraw:\n intention = WithdrawIntention.fromData(input.intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(input.intentionData as RepayIntentionData);\n break;\n case TransactionSubType.Close:\n intention = CloseIntention.fromData(input.intentionData as CloseIntentionData);\n break;\n case TransactionSubType.TankDeposit:\n intention = TankDepositIntention.fromData(input.intentionData as TankDepositIntentionData);\n break;\n case TransactionSubType.TankWithdraw:\n intention = TankWithdrawIntention.fromData(input.intentionData as TankWithdrawIntentionData);\n break;\n case TransactionSubType.TankClaim:\n intention = TankClaimIntention.fromData(input.intentionData as TankClaimIntentionData);\n break;\n case TransactionSubType.SBUCKDeposit:\n intention = SBUCKDepositIntention.fromData(input.intentionData as SBUCKDepositIntentionData);\n break;\n case TransactionSubType.SBUCKUnstake:\n intention = SBUCKUnstakeIntention.fromData(input.intentionData as SBUCKUnstakeIntentionData);\n break;\n case TransactionSubType.SBUCKWithdraw:\n intention = SBUCKWithdrawIntention.fromData(input.intentionData as SBUCKWithdrawIntentionData);\n break;\n case TransactionSubType.SBUCKClaim:\n intention = SBUCKClaimIntention.fromData(input.intentionData as SBUCKClaimIntentionData);\n break;\n case TransactionSubType.LockClaim:\n intention = LockClaimIntention.fromData(input.intentionData as LockClaimIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SBUCK_FOUNTAIN_PACKAGE_ID } from 'bucket-protocol-sdk';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n LockClaimIntentionData,\n PsmIntentionData,\n RepayIntentionData,\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n WithdrawIntentionData,\n} from './api';\nimport { DecodeResult, TransactionSubType } from './types';\n\nexport class Decoder {\n constructor(public readonly transaction: Transaction) {}\n\n decode() {\n // this.commands.map((command) => {\n // if (command.$kind === 'MoveCall') {\n // console.log(command);\n // }\n // });\n\n // Check sBUCK commands\n if (this.isSBUCKDepositTransaction()) {\n return this.decodeSBUCKDeposit();\n }\n if (this.isSBUCKUnstakeTransaction()) {\n return this.decodeSBUCKUnstake();\n }\n if (this.isSBUCKWithdrawTransaction()) {\n return this.decodeSBUCKWithdraw();\n }\n if (this.isSBUCKClaimTransaction()) {\n return this.decodeSBUCKClaim();\n }\n\n // Check lock commands\n if (this.isLockedClaimTransaction()) {\n return this.decodeLockedClaim();\n }\n\n // Check borrow commands\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isWithdrawTransaction()) {\n return this.decodeWithdraw();\n }\n if (this.isCloseTransaction()) {\n return this.decodeClose();\n }\n\n // Get tank commands\n if (this.isTankDepositTransaction()) {\n return this.decodeTankDeposit();\n }\n if (this.isTankWithdrawTransaction()) {\n return this.decodeTankWithdraw();\n }\n if (this.isTankClaimTransaction()) {\n return this.decodeTankClaim();\n }\n\n // Check PSM commands\n if (this.isPsmTransaction()) {\n return this.decodePsm();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getMoveCallModuleCommand(module: string, fn: string) {\n return this.commands.find(\n (command) =>\n command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n );\n }\n\n private getMoveCallPackageModuleCommand(package_: string, module: string, fn: string) {\n return this.commands.find(\n (command) =>\n command.$kind === 'MoveCall' &&\n command.MoveCall.package === package_ &&\n command.MoveCall.module === module &&\n command.MoveCall.function === fn,\n );\n }\n\n private getMoveCallModuleCommands(module: string, fn: string) {\n return this.commands.filter(\n (command) =>\n command.$kind === 'MoveCall' && command.MoveCall.module === module && command.MoveCall.function === fn,\n );\n }\n\n private getSplitCoinsCommands() {\n return this.commands.filter((command) => command.$kind === 'SplitCoins');\n }\n\n private getTransferCommands() {\n return this.commands.filter((command) => command.$kind === 'TransferObjects');\n }\n\n private isPsmTransaction() {\n return !!this.getMoveCallCommand('charge_reservoir') || !!this.getMoveCallCommand('discharge_reservoir');\n }\n\n private isStrapNewTransaction() {\n return !!this.getMoveCallModuleCommand('strap', 'new');\n }\n\n private isBorrowTransaction() {\n return (\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_top_up') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'high_borrow_with_strap')\n );\n }\n\n private isRepayTransaction() {\n return (\n !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'fully_repay_with_strap') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw') ||\n !!this.getMoveCallModuleCommand('bucket_operations', 'repay_and_withdraw_with_strap')\n );\n }\n\n private isWithdrawTransaction() {\n return (\n !!this.getMoveCallModuleCommand('buck', 'withdraw') ||\n !!this.getMoveCallModuleCommand('buck', 'withdraw_with_strap')\n );\n }\n\n private isCloseTransaction() {\n return !!this.getMoveCallModuleCommand('bucket_operations', 'destroy_empty_strap');\n }\n\n private isTankDepositTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'deposit');\n }\n\n private isTankWithdrawTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'withdraw');\n }\n\n private isTankClaimTransaction() {\n return !!this.getMoveCallModuleCommand('tank_operations', 'claim');\n }\n\n private isSBUCKDepositTransaction() {\n return !!this.getMoveCallModuleCommand('buck', 'buck_to_sbuck');\n }\n\n private isSBUCKWithdrawTransaction() {\n return !!this.getMoveCallModuleCommand('buck', 'sbuck_to_buck');\n }\n\n private isSBUCKStakeTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'stake');\n }\n\n private isSBUCKUnstakeTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'force_unstake');\n }\n\n private isSBUCKClaimTransaction() {\n return !!this.getMoveCallPackageModuleCommand(SBUCK_FOUNTAIN_PACKAGE_ID, 'fountain_core', 'claim');\n }\n\n private isLockedClaimTransaction() {\n return (\n !!this.getMoveCallModuleCommand('proof_rule', 'claim') ||\n !!this.getMoveCallModuleCommand('lst_proof_rule', 'claim')\n );\n }\n\n private isLstUnlockTransaction() {\n return !!this.getMoveCallModuleCommand('lst_proof_rule', 'unlock');\n }\n\n private decodePsm(): DecodeResult {\n let coinType;\n let buckToCoin;\n\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n amount = this.getPureInputU64(inputCoinObject.Input);\n }\n\n if (this.getMoveCallCommand('charge_reservoir')) {\n const psmCommand = this.getMoveCallCommand('charge_reservoir').MoveCall;\n [coinType] = psmCommand.typeArguments;\n buckToCoin = false;\n } else {\n const psmCommand = this.getMoveCallCommand('discharge_reservoir').MoveCall;\n [coinType] = psmCommand.typeArguments;\n buckToCoin = true;\n }\n\n console.log('Decoder.decodePsm', coinType, amount, buckToCoin);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Psm,\n intentionData: {\n coinType,\n amount,\n buckToCoin,\n } as PsmIntentionData,\n };\n }\n\n private decodeBorrow(): DecodeResult {\n let collateralType = '';\n let borrowAmount = '0';\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n let collateralAmount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n collateralAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n\n if (this.getMoveCallCommand('high_top_up')) {\n const command = this.getMoveCallCommand('high_top_up').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckAmount = command.arguments[1];\n if (buckAmount.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckAmount.Input);\n }\n\n const insertPlaceArg = command.arguments[3];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('high_borrow')) {\n const command = this.getMoveCallCommand('high_borrow').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckAmount = command.arguments[4];\n if (buckAmount.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckAmount.Input);\n }\n\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('high_borrow_with_strap')) {\n const command = this.getMoveCallCommand('high_borrow_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n\n const buckOutput = command.arguments[5];\n if (buckOutput.$kind === 'Input') {\n borrowAmount = this.getPureInputU64(buckOutput.Input);\n }\n\n const insertPlaceArg = command.arguments[6];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Borrow,\n intentionData: {\n collateralType,\n collateralAmount,\n borrowAmount,\n insertionPlace,\n strapId,\n } as BorrowIntentionData,\n };\n }\n\n private decodeRepay(): DecodeResult {\n let collateralType = '';\n let repayAmount = '0';\n let withdrawAmount = '0';\n const isSurplus = false;\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('fully_repay')) {\n const repayCommand = this.getMoveCallCommand('fully_repay').MoveCall;\n [collateralType] = repayCommand.typeArguments;\n } else if (this.getMoveCallCommand('fully_repay_with_strap')) {\n const repayCommand = this.getMoveCallCommand('fully_repay_with_strap').MoveCall;\n [collateralType] = repayCommand.typeArguments;\n } else if (this.getMoveCallCommand('repay_and_withdraw')) {\n const command = this.getMoveCallCommand('repay_and_withdraw').MoveCall;\n [collateralType] = command.typeArguments;\n const withdrawArg = command.arguments[4];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n repayAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n } else if (this.getMoveCallCommand('repay_and_withdraw_with_strap')) {\n const command = this.getMoveCallCommand('repay_and_withdraw_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n const withdrawArg = command.arguments[5];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n const insertPlaceArg = command.arguments[6];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins.amounts[0];\n if (inputCoinObject.$kind === 'Input') {\n repayAmount = this.getPureInputU64(inputCoinObject.Input);\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Repay,\n intentionData: {\n collateralType,\n repayAmount,\n withdrawAmount,\n isSurplus,\n insertionPlace,\n strapId,\n } as RepayIntentionData,\n };\n }\n\n private decodeWithdraw(): DecodeResult {\n let collateralType = '';\n let withdrawAmount = '0';\n let insertionPlace: string | undefined;\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('withdraw_with_strap')) {\n const command = this.getMoveCallCommand('withdraw_with_strap').MoveCall;\n [collateralType] = command.typeArguments;\n\n const withdrawArg = command.arguments[4];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n\n const insertPlaceArg = command.arguments[5];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n } else if (this.getMoveCallCommand('withdraw')) {\n const command = this.getMoveCallCommand('withdraw').MoveCall;\n [collateralType] = command.typeArguments;\n\n const withdrawArg = command.arguments[3];\n if (withdrawArg.$kind === 'Input') {\n withdrawAmount = this.getPureInputU64(withdrawArg.Input);\n }\n\n const insertPlaceArg = command.arguments[4];\n if (insertPlaceArg.$kind === 'Input') {\n const insertionPlaces = this.getPureAddresses(insertPlaceArg.Input);\n if (insertionPlaces.length === 1) {\n [insertionPlace] = insertionPlaces;\n }\n }\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Withdraw,\n intentionData: {\n collateralType,\n withdrawAmount,\n insertionPlace,\n strapId,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeClose(): DecodeResult {\n let collateralType = '';\n const strapId: string | undefined = this.getStrapId();\n\n if (this.getMoveCallCommand('destroy_empty_strap')) {\n const command = this.getMoveCallCommand('destroy_empty_strap').MoveCall;\n [collateralType] = command.typeArguments;\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Close,\n intentionData: {\n collateralType,\n strapId,\n } as CloseIntentionData,\n };\n }\n\n private decodeSBUCKDeposit(): DecodeResult {\n const balanceObject = this.getMoveCallCommand('into_balance');\n const coinType = balanceObject.MoveCall.typeArguments[0];\n\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n const isStake = this.isSBUCKStakeTransaction();\n console.log('Decoder.decodeSBUCKDeposit', coinType, amount, isStake);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKDeposit,\n intentionData: {\n coinType,\n amount,\n isStake,\n } as SBUCKDepositIntentionData,\n };\n }\n\n private decodeSBUCKUnstake(): DecodeResult {\n let amount = '0';\n\n const isStake = this.isSBUCKStakeTransaction();\n if (isStake) {\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n }\n\n const stakeProofs: string[] = [];\n const unlockCommands = this.getMoveCallModuleCommands('proof_rule', 'unlock');\n if (unlockCommands.length > 0) {\n for (let i = 0; i < unlockCommands.length; i++) {\n const command = unlockCommands[i];\n stakeProofs.push('');\n }\n } else {\n const unstakeCommands = this.getMoveCallModuleCommands('fountain_core', 'force_unstake');\n for (let i = 0; i < unstakeCommands.length; i++) {\n const command = unstakeCommands[i];\n const argument = command.MoveCall.arguments[2];\n if (argument.$kind === 'Input') {\n const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n stakeProofs.push(objectId);\n }\n }\n }\n\n const toBuck = this.isSBUCKWithdrawTransaction();\n\n const intentionData = {\n stakeProofs,\n amount,\n isStake,\n toBuck,\n } as SBUCKUnstakeIntentionData;\n console.log('Decoder.decodeSBUCKUnstake', intentionData);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKUnstake,\n intentionData,\n };\n }\n\n private decodeSBUCKWithdraw(): DecodeResult {\n let amount = '0';\n\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n console.log('Decoder.SBUCKWithdraw', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKWithdraw,\n intentionData: {\n amount,\n } as SBUCKWithdrawIntentionData,\n };\n }\n\n private decodeSBUCKClaim(): DecodeResult {\n const stakeProofs: string[] = [];\n\n const commands = this.getMoveCallModuleCommands('fountain_core', 'claim');\n for (let i = 0; i < commands.length; i++) {\n const command = commands[i];\n const argument = command.MoveCall.arguments[2];\n if (argument.$kind === 'Input') {\n const { objectId } = this.inputs[argument.Input].UnresolvedObject;\n stakeProofs.push(objectId);\n }\n }\n\n console.log('Decoder.decodeSBUCKClaim', stakeProofs);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SBUCKClaim,\n intentionData: {\n stakeProofs,\n } as SBUCKClaimIntentionData,\n };\n }\n\n private decodeTankDeposit(): DecodeResult {\n let amount = '0';\n const inputCoinObject = this.getSplitCoinsCommands()[0].SplitCoins;\n const inputAmount = inputCoinObject.amounts[0];\n if (inputAmount.$kind === 'Input') {\n amount = this.getPureInputU64(inputAmount.Input);\n }\n\n const command = this.getMoveCallModuleCommand('tank_operations', 'deposit').MoveCall;\n const coinType = command.typeArguments[0];\n\n console.log('Decoder.decodeTankDeposit', coinType, amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankDeposit,\n intentionData: {\n coinType,\n amount,\n } as TankDepositIntentionData,\n };\n }\n\n private decodeTankWithdraw(): DecodeResult {\n const command = this.getMoveCallModuleCommand('tank_operations', 'withdraw').MoveCall;\n const coinType = command.typeArguments[0];\n\n let amount = '0';\n const amountArg = command.arguments[5];\n if (amountArg.$kind === 'Input') {\n amount = this.getPureInputU64(amountArg.Input);\n }\n\n console.log('Decoder.decodeTankWithdraw', coinType, amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankWithdraw,\n intentionData: {\n coinType,\n amount,\n } as TankWithdrawIntentionData,\n };\n }\n\n private decodeTankClaim(): DecodeResult {\n const command = this.getMoveCallModuleCommand('tank_operations', 'claim').MoveCall;\n const coinType = command.typeArguments[0];\n\n console.log('Decoder.decodeTankClaim', coinType);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.TankClaim,\n intentionData: {\n coinType,\n } as TankClaimIntentionData,\n };\n }\n\n private decodeLockedClaim(): DecodeResult {\n let coinType = '';\n let proofCount = 0;\n\n const sbuckClaimCommands = this.getMoveCallModuleCommands('proof_rule', 'claim');\n for (let i = 0; i < sbuckClaimCommands.length; i++) {\n const command = sbuckClaimCommands[i];\n [coinType] = command.MoveCall.typeArguments;\n proofCount++;\n }\n\n const lstClaimCommands = this.getMoveCallModuleCommands('lst_proof_rule', 'claim');\n for (let i = 0; i < lstClaimCommands.length; i++) {\n const command = lstClaimCommands[i];\n [coinType] = command.MoveCall.typeArguments;\n proofCount++;\n }\n console.log('Decoder.decodeLockedClaim', coinType, proofCount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.LockClaim,\n intentionData: {\n coinType,\n proofCount,\n } as LockClaimIntentionData,\n };\n }\n\n // Helpers\n private getCoinInput(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Object') {\n throw new Error('not Object argument');\n }\n }\n\n private getStrapId() {\n let strapId: string | undefined;\n\n if (this.isStrapNewTransaction()) {\n strapId = 'new';\n } else if (this.isLstUnlockTransaction()) {\n strapId = 'locked';\n }\n\n if (!strapId) {\n const command = this.getMoveCallModuleCommand('fountain', 'unstake');\n if (command) {\n const strapArg = command.MoveCall.arguments[2];\n if (strapArg.$kind === 'Input') {\n strapId = this.inputs[strapArg.Input].UnresolvedObject.objectId;\n }\n }\n }\n\n return strapId;\n }\n\n private getPureInputU64(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Pure') {\n throw new Error('not pure argument');\n }\n\n return bcs.U64.fromBase64(input.Pure.bytes);\n }\n\n private getPureAddresses(idx: number) {\n const input = this.inputs[idx];\n if (input.$kind !== 'Pure') {\n throw new Error('not pure argument');\n }\n\n return bcs.vector(bcs.Address).fromBase64(input.Pure.bytes);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getPsmTx } from '../api/psm';\nimport { TransactionSubType } from '../types';\n\nexport class PsmIntention extends BaseIntention<PsmIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Psm;\n\n constructor(public readonly data: PsmIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getPsmTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: PsmIntentionData) {\n return new PsmIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildPsmTx } from 'bucket-protocol-sdk';\n\nimport { PsmIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getPsmTx = async (\n txbParams: PsmIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount, buckToCoin } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildPsmTx(client, tx, coinType, amount, buckToCoin, account.address);\n\n return tx;\n};\n","import { WalletAccount } from '@mysten/wallet-standard';\nimport { BucketClient } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nexport const getBucketClient = (network: SuiNetworks, account: WalletAccount) => {\n const config = network === 'sui:mainnet' ? 'mainnet' : 'testnet';\n return new BucketClient(config, account.address);\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BorrowIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getBorrowTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class BorrowIntention extends BaseIntention<BorrowIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getBorrowTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: BorrowIntentionData) {\n return new BorrowIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildBorrowTx, buildCloseTx, buildRepayTx, buildWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n BorrowIntentionData,\n CloseIntentionData,\n RepayIntentionData,\n WithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getBorrowTx = async (\n txbParams: BorrowIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, collateralAmount, borrowAmount, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildBorrowTx(\n client,\n tx,\n collateralType,\n collateralAmount,\n borrowAmount,\n account.address,\n insertionPlace,\n strapId,\n );\n\n return tx;\n};\n\nexport const getWithdrawTx = async (\n txbParams: WithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, withdrawAmount, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildWithdrawTx(client, tx, collateralType, withdrawAmount, account.address, insertionPlace, strapId);\n\n return tx;\n};\n\nexport const getRepayTx = async (\n txbParams: RepayIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, repayAmount, withdrawAmount, isSurplus, insertionPlace, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildRepayTx(\n client,\n tx,\n collateralType,\n repayAmount,\n withdrawAmount,\n account.address,\n isSurplus,\n insertionPlace,\n strapId,\n );\n\n return tx;\n};\n\nexport const getCloseTx = async (\n txbParams: CloseIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { collateralType, recipient, strapId } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildCloseTx(client, tx, collateralType, recipient, strapId);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { RepayIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRepayTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class RepayIntention extends BaseIntention<RepayIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Repay;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getRepayTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: RepayIntentionData) {\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { WithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getWithdrawTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class WithdrawIntention extends BaseIntention<WithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Withdraw;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: WithdrawIntentionData) {\n return new WithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CloseIntentionData } from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getCloseTx } from '../api/lending';\nimport { TransactionSubType } from '../types';\n\nexport class CloseIntention extends BaseIntention<CloseIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Close;\n\n constructor(public readonly data: CloseIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getCloseTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: CloseIntentionData) {\n return new CloseIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport {\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getSBUCKClaimTx, getSBUCKDepositTx, getSBUCKUnstakeTx, getSBUCKWithdrawTx } from '../api/sbuck';\nimport { TransactionSubType } from '../types';\n\nexport class SBUCKDepositIntention extends BaseIntention<SBUCKDepositIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKDeposit;\n\n constructor(public readonly data: SBUCKDepositIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKDepositTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKDepositIntentionData) {\n return new SBUCKDepositIntention(data);\n }\n}\n\nexport class SBUCKUnstakeIntention extends BaseIntention<SBUCKUnstakeIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKUnstake;\n\n constructor(public readonly data: SBUCKUnstakeIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKUnstakeTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKUnstakeIntentionData) {\n return new SBUCKUnstakeIntention(data);\n }\n}\n\nexport class SBUCKWithdrawIntention extends BaseIntention<SBUCKWithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKWithdraw;\n\n constructor(public readonly data: SBUCKWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKWithdrawIntentionData) {\n return new SBUCKWithdrawIntention(data);\n }\n}\n\nexport class SBUCKClaimIntention extends BaseIntention<SBUCKClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.SBUCKClaim;\n\n constructor(public readonly data: SBUCKClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getSBUCKClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: SBUCKClaimIntentionData) {\n return new SBUCKClaimIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildSBUCKClaimTx, buildSBUCKDepositTx, buildSBUCKUnstakeTx, buildSBUCKWithdrawTx } from 'bucket-protocol-sdk';\n\nimport {\n SBUCKClaimIntentionData,\n SBUCKDepositIntentionData,\n SBUCKUnstakeIntentionData,\n SBUCKWithdrawIntentionData,\n} from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getSBUCKDepositTx = async (\n txbParams: SBUCKDepositIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount, isStake } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKDepositTx(client, tx, coinType, amount, account.address, isStake);\n\n return tx;\n};\n\nexport const getSBUCKUnstakeTx = async (\n txbParams: SBUCKUnstakeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { stakeProofs, amount, isStake, toBuck } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKUnstakeTx(client, tx, stakeProofs, amount, account.address, isStake, toBuck);\n\n return tx;\n};\n\nexport const getSBUCKWithdrawTx = async (\n txbParams: SBUCKWithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKWithdrawTx(client, tx, amount, account.address);\n\n return tx;\n};\n\nexport const getSBUCKClaimTx = async (\n txbParams: SBUCKClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { stakeProofs } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildSBUCKClaimTx(client, tx, stakeProofs, account.address);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport {\n getTankClaimTx,\n getTankDepositTx,\n getTankWithdrawTx,\n TankClaimIntentionData,\n TankDepositIntentionData,\n TankWithdrawIntentionData,\n} from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class TankDepositIntention extends BaseIntention<TankDepositIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankDeposit;\n\n constructor(public readonly data: TankDepositIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankDepositTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankDepositIntentionData) {\n return new TankDepositIntention(data);\n }\n}\n\nexport class TankWithdrawIntention extends BaseIntention<TankWithdrawIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankWithdraw;\n\n constructor(public readonly data: TankWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankWithdrawTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankWithdrawIntentionData) {\n return new TankWithdrawIntention(data);\n }\n}\n\nexport class TankClaimIntention extends BaseIntention<TankClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.TankClaim;\n\n constructor(public readonly data: TankClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getTankClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: TankClaimIntentionData) {\n return new TankClaimIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildTankClaimTx, buildTankDepositTx, buildTankWithdrawTx } from 'bucket-protocol-sdk';\n\nimport { TankClaimIntentionData, TankDepositIntentionData, TankWithdrawIntentionData } from '@/apps/bucket/types/api';\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport const getTankDepositTx = async (\n txbParams: TankDepositIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankDepositTx(client, tx, coinType, amount, account.address);\n\n return tx;\n};\n\nexport const getTankWithdrawTx = async (\n txbParams: TankWithdrawIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, amount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankWithdrawTx(client, tx, coinType, amount, account.address);\n\n return tx;\n};\n\nexport const getTankClaimTx = async (\n txbParams: TankClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildTankClaimTx(client, tx, coinType, account.address);\n\n return tx;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { buildLockedClaimTx } from 'bucket-protocol-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getBucketClient } from './config';\n\nexport interface LockClaimIntentionData {\n coinType: string;\n proofCount: number;\n}\n\nexport const getLockClaimTx = async (\n txbParams: LockClaimIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const { coinType, proofCount } = txbParams;\n\n const tx = new Transaction();\n const client = getBucketClient(network, account);\n await buildLockedClaimTx(client, tx, coinType, proofCount, account.address);\n\n return tx;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { LockClaimIntentionData, getLockClaimTx } from '../api';\nimport { TransactionSubType } from '../types';\n\nexport class LockClaimIntention extends BaseIntention<LockClaimIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.LockClaim;\n\n constructor(public readonly data: LockClaimIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const tx = await getLockClaimTx(this.data, account, network);\n return tx;\n }\n\n static fromData(data: LockClaimIntentionData) {\n return new LockClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\n\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { ClaimFeeAndMiningIntention } from './intentions/claim-fee-and-mining';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { FarmingAddLiquidityIntention } from './intentions/farming-add';\nimport { FarmingBatchHarvestIntention } from './intentions/farming-batch-harvest';\nimport { FarmingClaimFeeAndRewardIntention } from './intentions/farming-claim-fee-and-rewards';\nimport { FarmingDecreaseLiquidityIntention } from './intentions/farming-decrease';\nimport { FarmingHarvestIntention } from './intentions/farming-harvest';\nimport { FarmingIncreaseLiquidityIntention } from './intentions/farming-increase';\nimport { FarmingRemoveLiquidityIntention } from './intentions/farming-remove';\nimport { FarmingStakeIntention } from './intentions/farming-stake';\nimport { FarmingUnstakeIntention } from './intentions/farming-unstake';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport { AddVaultsPositionIntention } from './intentions/vaults-add';\nimport { RemoveVaultsPositionIntention } from './intentions/vaults-remove';\nimport { VestingRedeemIntention } from './intentions/vesting-redeem';\nimport { XcetusCancelIntention } from './intentions/xcetus-cancel';\nimport { XcetusClaimingStakeRewardsIntention } from './intentions/xcetus-claim';\nimport { XcetusConvertIntention } from './intentions/xcetus-convert';\nimport { XcetusRedeemIntention } from './intentions/xcetus-redeem';\nimport { XcetusRedeemLockIntention } from './intentions/xcetus-redeem-lock';\nimport { SuiNetworks, CetusIntentionData, TransactionSubType } from './types';\n\nexport type CetusIntention =\n | AddLiquidityIntention\n | IncreaseLiquidityIntention\n | FarmingAddLiquidityIntention\n | FarmingIncreaseLiquidityIntention\n | DecreaseLiquidityIntention\n | RemoveLiquidityIntention\n | ClaimFeeAndMiningIntention\n | FarmingDecreaseLiquidityIntention\n | FarmingRemoveLiquidityIntention\n | FarmingClaimFeeAndRewardIntention\n | FarmingHarvestIntention\n | FarmingBatchHarvestIntention\n | FarmingStakeIntention\n | FarmingUnstakeIntention\n | XcetusConvertIntention\n | XcetusRedeemLockIntention\n | XcetusClaimingStakeRewardsIntention\n | XcetusCancelIntention\n | XcetusRedeemIntention\n | VestingRedeemIntention\n | SwapIntention\n | AddVaultsPositionIntention\n | RemoveVaultsPositionIntention;\n\nexport class CetusHelper implements IAppHelperInternal<CetusIntentionData> {\n application = 'cetus';\n\n supportSDK = '@mysten/sui' as const;\n\n // TODO: Please refer to the documentation and move the `action` and `txbParams` params into the `appContext` structure.\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n action?: string;\n txbParams?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: CetusIntentionData }> {\n console.log('Cetus helper deserialize input: ', input);\n const { txbParams, action } = input;\n\n return {\n txType: TransactionType.Other,\n txSubType: action,\n intentionData: {\n txbParams: { ...txbParams },\n action,\n },\n };\n }\n\n async build(input: {\n intentionData: CetusIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n let intention: CetusIntention;\n switch (input.txSubType) {\n case TransactionSubType.OpenAndAddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.IncreaseLiquidity:\n intention = IncreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.DecreaseLiquidity:\n intention = DecreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.ClaimFeeAndMining:\n intention = ClaimFeeAndMiningIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingOpenAndAddLiquidity:\n intention = FarmingAddLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingIncreaseLiquidity:\n intention = FarmingIncreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingDecreaseLiquidity:\n intention = FarmingDecreaseLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingRemoveLiquidity:\n intention = FarmingRemoveLiquidityIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingClaimFeeAndReward:\n intention = FarmingClaimFeeAndRewardIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingHarvest:\n intention = FarmingHarvestIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingBatchHarvest:\n intention = FarmingBatchHarvestIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingStake:\n intention = FarmingStakeIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.FarmingUnstake:\n intention = FarmingUnstakeIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSConvert:\n intention = XcetusConvertIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSRedeemLock:\n intention = XcetusRedeemLockIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSClaimStakingRwewards:\n intention = XcetusClaimingStakeRewardsIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSCancelRedeem:\n intention = XcetusCancelIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.xCETUSRedeem:\n intention = XcetusRedeemIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.VestingRedeem:\n intention = VestingRedeemIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.Swap:\n intention = SwapIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.AddVaultsPosition:\n intention = AddVaultsPositionIntention.fromData(input.intentionData);\n break;\n case TransactionSubType.RemoveVaultsPosition:\n intention = RemoveVaultsPositionIntention.fromData(input.intentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.OpenAndAddLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getAddLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { AggregatorClient, Env } from '@cetusprotocol/aggregator-sdk';\nimport { CetusPeripherySDK, SdkOptions as PeripherySdkOptions } from '@cetusprotocol/cetus-periphery-sdk';\nimport { CetusClmmSDK, SdkOptions } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { CetusXcetusSDK, SdkOptions as XcetusSdkOptions } from '@cetusprotocol/cetus-xcetus-sdk';\nimport CetusVaultsSDK from '@cetusprotocol/vaults-sdk';\nimport { SuiClient, getFullnodeUrl } from '@mysten/sui/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '../types';\n\nexport const clmmConfig: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n cetus_config: {\n package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n published_at: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n config: {\n coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n global_config_id: '0x0408fa4e4a4c03cc0de8f23d0c2bbfe8913d178713c9a271ed4080973fe42d8f',\n coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n },\n },\n clmm_pool: {\n package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n published_at: '0xc6faf3703b0e8ba9ed06b7851134bbbe7565eb35ff823fd78432baa4cbeaa12e',\n version: 4,\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0x2d8c2e0fc6dd25b0214b3fa747e0fd27fd54608142cd2e4f64c1cd350cc4add4',\n version: 6,\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0x92aee86c01c79146d23938a00c7fff725ee0688c389be36d1bcbe03761b466c6',\n published_at: '0x92aee86c01c79146d23938a00c7fff725ee0688c389be36d1bcbe03761b466c6',\n },\n aggregatorUrl: 'https://api-sui.cetus.zone/router',\n swapCountUrl: 'https://api-sui.cetus.zone/v2/sui/swap/count',\n};\n\nexport const peripheryConfig: PeripherySdkOptions = {\n // fullRpcUrl: getFullnodeUrl('mainnet'),\n // env: \"mainnet\",\n launchpad: {\n package_id: '0x80d114c5d474eabc2eb2fcd1a0903f1eb5b5096a8dc4184d72453f7a9be728e4',\n published_at: '0x80d114c5d474eabc2eb2fcd1a0903f1eb5b5096a8dc4184d72453f7a9be728e4',\n config: {\n pools_id: '0xfd8d37f7a1276878972d240302c8efe32f577220c1bbc6c8984d8b60dddfcab3',\n admin_cap_id: '0x66c70d58c69353714cc6fe2d3a62492d605a96a9821e2bd8274de17219c69980',\n config_cap_id: '0x02b8d23f033687579966e182c776fe0287cacdbb18bff56c29f141e29a18a4d1',\n },\n },\n ido: {\n package_id: '0x1192c9e20b4b0a8848a73a8c711b43e38f7ea1f307b556aab6ffab4e982e9c59',\n published_at: '0x1192c9e20b4b0a8848a73a8c711b43e38f7ea1f307b556aab6ffab4e982e9c59',\n config: {\n pools_id: '0xefc209b47acf1f23b29d166440904600229e520ad36228aaf2329b7c16be9762',\n admin_cap_id: '0x281859d366951830aeeda90779aa170d8ee6845875545470d33ecb890e78c8ce',\n package_version_id: '0xc93dc996106770af5f4e979b6808518f8cee080f22f35b936f071f59d834bb22',\n },\n },\n xcetus: {\n package_id: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n published_at: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n config: {\n xcetus_manager_id: '0x838b3dbade12b1e602efcaf8c8b818fae643e43176462bf14fd196afa59d1d9d',\n lock_manager_id: '0x288b59d9dedb51d0bb6cb5e13bfb30885ecf44f8c9076b6f5221c5ef6644fd28',\n lock_handle_id: '0x7c534bb7b8a2cc21538d0dbedd2437cc64f47106cb4c259b9ff921b5c3cb1a49',\n },\n },\n xcetus_dividends: {\n package_id: '0x785248249ac457dfd378bdc6d2fbbfec9d1daf65e9d728b820eb4888c8da2c10',\n published_at: '0x5aa58e1623885bd93de2331d05c29bf4930e54e56beeabcab8fe5385de2d31dc',\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '0x682ba823134f156eac2bcfb27d85a284954a0e61998dc628c40b9bcb4a46ff30',\n dividend_settle_id: '0xade40abe9f6dd10b83b11085be18f07b63b681cf1c169b041fa16854403388c5',\n venft_dividends_id: '0x9dcdb97b4307684bedaeaf803d381b12321a31ecbb9dad7df2cd5f64384f9456',\n venft_dividends_id_v2: '0xaa21fbc1707786d56302952f8327362f4eb9a431a5bc574834e6d46125390de3',\n },\n },\n cetus_faucet: {\n package_id: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n published_at: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n },\n xtoken: {\n package_id: '',\n published_at: '',\n config: {\n xtoken_manager_id: '',\n lock_manager_id: '',\n lock_handle_id: '',\n },\n },\n xtoken_dividends: {\n package_id: '',\n published_at: '',\n config: {\n dividend_manager_id: '',\n dividend_admin_id: '',\n dividend_settle_id: '',\n },\n },\n token_faucet: {\n package_id: '',\n published_at: '',\n },\n booster: {\n package_id: '',\n published_at: '',\n config: {\n booster_config_id: '',\n booster_pool_handle: '',\n },\n },\n maker_bonus: {\n package_id: '',\n published_at: '',\n config: {\n maker_config_id: '',\n maker_pool_handle: '',\n },\n },\n liquidity_stratefy: {\n package_id: '',\n published_at: '',\n version: undefined,\n config: undefined,\n },\n vaults: {\n package_id: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n published_at: '0x58e5de6e425397eeaf952d55c0f94637bee91b25d6138ce222f89cda0aefec03',\n version: 1,\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\n haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0xaabf0856070391df81fad9240049d69c5a51c3d376cc0885eeedd516526cc79b',\n version: 1,\n config: {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n },\n volo: {\n package_id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n published_at: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n version: 1,\n config: {\n native_pool: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n vsui_metadata: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n coin_type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n },\n },\n aftermath: {\n package_id: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n published_at: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n version: 1,\n config: {\n staked_sui_vault: '0x2f8f6d5da7f13ea37daa397724280483ed062769813b6f31e9788e59cc88994d',\n referral_vault: '0x4ce9a19b594599536c53edb25d22532f82f18038dc8ef618afd00fbbfb9845ef',\n safe: '0xeb685899830dd5837b47007809c76d91a098d52aabbf61e8ac467c59e5cc4610',\n validator_address: '0xd30018ec3f5ff1a3c75656abf927a87d7f0529e6dc89c7ddd1bd27ecb05e3db2',\n coin_type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI',\n },\n },\n },\n },\n limit_order: {\n package_id: '',\n published_at: '',\n version: 1,\n config: {\n rate_orders_indexer_id: '',\n rate_orders_indexer_handle: '',\n global_config_id: '',\n token_list_handle: '',\n user_orders_indexer_id: '',\n user_orders_indexer_handle: '',\n },\n },\n frams: {\n package_id: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\n published_at: '0x7e4ca066f06a1132ab0499c8c0b87f847a0d90684afa902e52501a44dbd81992',\n version: 1,\n config: {\n global_config_id: '0x21215f2f6de04b57dd87d9be7bb4e15499aec935e36078e2488f36436d64996e',\n rewarder_manager_id: '0xe0e155a88c77025056da08db5b1701a91b79edb6167462f768e387c3ed6614d5',\n rewarder_manager_handle: '0xb32e312cbb3367d6f3d2b4e57c9225e903d29b7b9f612dae2ddf75bdeb26a5aa',\n admin_cap_id: '0xf10fbf1fea5b7aeaa524b87769461a28c5c977613046360093673991f26d886c',\n },\n },\n dca: {\n package_id: '',\n published_at: '',\n version: 0,\n config: {\n admin_cap_id: '',\n global_config_id: '',\n indexer_id: '',\n user_indexer_id: '',\n in_coin_whitelist_id: '',\n out_coin_whitelist_id: '',\n },\n },\n};\n\nexport const xcetusConfig: XcetusSdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n xcetus: {\n package_id: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n published_at: '0x9e69acc50ca03bc943c4f7c5304c2a6002d507b51c11913b247159c60422c606',\n config: {\n xcetus_manager_id: '0x838b3dbade12b1e602efcaf8c8b818fae643e43176462bf14fd196afa59d1d9d',\n lock_manager_id: '0x288b59d9dedb51d0bb6cb5e13bfb30885ecf44f8c9076b6f5221c5ef6644fd28',\n lock_handle_id: '0x7c534bb7b8a2cc21538d0dbedd2437cc64f47106cb4c259b9ff921b5c3cb1a49',\n },\n },\n xcetus_dividends: {\n package_id: '0x785248249ac457dfd378bdc6d2fbbfec9d1daf65e9d728b820eb4888c8da2c10',\n published_at: '0x5aa58e1623885bd93de2331d05c29bf4930e54e56beeabcab8fe5385de2d31dc',\n version: 4,\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '0x682ba823134f156eac2bcfb27d85a284954a0e61998dc628c40b9bcb4a46ff30',\n dividend_settle_id: '0xade40abe9f6dd10b83b11085be18f07b63b681cf1c169b041fa16854403388c5',\n venft_dividends_id: '0x9dcdb97b4307684bedaeaf803d381b12321a31ecbb9dad7df2cd5f64384f9456',\n venft_dividends_id_v2: '0xaa21fbc1707786d56302952f8327362f4eb9a431a5bc574834e6d46125390de3',\n },\n },\n cetus_faucet: {\n package_id: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n published_at: '0x6864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n },\n};\n\nexport const getClmmSdk = (network: SuiNetworks, account: WalletAccount) => {\n const config = clmmConfig;\n const clmmSdk = new CetusClmmSDK(config);\n clmmSdk.senderAddress = account.address;\n return clmmSdk;\n};\n\nexport const getPeripherySdk = (network: SuiNetworks, account: WalletAccount) => {\n const clmmSdk = getClmmSdk(network, account);\n const config = peripheryConfig;\n const peripherySdk = new CetusPeripherySDK(config, clmmSdk);\n return peripherySdk;\n};\n\nconst aggregatorURL = 'https://api-sui.cetus.zone/router_v2/find_routes';\nexport const getAggregatorSdk = (network: SuiNetworks, account: WalletAccount) => {\n const suiClient = new SuiClient({\n url: 'https://fullnode.mainnet.sui.io/',\n });\n const aggregatorSdk = new AggregatorClient({\n endpoint: aggregatorURL,\n signer: account.address,\n client: suiClient,\n env: Env.Mainnet,\n });\n\n return aggregatorSdk;\n};\n\nconst vaultsSDKOptions = {\n fullRpcUrl: 'https://fullnode.mainnet.sui.io/',\n simulationAccount: {\n address: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n },\n clmm_pool: {\n package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n published_at: '0xc6faf3703b0e8ba9ed06b7851134bbbe7565eb35ff823fd78432baa4cbeaa12e',\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0x2d8c2e0fc6dd25b0214b3fa747e0fd27fd54608142cd2e4f64c1cd350cc4add4',\n },\n frams: {\n package_id: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\n published_at: '0x7e4ca066f06a1132ab0499c8c0b87f847a0d90684afa902e52501a44dbd81992',\n config: {\n global_config_id: '0x21215f2f6de04b57dd87d9be7bb4e15499aec935e36078e2488f36436d64996e',\n rewarder_manager_id: '0xe0e155a88c77025056da08db5b1701a91b79edb6167462f768e387c3ed6614d5',\n rewarder_manager_handle: '0xb32e312cbb3367d6f3d2b4e57c9225e903d29b7b9f612dae2ddf75bdeb26a5aa',\n admin_cap_id: '0xf10fbf1fea5b7aeaa524b87769461a28c5c977613046360093673991f26d886c',\n },\n },\n vaults: {\n package_id: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n published_at: '0x58e5de6e425397eeaf952d55c0f94637bee91b25d6138ce222f89cda0aefec03',\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\n haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0xaabf0856070391df81fad9240049d69c5a51c3d376cc0885eeedd516526cc79b',\n version: 1,\n config: {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n },\n volo: {\n package_id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n published_at: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n version: 1,\n config: {\n native_pool: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n vsui_metadata: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n coin_type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n },\n },\n aftermath: {\n package_id: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n published_at: '0x7f6ce7ade63857c4fd16ef7783fed2dfc4d7fb7e40615abdb653030b76aef0c6',\n version: 1,\n config: {\n staked_sui_vault: '0x2f8f6d5da7f13ea37daa397724280483ed062769813b6f31e9788e59cc88994d',\n referral_vault: '0x4ce9a19b594599536c53edb25d22532f82f18038dc8ef618afd00fbbfb9845ef',\n safe: '0xeb685899830dd5837b47007809c76d91a098d52aabbf61e8ac467c59e5cc4610',\n validator_address: '0xd30018ec3f5ff1a3c75656abf927a87d7f0529e6dc89c7ddd1bd27ecb05e3db2',\n coin_type: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc::afsui::AFSUI',\n },\n },\n },\n },\n aggregator: {\n endPoint: 'https://api-sui.cetus.zone/router_v2/find_routes',\n fullNodeurl: 'https://fullnode.mainnet.sui.io/',\n walletAddress: '0x326ce9894f08dcaa337fa232641cc34db957aec9ff6614c1186bc9a7508df0bb',\n env: Env.Mainnet,\n providers: [\n 'CETUS',\n 'DEEPBOOK',\n 'KRIYA',\n 'KRIYAV3',\n 'FLOWX',\n 'FLOWXV3',\n 'AFTERMATH',\n 'TURBOS',\n 'HAEDAL',\n 'VOLO',\n 'AFSUI',\n ],\n },\n};\n\nexport const getVaultsSdk = (network: SuiNetworks, account: WalletAccount) => {\n const vaultsSDK: any = new CetusVaultsSDK(vaultsSDKOptions);\n vaultsSDK.senderAddress = account.address;\n return vaultsSDK;\n};\n\nexport const getXcetusSdk = (network: SuiNetworks, account: WalletAccount) => {\n const xcetusSDk: any = new CetusXcetusSDK(xcetusConfig);\n xcetusSDk.senderAddress = account.address;\n return xcetusSDk;\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getClmmSdk } from './config';\n\nexport const getAddLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(\n txbParams?.parameter,\n txbParams?.gasEstimateArg,\n );\n return txb;\n};\n\nexport const getIncreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.createAddLiquidityFixTokenPayload(\n txbParams?.parameter,\n txbParams?.gasEstimateArg,\n );\n return txb;\n};\n\nexport const getRemoveLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.closePositionTransactionPayload(txbParams);\n return txb;\n};\n\nexport const getDecreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Position.removeLiquidityTransactionPayload(txbParams);\n return txb;\n};\n\nexport const getClaimFeeAndMiningTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: Transaction = await clmmSdk.Rewarder.collectRewarderTransactionPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getClaimFeeAndMiningTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class ClaimFeeAndMiningIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ClaimFeeAndMining;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getClaimFeeAndMiningTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new ClaimFeeAndMiningIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getDecreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.DecreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getDecreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new DecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingAddLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingAddLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingOpenAndAddLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingAddLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingAddLiquidityIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getPeripherySdk } from './config';\n\nexport const getFarmingAddLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.openPositionAddLiquidityStakePaylod(txbParams);\n return txb;\n};\n\nexport const getFarmingIncreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.addLiquidityFixCoinPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingDecreaseLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingRemoveLiquidityTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.removeLiquidityPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingClaimFeeAndRewardTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.claimFeeAndClmmReward(txbParams);\n return txb;\n};\n\nexport const getFarmingHarvest = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.harvestPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingBatchHarvest = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const params: any = Object.values(txbParams);\n const txb: Transaction = await peripherySdk.Farms.batchHarvestPayload(params);\n return txb;\n};\n\nexport const getFarmingStake = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.depositPayload(txbParams);\n return txb;\n};\n\nexport const getFarmingUnstake = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: Transaction = await peripherySdk.Farms.withdrawPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingBatchHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingBatchHarvestIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingBatchHarvest;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingBatchHarvest(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingBatchHarvestIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingClaimFeeAndRewardTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingClaimFeeAndRewardIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingClaimFeeAndReward;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingClaimFeeAndRewardTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingClaimFeeAndRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingDecreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingDecreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingDecreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingDecreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingDecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingHarvestIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingHarvest;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingHarvest(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingHarvestIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingIncreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingIncreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingIncreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingIncreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingIncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingRemoveLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingRemoveLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingRemoveLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingRemoveLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingRemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingStake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingStakeIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingStake;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingStake(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingStakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getFarmingUnstake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class FarmingUnstakeIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.FarmingUnstake;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getFarmingUnstake(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new FarmingUnstakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getIncreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.IncreaseLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getIncreaseLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new IncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveLiquidity;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getRemoveLiquidityTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getSwapRouterTxb } from '../api/swap';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.Swap;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getSwapRouterTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new SwapIntention(data);\n }\n}\n","import { restituteMsafeFastRouterSwapParams } from '@cetusprotocol/aggregator-sdk';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getAggregatorSdk } from './config';\n\nexport const getSwapRouterTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const aggregatorSdk = getAggregatorSdk(network, account);\n const txb = new Transaction();\n await aggregatorSdk.fastRouterSwap({\n ...txbParams,\n routers: restituteMsafeFastRouterSwapParams(txbParams.routers),\n txb,\n });\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getAddVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class AddVaultsPositionIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.AddVaultsPosition;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getAddVaultsPositionPayload(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new AddVaultsPositionIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getVaultsSdk } from './config';\n\nexport const getAddVaultsPositionPayload = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const vaultsSdk = getVaultsSdk(network, account);\n const txb: Transaction = await vaultsSdk.Vaults.deposit(txbParams);\n return txb;\n};\n\nexport const getRemoveVaultsPositionPayload = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const vaultsSdk = getVaultsSdk(network, account);\n const txb: Transaction = await vaultsSdk.Vaults.withdraw(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getRemoveVaultsPositionPayload } from '../api/vaults';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class RemoveVaultsPositionIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveVaultsPosition;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getRemoveVaultsPositionPayload(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new RemoveVaultsPositionIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getVestingRedeemTxb } from '../api/vesting';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class VestingRedeemIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.VestingRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getVestingRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new VestingRedeemIntention(data);\n }\n}\n","import { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nconst VestingConfing = {\n package_id: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n published_at: '0x355714a1eeb7ab1d80902da6c92001170cda1212edf524c32aa308a3ac177c31',\n cetus_coin_type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n};\n\nexport const getVestingRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n console.log('getVestingRedeemTxb txbParams: ', txbParams);\n console.log('getVestingRedeemTxb account: ', account);\n console.log('getVestingRedeemTxb network: ', network);\n const { pool, nftId, periods, CLOCK_ADDRESS } = txbParams;\n const txb = new Transaction();\n\n periods.forEach((period: any) => {\n txb.moveCall({\n target: `${VestingConfing.published_at}::router::redeem`,\n typeArguments: [VestingConfing.cetus_coin_type],\n arguments: [txb.object(pool), txb.object(nftId), txb.pure(period), txb.object(CLOCK_ADDRESS)],\n });\n });\n\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusCancelRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusCancelIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSCancelRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusCancelRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusCancelIntention(data);\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusSdk } from './config';\n\nexport const getXcetusConvertTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.convertPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemLockTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemLockPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusClaimingStakeRewardsTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemDividendV3Payload(\n txbParams.veNftId,\n txbParams.rewardList,\n );\n return txb;\n};\n\nexport const getXcetusCancelRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.cancelRedeemPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<Transaction> => {\n const xcetusSdk = getXcetusSdk(network, account);\n const txb: Transaction = await xcetusSdk.XCetusModule.redeemPayload(txbParams);\n return txb;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusClaimingStakeRewardsTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusClaimingStakeRewardsIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSClaimStakingRwewards;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusClaimingStakeRewardsTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusClaimingStakeRewardsIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusConvertTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusConvertIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSConvert;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusConvertTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusConvertIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSRedeem;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusRedeemTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusRedeemIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { getXcetusRedeemLockTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType } from '../types';\n\nexport class XcetusRedeemLockIntention extends BaseIntention<CetusIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.xCETUSRedeemLock;\n\n constructor(public readonly data: CetusIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n const { account, network } = input;\n const { txbParams } = this.data;\n const txb = await getXcetusRedeemLockTxb(txbParams, account, network);\n return txb;\n }\n\n static fromData(data: CetusIntentionData) {\n return new XcetusRedeemLockIntention(data);\n }\n}\n","import { CancelStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CancelStreamIntention extends StreamIntention<CancelStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CANCEL;\n\n constructor(public readonly data: CancelStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.cancel();\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { SuiNetworks } from '@/types';\n\nexport interface IAppHelperInternalLegacy<T> {\n application: string;\n supportSDK: '@mysten/sui.js';\n\n deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n }>;\n\n build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock>;\n}\n\nexport interface TransactionIntentionLegacy<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n\n serialize(): string;\n\n build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<TransactionBlock>;\n}\n\nexport abstract class BaseIntentionLegacy<D> implements TransactionIntentionLegacy<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock>;\n}\n","import { getFullnodeUrl } from '@mysten/sui.js/client';\n\nimport * as devContractConfig from '../config/dev.json';\nimport * as prodContractConfig from '../config/prod.json';\n\nexport enum Env {\n dev = 'dev',\n stg = 'stg',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface EnvConfig {\n env: Env;\n rpc: SuiConfig;\n backend: BackendConfig;\n contract: ContractConfig;\n}\n\nexport interface EnvConfigOptions {\n rpc?: SuiConfig;\n backend?: BackendConfig;\n contract?: ContractConfig;\n}\n\nexport interface BackendConfig {\n url: string;\n}\n\nexport interface SuiConfig {\n url: string;\n}\n\nexport interface ContractConfig {\n contractId: string;\n roleObjId: string;\n vaultObjId: string;\n feeObjId: string;\n}\n\nexport const DEV_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const STG_RPC_ENDPOINT = getFullnodeUrl('testnet');\nexport const PREV_RPC_ENDPOINT = getFullnodeUrl('mainnet');\nexport const PROD_RPC_ENDPOINT = getFullnodeUrl('mainnet');\n\nexport const DEV_BE_API = 'https://bc3p6l5unl.execute-api.us-west-1.amazonaws.com/prod';\nexport const STG_BE_API = 'https://rolsbkota7.execute-api.us-west-1.amazonaws.com/prod';\nexport const PREV_BE_API = 'https://6p6mkx33ne.execute-api.us-west-1.amazonaws.com/prod';\nexport const PROD_BE_API = 'https://xrae3mrjv5.execute-api.us-west-1.amazonaws.com/prod';\n\nexport const CONTRACT_DEV: ContractConfig = devContractConfig;\nexport const CONTRACT_PROD: ContractConfig = prodContractConfig;\n\nconst ENV_CONFIG: Map<Env, EnvConfig> = new Map([\n [\n Env.dev,\n {\n env: Env.dev,\n rpc: {\n url: DEV_RPC_ENDPOINT,\n },\n backend: {\n url: DEV_BE_API,\n },\n contract: CONTRACT_DEV,\n },\n ],\n [\n Env.stg,\n {\n env: Env.stg,\n rpc: {\n url: STG_RPC_ENDPOINT,\n },\n backend: {\n url: STG_BE_API,\n },\n contract: CONTRACT_DEV,\n },\n ],\n [\n Env.prev,\n {\n env: Env.prev,\n rpc: {\n url: PREV_RPC_ENDPOINT,\n },\n backend: {\n url: PREV_BE_API,\n },\n contract: CONTRACT_PROD,\n },\n ],\n [\n Env.prod,\n {\n env: Env.prod,\n rpc: {\n url: PROD_RPC_ENDPOINT,\n },\n backend: {\n url: PROD_BE_API,\n },\n contract: CONTRACT_PROD,\n },\n ],\n]);\n\nexport function getConfig(env: Env, options?: EnvConfigOptions): EnvConfig {\n const ec = ENV_CONFIG.get(env);\n if (!ec) {\n throw new Error(`Env not supported: ${env}`);\n }\n if (options && options.rpc) {\n ec.rpc = options.rpc;\n }\n if (options && options.backend) {\n ec.backend = options.backend;\n }\n if (options && options.contract) {\n ec.contract = options.contract;\n }\n return ec;\n}\n","{\n \"transaction\": \"DiBZq4UmVVYiRL6ZJmFKYoHcxtxqrhsCXSkFyT7wUr3j\",\n \"status\": \"success\",\n \"contractId\": \"0x81c960dc653975fbd0072deca8afb92d322898c911622898ba1b2e3ad0c4bd8d\",\n \"roleObjId\": \"0xc6ec0bdee0bb59a72077e9acd2f42457043cf47080b3d3fad4d39abf28bba63a\",\n \"vaultObjId\": \"0xbc4021387fbac149119fd24e92be9e58f745774292f3a2a12e2ac6daf5363e1d\",\n \"feeObjId\": \"0x4178f63970fe2daeb256dc5730ad172e82b3e8eb45f31b33e0daae72cd35e1e1\",\n \"upgradeCapObjId\": \"0xe1e9aa7d222d151bfe6dd83358b0d7fdcb11260f710800cfaf7ccc1b1e245115\"\n}","{\n \"transaction\": \"855FNDV8o8Z3fWULPnQo9qdhLJpsg7wZrkCpNyfw9KfB\",\n \"status\": \"success\",\n \"contractId\": \"0xc357c3985e8fb875d6b37141497af660779aa1bab0ec489b2213efd74067d1fa\",\n \"roleObjId\": \"0x5ab49bdf9fd1413e328ef242b3f8d83dde791b38a0b627bfc87fb25c010d34f1\",\n \"vaultObjId\": \"0xb483558770d8eb26007f193b75db40f0a45f2e36863a687625885d4de6993378\",\n \"feeObjId\": \"0x48453fc4d7cde3fe35aad89e5dfb496608a6a55ea529a1c0274681a808627f94\",\n \"upgradeCapObjId\": \"0x34279779a0d0d36bd5044b04830d607fa1b0ecf316548c8ac3a44151e4f1a42a\"\n}","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { EnvConfig, Env, EnvConfigOptions, getConfig } from './env';\nimport { NoBackendError } from '../error/NoBackendError';\nimport { WalletNotConnectedError } from '../error/WalletNotConnectedError';\nimport { Backend } from '../stream/backend';\nimport { IBackend } from '../types/backend';\nimport { IWallet, WalletType } from '../types/wallet';\n\nexport class Globals {\n public signer: IWallet | undefined;\n\n public readonly suiClient: SuiClient;\n\n public readonly envConfig: EnvConfig;\n\n public _backend?: IBackend;\n\n constructor(envConfig: EnvConfig) {\n this.envConfig = envConfig;\n this.suiClient = new SuiClient({ url: envConfig.rpc.url });\n if (envConfig.backend) {\n this._backend = new Backend(envConfig.backend.url);\n }\n }\n\n static new(env: Env, options?: EnvConfigOptions) {\n const ec = getConfig(env, options);\n return new Globals(ec);\n }\n\n get walletType(): WalletType | 'disconnected' {\n if (!this.wallet) {\n return 'disconnected';\n }\n return this.wallet.type;\n }\n\n get backend(): IBackend {\n if (!this._backend) {\n throw new NoBackendError();\n }\n return this._backend;\n }\n\n // Used for test cases\n set backend(b: IBackend) {\n this._backend = b;\n }\n\n connectWallet(wallet: IWallet) {\n this.signer = wallet;\n }\n\n disconnect() {\n this.signer = undefined;\n }\n\n get wallet(): IWallet {\n if (!this.signer) {\n throw new WalletNotConnectedError();\n }\n return this.signer;\n }\n\n async walletAddress() {\n return this.wallet.address();\n }\n}\n","export enum MPayErrorCode {\n sanity,\n walletNotConnected,\n InvalidInput,\n InvalidRpcResult,\n NotEnoughBalance,\n StreamNotFound,\n RpcError,\n NotCreator,\n NotRecipient,\n InvalidStreamGroup,\n BackendError,\n NoBackend,\n TransactionFailed,\n}\n\nexport type JsonObject =\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | readonly JsonObject[]\n | { readonly [key: string]: JsonObject }\n | { toJSON(): JsonObject };\n\nexport class MPayError extends Error {\n public readonly mpayErrorCode: number;\n\n public readonly context?: JsonObject;\n\n constructor(mpayErrorCode: number, msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n const { cause, context } = options;\n if (cause) {\n super(`[MPay] ${msg}: ${cause}`);\n } else {\n super(`[MPay] ${msg}`);\n }\n this.mpayErrorCode = mpayErrorCode;\n this.context = context;\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NoBackendError extends MPayError {\n constructor() {\n super(MPayErrorCode.NoBackend, 'Backend is not specified');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class WalletNotConnectedError extends MPayError {\n constructor() {\n super(MPayErrorCode.walletNotConnected, 'Wallet not connected');\n }\n}\n","import axios, { AxiosError, AxiosResponse } from 'axios';\n\nimport { BackendError } from '../error/BackendError';\nimport {\n IBackend,\n BackendIncomingStreamFilterOptions,\n StreamRef,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\n\nexport class Backend implements IBackend {\n constructor(private apiURL: string) {}\n\n private static parseResponseData(response: AxiosError | AxiosResponse) {\n if (response instanceof AxiosError) {\n throw new BackendError(response.response?.statusText as string);\n }\n if (response.status === 200) {\n if (response.data.success) {\n return response.data.data;\n }\n throw new BackendError(response.data.code);\n }\n throw new BackendError(response.status.toString());\n }\n\n async getIncomingStreams(recipient: string, options?: BackendIncomingStreamFilterOptions): Promise<StreamRef[]> {\n const res = await axios.post(`${this.apiURL}/stream`, {\n recipient,\n ...options,\n });\n return Backend.parseResponseData(res) as StreamRef[];\n }\n\n async getOutgoingStreams(sender: string, options?: BackendOutgoingStreamFilterOptions): Promise<StreamRef[]> {\n const res = await axios.post(`${this.apiURL}/stream`, {\n sender,\n ...options,\n });\n return Backend.parseResponseData(res);\n }\n\n async getStreamHistory(query: {\n streamId?: string;\n groupId?: string;\n pagination?: PaginationOptions;\n }): Promise<Paginated<StreamEvent>> {\n const res = await axios.post(`${this.apiURL}/stream-events`, query);\n const paginatedData = Backend.parseResponseData(res);\n paginatedData.data.forEach((event: StreamEvent) => {\n const formalizedEvent = event;\n if (formalizedEvent.data.type === 'create_stream') {\n formalizedEvent.data.balance = BigInt(formalizedEvent.data.balance);\n } else if (formalizedEvent.data.type === 'cancel_stream') {\n formalizedEvent.data.withdrawAmount = BigInt(formalizedEvent.data.withdrawAmount);\n } else if (formalizedEvent.data.type === 'claim' || formalizedEvent.data.type === 'auto_claim') {\n formalizedEvent.data.claimAmount = BigInt(formalizedEvent.data.claimAmount);\n } else if (formalizedEvent.data.type === 'set_auto_claim') {\n formalizedEvent.data.enabled = !!formalizedEvent.data.enabled;\n }\n formalizedEvent.createdAt = new Date(formalizedEvent.createdAt);\n return formalizedEvent;\n });\n\n return paginatedData;\n }\n\n async getAllCoinTypes(address: string): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { address });\n return Backend.parseResponseData(res);\n }\n\n async getAllRecipients(sender: string, options?: StreamFilterStatus): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { sender, status: options });\n return Backend.parseResponseData(res);\n }\n\n async getAllSenders(recipient: string, options?: StreamFilterStatus): Promise<string[]> {\n const res = await axios.post(`${this.apiURL}/stream-info`, { recipient, status: options });\n return Backend.parseResponseData(res);\n }\n}\n","import { JsonObject, MPayError, MPayErrorCode } from './base';\n\nexport class BackendError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.BackendError, msg, { context });\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Env, EnvConfigOptions, Globals } from '../common';\nimport { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\nimport { Stream } from './Stream';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { getCoinsWithAmount } from '../sui/iterator/coin';\nimport { isSameCoinType } from '../sui/utils';\nimport { StreamFilterStatus } from '../types/backend';\nimport {\n CreateStreamInfo,\n IMPayClient,\n IPagedStreamListIterator,\n IncomingStreamQuery,\n OutgoingStreamQuery,\n} from '../types/client';\nimport {\n CoinRequest,\n CoinRequestResponse,\n GAS_OBJECT_SPEC,\n IMSafeAccount,\n ISingleWallet,\n IWallet,\n WalletType,\n} from '../types/wallet';\n\nexport class MSafeAccountAdapter implements IWallet {\n constructor(private readonly msafe: IMSafeAccount) {}\n\n get type() {\n return WalletType.msafe;\n }\n\n async address() {\n return this.msafe.address();\n }\n\n async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n return this.msafe.requestCoins(reqs);\n }\n}\n\nexport class MSafeSingleWallet {\n constructor(private account: WalletAccount) {}\n\n async address(): Promise<string> {\n return this.account.address;\n }\n}\n\nexport class SingleWalletAdapter implements IWallet {\n constructor(\n private readonly singleWallet: ISingleWallet,\n private readonly suiClient: SuiClient,\n ) {}\n\n get type() {\n return WalletType.single;\n }\n\n async address() {\n return this.singleWallet.address();\n }\n\n async requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]> {\n return Promise.all(reqs.map((req) => this.requestCoin(req)));\n }\n\n async requestCoin(req: CoinRequest): Promise<CoinRequestResponse> {\n if (isSameCoinType(req.coinType, SUI_TYPE_ARG)) {\n return {\n primaryCoin: GAS_OBJECT_SPEC,\n };\n }\n if (req.amount <= 0) {\n throw new InvalidInputError('Invalid coin request', 'coinAmount', req.amount);\n }\n const coins = await getCoinsWithAmount(this.suiClient, await this.address(), req.amount, req.coinType);\n if (coins.length === 0) {\n throw new SanityError('no coins available');\n }\n return {\n primaryCoin: coins[0].coinObjectId,\n mergedCoins: coins.slice(1).map((coin) => coin.coinObjectId),\n };\n }\n}\n\nexport class MPayClient implements IMPayClient {\n public readonly globals: Globals;\n\n public readonly helper: MPayHelper;\n\n constructor(env: Env, options?: EnvConfigOptions) {\n this.globals = Globals.new(env, options);\n this.helper = new MPayHelper(this.globals);\n }\n\n connectSingleWallet(wallet: ISingleWallet) {\n const adapter = new SingleWalletAdapter(wallet, this.globals.suiClient);\n this.globals.connectWallet(adapter);\n }\n\n connectMSafeAccount(msafe: IMSafeAccount) {\n const adapter = new MSafeAccountAdapter(msafe);\n this.globals.connectWallet(adapter);\n }\n\n async createStream(info: CreateStreamInfo): Promise<TransactionBlock> {\n return this.builder().createStreams(info);\n }\n\n async getStream(streamId: string) {\n return Stream.new(this.globals, streamId);\n }\n\n async getIncomingStreams(query?: IncomingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n return PagedStreamListIterator.newIncoming({\n globals: this.globals,\n query,\n pageSize,\n });\n }\n\n async getOutgoingStreams(query?: OutgoingStreamQuery, pageSize = 10): Promise<IPagedStreamListIterator> {\n return PagedStreamListIterator.newOutgoing({\n globals: this.globals,\n query,\n pageSize,\n });\n }\n\n async getCoinTypesForStreamFilter(): Promise<string[]> {\n const address = await this.wallet.address();\n const coinTypes = await this.globals.backend.getAllCoinTypes(address);\n return coinTypes.map((coinType) => normalizeStructTag(coinType));\n }\n\n async getRecipientsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n const address = await this.wallet.address();\n const recipients = await this.globals.backend.getAllRecipients(address, options);\n return recipients.map((recipient) => normalizeSuiAddress(recipient));\n }\n\n async getCreatorsForStreamFilter(options?: StreamFilterStatus): Promise<string[]> {\n const address = await this.wallet.address();\n const creators = await this.globals.backend.getAllSenders(address, options);\n return creators.map((creator) => normalizeSuiAddress(creator));\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n private builder() {\n return new MPayBuilder(this.globals);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamHelper } from './CreateStreamHelper';\nimport { Globals } from '../common';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { CreateStreamInfo } from '../types/client';\n\n// TODO: add vault and admin control related code.\nexport class MPayBuilder {\n private readonly feeContract: FeeContract;\n\n private readonly streamContract: StreamContract;\n\n constructor(public readonly globals: Globals) {\n const config = globals.envConfig.contract;\n this.feeContract = new FeeContract(config, globals);\n this.streamContract = new StreamContract(config, globals);\n }\n\n async createStreams(info: CreateStreamInfo) {\n const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(info);\n return this.createStreamHelper().buildCreateStreamTransactionBlock(infoInternal);\n }\n\n createStreamHelper() {\n return new CreateStreamHelper(this.globals, this.feeContract, this.streamContract);\n }\n\n setAutoClaim(streamId: string, enabled: boolean, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.setAutoClaim(txb, {\n streamId,\n enabled,\n coinType,\n });\n }\n\n claimStream(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.claimStream(txb, {\n streamId,\n coinType,\n });\n }\n\n claimStreamByProxy(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n return this.streamContract.claimStreamByProxy(txb, {\n streamId,\n coinType,\n });\n }\n\n cancelStream(streamId: string, coinType: string) {\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId,\n coinType,\n });\n return txb;\n }\n}\n","import { TransactionArgument, TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { CLAIM_FEE_NUMERATOR, FEE_DENOMINATOR, FEE_NUMERATOR, FLAT_FEE_SUI } from './const';\nimport { Globals } from '../common';\nimport { ResultRef } from '../common/transaction';\nimport { FeeContract } from '../contract/FeeContract';\nimport { InspectViewer } from '../contract/InspectViewer';\nimport { StreamContract } from '../contract/StreamContract';\nimport { encodeMetadata } from '../stream/metadata';\nimport { isSameCoinType } from '../sui/utils';\nimport {\n CreateStreamInfo,\n CreateStreamInfoInternal,\n MPayFees,\n PaymentWithFee,\n RecipientInfoInternal,\n} from '../types/client';\nimport { CoinRequest, CoinRequestResponse, GAS_OBJECT_SPEC } from '../types/wallet';\nimport { generateGroupId } from '../utils/random';\n\nexport class CreateStreamHelper {\n constructor(\n public readonly globals: Globals,\n private readonly feeContract: FeeContract,\n private readonly streamContract: StreamContract,\n ) {}\n\n static convertCreateStreamInfoToInternal(info: CreateStreamInfo): CreateStreamInfoInternal {\n return {\n metadata: encodeMetadata({\n name: info.name,\n groupId: generateGroupId(),\n }),\n coinType: normalizeStructTag(info.coinType),\n recipients: info.recipients.map((recipient) => ({\n address: recipient.address,\n cliffAmount: recipient.cliffAmount,\n amountPerEpoch: recipient.amountPerStep,\n })),\n epochInterval: info.interval,\n numberEpoch: info.steps,\n startTime: info.startTimeMs,\n cancelable: info.cancelable,\n };\n }\n\n async buildCreateStreamTransactionBlock(info: CreateStreamInfoInternal): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n const paymentWithFee = this.calculateFeesInternal(info);\n const coinReqs = this.getCreateStreamCoinRequests(info, paymentWithFee);\n const coinResp = await this.wallet.requestCoins(coinReqs);\n\n const paymentMergedObject = await this.addMergeCoins(txb, coinResp[0]);\n let flatFeeMergedObject: TransactionArgument;\n if (coinReqs.length > 1) {\n flatFeeMergedObject = await this.addMergeCoins(txb, coinResp[1]);\n } else {\n flatFeeMergedObject = paymentMergedObject;\n }\n\n // Create streams\n for (let i = 0; i < info.recipients.length; i++) {\n const recipient = info.recipients[i];\n const paymentAmount = this.amountForRecipient(recipient, info.numberEpoch);\n const feeAmount = this.getStreamFeeLocal(paymentAmount);\n const [paymentCoin] = txb.splitCoins(paymentMergedObject, [txb.pure(paymentAmount + feeAmount, 'u64')]);\n const [flatFeeCoin] = txb.splitCoins(flatFeeMergedObject, [txb.pure(this.flatSuiFee, 'u64')]);\n this.streamContract.createStream(txb, {\n paymentCoin: new ResultRef(paymentCoin as TransactionArgument & TransactionArgument[]),\n flatFeeCoin: new ResultRef(flatFeeCoin as TransactionArgument & TransactionArgument[]),\n metadata: info.metadata,\n recipient: recipient.address,\n timeStart: info.startTime,\n cliff: recipient.cliffAmount,\n epochInterval: info.epochInterval,\n numEpoch: info.numberEpoch,\n amountPerEpoch: recipient.amountPerEpoch,\n cancelable: info.cancelable,\n coinType: info.coinType,\n });\n }\n return txb;\n }\n\n calculateCreateStreamFees(createInfo: CreateStreamInfo) {\n const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(createInfo);\n return this.calculateFeesInternal(infoInternal);\n }\n\n feeParams(): MPayFees {\n return {\n createFeePercent: {\n numerator: FEE_NUMERATOR,\n denominator: FEE_DENOMINATOR,\n },\n claimFeePercent: {\n numerator: CLAIM_FEE_NUMERATOR,\n denominator: FEE_DENOMINATOR,\n },\n flatFeePerStream: FLAT_FEE_SUI,\n };\n }\n\n private async addMergeCoins(txb: TransactionBlock, coins: CoinRequestResponse): Promise<TransactionObjectArgument> {\n let mergedCoin: TransactionObjectArgument;\n if (coins.mergedCoins && coins.mergedCoins.length) {\n txb.mergeCoins(\n txb.object(coins.primaryCoin),\n coins.mergedCoins.map((coinId) => txb.object(coinId)),\n );\n mergedCoin = txb.object(coins.primaryCoin);\n } else if (coins.primaryCoin === GAS_OBJECT_SPEC) {\n mergedCoin = txb.gas;\n } else {\n mergedCoin = txb.object(coins.primaryCoin);\n }\n return mergedCoin;\n }\n\n getCreateStreamCoinRequests(info: CreateStreamInfoInternal, payment: PaymentWithFee): CoinRequest[] {\n const streamCoinType = info.coinType;\n\n if (isSameCoinType(streamCoinType, SUI_TYPE_ARG)) {\n return [\n {\n coinType: streamCoinType,\n amount: payment.totalAmount + payment.streamFeeAmount + payment.flatFeeAmount,\n },\n ];\n }\n return [\n {\n coinType: streamCoinType,\n amount: payment.totalAmount + payment.streamFeeAmount,\n },\n {\n coinType: SUI_TYPE_ARG,\n amount: payment.flatFeeAmount,\n },\n ];\n }\n\n calculateFeesInternal(info: CreateStreamInfoInternal): PaymentWithFee {\n const streamPayment = info.recipients.reduce(\n (sum, recipient) => {\n const totalAmount = this.amountForRecipient(recipient, info.numberEpoch);\n const fee = this.getStreamFeeLocal(totalAmount);\n return {\n totalAmount: sum.totalAmount + totalAmount,\n streamFeeAmount: sum.streamFeeAmount + fee,\n };\n },\n {\n totalAmount: 0n,\n streamFeeAmount: 0n,\n },\n );\n const flatFeeAmount = BigInt(info.recipients.length) * this.flatSuiFee;\n return {\n flatFeeAmount,\n ...streamPayment,\n };\n }\n\n private amountForRecipient(recipient: RecipientInfoInternal, numEpoch: bigint) {\n return BigInt(recipient.amountPerEpoch) * BigInt(numEpoch) + BigInt(recipient.cliffAmount);\n }\n\n get flatSuiFee() {\n return FLAT_FEE_SUI;\n }\n\n getStreamFeeLocal(streamAmount: bigint) {\n return (streamAmount * FEE_NUMERATOR) / FEE_DENOMINATOR;\n }\n\n async getStreamFeeRemote(streamAmount: bigint) {\n const txb = this.feeContract.streamingFee(new TransactionBlock(), streamAmount);\n const res = await this.globals.suiClient.devInspectTransactionBlock({\n sender: await this.globals.walletAddress(),\n transactionBlock: txb,\n });\n const iv = new InspectViewer(res);\n return iv.getU64();\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n}\n","export const FEE_NUMERATOR = 50n;\nexport const FEE_DENOMINATOR = 10000n;\nexport const CLAIM_FEE_NUMERATOR = 25n;\nexport const FLAT_FEE_SUI = 100000000n;\n","import { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nexport type MoveNumber = bigint | string | number;\nexport type Ref<T> = T | ResultRef;\nexport type ObjectId = string;\n\nexport class MoveObject {\n constructor(public readonly object: string) {}\n\n moveArg(txb: TransactionBlock) {\n return txb.object(this.object);\n }\n}\n\nexport class ObjectVector {\n constructor(public readonly objects: string[]) {}\n\n moveArgs(txb: TransactionBlock) {\n return txb.makeMoveVec({ objects: this.objects.map((o) => txb.object(o)) });\n }\n}\n\nexport class ResultRef {\n constructor(public readonly result: TransactionArgument & TransactionArgument[]) {\n // eslint-disable-next-line no-constructor-return\n return new Proxy(this, {\n set() {\n throw new Error('The transaction result is a proxy, and does not support setting properties directly');\n },\n get(target, property) {\n // This allows this transaction argument to be used in the singular form:\n if (property in target) {\n return Reflect.get(target, property);\n }\n\n const nestedResultFor = (resultIndex: number) => new ResultRef(target.result[resultIndex] as any);\n\n // Support destructuring:\n if (property === Symbol.iterator) {\n // eslint-disable-next-line func-names\n return function* () {\n let i = 0;\n while (true) {\n yield nestedResultFor(i);\n i++;\n }\n };\n }\n\n if (typeof property === 'symbol') {\n // eslint-disable-next-line consistent-return\n return;\n }\n\n const resultIndex = parseInt(property, 10);\n if (Number.isNaN(resultIndex) || resultIndex < 0) {\n // eslint-disable-next-line consistent-return\n return;\n }\n return nestedResultFor(resultIndex);\n },\n });\n }\n\n moveArg() {\n return this.result;\n }\n}\n","import { Buffer } from 'buffer';\n\nimport { DevInspectResults, SuiExecutionResult } from '@mysten/sui.js/client';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { InvalidRpcResultError } from '../error/InvalidRpcResultError';\n\nexport class InspectViewer {\n constructor(readonly results: DevInspectResults) {}\n\n callResult(index: number) {\n return this.results.results![index];\n }\n\n returnValue(returned: SuiExecutionResult, index: number) {\n return returned.returnValues![index];\n }\n\n getValue(callIndex = 0, returnIndex = 0) {\n const callResult = this.callResult(callIndex);\n return this.returnValue(callResult, returnIndex);\n }\n\n getAddress(callIndex = 0, returnIndex = 0) {\n const [value, type] = this.getValue(callIndex, returnIndex);\n if (type !== 'address') {\n throw new InvalidRpcResultError('Invalid contract return type.', {\n ctx: {\n expectType: 'address',\n gotType: type,\n },\n });\n }\n return normalizeSuiAddress(Buffer.from(value).toString('hex'));\n }\n\n getU64(callIndex = 0, returnIndex = 0) {\n const [value, type] = this.getValue(callIndex, returnIndex);\n if (type !== 'u64') {\n throw new InvalidRpcResultError('Invalid contract return type.', {\n ctx: {\n expectType: 'u64',\n gotType: type,\n },\n });\n }\n return Buffer.from(value).readBigInt64LE();\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidRpcResultError extends MPayError {\n constructor(msg: string, ctx?: JsonObject) {\n super(MPayErrorCode.InvalidRpcResult, msg, { context: ctx });\n }\n}\n","import { bcs } from '@mysten/sui.js/bcs';\n\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { StreamMetadata } from '../types/stream';\n\nexport const metadataBcsType = {\n groupId: 'string',\n name: 'string',\n};\n\nconst MAX_NAME_SIZE = 64;\n\nexport function encodeMetadata(metadata: StreamMetadata) {\n validateMetadata(metadata);\n return bcs.ser(metadataBcsType, metadata).toString('base64');\n}\n\nexport function decodeMetadata(metaStr: string) {\n const metadata = bcs.de(metadataBcsType, metaStr, 'base64') as StreamMetadata;\n validateMetadata(metadata);\n return metadata;\n}\n\nexport function validateMetadata(metadata: StreamMetadata) {\n if (!isAsciiString(metadata.name)) {\n throw new InvalidInputError('Invalid metadata: Name contains unknown character');\n }\n if (!isAsciiString(metadata.groupId)) {\n throw new InvalidInputError('Invalid metadata: Group ID contains unknown character');\n }\n if (metadata.name.length > MAX_NAME_SIZE) {\n throw new InvalidInputError('Invalid metadata: Name exceed max length 64');\n }\n}\n\nfunction isAsciiString(str: string) {\n // eslint-disable-next-line no-control-regex\n const asciiPattern = /^[\\x00-\\x7F]+$/;\n return asciiPattern.test(str);\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class InvalidInputError extends MPayError {\n constructor(msg: string, fieldKey?: string, fieldValue?: any) {\n super(MPayErrorCode.InvalidInput, `Invalid input: ${msg}`, {\n context: {\n fieldKey,\n fieldValue,\n },\n });\n }\n}\n","import { normalizeStructTag } from '@mysten/sui.js/utils';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n","export enum WalletType {\n single = 'single',\n msafe = 'msafe',\n}\n\nexport const GAS_OBJECT_SPEC = 'txn.gas';\n\n/**\n * IWallet is the adapted interface of wallet. Supports both single wallet and msafe.\n */\nexport interface IWallet {\n type: WalletType;\n\n address(): Promise<string>;\n\n requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of msafe account.\n * Need to adapt to IWallet interface\n */\nexport interface IMSafeAccount {\n address(): Promise<string>;\n\n // return coin objects by amount.\n requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of single signer wallet.\n * Need to adapt to IWallet interface\n */\nexport interface ISingleWallet {\n address(): Promise<string>;\n}\n\nexport interface CoinRequest {\n coinType: string;\n amount: bigint;\n}\n\nexport interface CoinRequestResponse {\n primaryCoin: string;\n mergedCoins?: string[];\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateGroupId() {\n return nanoid();\n}\n","import { TransactionBlock, Transactions } from '@mysten/sui.js/transactions';\n\nimport { ContractConfig, Globals } from '../common';\nimport { ObjectVector, MoveObject, ResultRef, Ref, ObjectId } from '../common/transaction';\nimport { CLOCK_ID } from '../const';\n\nexport class BaseContract {\n constructor(\n public readonly moduleName: string,\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {}\n\n addContractCall(txb: TransactionBlock, input: { method: string; arguments: any[]; typeArgs?: string[] }) {\n const target =\n `${this.config.contractId}::${this.moduleName}::${input.method}` as `${string}::${string}::${string}`;\n txb.add(\n Transactions.MoveCall({\n target,\n arguments: input.arguments.map((arg) => {\n if (arg instanceof ObjectVector) {\n return arg.moveArgs(txb);\n }\n if (arg instanceof MoveObject) {\n return arg.moveArg(txb);\n }\n if (arg instanceof ResultRef) {\n return arg.moveArg();\n }\n return txb.pure(arg);\n }),\n typeArguments: input.typeArgs,\n }),\n );\n return txb;\n }\n\n private addTransactionBlock(txb: TransactionBlock, target: string, callArgs: any[] = [], typeArgs: string[] = []) {\n txb.add(\n Transactions.MoveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: callArgs.map((arg) => {\n if (arg instanceof ObjectVector) {\n return arg.moveArgs(txb);\n }\n if (arg instanceof MoveObject) {\n return arg.moveArg(txb);\n }\n if (arg instanceof ResultRef) {\n return arg.moveArg();\n }\n return txb.pure(arg);\n }),\n typeArguments: typeArgs,\n }),\n );\n }\n\n makeObject(object: Ref<ObjectId>) {\n return typeof object === 'string' ? new MoveObject(object) : object;\n }\n\n vaultObject() {\n return new MoveObject(this.config.vaultObjId);\n }\n\n roleObject() {\n return new MoveObject(this.config.roleObjId);\n }\n\n feeObject() {\n return new MoveObject(this.config.feeObjId);\n }\n\n clockObject() {\n return new MoveObject(CLOCK_ID);\n }\n}\n","export const CLOCK_ID = '0x0000000000000000000000000000000000000000000000000000000000000006';\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { MoveNumber } from '../common/transaction';\n\nexport class FeeContract extends BaseContract {\n static ModuleName = 'fee_module';\n\n static MethodName = {\n set_streaming_fee: 'set_streaming_fee',\n set_claim_fee: 'set_claim_fee',\n set_streaming_flat_fee: 'set_streaming_flat_fee',\n streaming_flat_fee: 'streaming_flat_fee',\n streaming_fee: 'streaming_fee',\n claim_fee: 'claim_fee',\n fee_denominator: 'fee_denominator',\n } as const;\n\n constructor(\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {\n super(FeeContract.ModuleName, config, globals);\n }\n\n setStreamingFee(txb: TransactionBlock, createFeeNumerator: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_streaming_fee,\n arguments: [roleObject, feeObject, createFeeNumerator],\n typeArgs: [],\n });\n }\n\n setStreamingFlatFee(txb: TransactionBlock, flatFee: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_streaming_flat_fee,\n arguments: [roleObject, feeObject, flatFee],\n typeArgs: [],\n });\n }\n\n setClaimFee(txb: TransactionBlock, claimFee: MoveNumber) {\n const roleObject = this.roleObject();\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.set_claim_fee,\n arguments: [roleObject, feeObject, claimFee],\n typeArgs: [],\n });\n }\n\n streamingFee(txb: TransactionBlock, amount: MoveNumber) {\n const feeObject = this.feeObject();\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.streaming_fee,\n arguments: [feeObject, amount],\n typeArgs: [],\n });\n }\n\n claimFee(txb: TransactionBlock, amount: MoveNumber) {\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.claim_fee,\n arguments: [this.feeObject(), amount],\n typeArgs: [],\n });\n }\n\n feeDenominator(txb: TransactionBlock) {\n return this.addContractCall(txb, {\n method: FeeContract.MethodName.fee_denominator,\n arguments: [this.feeObject()],\n typeArgs: [],\n });\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { BaseContract } from './BaseContract';\nimport { ContractConfig, Globals } from '../common';\nimport { Ref, ObjectId, MoveNumber } from '../common/transaction';\n\nexport class StreamContract extends BaseContract {\n static ModuleName = 'stream';\n\n static MethodName = {\n create_stream: 'create_stream',\n set_auto_claim: 'set_auto_claim',\n cancel_stream: 'cancel_stream',\n claim_stream: 'claim_stream',\n claim_stream_by_proxy: 'claim_stream_by_proxy',\n stream_current_epoch: 'stream_current_epoch',\n now_milli_seconds: 'now_milli_seconds',\n } as const;\n\n constructor(\n public readonly config: ContractConfig,\n public readonly globals: Globals,\n ) {\n super(StreamContract.ModuleName, config, globals);\n }\n\n createStream(\n txb: TransactionBlock,\n input: {\n paymentCoin: Ref<ObjectId>;\n flatFeeCoin: Ref<ObjectId>;\n metadata: string;\n recipient: string;\n timeStart: Ref<MoveNumber>;\n cliff: Ref<MoveNumber>;\n epochInterval: Ref<MoveNumber>;\n numEpoch: Ref<MoveNumber>;\n amountPerEpoch: Ref<MoveNumber>;\n cancelable: boolean;\n coinType: string;\n },\n ) {\n const feeObject = this.feeObject();\n const vaultObject = this.vaultObject();\n const paymentCoinObject = this.makeObject(input.paymentCoin);\n const flatFeeObject = this.makeObject(input.flatFeeCoin);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.create_stream,\n arguments: [\n feeObject,\n vaultObject,\n paymentCoinObject,\n flatFeeObject,\n input.metadata,\n input.recipient,\n input.timeStart,\n input.cliff,\n input.epochInterval,\n input.numEpoch,\n input.amountPerEpoch,\n input.cancelable,\n clockObject,\n ],\n typeArgs: [input.coinType],\n });\n }\n\n setAutoClaim(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n enabled: boolean;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.set_auto_claim,\n arguments: [streamObject, input.enabled],\n typeArgs: [input.coinType],\n });\n }\n\n cancelStream(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.cancel_stream,\n arguments: [streamObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n claimStream(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.claim_stream,\n arguments: [streamObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n claimStreamByProxy(\n txb: TransactionBlock,\n input: {\n streamId: Ref<ObjectId>;\n coinType: string;\n },\n ) {\n const streamObject = this.makeObject(input.streamId);\n const vaultObject = this.vaultObject();\n const feeObject = this.feeObject();\n const clockObject = this.clockObject();\n return this.addContractCall(txb, {\n method: StreamContract.MethodName.claim_stream_by_proxy,\n arguments: [streamObject, vaultObject, feeObject, clockObject],\n typeArgs: [input.coinType],\n });\n }\n\n get createStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.create_stream}`;\n }\n\n get setAutoClaimTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.set_auto_claim}`;\n }\n\n get cancelStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.cancel_stream}`;\n }\n\n get claimStreamTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream}`;\n }\n\n get claimStreamByProxyTarget() {\n return `${this.config.contractId}::${StreamContract.ModuleName}::${StreamContract.MethodName.claim_stream_by_proxy}`;\n }\n}\n","import {\n CoinMetadata,\n SuiClient,\n SuiObjectChangeCreated,\n SuiTransactionBlockResponse,\n DevInspectResults,\n} from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { MPayBuilder } from '../builder/MPayBuilder';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { TransactionFailedError } from '../error/TransactionFailedError';\nimport {\n IMPayHelper,\n CreateStreamInfo,\n PaymentWithFee,\n MPayFees,\n Fraction,\n CalculatedStreamAmount,\n CalculatedTimeline,\n} from '../types/client';\n\n// Minimum time interval is 1 second\nexport const MIN_INTERVAL_MS = 1000;\n\nexport class MPayHelper implements IMPayHelper {\n private readonly coinMetaHelper: CoinMetaHelper;\n\n private readonly createStreamHelper: CreateStreamHelper;\n\n constructor(public readonly globals: Globals) {\n this.coinMetaHelper = new CoinMetaHelper(globals.suiClient);\n this.createStreamHelper = new MPayBuilder(globals).createStreamHelper();\n }\n\n getStreamIdsFromCreateStreamResponse(res: SuiTransactionBlockResponse) {\n if (res.effects?.status.status !== 'success') {\n throw new TransactionFailedError(res.effects?.status.status, res.effects?.status.error);\n }\n return res\n .objectChanges!.filter(\n (change) =>\n change.type === 'created' &&\n change.objectType.startsWith(`${this.globals.envConfig.contract.contractId}::stream::Stream`),\n )\n .map((change) => (change as SuiObjectChangeCreated).objectId);\n }\n\n calculateCreateStreamFees(info: CreateStreamInfo): PaymentWithFee {\n return this.createStreamHelper.calculateCreateStreamFees(info);\n }\n\n feeParams(): MPayFees {\n return this.createStreamHelper.feeParams();\n }\n\n calculateStreamAmount(input: { totalAmount: bigint; steps: bigint; cliff?: Fraction }): CalculatedStreamAmount {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const cliffFraction = input.cliff\n ? input.cliff\n : {\n numerator: 0n,\n denominator: 100n,\n };\n const cliffAmount = (input.totalAmount * cliffFraction.numerator) / cliffFraction.denominator;\n const amountPerStep = (input.totalAmount - cliffAmount) / input.steps;\n const realTotalAmount = amountPerStep * input.steps + cliffAmount;\n\n const res = {\n realTotalAmount,\n cliffAmount,\n amountPerStep,\n };\n this.validateStreamAmount(res, input.totalAmount);\n return res;\n }\n\n calculateTimelineByInterval(input: { timeStart: DateTime; interval: Duration; steps: bigint }): CalculatedTimeline {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const timeEnd = input.timeStart.plus(input.interval.toMillis() * Number(input.steps));\n\n const res = {\n timeStart: input.timeStart,\n timeEnd,\n interval: input.interval,\n steps: input.steps,\n };\n this.validateTimeline(res);\n return res;\n }\n\n calculateTimelineByTotalDuration(input: { timeStart: DateTime; total: Duration; steps: bigint }): CalculatedTimeline {\n if (input.steps === 0n) {\n throw new InvalidInputError('Invalid stream steps: 0');\n }\n const intervalMilli = BigInt(input.total.toMillis()) / input.steps;\n const timeEnd = input.timeStart.plus(Duration.fromMillis(Number(intervalMilli * input.steps)));\n const res = {\n timeStart: input.timeStart,\n timeEnd,\n interval: Duration.fromMillis(Number(intervalMilli)),\n steps: input.steps,\n };\n this.validateTimeline(res);\n return res;\n }\n\n async getBalance(address: string, coinType?: string | null) {\n const balance = await this.globals.suiClient.getBalance({\n owner: address,\n coinType,\n });\n const coinMeta = await this.getCoinMeta(coinType);\n return {\n ...balance,\n coinType: normalizeStructTag(balance.coinType),\n coinMeta,\n };\n }\n\n async getAllBalance(address: string) {\n const allBalance = await this.globals.suiClient.getAllBalances({\n owner: address,\n });\n const coinMetas = await Promise.all(allBalance.map((bal) => this.getCoinMeta(bal.coinType)));\n return allBalance.map((bal, i) => ({\n ...bal,\n coinType: normalizeStructTag(bal.coinType),\n coinMeta: coinMetas[i],\n }));\n }\n\n async getCoinMeta(coinType: string | null | undefined) {\n return this.coinMetaHelper.getCoinMeta(coinType);\n }\n\n async simulateTransactionBlock(txb: TransactionBlock): Promise<DevInspectResults> {\n return this.globals.suiClient.devInspectTransactionBlock({\n transactionBlock: txb,\n sender: await this.globals.wallet.address(),\n });\n }\n\n private validateStreamAmount(val: CalculatedStreamAmount, originTotalAmount: bigint) {\n if (val.amountPerStep === 0n) {\n throw new InvalidInputError('Stream amount too small', 'totalAmount', originTotalAmount);\n }\n if (val.cliffAmount > val.realTotalAmount) {\n throw new InvalidInputError('Invalid cliff settings');\n }\n }\n\n private validateTimeline(val: CalculatedTimeline) {\n if (val.interval.toMillis() < MIN_INTERVAL_MS) {\n throw new InvalidInputError('Interval shall be at least 1 second', 'interval', val.interval);\n }\n }\n}\n\nexport class CoinMetaHelper {\n private coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(private readonly suiClient: SuiClient) {\n this.coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string | null | undefined): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType || SUI_TYPE_ARG);\n if (this.coinMetaReg.has(normalized)) {\n return this.coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this.coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this.suiClient.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class TransactionFailedError extends MPayError {\n constructor(status: string | undefined, msg: string | undefined) {\n super(MPayErrorCode.TransactionFailed, `Transaction failed: ${msg}`, {\n context: {\n status,\n msg,\n },\n });\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { DateTime } from 'luxon';\n\nimport { Stream } from './Stream';\nimport { StreamGroup } from './StreamGroup';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { SuiIterator } from '../sui/iterator/iterator';\nimport { ObjectBatchIterator, ListOidIterator } from '../sui/iterator/object';\nimport {\n StreamRef,\n BackendIncomingStreamFilterOptions,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { IPagedStreamListIterator, IncomingStreamQuery, OutgoingStreamQuery } from '../types/client';\nimport { IStream, IStreamGroup, StreamStatus } from '../types/stream';\n\nexport class PagedStreamListIterator implements IPagedStreamListIterator {\n private constructor(\n public readonly it: StreamListIterator,\n public readonly pageSize: number,\n ) {}\n\n static async newIncoming(input: {\n globals: Globals;\n query?: IncomingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newIncoming(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n static async newOutgoing(input: {\n globals: Globals;\n query?: OutgoingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newOutgoing(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n async hasNext() {\n return this.it.hasNext();\n }\n\n async next(): Promise<(IStream | IStreamGroup)[]> {\n const res: (IStream | IStreamGroup)[] = [];\n while (res.length < this.pageSize && (await this.it.hasNext())) {\n res.push(await this.it.next());\n }\n return res;\n }\n}\n\nexport class StreamListIterator implements SuiIterator<IStream | IStreamGroup> {\n cachedNext: IStream | IStreamGroup | undefined | null;\n\n private constructor(private readonly requester: StreamListRequester) {}\n\n static async newIncoming(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const requester = await StreamListRequester.newIncomingQuery(input);\n return new StreamListIterator(requester);\n }\n\n static async newOutgoing(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const requester = await StreamListRequester.newOutgoingQuery(input);\n return new StreamListIterator(requester);\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cachedNext === undefined) {\n this.cachedNext = await this.requester.doNextRequest();\n }\n return this.cachedNext !== null;\n }\n\n async next(): Promise<IStream | IStreamGroup> {\n if (this.cachedNext === undefined) {\n const res = await this.requester.doNextRequest();\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res;\n }\n const res = this.cachedNext;\n this.cachedNext = undefined;\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res as IStream | IStreamGroup;\n }\n}\n\nexport class StreamListRequester {\n public current = 0;\n\n public objectIter: ObjectBatchIterator;\n\n private constructor(\n public readonly globals: Globals,\n public readonly recipient: string,\n public readonly groupRefs: StreamRef[][],\n public readonly query?: IncomingStreamQuery | OutgoingStreamQuery,\n ) {\n this.current = 0;\n const oidIter = new ListOidIterator(groupRefs.flat().map((ref) => ref.streamId));\n this.objectIter = new ObjectBatchIterator(globals.suiClient, oidIter);\n }\n\n static async newIncomingQuery(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const backendQuery = convertToIncomingBackendQuery(input.query);\n const recipient = await input.globals.walletAddress();\n const refs = await input.globals.backend.getIncomingStreams(recipient, backendQuery);\n const filtered = refs.filter((ref: any) => normalizeSuiAddress(ref.recipient) === normalizeSuiAddress(recipient));\n const groupedRefs = groupAndSortRefs(filtered);\n\n return new StreamListRequester(input.globals, recipient, groupedRefs, input.query);\n }\n\n static async newOutgoingQuery(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const backendQuery = convertToOutgoingBackendQuery(input.query);\n const sender = await input.globals.walletAddress();\n const refs = await input.globals.backend.getOutgoingStreams(sender, backendQuery);\n const groupedRefs = groupAndSortRefs(refs);\n return new StreamListRequester(input.globals, sender, groupedRefs, input.query);\n }\n\n async doNextRequest(): Promise<IStream | IStreamGroup | null> {\n if (this.current >= this.groupRefs.length) {\n return null;\n }\n const stRefs = this.groupRefs[this.current];\n if (stRefs.length === 1) {\n const stream = await getStreamFromIterator(this.globals, stRefs[0].streamId, this.objectIter);\n this.current++;\n return isStreamOfQuery(stream, this.query) ? stream : this.doNextRequest();\n }\n if (stRefs.length > 1) {\n const sg = await getStreamGroupFromIterator(\n this.globals,\n stRefs.map((ref) => ref.streamId),\n this.objectIter,\n );\n this.current++;\n return isStreamGroupOfQuery(sg, this.query) ? sg : this.doNextRequest();\n }\n throw new SanityError('Stream group with no stream');\n }\n}\n\nexport function groupAndSortRefs(refs: StreamRef[]) {\n const m = new Map<string, StreamRef[]>();\n refs.forEach((ref) => {\n const groupList = m.get(ref.groupId);\n if (groupList) {\n groupList.push(ref);\n m.set(ref.groupId, groupList);\n } else {\n m.set(ref.groupId, [ref]);\n }\n });\n return Array.from(m.values()).sort(\n (gl1, gl2) => DateTime.fromISO(gl2[0].createDate).toMillis() - DateTime.fromISO(gl1[0].createDate).toMillis(),\n );\n}\n\nfunction isStreamOfQuery(stream: IStream, query: IncomingStreamQuery | OutgoingStreamQuery | undefined) {\n if (query === undefined) {\n return true;\n }\n const isStatus = isStreamOfStatus(stream, query.status);\n if (query && 'claimable' in query && query.claimable !== undefined) {\n const isClaimable = query.claimable ? stream.progress.claimable !== 0n : stream.progress.claimable === 0n;\n return isStatus && isClaimable;\n }\n return isStatus;\n}\n\nfunction isStreamOfStatus(stream: IStream, filter: StreamStatus | StreamStatus[] | undefined): boolean {\n if (filter === undefined) {\n return true;\n }\n if (!Array.isArray(filter)) {\n return stream.progress.status === filter;\n }\n return filter.includes(stream.progress.status);\n}\n\nfunction isStreamGroupOfQuery(sg: IStreamGroup, query: IncomingStreamQuery | OutgoingStreamQuery | undefined): boolean {\n if (!query) {\n return true;\n }\n let isStatus = false;\n sg.streams.forEach((stream) => {\n if (isStreamOfQuery(stream, query)) {\n isStatus = true;\n }\n });\n return isStatus;\n}\n\nasync function getStreamFromIterator(globals: Globals, streamId: string, it: ObjectBatchIterator) {\n const data = await getStreamObjectResponseFromIter(it, streamId);\n return Stream.fromObjectData(globals, streamId, data);\n}\n\nasync function getStreamGroupFromIterator(globals: Globals, streamIds: string[], it: ObjectBatchIterator) {\n const objResponses: SuiObjectResponse[] = [];\n while (objResponses.length < streamIds.length) {\n const data = await getStreamObjectResponseFromIter(it, streamIds[objResponses.length]);\n objResponses.push(data);\n }\n return StreamGroup.newFromObjectResponse(globals, streamIds, objResponses);\n}\n\nasync function getStreamObjectResponseFromIter(it: ObjectBatchIterator, streamId: string) {\n if (!(await it.hasNext())) {\n throw new SanityError('object iterator has been consumed');\n }\n const data = await it.next();\n if (!data || data.error || data.data === undefined || data.data === null) {\n throw new SanityError(`object iterator undefined response`, {\n cause: data?.error,\n });\n }\n if (data?.data?.objectId !== streamId) {\n throw new SanityError('stream id not aligned');\n }\n return data;\n}\n\n// Convert IncomingStreamQuery to BackendIncomingStreamFilterOptions\nfunction convertToIncomingBackendQuery(query?: IncomingStreamQuery): BackendIncomingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n sender: normalizeAddressFilter(query?.sender),\n };\n}\n\nfunction convertToOutgoingBackendQuery(query?: OutgoingStreamQuery): BackendOutgoingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n recipient: normalizeAddressFilter(query?.recipient),\n };\n}\n\nexport function convertStreamStatus(status: undefined | StreamStatus | StreamStatus[]): StreamFilterStatus {\n if (status === undefined || status.length === 0) {\n return 'all';\n }\n if (!Array.isArray(status)) {\n return convertStreamStatusSingle(status);\n }\n return status.reduce((res: StreamFilterStatus | undefined, st) => {\n const sts = convertStreamStatus(st);\n if (!res) {\n return sts;\n }\n if (res === sts) {\n return sts;\n }\n return 'all';\n }, undefined) as StreamFilterStatus;\n}\n\nfunction convertStreamStatusSingle(status: StreamStatus): StreamFilterStatus {\n switch (status) {\n case 'STREAMING':\n case 'STREAMED':\n case 'CANCELED':\n return 'active';\n case 'COMPLETED':\n case 'SETTLED':\n return 'inactive';\n default:\n throw new InvalidInputError('Unknown stream filtered status');\n }\n}\n\nfunction normalizeCoinTypeFilter(coinType: string | string[] | undefined) {\n if (!coinType) {\n return undefined;\n }\n if (!Array.isArray(coinType)) {\n return normalizeStructTag(coinType);\n }\n return coinType.length !== 0 ? coinType.map((ct) => normalizeStructTag(ct)) : undefined;\n}\n\nfunction normalizeAddressFilter(address: string | string[] | undefined) {\n if (!address) {\n return undefined;\n }\n if (!Array.isArray(address)) {\n return normalizeSuiAddress(address);\n }\n return address.length !== 0 ? address.map((addr) => normalizeSuiAddress(addr)) : undefined;\n}\n","import { SuiObjectData, SuiObjectResponse, SuiParsedData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { decodeMetadata } from './metadata';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { NotCreatorError } from '../error/NotCreatorError';\nimport { NotRecipientError } from '../error/NotRecipientError';\nimport { RpcError } from '../error/RpcError';\nimport { SanityError } from '../error/SanityError';\nimport { StreamNotFoundError } from '../error/StreamNotFoundError';\nimport { RawStreamData, RawStreamStatusEnum } from '../types/data';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStream, StreamInfo, StreamGroupCommonInfo, StreamProgress, StreamStatus } from '../types/stream';\nimport { MAX_U64, roundDateTime, roundDuration } from '../utils/utils';\n\nexport class Stream implements IStream {\n private readonly streamContract: StreamContract;\n\n public readonly type = 'Stream';\n\n constructor(\n public readonly globals: Globals,\n public readonly streamId: string,\n public rawData: RawStreamData,\n ) {\n this.streamContract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n static async new(globals: Globals, streamId: string) {\n const rawData = await Stream.fetchStreamData(globals, streamId);\n return new Stream(globals, streamId, rawData);\n }\n\n static fromObjectData(globals: Globals, streamId: string, data: SuiObjectResponse) {\n const rawData = Stream.parseRawStreamData(streamId, data);\n return new Stream(globals, streamId, rawData);\n }\n\n get info(): StreamInfo {\n return {\n name: this.name,\n creator: this.creator,\n coinType: this.coinType,\n totalAmount: this.totalAmount,\n start: this.timeStart,\n end: this.timeEnd,\n cancelable: this.cancelable,\n cliffAmount: this.cliff,\n duration: this.duration,\n interval: this.interval,\n steps: this.totalSteps,\n nextReleaseDate: this.nextReleaseDate,\n nextReleaseAmount: this.nextReleaseAmount,\n\n groupId: this.groupId,\n streamId: this.streamId,\n recipient: this.recipient,\n progress: this.progress,\n autoClaim: this.autoClaim,\n };\n }\n\n get groupCommonInfo(): StreamGroupCommonInfo {\n return {\n name: this.name,\n groupId: this.groupId,\n creator: this.creator,\n start: this.timeStart,\n interval: this.interval,\n steps: this.totalSteps,\n cancelable: this.cancelable,\n };\n }\n\n async refresh() {\n this.rawData = await Stream.fetchStreamData(this.globals, this.streamId);\n }\n\n refreshWithData(data: SuiObjectResponse) {\n if (data.data?.objectId !== this.streamId) {\n throw new SanityError('Object Id does not align');\n }\n this.rawData = Stream.parseRawStreamData(this.streamId, data);\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n streamId: this.streamId,\n pagination,\n });\n }\n\n async cancel() {\n if ((await this.globals.walletAddress()) !== this.creator) {\n throw new NotCreatorError();\n }\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async claim() {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.claimStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async setAutoClaim(enabled: boolean) {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.setAutoClaim(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n enabled,\n });\n return txb;\n }\n\n async claimByProxy() {\n const txb = new TransactionBlock();\n this.streamContract.claimStreamByProxy(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get client() {\n return this.globals.suiClient;\n }\n\n get coinType() {\n return normalizeStructTag(this.rawData.coinType);\n }\n\n get progress(): StreamProgress {\n return {\n status: this.streamStatus,\n total: this.totalAmount,\n streamed: this.streamedAmount,\n claimed: this.claimedAmount,\n claimable: this.claimable,\n canceled: this.canceledAmount,\n };\n }\n\n get balance() {\n return this.rawData.balance;\n }\n\n get autoClaim() {\n return this.rawData.autoClaim;\n }\n\n get amountPerEpoch() {\n return this.rawData.config.amountPerEpoch;\n }\n\n get cancelable() {\n return this.rawData.config.cancelable;\n }\n\n get cliff() {\n return this.rawData.config.cliff;\n }\n\n get creator() {\n return this.rawData.config.creator;\n }\n\n get interval(): Duration {\n return roundDuration(this.rawData.config.epochInterval);\n }\n\n get groupId() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.groupId;\n }\n\n get name() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.name;\n }\n\n get recipient() {\n return this.rawData.config.recipient;\n }\n\n get timeStart(): DateTime {\n return roundDateTime(this.rawData.config.timeStart);\n }\n\n get duration(): Duration {\n const rawConfig = this.rawData.config;\n const duration = rawConfig.epochInterval * rawConfig.totalEpoch;\n return roundDuration(duration);\n }\n\n get timeEnd(): DateTime {\n return this.timeStart.plus(this.duration);\n }\n\n get totalSteps(): bigint {\n return this.rawData.config.totalEpoch;\n }\n\n get claimable(): bigint {\n return this.streamedAmount - this.claimedAmount;\n }\n\n get nextReleaseDate(): DateTime | null {\n if (this.currentEpoch === -1n) {\n return this.timeStart;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return roundDateTime((this.currentEpoch + 1n) * this.rawData.config.epochInterval + this.rawData.config.timeStart);\n }\n\n get nextReleaseAmount(): bigint | null {\n if (this.currentEpoch === -1n) {\n return this.cliff;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return this.amountPerEpoch;\n }\n\n get streamStatus(): StreamStatus {\n const rawStatus = this.rawData.status.status;\n if (rawStatus === RawStreamStatusEnum.CANCELED) {\n return StreamStatus.CANCELED;\n }\n if (rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED) {\n return StreamStatus.SETTLED;\n }\n if (rawStatus === RawStreamStatusEnum.COMPLETED) {\n return StreamStatus.COMPLETED;\n }\n if (this.currentEpoch >= this.totalSteps) {\n return StreamStatus.STREAMED;\n }\n return StreamStatus.STREAMING;\n }\n\n get streamedAmount() {\n if (this.currentEpoch === -1n) {\n return 0n;\n }\n if (this.isCanceled) {\n return this.rawData.status.epochCanceled * this.amountPerEpoch + this.cliff;\n }\n return this.currentEpoch * this.amountPerEpoch + this.cliff;\n }\n\n get claimedAmount() {\n if (this.rawData.status.epochClaimed === MAX_U64) {\n return 0n;\n }\n return this.rawData.status.epochClaimed * this.amountPerEpoch + this.cliff;\n }\n\n get currentEpoch() {\n const timeNowMs = DateTime.now().toMillis();\n const timeStartMs = this.timeStart.toMillis();\n if (timeNowMs < timeStartMs) {\n return -1n;\n }\n const epoch = Math.floor((timeNowMs - timeStartMs) / Number(this.rawData.config.epochInterval));\n return BigInt(epoch) > Number(this.rawData.config.totalEpoch) ? this.rawData.config.totalEpoch : BigInt(epoch);\n }\n\n get totalAmount() {\n const rawConfig = this.rawData.config;\n return rawConfig.amountPerEpoch * rawConfig.totalEpoch + rawConfig.cliff;\n }\n\n get isCanceled() {\n const rawStatus = this.rawData.status.status;\n return rawStatus === RawStreamStatusEnum.CANCELED || rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED;\n }\n\n get canceledAmount() {\n return this.isCanceled ? this.totalAmount - this.streamedAmount : 0n;\n }\n\n private static async fetchStreamData(globals: Globals, streamId: string) {\n const res = await globals.suiClient.getObject({\n id: streamId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n return Stream.parseRawStreamData(streamId, res);\n }\n\n static parseRawStreamData(streamId: string, res: SuiObjectResponse): RawStreamData {\n if (res.error) {\n if (res.error.code === 'notExists') {\n throw new StreamNotFoundError(streamId);\n }\n throw new RpcError(`get stream data: ${res.error.code}`, {\n streamId,\n ...res.error,\n });\n }\n const content = (res.data as SuiObjectData).content as SuiParsedData;\n if (content.dataType !== 'moveObject') {\n throw new RpcError('Unexpected object type', {\n gotType: content.dataType,\n });\n }\n const { typeParams } = parseStructTag(content.type);\n const coinType = normalizeStructTag(typeParams[0]);\n\n const dataFields = content.fields as any;\n const config = dataFields.config.fields as any;\n const status = dataFields.status.fields as any;\n\n return {\n coinType,\n autoClaim: dataFields.auto_claim as boolean,\n balance: BigInt(dataFields.balance.fields.balance),\n config: {\n amountPerEpoch: BigInt(config.amount_per_epoch),\n cancelable: config.cancelable,\n cliff: BigInt(config.cliff),\n creator: config.creator,\n epochInterval: BigInt(config.epoch_interval),\n metadata: config.metadata,\n recipient: config.recipient,\n timeStart: BigInt(config.time_start),\n totalEpoch: BigInt(config.total_epoch),\n },\n status: {\n status: status.status as RawStreamStatusEnum,\n epochCanceled: BigInt(status.epoch_canceled),\n epochClaimed: BigInt(status.epoch_claimed),\n },\n };\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotCreatorError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotCreator, 'Connected wallet is not creator');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotRecipientError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class RpcError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.RpcError, msg, {\n context,\n });\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\n/**\n * SanityError is the error reported because of error in code.\n * For normal user process, the sanity error shall never be thrown.\n */\nexport class SanityError extends MPayError {\n constructor(msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n super(MPayErrorCode.sanity, msg, options);\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class StreamNotFoundError extends MPayError {\n constructor(streamId: string) {\n super(MPayErrorCode.StreamNotFound, 'Stream not found', {\n context: {\n streamId,\n },\n });\n }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\n// eslint-disable-next-line no-bitwise\nexport const MAX_U64 = (1n << 64n) - 1n;\n\nexport const TIME_ROUND_UNIT = 1000;\n\n// roundTime round date to seconds\nexport function roundDateTime(date: DateTime | number | bigint) {\n let dateMs: number;\n if (typeof date === 'number') {\n dateMs = date;\n } else if (typeof date === 'bigint') {\n dateMs = Number(date);\n } else {\n dateMs = date.toMillis();\n }\n const roundMs = Math.round(dateMs / TIME_ROUND_UNIT);\n return DateTime.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n\nexport function roundDuration(duration: Duration | number | bigint) {\n let durationMs: number;\n if (typeof duration === 'number') {\n durationMs = duration;\n } else if (typeof duration === 'bigint') {\n durationMs = Number(duration);\n } else {\n durationMs = duration.toMillis();\n }\n const roundMs = Math.round(durationMs / TIME_ROUND_UNIT);\n return Duration.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidStreamGroupError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.InvalidStreamGroup, `Invalid stream group: ${msg}`, { context });\n }\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiClient, SuiObjectDataOptions, SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { SuiIterator, getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\nexport const REQUEST_PAGE_SIZE = 25;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n suiClient: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectResponse | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(suiClient, oidIter, options);\n return (await getAllFromIterator(iter)) as SuiObjectResponse[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectResponse> {\n constructor(\n public readonly suiClient: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(suiClient, idIter, options));\n }\n}\n\n// TODO: Unit test this class\nexport class ObjectBatchRequester implements Requester<SuiObjectResponse> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly suiClient: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectResponse>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res = await this.suiClient.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { Stream } from './Stream';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { InvalidStreamGroupError } from '../error/InvalidStreamGroupError';\nimport { SanityError } from '../error/SanityError';\nimport { getObjectsById } from '../sui/iterator/object';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStreamGroup, StreamGroupInfo, StreamGroupProgress, StreamGroupCommonInfo } from '../types/stream';\n\nexport class StreamGroup implements IStreamGroup {\n public readonly type = 'StreamGroup';\n\n constructor(\n public readonly globals: Globals,\n public readonly streams: Stream[],\n ) {\n if (streams.length === 0) {\n throw new InvalidStreamGroupError('stream size 0');\n }\n const gids = streams.map((st) => st.groupId);\n const set = new Set(gids);\n if (set.size !== 1) {\n throw new InvalidInputError('Stream does not have same group ID');\n }\n }\n\n static async new(globals: Globals, ids: string[]) {\n const streamObjs = await getObjectsById(globals.suiClient, ids);\n streamObjs.forEach((obj) => {\n if (!obj) {\n throw new SanityError('stream group object data undefined');\n }\n });\n return StreamGroup.newFromObjectResponse(globals, ids, streamObjs as SuiObjectResponse[]);\n }\n\n static async newFromObjectResponse(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = await StreamGroup.parseGroupStreams(globals, ids, responses);\n return new StreamGroup(globals, streams);\n }\n\n static checkStreamGroup(streams: Stream[]) {\n const commonInfos = streams.map((stream) => stream.groupCommonInfo);\n const expInfo = commonInfos[0];\n let isEqual = true;\n commonInfos.forEach((info) => {\n if (!isEqualStreamGroupCommonInfo(expInfo, info)) {\n isEqual = false;\n }\n });\n return isEqual;\n }\n\n async refresh() {\n const streamObjs = await getObjectsById(\n this.globals.suiClient,\n this.streams.map((stream) => stream.streamId),\n );\n this.streams.forEach((stream, i) => {\n stream.refreshWithData(streamObjs[i] as SuiObjectResponse);\n });\n }\n\n get groupId() {\n return this.streams[0].groupId;\n }\n\n get creator() {\n return this.streams[0].creator;\n }\n\n get info(): StreamGroupInfo {\n return {\n groupId: this.groupId,\n streamIds: this.streams.map((st) => st.streamId),\n progress: this.progress,\n\n name: this.streams[0].name,\n creator: this.creator,\n coinType: this.streams[0].coinType,\n totalAmount: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n start: this.streams[0].timeStart,\n end: this.streams[0].timeEnd,\n cancelable: this.streams[0].cancelable,\n cliffAmount: this.streams.reduce((sum, st) => sum + st.cliff, 0n),\n duration: this.streams[0].duration,\n interval: this.streams[0].interval,\n steps: this.streams[0].totalSteps,\n nextReleaseAmount: this.streams.reduce((sum, st) => {\n if (st.nextReleaseAmount === null) {\n return sum;\n }\n return sum + st.nextReleaseAmount;\n }, 0n),\n nextReleaseDate: this.streams[0].nextReleaseDate,\n };\n }\n\n get progress(): StreamGroupProgress {\n return {\n total: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n streamed: this.streams.reduce((sum, st) => sum + st.streamedAmount, 0n),\n claimed: this.streams.reduce((sum, st) => sum + st.claimedAmount, 0n),\n claimable: this.streams.reduce((sum, st) => sum + st.claimable, 0n),\n canceled: this.streams.reduce((sum, st) => sum + st.canceledAmount, 0n),\n };\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n groupId: this.groupId,\n pagination,\n });\n }\n\n private static async parseGroupStreams(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = responses\n .map((obj, i) => Stream.fromObjectData(globals, ids[i], obj))\n .filter((stream) => !!stream) as Stream[];\n\n if (new Set(streams.map((st) => st.groupId)).size !== 1) {\n throw new InvalidStreamGroupError('Not same group ID');\n }\n if (!this.checkStreamGroup(streams)) {\n throw new InvalidStreamGroupError('Not same stream settings');\n }\n return streams;\n }\n}\n\nfunction isEqualStreamGroupCommonInfo(info1: StreamGroupCommonInfo, info2: StreamGroupCommonInfo): boolean {\n return (\n info1.name === info2.name &&\n info1.groupId === info2.groupId &&\n info1.creator === info2.creator &&\n info1.start.toMillis() === info2.start.toMillis() &&\n info1.interval.toMillis() === info2.interval.toMillis() &&\n info1.steps === info2.steps &&\n info1.cancelable === info2.cancelable\n );\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotEnoughBalanceError extends MPayError {\n constructor(\n public readonly coinType: string,\n public readonly requestAmount: bigint,\n public readonly gotAmount: bigint,\n ) {\n super(MPayErrorCode.NotEnoughBalance, `Not enough balance: ${coinType}`, {\n context: {\n coinType,\n requestAmount,\n gotAmount,\n },\n });\n }\n}\n","import { SuiClient, CoinStruct } from '@mysten/sui.js/client';\n\nimport { getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { NotEnoughBalanceError } from '../../error/NotEnoughBalanceError';\nimport { SanityError } from '../../error/SanityError';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n suiClient: SuiClient,\n owner: string,\n requestAmount: bigint,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const it = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n let totalAmount = BigInt(0);\n const res: CoinStruct[] = [];\n while ((await it.hasNext()) && totalAmount < requestAmount) {\n const val = await it.next();\n if (!val) {\n continue;\n }\n res.push(val);\n totalAmount += BigInt(val.balance);\n }\n if (totalAmount < requestAmount) {\n throw new NotEnoughBalanceError(coinType, requestAmount, totalAmount);\n }\n return res;\n}\n\nexport async function getAllOwnedCoins(\n suiClient: SuiClient,\n owner: string,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const iter = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n return (await getAllFromIterator(iter)) as CoinStruct[];\n}\n\nexport class OwnedCoinIterator extends EntryIterator<CoinStruct> {\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n super(new OwnedCoinRequester(suiClient, owner, coinType, reqPageSize));\n }\n}\n\nexport class OwnedCoinRequester implements Requester<CoinStruct> {\n nextCursor: string | null | undefined;\n\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n if (reqPageSize <= 0) {\n throw new SanityError('Invalid reqPageSize');\n }\n }\n\n async doNextRequest(): Promise<PagedData<CoinStruct>> {\n const res = await this.suiClient.getCoins({\n owner: this.owner,\n coinType: this.coinType,\n cursor: this.nextCursor,\n limit: this.reqPageSize,\n });\n this.nextCursor = res.nextCursor;\n return {\n data: res.data,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\n\nexport abstract class StreamIntention<T> extends BaseIntentionLegacy<T> {\n public application = 'mpay';\n\n getClient(network: SuiNetworks, account: WalletAccount): MPayClient {\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n return mpayClient;\n }\n}\n","import { ClaimByProxyStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimByProxyStreamIntention extends StreamIntention<ClaimByProxyStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CLAIM_BY_PROXY;\n\n constructor(public readonly data: ClaimByProxyStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.claimByProxy();\n }\n}\n","import { ClaimStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimStreamIntention extends StreamIntention<ClaimStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.claim();\n }\n}\n","import { CreateStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CreateStreamIntention extends StreamIntention<CreateStreamIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.CREATE_STREAM;\n\n constructor(public readonly data: CreateStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n return mpayClient.createStream(this.data);\n }\n}\n","// Helper class to decode move call\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return BigInt(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { Globals } from '../common';\nimport { MoveCallHelper } from './moveCall';\nimport { FeeContract } from '../contract/FeeContract';\nimport { StreamContract } from '../contract/StreamContract';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { decodeMetadata } from '../stream/metadata';\nimport { isSameTarget } from '../sui/utils';\nimport { CreateStreamInfo, RecipientWithAmount } from '../types/client';\nimport { DecodedCreateStream, StreamTransactionType } from '../types/decode';\n\nexport class CreateStreamDecodeHelper {\n constructor(\n public readonly globals: Globals,\n public readonly txb: TransactionBlock,\n ) {}\n\n decode(): DecodedCreateStream {\n const streamInfo = this.decodeCreateStreamInfo();\n const fees = this.createStreamHelper().calculateCreateStreamFees(streamInfo);\n return {\n type: StreamTransactionType.CREATE_STREAM,\n info: streamInfo,\n fees,\n };\n }\n\n private decodeCreateStreamInfo(): CreateStreamInfo {\n const moveCalls = this.createStreamTransactions();\n const infos = moveCalls.map((moveCall) => this.getCreationInfoFromMoveCall(moveCall));\n return this.aggregateGroupStreamInfo(infos);\n }\n\n private createStreamTransactions(): MoveCallHelper[] {\n const txs = this.transactions.filter(\n (tx) => tx.kind === 'MoveCall' && isSameTarget(tx.target, this.contract.createStreamTarget),\n ) as MoveCallTransaction[];\n if (txs.length === 0) {\n throw new SanityError('No create stream transactions');\n }\n return txs.map((tx) => new MoveCallHelper(tx, this.txb));\n }\n\n private getCreationInfoFromMoveCall(moveCall: MoveCallHelper): SingleStreamCreationInfo {\n const metadata = moveCall.decodeInputString(4);\n const { name, groupId } = decodeMetadata(metadata);\n\n const recipient = moveCall.decodeInputAddress(5);\n const timeStart = moveCall.decodeInputU64(6);\n const cliff = moveCall.decodeInputU64(7);\n const epochInterval = moveCall.decodeInputU64(8);\n const totalEpoch = moveCall.decodeInputU64(9);\n const amountPerEpoch = moveCall.decodeInputU64(10);\n const cancelable = moveCall.decodeInputBool(11);\n const coinType = moveCall.typeArg(0);\n\n return {\n name,\n groupId,\n recipient,\n timeStart,\n cliff,\n epochInterval,\n totalEpoch,\n amountPerEpoch,\n cancelable,\n coinType,\n };\n }\n\n private aggregateGroupStreamInfo(infos: SingleStreamCreationInfo[]): CreateStreamInfo {\n const commonInfoSet = new Set(\n infos.map((info) =>\n JSON.stringify({\n name: info.name,\n groupId: info.groupId,\n timeStart: String(info.timeStart),\n epochInterval: String(info.epochInterval),\n totalEpoch: String(info.totalEpoch),\n cancelable: info.cancelable,\n coinType: info.coinType,\n }),\n ),\n );\n if (commonInfoSet.size !== 1) {\n throw new InvalidInputError('Stream group not have common info');\n }\n const recipients: RecipientWithAmount[] = infos.map((info) => ({\n address: info.recipient,\n amountPerStep: info.amountPerEpoch,\n cliffAmount: info.cliff,\n }));\n return {\n name: infos[0].name,\n coinType: infos[0].coinType,\n recipients,\n interval: infos[0].epochInterval,\n steps: infos[0].totalEpoch,\n startTimeMs: infos[0].timeStart,\n cancelable: infos[0].cancelable,\n };\n }\n\n private mergeCoinTransactions() {\n return this.transactions.filter((tx) => tx.kind === 'MergeCoins');\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get contract() {\n return new StreamContract(this.globals.envConfig.contract, this.globals);\n }\n\n private get feeContract() {\n return new FeeContract(this.globals.envConfig.contract, this.globals);\n }\n\n private createStreamHelper() {\n return new CreateStreamHelper(this.globals, this.feeContract, this.contract);\n }\n\n private getInputArg(arg: TransactionArgument) {\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return 'value' in arg ? arg : this.txb.blockData.inputs[arg.index];\n }\n}\n\ninterface SingleStreamCreationInfo {\n name: string;\n groupId: string;\n recipient: string;\n timeStart: bigint;\n cliff: bigint;\n epochInterval: bigint;\n totalEpoch: bigint;\n amountPerEpoch: bigint;\n cancelable: boolean;\n coinType: string;\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CreateStreamDecodeHelper } from './create';\nimport { MoveCallHelper } from './moveCall';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { isSameTarget } from '../sui/utils';\nimport {\n DecodedCancelStream,\n DecodedClaimByProxy,\n DecodedClaimStream,\n DecodedCreateStream,\n DecodedSetAutoClaim,\n StreamDecodedTransaction,\n StreamTransactionType,\n} from '../types/decode';\n\nexport class StreamTransactionDecoder {\n static decodeTransaction(globals: Globals, txb: TransactionBlock): StreamDecodedTransaction {\n const helper = new DecodeHelper(globals, txb);\n return helper.decode();\n }\n}\n\nexport class DecodeHelper {\n private readonly contract: StreamContract;\n\n constructor(\n public readonly globals: Globals,\n public readonly txb: TransactionBlock,\n ) {\n this.contract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n decode(): StreamDecodedTransaction {\n if (this.isCreateStreamTransaction()) {\n return this.decodeCreateStreamTransaction();\n }\n if (this.isClaimByProxyTransaction()) {\n return this.decodeClaimByProxyTransaction();\n }\n if (this.isSetAutoClaimTransaction()) {\n return this.decodeSetAutoClaimTransaction();\n }\n if (this.isCancelStreamTransaction()) {\n return this.decodeCancelStreamTransaction();\n }\n if (this.isClaimStreamTransaction()) {\n return this.decodeClaimTransaction();\n }\n throw new Error('Unknown stream transaction type');\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private isCreateStreamTransaction() {\n const createStreamIndex = this.transactions.findIndex(\n (tx) => tx.kind === 'MoveCall' && isSameTarget(tx.target, this.contract.createStreamTarget),\n );\n return createStreamIndex !== -1;\n }\n\n private isSetAutoClaimTransaction() {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.setAutoClaimTarget)\n );\n }\n\n private isCancelStreamTransaction() {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.cancelStreamTarget)\n );\n }\n\n private isClaimStreamTransaction(): boolean {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.claimStreamTarget)\n );\n }\n\n private isClaimByProxyTransaction(): boolean {\n return (\n this.transactions.length === 1 &&\n this.transactions[0].kind === 'MoveCall' &&\n isSameTarget(this.transactions[0].target, this.contract.claimStreamByProxyTarget)\n );\n }\n\n private decodeCreateStreamTransaction(): DecodedCreateStream {\n const helper = new CreateStreamDecodeHelper(this.globals, this.txb);\n return helper.decode();\n }\n\n private decodeSetAutoClaimTransaction(): DecodedSetAutoClaim {\n const streamId = this.helper.decodeSharedObjectId(0);\n const enabled = this.helper.decodeInputBool(1);\n return {\n type: StreamTransactionType.SET_AUTO_CLAIM,\n streamId,\n enabled,\n };\n }\n\n private decodeClaimTransaction(): DecodedClaimStream {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CLAIM,\n streamId,\n };\n }\n\n private decodeClaimByProxyTransaction(): DecodedClaimByProxy {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CLAIM_BY_PROXY,\n streamId,\n };\n }\n\n private decodeCancelStreamTransaction(): DecodedCancelStream {\n const streamId = this.helper.decodeSharedObjectId(0);\n return {\n type: StreamTransactionType.CANCEL,\n streamId,\n };\n }\n\n private get helper() {\n const moveCall = this.transactions[0] as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n","import { SetAutoClaimIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { StreamIntention } from './intention';\nimport { StreamTransactionType } from './types/decode';\n\nexport class SetAutoClaimStreamIntention extends StreamIntention<SetAutoClaimIntentionData> {\n txType = TransactionType.Stream;\n\n txSubType = StreamTransactionType.SET_AUTO_CLAIM;\n\n constructor(public readonly data: SetAutoClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n const mpayClient = this.getClient(network, account);\n const stream = await mpayClient.getStream(this.data.streamId);\n return stream.setAutoClaim(this.data.enabled);\n }\n}\n","import {\n CancelStreamIntentionData,\n ClaimByProxyStreamIntentionData,\n ClaimStreamIntentionData,\n CreateStreamIntentionData,\n SetAutoClaimIntentionData,\n TransactionType,\n} from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { CancelStreamIntention } from './cancel-stream';\nimport { ClaimByProxyStreamIntention } from './claim-by-proxy-stream';\nimport { ClaimStreamIntention } from './claim-stream';\nimport { Env, Globals } from './common';\nimport { CreateStreamIntention } from './create-stream';\nimport { DecodeHelper } from './decoder/decoder';\nimport { SetAutoClaimStreamIntention } from './set-auto-claim-stream';\nimport { StreamTransactionType } from './types/decode';\n\nexport type MPayIntention =\n | CreateStreamIntention\n | SetAutoClaimStreamIntention\n | ClaimStreamIntention\n | CancelStreamIntention\n | ClaimByProxyStreamIntention;\n\nexport type MPayIntentionData =\n | CreateStreamIntentionData\n | SetAutoClaimIntentionData\n | ClaimStreamIntentionData\n | ClaimByProxyStreamIntentionData\n | CancelStreamIntentionData;\n\nexport class MPayAppHelper implements IAppHelperInternalLegacy<MPayIntentionData> {\n application = 'mpay';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: string; intentionData: MPayIntentionData }> {\n const { network, transactionBlock } = input;\n const globals = Globals.new(network === 'sui:mainnet' ? Env.prod : Env.dev);\n const decoder = new DecodeHelper(globals, transactionBlock);\n const result = decoder.decode();\n\n let intention: MPayIntention;\n\n switch (result.type) {\n case StreamTransactionType.CREATE_STREAM:\n intention = new CreateStreamIntention(result.info);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = new SetAutoClaimStreamIntention({ streamId: result.streamId, enabled: result.enabled });\n break;\n case StreamTransactionType.CLAIM:\n intention = new ClaimStreamIntention({ streamId: result.streamId });\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = new ClaimByProxyStreamIntention({ streamId: result.streamId });\n break;\n case StreamTransactionType.CANCEL:\n intention = new CancelStreamIntention({ streamId: result.streamId });\n break;\n default:\n throw new Error(`Unknown transaction type: ${result}`);\n }\n\n return {\n txType: intention.txType,\n txSubType: intention.txSubType,\n intentionData: intention.data,\n };\n }\n\n async build(input: {\n intentionData: MPayIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { intentionData } = input;\n let intention: MPayIntention;\n switch (input.txSubType as StreamTransactionType) {\n case StreamTransactionType.CREATE_STREAM:\n intention = new CreateStreamIntention(intentionData as CreateStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM:\n intention = new ClaimStreamIntention(intentionData as ClaimStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = new ClaimByProxyStreamIntention(intentionData as ClaimByProxyStreamIntentionData);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = new SetAutoClaimStreamIntention(intentionData as SetAutoClaimIntentionData);\n break;\n case StreamTransactionType.CANCEL:\n intention = new CancelStreamIntention(intentionData as CancelStreamIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ ...input });\n }\n}\n","import { TransactionDefaultApplication, TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { CoinTransferIntention, CoinTransferIntentionData } from '@/apps/msafe-core/coin-transfer';\n\nimport { ObjectTransferIntention, ObjectTransferIntentionData } from './object-transfer';\n\nexport type CoreIntention = CoinTransferIntention | ObjectTransferIntention;\n\nexport type CoreIntentionData = CoinTransferIntentionData | ObjectTransferIntentionData;\n\nexport class CoreHelper implements IAppHelperInternalLegacy<CoreIntentionData> {\n application = 'msafe-core';\n\n supportSDK = '@mysten/sui.js' as const;\n\n constructor() {\n this.application = TransactionDefaultApplication;\n }\n\n deserialize(): Promise<{ txType: TransactionType; txSubType: string; intentionData: CoreIntentionData }> {\n throw new Error('MSafe core transaction intention should be build from API');\n }\n\n async build(input: {\n intentionData: CoreIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: CoreIntention;\n switch (input.txSubType) {\n case TransactionSubTypes.assets.coin.send:\n intention = CoinTransferIntention.fromData(input.intentionData as CoinTransferIntentionData);\n break;\n case TransactionSubTypes.assets.object.send:\n intention = ObjectTransferIntention.fromData(input.intentionData as ObjectTransferIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { TransactionType, buildCoinTransferTxb } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nexport interface CoinTransferIntentionData {\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport class CoinTransferIntention extends BaseIntentionLegacy<CoinTransferIntentionData> {\n txType: TransactionType.Assets;\n\n txSubType: 'SendCoin';\n\n constructor(public readonly data: CoinTransferIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n return buildCoinTransferTxb(suiClient, this.data, account.address);\n }\n\n static fromData(data: CoinTransferIntentionData) {\n return new CoinTransferIntention(data);\n }\n}\n","import { TransactionType, buildObjectTransferTxb } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nexport interface ObjectTransferIntentionData {\n receiver: string;\n objectType: string;\n objectId: string;\n}\n\nexport class ObjectTransferIntention extends BaseIntentionLegacy<ObjectTransferIntentionData> {\n txType: TransactionType.Assets;\n\n txSubType: 'SendObject';\n\n constructor(public readonly data: ObjectTransferIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n return buildObjectTransferTxb(suiClient, this.data, account.address);\n }\n\n static fromData(data: ObjectTransferIntentionData) {\n return new ObjectTransferIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount, SuiSignTransactionBlockInput } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { updatePackageId } from './config';\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention, ClaimRewardIntentionData } from './intentions/claim-reward';\nimport { ClaimSupplyIntention, ClaimSupplyIntentionData } from './intentions/claim-supply';\nimport { EntryBorrowIntention, EntryBorrowIntentionData } from './intentions/entry-borrow';\nimport { EntryDepositIntention, EntryDepositIntentionData } from './intentions/entry-deposit';\nimport { EntryRepayIntention, EntryRepayIntentionData } from './intentions/entry-repay';\nimport { EntryWithdrawIntention, EntryWithdrawIntentionData } from './intentions/entry-withdraw';\nimport { EntryMultiDepositIntention, EntryMultiDepositIntentionData } from './intentions/multi-deposit';\nimport { TransactionSubType } from './types';\n\nexport type NAVIIntention =\n | EntryDepositIntention\n | EntryBorrowIntention\n | EntryRepayIntention\n | EntryWithdrawIntention\n | EntryMultiDepositIntention\n | ClaimRewardIntention\n | ClaimSupplyIntention;\n\nexport type NAVIIntentionData =\n | EntryDepositIntentionData\n | EntryBorrowIntentionData\n | EntryRepayIntentionData\n | EntryWithdrawIntentionData\n | EntryMultiDepositIntentionData\n | ClaimRewardIntentionData\n | ClaimSupplyIntentionData;\n\nexport class NAVIAppHelper implements IAppHelperInternalLegacy<NAVIIntentionData> {\n application = 'navi';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: TransactionSubType; intentionData: NAVIIntentionData }> {\n await updatePackageId();\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: NAVIIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: NAVIIntention;\n await updatePackageId();\n switch (input.txSubType) {\n case TransactionSubType.EntryDeposit:\n intention = EntryDepositIntention.fromData(input.intentionData as EntryDepositIntentionData);\n break;\n case TransactionSubType.EntryBorrow:\n intention = EntryBorrowIntention.fromData(input.intentionData as EntryBorrowIntentionData);\n break;\n case TransactionSubType.EntryRepay:\n intention = EntryRepayIntention.fromData(input.intentionData as EntryRepayIntentionData);\n break;\n case TransactionSubType.EntryWithdraw:\n intention = EntryWithdrawIntention.fromData(input.intentionData as EntryWithdrawIntentionData);\n break;\n case TransactionSubType.EntryMultiDeposit:\n intention = EntryMultiDepositIntention.fromData(input.intentionData as EntryMultiDepositIntentionData);\n break;\n case TransactionSubType.ClaimReward:\n intention = ClaimRewardIntention.fromData(input.intentionData as ClaimRewardIntentionData);\n break;\n case TransactionSubType.EntryClaimAndDeposit:\n intention = ClaimSupplyIntention.fromData(input.intentionData as ClaimSupplyIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { CoinType, type Pool } from './types';\n\nlet updated = false;\n\nconst config = {\n ProtocolPackage: '0x81c408448d0d57b3e371ea94de1d40bf852784d3e225de1e74acab3e8395c18f',\n StorageId: '0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe',\n Incentive: '0xaaf735bf83ff564e1b219a0d644de894ef5bdc4b2250b126b2a46dd002331821',\n IncentiveV2: '0xf87a8acb8b81d14307894d12595541a73f19933f88e1326d5be349c7a6f7559c', // The new incentive version: V2\n gasBudget: 50_000_000,\n PriceOracle: '0x1568865ed9a0b5ec414220e8f79b3d04c77acc82358f6e5ae4635687392ffbef',\n ReserveParentId: '0xe6d4c6610b86ce7735ea754596d71d72d10c7980b5052fc3c8cdf8d09fea9b4b', // get it from storage object id. storage.reserves\n pool: {\n sui: {\n name: 'SUI',\n assetId: 0,\n poolId: '0x96df0fce3c471489f4debaaa762cf960b3d97820bd1f3f025ff8190730e958c5',\n fondPoolId: '0xf975bc2d4cca10e3ace8887e20afd77b46c383b4465eac694c4688344955dea4',\n type: '0x2::sui::SUI',\n coinType: CoinType.sui,\n reserveObjectId: '0xab644b5fd11aa11e930d1c7bc903ef609a9feaf9ffe1b23532ad8441854fbfaf',\n borrowBalanceParentId: '0xe7ff0daa9d090727210abe6a8b6c0c5cd483f3692a10610386e4dc9c57871ba7',\n supplyBalanceParentId: '0x589c83af4b035a3bc64c40d9011397b539b97ea47edf7be8f33d643606bf96f8',\n },\n wusdc: {\n name: 'wUSDC',\n assetId: 1,\n coinType: CoinType.wusdc,\n poolId: '0xa02a98f9c88db51c6f5efaaf2261c81f34dd56d86073387e0ef1805ca22e39c8',\n type: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf::coin::COIN',\n reserveObjectId: '0xeb3903f7748ace73429bd52a70fff278aac1725d3b58afa781f25ce3450ac203',\n borrowBalanceParentId: '0x8a3aaa817a811131c624658f6e77cba04ab5829293d2c49c1a9cce8ac9c8dec4',\n supplyBalanceParentId: '0x8d0a4467806458052d577c8cd2be6031e972f2b8f5f77fce98aa12cd85330da9',\n },\n usdt: {\n name: 'USDT',\n coinType: CoinType.usdt,\n assetId: 2,\n poolId: '0x0e060c3b5b8de00fb50511b7a45188c8e34b6995c01f69d98ea5a466fe10d103',\n type: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',\n reserveObjectId: '0xb8c5eab02a0202f638958cc79a69a2d30055565caad1684b3c8bbca3bddcb322',\n borrowBalanceParentId: '0xc14d8292a7d69ae31164bafab7ca8a5bfda11f998540fe976a674ed0673e448f',\n supplyBalanceParentId: '0x7e2a49ff9d2edd875f82b76a9b21e2a5a098e7130abfd510a203b6ea08ab9257',\n },\n weth: {\n name: 'WETH',\n coinType: CoinType.weth,\n assetId: 3,\n poolId: '0x71b9f6e822c48ce827bceadce82201d6a7559f7b0350ed1daa1dc2ba3ac41b56',\n type: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5::coin::COIN',\n reserveObjectId: '0xafecf4b57899d377cc8c9de75854c68925d9f512d0c47150ca52a0d3a442b735',\n borrowBalanceParentId: '0x7568d06a1b6ffc416a36c82791e3daf0e621cf19d4a2724fc6f74842661b6323',\n supplyBalanceParentId: '0xa668905b1ad445a3159b4d29b1181c4a62d864861b463dd9106cc0d97ffe8f7f',\n },\n cetus: {\n name: 'CETUS',\n coinType: CoinType.cetus,\n assetId: 4,\n poolId: '0x3c376f857ec4247b8ee456c1db19e9c74e0154d4876915e54221b5052d5b1e2e',\n type: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b::cetus::CETUS',\n reserveObjectId: '0x66a807c06212537fe46aa6719a00e4fa1e85a932d0b53ce7c4b1041983645133',\n borrowBalanceParentId: '0x4c3da45ffff6432b4592a39cdb3ce12f4a28034cbcb804bb071facc81fdd923d',\n supplyBalanceParentId: '0x6adc72faf2a9a15a583c9fb04f457c6a5f0b456bc9b4832413a131dfd4faddae',\n },\n voloSui: {\n name: 'VoloSui',\n coinType: CoinType.voloSui,\n assetId: 5,\n poolId: '0x9790c2c272e15b6bf9b341eb531ef16bcc8ed2b20dfda25d060bf47f5dd88d01',\n fondPoolId: '0xe2b5ada45273676e0da8ae10f8fe079a7cec3d0f59187d3d20b1549c275b07ea',\n type: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n reserveObjectId: '0xd4fd7e094af9819b06ea3136c13a6ae8da184016b78cf19773ac26d2095793e2',\n borrowBalanceParentId: '0x8fa5eccbca2c4ba9aae3b87fd44aa75aa5f5b41ea2d9be4d5321379384974984',\n supplyBalanceParentId: '0xe6457d247b6661b1cac123351998f88f3e724ff6e9ea542127b5dcb3176b3841',\n },\n haSui: {\n name: 'HaedalSui',\n coinType: CoinType.haSui,\n assetId: 6,\n poolId: '0x6fd9cb6ebd76bc80340a9443d72ea0ae282ee20e2fd7544f6ffcd2c070d9557a',\n fondPoolId: '0xa20e18085ce04be8aa722fbe85423f1ad6b1ae3b1be81ffac00a30f1d6d6ab51',\n type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n reserveObjectId: '0x0c9f7a6ca561dc566bd75744bcc71a6af1dc3caf7bd32c099cd640bb5f3bb0e3',\n borrowBalanceParentId: '0x01f36898e020be6c3423e5c95d9f348868813cd4d0be39b0c8df9d8de4722b00',\n supplyBalanceParentId: '0x278b8e3d09c3548c60c51ed2f8eed281876ea58c392f71b7ff650cc9286d095b',\n },\n navx: {\n name: 'NAVX',\n coinType: CoinType.navx,\n assetId: 7,\n poolId: '0xc0e02e7a245e855dd365422faf76f87d9f5b2148a26d48dda6e8253c3fe9fa60',\n fondPoolId: '0x9dae0cf104a193217904f88a48ce2cf0221e8cd9073878edd05101d6b771fa09',\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n reserveObjectId: '0x2e13b2f1f714c0c5fa72264f147ef7632b48ec2501f810c07df3ccb59d6fdc81',\n borrowBalanceParentId: '0xa5bf13075aa400cbdd4690a617c5f008e1fae0511dcd4f7121f09817df6c8d8b',\n supplyBalanceParentId: '0x59dedca8dc44e8df50b190f8b5fe673098c1273ac6168c0a4addf3613afcdee5',\n },\n wbtc: {\n name: 'WBTC',\n coinType: CoinType.wbtc,\n assetId: 8,\n poolId: '0xd162cbe40f8829ce71c9b3d3bf3a83859689a79fa220b23d70dc0300b777ae6e',\n type: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881::coin::COIN',\n reserveObjectId: '0x8b4d81f004e4e9faf4540951a896b6d96e42598a270e6375f598b99742db767e',\n borrowBalanceParentId: '0x55e1f3c9e6e5cf9fff563bdd61db07a3826458c56ef72c455e049ab3b1b0e99c',\n supplyBalanceParentId: '0x821e505a0091b089edba94deaa14c2f2230d026bbaa7b85680554441aad447e0',\n },\n ausd: {\n name: 'AUSD',\n coinType: CoinType.ausd,\n assetId: 9,\n poolId: '0xc9208c1e75f990b2c814fa3a45f1bf0e85bb78404cfdb2ae6bb97de58bb30932',\n type: '0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD',\n reserveObjectId: '0x918889c6a9d9b93108531d4d59a4ebb9cc4d41689798ffc1d4aed6e1ae816ec0',\n borrowBalanceParentId: '0x551300b9441c9a3a16ca1d7972c1dbb4715e15004ccd5f001b2c2eee22fd92c1',\n supplyBalanceParentId: '0xe151af690355de8be1c0281fbd0d483c099ea51920a57c4bf8c9666fd36808fd',\n },\n nusdc: {\n name: 'USDC',\n assetId: 10,\n coinType: CoinType.nusdc,\n poolId: '0xa3582097b4c57630046c0c49a88bfc6b202a3ec0a9db5597c31765f7563755a8',\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n reserveObjectId: '0x4c8a2c72a22ae8da803a8519798d312c86e74a9e0d6ec0eec2bfcf7e4b3fef5e',\n borrowBalanceParentId: '0xb0b0c7470e96cabbb4f1e8d06bef2fbea65f4dbac52afae8635d9286b1ea9a09',\n supplyBalanceParentId: '0x08b5ce8574ac3bc9327e66ad5decd34d07ee798f724ad01058e8855ac9acb605',\n },\n eth: {\n name: 'ETH',\n assetId: 11,\n coinType: CoinType.eth,\n poolId: '0x78ba01c21d8301be15690d3c30dc9f111871e38cfb0b2dd4b70cc6052fba41bb',\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n reserveObjectId: '0x376faea6dfbffab9ea808474cb751d91222b6d664f38c0f1d23de442a8edb1ce',\n borrowBalanceParentId: '0xf0c6ce5cfaee96073876a5fab7426043f3a798b79502c4caeb6d9772cd35af1f',\n supplyBalanceParentId: '0xc0a0cb43620eb8a84d5a4a50a85650e7fa7ba81e660f9cc2863404fd84591d4b',\n },\n usdy: {\n name: 'USDY',\n assetId: 12,\n coinType: CoinType.usdy,\n poolId: '0x4b6253a9f8cf7f5d31e6d04aed4046b9e325a1681d34e0eff11a8441525d4563',\n type: '0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY',\n reserveObjectId: '',\n borrowBalanceParentId: '',\n supplyBalanceParentId: '',\n },\n } as Pool,\n borrowFee: 0.003,\n borrowFeeAddress: '0x70b9b10704263cf53392849e33b1f5fd16005869b4198ed5524836bad1234ea2',\n};\n\nexport async function updatePackageId() {\n if (updated) {\n return;\n }\n try {\n const data = await fetch('https://open-api.naviprotocol.io/api/msafe').then((res) => res.json());\n const { packageId, borrowFee, borrowFeeAddress, pool } = data;\n if (packageId) {\n config.ProtocolPackage = packageId;\n }\n if (borrowFee) {\n config.borrowFee = borrowFee;\n }\n if (borrowFeeAddress) {\n config.borrowFeeAddress = borrowFeeAddress;\n }\n if (pool) {\n config.pool = pool;\n }\n updated = true;\n } catch (e: any) {\n console.error(e.message);\n }\n}\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n decode() {\n console.log('txb', this.txb);\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isEntryBorrowTransaction()) {\n return this.decodeEntryBorrow();\n }\n if (this.isEntryBorrowWithFeeTransaction()) {\n return this.decodeEntryBorrow();\n }\n if (this.isEntryMultiDepositTransaction()) {\n return this.decodeEntryMultiDeposit();\n }\n if (this.isEntryDepositTransaction()) {\n return this.decodeEntryDeposit();\n }\n if (this.isEntryRepayTransaction()) {\n return this.decodeEntryRepay();\n }\n if (this.isEntryWithdrawTransaction()) {\n return this.decodeEntryWithdraw();\n }\n if (this.isEntryClaimAndDepositTransaction()) {\n return this.decodeEntryClaimAndDeposit();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isClaimRewardTransaction() {\n const claimTrans = this.transactions.find((trans) => {\n if (trans.kind === 'MoveCall' && trans.target.includes('claim_reward')) {\n return true;\n }\n return false;\n });\n return !!claimTrans;\n }\n\n private isEntryBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_borrow`);\n }\n\n private isEntryBorrowWithFeeTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::borrow`);\n }\n\n private isEntryMultiDepositTransaction() {\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n const transactions = this.transactions.filter((trans) => trans.kind === 'MoveCall' && trans.target === target);\n const claimTransaction = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.includes('claim_reward'),\n );\n if (claimTransaction) {\n return false;\n }\n return transactions.length > 1;\n }\n\n private isEntryClaimAndDepositTransaction() {\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n const transactions = this.transactions.filter((trans) => trans.kind === 'MoveCall' && trans.target === target);\n const claimTransaction = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.includes('claim_reward'),\n );\n if (claimTransaction && transactions.length > 0) {\n return true;\n }\n return false;\n }\n\n private isEntryDepositTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_deposit`);\n }\n\n private isEntryRepayTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::entry_repay`);\n }\n\n private isEntryWithdrawTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v3::withdraw`);\n }\n\n private findPoolByAssetId(assetId: number) {\n const findPool = Object.values(config.pool).find((pool) => pool.assetId === assetId);\n if (!findPool) {\n throw new Error('Pool not found');\n }\n return findPool;\n }\n\n private decodeEntryClaimAndDeposit(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryClaimAndDeposit,\n intentionData: {\n type: 'entry_claim_and_deposit',\n },\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n console.log('decode claims');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimReward,\n intentionData: {\n type: 'claim_reward',\n },\n };\n }\n\n private decodeEntryBorrow(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryBorrow,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryMultiDeposit(): DecodeResult {\n const list = [] as {\n amount: number;\n assetId: number;\n }[];\n const target = `${config.ProtocolPackage}::incentive_v3::entry_deposit`;\n this.transactions.forEach((trans) => {\n if (trans.kind === 'MoveCall' && trans.target === target) {\n const helper = new MoveCallHelper(trans, this.txb);\n const assetId = helper.decodeInputU8(3);\n const amount = helper.decodeInputU64(5);\n list.push({\n assetId,\n amount,\n });\n }\n });\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryMultiDeposit,\n intentionData: {\n list,\n },\n };\n }\n\n private decodeEntryDeposit(): DecodeResult {\n const assetId = this.helper.decodeInputU8(3);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryDeposit,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryRepay(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(6);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryRepay,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private decodeEntryWithdraw(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryWithdraw,\n intentionData: {\n amount,\n assetId,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(config.ProtocolPackage),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport type { TransactionBlock } from '@mysten/sui.js/transactions';\nimport {\n depositCoin,\n withdrawCoin,\n repayDebt,\n borrowCoin,\n claimAllRewardsPTB,\n claimAllRewardsResupplyPTB,\n} from 'navi-sdk';\nimport { PoolConfig } from 'navi-sdk/dist/types';\n\nexport async function depositToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n await depositCoin(txb as any, pool, coinObject, amount);\n return txb;\n}\n\nexport async function withdrawToken(txb: TransactionBlock, pool: PoolConfig, amount: number, userAddress: string) {\n const [coin] = await withdrawCoin(txb as any, pool, amount);\n txb.transferObjects([coin as any], txb.pure(userAddress));\n return txb;\n}\n\nexport async function borrowToken(tx: TransactionBlock, pool: PoolConfig, amount: number, userAddress: string) {\n const [borrowedCoin] = await borrowCoin(tx as any, pool, amount);\n tx.transferObjects([borrowedCoin as any], tx.pure.address(userAddress));\n\n return tx;\n}\n\nexport async function repayToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n await repayDebt(txb as any, pool, coinObject, amount);\n return txb;\n}\n\nexport async function claimReward(client: SuiClient, userAddress: string) {\n const txb = await claimAllRewardsPTB(client as any, userAddress);\n return txb as any;\n}\n\nexport async function claimSupply(client: SuiClient, userAddress: string) {\n const txb = await claimAllRewardsResupplyPTB(client as any, userAddress);\n return txb as any;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { claimReward } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimRewardIntentionData {\n type: string;\n}\n\nexport class ClaimRewardIntention extends BaseIntentionLegacy<ClaimRewardIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimReward;\n\n constructor(public readonly data: ClaimRewardIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { type } = this.data;\n console.log('claim reward', type);\n const txb = await claimReward(input.suiClient, input.account.address);\n return txb;\n }\n\n static fromData(data: ClaimRewardIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { claimSupply } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimSupplyIntentionData {\n type: string;\n}\n\nexport class ClaimSupplyIntention extends BaseIntentionLegacy<ClaimSupplyIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryClaimAndDeposit;\n\n constructor(public readonly data: ClaimSupplyIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { type } = this.data;\n console.log('claim reward and supply', type);\n const txb = await claimSupply(input.suiClient, input.account.address);\n return txb;\n }\n\n static fromData(data: ClaimSupplyIntentionData) {\n return new ClaimSupplyIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { borrowToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryBorrowIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryBorrowIntention extends BaseIntentionLegacy<EntryBorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryBorrow;\n\n constructor(public readonly data: EntryBorrowIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<TransactionBlock> {\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n const txb = await borrowToken(tx, pool, amount, input.account.address);\n return txb;\n }\n\n static fromData(data: EntryBorrowIntentionData) {\n return new EntryBorrowIntention(data);\n }\n}\n","import { pool } from 'navi-sdk';\n\nexport function getPoolConfigByAssetId(assetId: string | number) {\n return Object.values(pool).find((item) => String(item.assetId) === String(assetId));\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryDepositIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryDepositIntention extends BaseIntentionLegacy<EntryDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryDeposit;\n\n constructor(public readonly data: EntryDepositIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n const txb = await depositToken(tx, pool, toDeposit, amount);\n return txb;\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let i = 1;\n while (i < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n i++;\n }\n }\n\n const txb = await depositToken(tx, pool, tx.object(coinObj), amount);\n return txb;\n }\n\n static fromData(data: EntryDepositIntentionData) {\n return new EntryDepositIntention(data);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nexport async function getTokenAmount(client: SuiClient, sender: string, coinType: string): Promise<number> {\n if (!sender) {\n throw new Error('Sender is undefined.');\n }\n if (!client) {\n throw new Error('Client is undefined.');\n }\n const coinInfo = await client.getBalance({\n owner: sender,\n coinType,\n });\n const tokenBalance = Number(coinInfo.totalBalance);\n return tokenBalance;\n}\n\nexport async function getTokenObjs(client: SuiClient, sender: string, coinType: string): Promise<any> {\n const result = await client.getCoins({\n owner: sender,\n coinType,\n });\n console.log('getTokenObjs', sender, result);\n return result;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { repayToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryRepayIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryRepayIntention extends BaseIntentionLegacy<EntryRepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryRepay;\n\n constructor(public readonly data: EntryRepayIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return repayToken(tx, pool, toDeposit, amount);\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let i = 1;\n while (i < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[i].coinObjectId]);\n i++;\n }\n }\n\n return repayToken(tx, pool, tx.object(coinObj), amount);\n }\n\n static fromData(data: EntryRepayIntentionData) {\n return new EntryRepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { withdrawToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryWithdrawIntentionData {\n amount: number;\n assetId: number;\n}\n\nexport class EntryWithdrawIntention extends BaseIntentionLegacy<EntryWithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryWithdraw;\n\n constructor(public readonly data: EntryWithdrawIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<TransactionBlock> {\n const { assetId, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n const pool = getPoolConfigByAssetId(assetId);\n\n const txb = await withdrawToken(tx, pool, amount, input.account.address);\n return txb;\n }\n\n static fromData(data: EntryWithdrawIntentionData) {\n return new EntryWithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { depositToken } from '../api/incentiveV2';\nimport { TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\nimport { getPoolConfigByAssetId } from '../utils/tools';\n\nexport interface EntryMultiDepositIntentionData {\n list: {\n amount: number;\n assetId: number;\n }[];\n}\n\nexport class EntryMultiDepositIntention extends BaseIntentionLegacy<EntryMultiDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.EntryDeposit;\n\n constructor(public readonly data: EntryMultiDepositIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const { list } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n\n for (let i = 0; i < list.length; i++) {\n const { assetId, amount } = list[i];\n const pool = getPoolConfigByAssetId(assetId);\n if (assetId === 0) {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n await depositToken(tx, pool, toDeposit, amount);\n continue;\n }\n\n const tokenInfo = await getTokenObjs(suiClient, account.address, pool.type);\n if (!tokenInfo.data[0]) {\n throw new Error(`Insufficient balance for ${pool.name} Token`);\n }\n\n const coinObj = tokenInfo.data[0].coinObjectId;\n\n if (tokenInfo.data.length >= 2) {\n let j = 1;\n while (j < tokenInfo.data.length) {\n tx.mergeCoins(coinObj, [tokenInfo.data[j].coinObjectId]);\n j++;\n }\n }\n\n await depositToken(tx, pool, tx.object(coinObj), amount);\n }\n\n return tx;\n }\n\n static fromData(data: EntryMultiDepositIntentionData) {\n return new EntryMultiDepositIntention(data);\n }\n}\n","import { TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { fromHex } from '@mysten/bcs';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { IAppHelperInternal, TransactionIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nexport type PlainTransactionData = {\n content: string;\n};\n\nexport const PlainTransactionApplication = 'msafe-plain-tx';\nexport const PlainTransactionType = TransactionSubTypes.others.plain;\n\nexport class PlainTransactionIntention implements TransactionIntention<PlainTransactionData> {\n application = PlainTransactionApplication;\n\n txType = TransactionType.Other;\n\n txSubType = PlainTransactionType;\n\n protected constructor(public readonly data: PlainTransactionData) {}\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks }): Promise<Transaction> {\n return Transaction.from(fromHex(this.data.content));\n }\n\n static fromData(data: PlainTransactionData) {\n return new PlainTransactionIntention(data);\n }\n}\n\nexport class PlainTransactionHelper implements IAppHelperInternal<PlainTransactionData> {\n application: string;\n\n supportSDK = '@mysten/sui' as const;\n\n constructor() {\n this.application = PlainTransactionApplication;\n }\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext: {\n content: string;\n };\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {\n const { content } = input.appContext;\n\n return {\n txType: TransactionType.Other,\n txSubType: PlainTransactionType,\n intentionData: { content },\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: PlainTransactionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { suiClient, network, account } = input;\n const intention = PlainTransactionIntention.fromData(input.intentionData);\n return intention.build({ suiClient, network, account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiClient as SuiClientLegacy } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelper } from '@/apps/interface/common';\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { MSafeHTTPTransport } from '@/lib/MSafeHTTPTransport';\nimport { SuiNetworks } from '@/types';\n\nexport class MSafeApps {\n apps: Map<string, IAppHelper<any>>;\n\n private constructor() {\n this.apps = new Map<string, IAppHelper<any>>();\n }\n\n static fromHelpers(apps: (IAppHelperInternalLegacy<any> | IAppHelperInternal<any>)[]) {\n const mApps = new MSafeApps();\n for (let i = 0; i < apps.length; i++) {\n const app = apps[i];\n switch (app.supportSDK) {\n case '@mysten/sui.js':\n mApps.addLegacyHelper(app);\n break;\n case '@mysten/sui':\n mApps.addHelper(app);\n break;\n default:\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n throw new Error(`${app.application}: ${app.supportSDK} SDK not supported`);\n }\n }\n return mApps;\n }\n\n addLegacyHelper(app: IAppHelperInternalLegacy<any>) {\n this.apps.set(app.application, new SuiJsSdkAdapter(app));\n }\n\n addHelper(app: IAppHelperInternal<any>) {\n this.apps.set(app.application, new SuiSdkAdapter(app));\n }\n\n getAppHelper(appName: string): IAppHelper<any> {\n const app = this.apps.get(appName);\n if (!app) {\n throw new Error(`${appName} not registered`);\n }\n return app;\n }\n}\n\n/*\n SuiSdkAdapter adapts IAppHelperInternal with @mysten/sui to IAppHelper\n TODO: build to @mysten/sui Transaction after update sdk and api\n */\nexport class SuiSdkAdapter implements IAppHelper<any> {\n constructor(public helper: IAppHelperInternal<any>) {}\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n clientUrl: string;\n account: WalletAccount;\n },\n ) {\n const client = new SuiClient({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n const clientLegacy = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n const build = await input.transactionBlock.build({ client: clientLegacy });\n const tx = Transaction.from(build);\n return this.helper.deserialize({ ...input, suiClient: client, transaction: tx });\n }\n\n async build(input: {\n intentionData: any;\n txType: TransactionType;\n txSubType: string;\n clientUrl: string;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const client = new SuiClient({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n // fetch account sui balance, check if sui balance is greater or equal to 0.1 SUI\n const accountSuiBalance = await client.getBalance({ owner: input.account.address });\n if (Number(accountSuiBalance.totalBalance) < 100000000) {\n throw new Error('Insufficient gas fee');\n }\n const tx = await this.helper.build({ ...input, suiClient: client });\n tx.setSender(input.account.address);\n const bytes = await tx.build({ client });\n return TransactionBlock.from(bytes);\n }\n}\n\n/*\n SuiJsSdkAdapter adapts IAppHelperInternalLegacy with @mysten/sui.js to IAppHelper\n TODO: build to @mysten/sui Transaction after update sdk and api\n */\nexport class SuiJsSdkAdapter implements IAppHelper<any> {\n constructor(public helper: IAppHelperInternalLegacy<any>) {}\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n clientUrl: string;\n account: WalletAccount;\n },\n ) {\n const client = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n return this.helper.deserialize({ ...input, transactionBlock: input.transactionBlock, suiClient: client });\n }\n\n async build(input: {\n intentionData: any;\n txType: TransactionType;\n txSubType: string;\n clientUrl: string;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const client = new SuiClientLegacy({\n transport: new MSafeHTTPTransport({\n url: input.clientUrl,\n rpc: {\n url: input.clientUrl,\n },\n }),\n });\n // fetch account sui balance, check if sui balance is greater or equal to 0.1 SUI\n const accountSuiBalance = await client.getBalance({ owner: input.account.address });\n if (Number(accountSuiBalance.totalBalance) < 100000000) {\n throw new Error('Insufficient gas fee');\n }\n return this.helper.build({ ...input, suiClient: client });\n }\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RequestManager, HTTPTransport, Client } from '@open-rpc/client-js';\n\nimport { WebsocketClient, WebsocketClientOptions } from './rpc-websocket-client';\n\n/**\n * An object defining headers to be passed to the RPC server\n */\nexport type HttpHeaders = { [header: string]: string };\n\ninterface SuiHTTPTransportOptions {\n url: string;\n rpc?: {\n headers?: HttpHeaders;\n url?: string;\n };\n websocket?: WebsocketClientOptions & {\n url?: string;\n };\n}\n\nexport interface SuiTransportRequestOptions {\n method: string;\n params: unknown[];\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\n\nexport interface SuiTransportSubscribeOptions<T> {\n method: string;\n unsubscribe: string;\n params: unknown[];\n onMessage: (event: T) => void;\n}\n\nexport interface SuiTransport {\n request<T = unknown>(input: SuiTransportRequestOptions): Promise<T>;\n subscribe<T = unknown>(input: SuiTransportSubscribeOptions<T>): Promise<() => Promise<boolean>>;\n}\n\nexport class MSafeHTTPTransport implements SuiTransport {\n private rpcClient: Client;\n\n private websocketClient: WebsocketClient;\n\n constructor({\n url,\n websocket: { url: websocketUrl, ...websocketOptions } = {} as WebsocketClientOptions,\n rpc,\n }: SuiHTTPTransportOptions) {\n const transport = new HTTPTransport(rpc?.url ?? url, {\n headers: {\n 'Content-Type': 'application/json',\n ...rpc?.headers,\n },\n });\n\n this.rpcClient = new Client(new RequestManager([transport]));\n this.websocketClient = new WebsocketClient(websocketUrl ?? url, websocketOptions);\n }\n\n async request<T>(input: SuiTransportRequestOptions): Promise<T> {\n // eslint-disable-next-line @typescript-eslint/return-await\n return await this.rpcClient.request(input);\n }\n\n async subscribe<T>(input: SuiTransportSubscribeOptions<T>): Promise<() => Promise<boolean>> {\n const unsubscribe = await this.websocketClient.subscribe(input);\n\n return async () => !!(await unsubscribe());\n }\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nconst CODE_TO_ERROR_TYPE: Record<number, string> = {\n '-32700': 'ParseError',\n '-32600': 'InvalidRequest',\n '-32601': 'MethodNotFound',\n '-32602': 'InvalidParams',\n '-32603': 'InternalError',\n};\n\nexport class SuiHTTPTransportError extends Error {}\n\nexport class JsonRpcError extends SuiHTTPTransportError {\n code: number;\n\n type: string;\n\n constructor(message: string, code: number) {\n super(message);\n this.code = code;\n this.type = CODE_TO_ERROR_TYPE[code] ?? 'ServerError';\n }\n}\n\nexport class SuiHTTPStatusError extends SuiHTTPTransportError {\n status: number;\n\n statusText: string;\n\n constructor(message: string, status: number, statusText: string) {\n super(message);\n this.status = status;\n this.statusText = statusText;\n }\n}\n","/* eslint-disable object-shorthand */\n/* eslint-disable curly */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/lines-between-class-members */\n// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcError } from './errors';\n\nfunction getWebsocketUrl(httpUrl: string): string {\n const url = new URL(httpUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n return url.toString();\n}\n\ntype JsonRpcMessage =\n | {\n id: number;\n result: never;\n error: {\n code: number;\n message: string;\n };\n }\n | {\n id: number;\n result: unknown;\n error: never;\n }\n | {\n method: string;\n params: NotificationMessageParams;\n };\n\ntype NotificationMessageParams = {\n subscription?: number;\n result: object;\n};\n\ntype SubscriptionRequest<T = any> = {\n method: string;\n unsubscribe: string;\n params: any[];\n onMessage: (event: T) => void;\n};\n\n/**\n * Configuration options for the websocket connection\n */\nexport type WebsocketClientOptions = {\n /**\n * Custom WebSocket class to use. Defaults to the global WebSocket class, if available.\n */\n WebSocketConstructor?: typeof WebSocket;\n /**\n * Milliseconds before timing out while calling an RPC method\n */\n callTimeout?: number;\n /**\n * Milliseconds between attempts to connect\n */\n reconnectTimeout?: number;\n /**\n * Maximum number of times to try connecting before giving up\n */\n maxReconnects?: number;\n};\n\nexport const DEFAULT_CLIENT_OPTIONS = {\n // We fudge the typing because we also check for undefined in the constructor:\n WebSocketConstructor: (typeof WebSocket !== 'undefined' ? WebSocket : undefined) as typeof WebSocket,\n callTimeout: 30000,\n reconnectTimeout: 3000,\n maxReconnects: 5,\n} satisfies WebsocketClientOptions;\n\nexport class WebsocketClient {\n endpoint: string;\n options: Required<WebsocketClientOptions>;\n #requestId = 0;\n #disconnects = 0;\n #webSocket: WebSocket | null = null;\n #connectionPromise: Promise<WebSocket> | null = null;\n #subscriptions = new Set<RpcSubscription>();\n #pendingRequests = new Map<\n number,\n {\n resolve: (result: Extract<JsonRpcMessage, { id: number }>) => void;\n reject: (reason: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n constructor(endpoint: string, options: WebsocketClientOptions = {}) {\n this.endpoint = endpoint;\n this.options = { ...DEFAULT_CLIENT_OPTIONS, ...options };\n\n // not support websocket in node currently\n // if (!this.options.WebSocketConstructor) {\n // throw new Error('Missing WebSocket constructor');\n // }\n\n if (this.endpoint && this.endpoint.startsWith('http')) {\n this.endpoint = getWebsocketUrl(this.endpoint);\n }\n }\n\n async makeRequest<T>(method: string, params: any[]): Promise<T> {\n const webSocket = await this.#setupWebSocket();\n\n return new Promise<Extract<JsonRpcMessage, { id: number }>>((resolve, reject) => {\n this.#requestId += 1;\n this.#pendingRequests.set(this.#requestId, {\n resolve: resolve,\n reject,\n timeout: setTimeout(() => {\n this.#pendingRequests.delete(this.#requestId);\n reject(new Error(`Request timeout: ${method}`));\n }, this.options.callTimeout),\n });\n\n webSocket.send(JSON.stringify({ jsonrpc: '2.0', id: this.#requestId, method, params }));\n }).then(({ error, result }) => {\n if (error) {\n throw new JsonRpcError(error.message, error.code);\n }\n\n return result as T;\n });\n }\n\n #setupWebSocket() {\n if (this.#connectionPromise) {\n return this.#connectionPromise;\n }\n\n this.#connectionPromise = new Promise<WebSocket>((resolve) => {\n this.#webSocket?.close();\n this.#webSocket = new this.options.WebSocketConstructor(this.endpoint);\n\n this.#webSocket.addEventListener('open', () => {\n this.#disconnects = 0;\n resolve(this.#webSocket!);\n });\n\n this.#webSocket.addEventListener('close', () => {\n this.#disconnects++;\n if (this.#disconnects <= this.options.maxReconnects) {\n setTimeout(() => {\n this.#reconnect();\n }, this.options.reconnectTimeout);\n }\n });\n\n this.#webSocket.addEventListener('message', ({ data }: { data: string }) => {\n let json: JsonRpcMessage;\n try {\n json = JSON.parse(data) as JsonRpcMessage;\n } catch (error) {\n console.error(new Error(`Failed to parse RPC message: ${data}`, { cause: error }));\n return;\n }\n\n if ('id' in json && json.id != null && this.#pendingRequests.has(json.id)) {\n const { resolve, timeout } = this.#pendingRequests.get(json.id)!;\n\n clearTimeout(timeout);\n resolve(json);\n } else if ('params' in json) {\n const { params } = json;\n this.#subscriptions.forEach((subscription) => {\n if (subscription.subscriptionId === params.subscription)\n if (params.subscription === subscription.subscriptionId) {\n subscription.onMessage(params.result);\n }\n });\n }\n });\n });\n\n return this.#connectionPromise;\n }\n\n async #reconnect() {\n this.#webSocket?.close();\n this.#connectionPromise = null;\n\n return Promise.allSettled([...this.#subscriptions].map((subscription) => subscription.subscribe(this)));\n }\n\n async subscribe<T>(input: SubscriptionRequest<T>) {\n const subscription = new RpcSubscription(input);\n this.#subscriptions.add(subscription);\n await subscription.subscribe(this);\n return () => subscription.unsubscribe(this);\n }\n}\n\nclass RpcSubscription {\n subscriptionId: number | null = null;\n input: SubscriptionRequest<any>;\n subscribed = false;\n\n constructor(input: SubscriptionRequest) {\n this.input = input;\n }\n\n onMessage(message: unknown) {\n if (this.subscribed) {\n this.input.onMessage(message);\n }\n }\n\n async unsubscribe(client: WebsocketClient) {\n const { subscriptionId } = this;\n this.subscribed = false;\n if (subscriptionId == null) return false;\n this.subscriptionId = null;\n\n return client.makeRequest(this.input.unsubscribe, [subscriptionId]);\n }\n\n async subscribe(client: WebsocketClient) {\n this.subscriptionId = null;\n this.subscribed = true;\n const newSubscriptionId = await client.makeRequest<number>(this.input.method, this.input.params);\n\n if (this.subscribed) {\n this.subscriptionId = newSubscriptionId;\n }\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { Scallop, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { DecoderLending } from './decoders/decoderLending';\nimport { DecoderReferral } from './decoders/decoderReferral';\nimport { DecoderVeSca } from './decoders/decoderVesca';\nimport { BorrowIntention, BorrowIntentionData } from './intentions/lending/borrow';\nimport { BorrowWithBoostIntention, BorrowWithBoostIntentionData } from './intentions/lending/borrow-with-boost';\nimport {\n BorrowWithReferralIntention,\n BorrowWithReferralIntentionData,\n} from './intentions/lending/borrow-with-referral';\nimport { ClaimIncentiveRewardIntention } from './intentions/lending/claim-incentive-reward';\nimport { DepositCollateralIntention, DepositCollateralIntentionData } from './intentions/lending/deposit-collateral';\nimport { MigrateAndClaimIntention, MigrateAndClaimIntentionData } from './intentions/lending/migrate-and-claim';\nimport { MigrateScoinIntention, MigrateScoinIntentionData } from './intentions/lending/migrate-scoin';\nimport { OpenObligationIntention, OpenObligationIntentionData } from './intentions/lending/open-obligation';\nimport { RepayIntention, RepayIntentionData } from './intentions/lending/repay';\nimport { RepayWithBoostIntention, RepayWithBoostIntentionData } from './intentions/lending/repay-with-boost';\nimport { SupplyLendingIntention, SupplyLendingIntentionData } from './intentions/lending/supply-lending';\nimport { UnstakeSpoolIntention, UnstakeSpoolIntentionData } from './intentions/lending/unstake-spool';\nimport {\n WithdrawAndUnstakeLendingIntention,\n WithdrawAndUnstakeLendingIntentionData,\n} from './intentions/lending/withdraw-and-unstake-lending';\nimport { WithdrawCollateralIntention, WithdrawCollateralIntentionData } from './intentions/lending/withdraw-collateral';\nimport { WithdrawLendingIntention, WithdrawLendingIntentionData } from './intentions/lending/withdraw-lending';\nimport { BindReferralIntention, BindReferralIntentionData } from './intentions/referral/bind-referral';\nimport {\n ClaimRevenueReferralIntention,\n ClaimRevenueReferralIntentionData,\n} from './intentions/referral/claim-revenue-referral';\nimport {\n CreateReferralLinkIntention,\n CreateReferralLinkIntentionData,\n} from './intentions/referral/create-referral-link';\nimport {\n ExtendPeriodAndStakeMoreIntention,\n ExtendPeriodAndStakeMoreIntentionData,\n} from './intentions/staking/extend-period-and-stake-more';\nimport { ExtendStakePeriodIntention, ExtendStakePeriodIntentionData } from './intentions/staking/extend-stake-period';\nimport { RedeemScaIntention, RedeemScaIntentionData } from './intentions/staking/redeem-sca';\nimport {\n RenewExpStakePeriodIntention,\n RenewExpStakePeriodIntentionData,\n} from './intentions/staking/renew-exp-stake-period';\nimport { StakeScaIntention, StakeScaIntentionData } from './intentions/staking/stake-sca';\nimport {\n SupplyAndStakeLendingIntention,\n SupplyAndStakeLendingIntentionData,\n} from './intentions/staking/supply-and-stake-lending';\nimport { WithdrawStakedScaIntention, WithdrawStakedScaIntentionData } from './intentions/staking/withdraw-staked-sca';\nimport { SuiNetworks } from './types';\nimport { TransactionSubType } from './types/utils';\nimport { IAppHelperInternal } from '../interface/sui';\n\nexport type ScallopIntention =\n | SupplyLendingIntention\n | WithdrawLendingIntention\n | BorrowIntention\n | RepayIntention\n | DepositCollateralIntention\n | WithdrawCollateralIntention\n | OpenObligationIntention\n | UnstakeSpoolIntention\n | ClaimIncentiveRewardIntention\n | BorrowWithBoostIntention\n | StakeScaIntention\n | ExtendStakePeriodIntention\n | ExtendPeriodAndStakeMoreIntention\n | RenewExpStakePeriodIntention\n | WithdrawStakedScaIntention\n | SupplyAndStakeLendingIntention\n | WithdrawAndUnstakeLendingIntention\n | RedeemScaIntention\n | MigrateAndClaimIntention\n | BorrowWithReferralIntention\n | CreateReferralLinkIntention\n | ClaimRevenueReferralIntention\n | BindReferralIntention\n | MigrateScoinIntention\n | RepayWithBoostIntention;\n\nexport type ScallopIntentionData =\n | SupplyLendingIntentionData\n | WithdrawLendingIntentionData\n | BorrowIntentionData\n | RepayIntentionData\n | DepositCollateralIntentionData\n | WithdrawCollateralIntentionData\n | OpenObligationIntentionData\n | UnstakeSpoolIntentionData\n | BorrowWithBoostIntentionData\n | StakeScaIntentionData\n | ExtendStakePeriodIntentionData\n | ExtendPeriodAndStakeMoreIntentionData\n | RenewExpStakePeriodIntentionData\n | WithdrawStakedScaIntentionData\n | SupplyAndStakeLendingIntentionData\n | WithdrawAndUnstakeLendingIntentionData\n | RedeemScaIntentionData\n | MigrateAndClaimIntentionData\n | BorrowWithReferralIntentionData\n | CreateReferralLinkIntentionData\n | ClaimRevenueReferralIntentionData\n | BindReferralIntentionData\n | MigrateScoinIntentionData\n | RepayWithBoostIntentionData;\n\nexport class ScallopAppHelper implements IAppHelperInternal<ScallopIntentionData> {\n application = 'scallop';\n\n supportSDK = '@mysten/sui' as const;\n\n private scallopClient: ScallopClient | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: ScallopIntentionData;\n }> {\n if (!this.scallopClient) {\n const scallop = new Scallop({\n addressId: '67c44a103fe1b8c454eb9699',\n walletAddress: input.account.address,\n suiClients: [input.suiClient],\n });\n this.scallopClient = await scallop.createScallopClient();\n }\n\n const { transaction } = input;\n console.log('transaction', transaction);\n\n // const devInspectResult = await input.suiClient.devInspectTransactionBlock({\n // transactionBlock: transaction,\n // sender: input.account.address,\n // });\n\n const decoderLending = new DecoderLending(transaction, this.scallopClient);\n const decoderReferral = new DecoderReferral(transaction, this.scallopClient);\n const decoderVesca = new DecoderVeSca(transaction, this.scallopClient);\n\n const result = decoderLending.decode() || decoderReferral.decode() || decoderVesca.decode();\n if (!result) {\n throw new Error('Unknown transaction type');\n }\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: ScallopIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network, txSubType, intentionData } = input;\n if (!this.scallopClient) {\n const scallop = new Scallop({\n addressId: '67c44a103fe1b8c454eb9699',\n walletAddress: input.account.address,\n suiClients: [input.suiClient],\n });\n this.scallopClient = await scallop.createScallopClient();\n }\n\n let intention: ScallopIntention;\n switch (txSubType) {\n case TransactionSubType.SupplyLending:\n intention = SupplyLendingIntention.fromData(intentionData as SupplyLendingIntentionData);\n break;\n case TransactionSubType.WithdrawLending:\n intention = WithdrawLendingIntention.fromData(intentionData as WithdrawLendingIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n break;\n case TransactionSubType.DepositCollateral:\n intention = DepositCollateralIntention.fromData(intentionData as DepositCollateralIntentionData);\n break;\n case TransactionSubType.WithdrawCollateral:\n intention = WithdrawCollateralIntention.fromData(intentionData as WithdrawCollateralIntentionData);\n break;\n case TransactionSubType.OpenObligation:\n intention = OpenObligationIntention.fromData(intentionData as OpenObligationIntentionData);\n break;\n case TransactionSubType.UnstakeSpool:\n intention = UnstakeSpoolIntention.fromData(intentionData as UnstakeSpoolIntentionData);\n break;\n case TransactionSubType.ClaimIncentiveReward:\n intention = ClaimIncentiveRewardIntention.fromData(intentionData);\n break;\n case TransactionSubType.BorrowWithBoost:\n intention = BorrowWithBoostIntention.fromData(intentionData as BorrowWithBoostIntentionData);\n break;\n case TransactionSubType.StakeSca:\n intention = StakeScaIntention.fromData(intentionData as StakeScaIntentionData);\n break;\n case TransactionSubType.ExtendStakePeriod:\n intention = ExtendStakePeriodIntention.fromData(intentionData as ExtendStakePeriodIntentionData);\n break;\n case TransactionSubType.ExtendPeriodAndStakeMore:\n intention = ExtendPeriodAndStakeMoreIntention.fromData(intentionData as ExtendPeriodAndStakeMoreIntentionData);\n break;\n case TransactionSubType.RenewExpStakePeriod:\n intention = RenewExpStakePeriodIntention.fromData(intentionData as RenewExpStakePeriodIntentionData);\n break;\n case TransactionSubType.WithdrawStakedSca:\n intention = WithdrawStakedScaIntention.fromData(intentionData as WithdrawStakedScaIntentionData);\n break;\n case TransactionSubType.SupplyAndStakeLending:\n intention = SupplyAndStakeLendingIntention.fromData(intentionData as SupplyAndStakeLendingIntentionData);\n break;\n case TransactionSubType.WithdrawAndUnstakeLending:\n intention = WithdrawAndUnstakeLendingIntention.fromData(\n intentionData as WithdrawAndUnstakeLendingIntentionData,\n );\n break;\n case TransactionSubType.RedeemSca:\n intention = RedeemScaIntention.fromData(intentionData as RedeemScaIntentionData);\n break;\n case TransactionSubType.MigrateAndClaim:\n intention = MigrateAndClaimIntention.fromData(intentionData as MigrateAndClaimIntentionData);\n break;\n case TransactionSubType.BorrowWithReferral:\n intention = BorrowWithReferralIntention.fromData(intentionData as BorrowWithReferralIntentionData);\n break;\n case TransactionSubType.CreateReferralLink:\n intention = CreateReferralLinkIntention.fromData(intentionData as CreateReferralLinkIntentionData);\n break;\n case TransactionSubType.ClaimRevenueReferral:\n intention = ClaimRevenueReferralIntention.fromData(intentionData as ClaimRevenueReferralIntentionData);\n break;\n case TransactionSubType.BindReferral:\n intention = BindReferralIntention.fromData(intentionData as BindReferralIntentionData);\n break;\n case TransactionSubType.MigrateScoin:\n intention = MigrateScoinIntention.fromData(intentionData as MigrateScoinIntentionData);\n break;\n case TransactionSubType.RepayWithBoost:\n intention = RepayWithBoostIntention.fromData(intentionData as RepayWithBoostIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account, network, scallopClient: this.scallopClient });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { SplitCoinTransactionType } from '../types/sui';\nimport { DecodeResult, TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, SplitCoinHelper } from '../utils';\n\nexport class DecoderLending extends Decoder {\n decode() {\n // if (this.isMoveAsset()) {\n // return this.decodeMoveAsset();\n // }\n if (this.isSupplyWithStakeSpoolTransaction()) {\n return this.decodeSupplyWithStakeSpool();\n }\n if (this.isUnstakeAndWithdrawTransaction()) {\n return this.decodeUnstakeAndWithdraw();\n }\n if (this.isStakeSpoolTransaction()) {\n return this.decodeStakeSpool();\n }\n if (this.isDepositCollateralTransaction()) {\n return this.decodeDepositCollateral();\n }\n if (this.isWithdrawCollateralTransaction()) {\n return this.decodeWithdrawCollateral();\n }\n if (this.isWithdrawLendingScoinTransaction()) {\n return this.decodeWithdrawLendingScoin();\n }\n if (this.isWithdrawLendingTransaction()) {\n return this.decodeWithdrawLending();\n }\n if (this.isSupplyLendingTransaction()) {\n return this.decodeSupplyLending();\n }\n if (this.isBorrowWithReferralTransaction()) {\n return this.decodeBorrowWithReferral();\n }\n if (this.isBorrowWithBoostTransaction()) {\n return this.decodeBorrowWithBoost();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayWithBoostTransaction()) {\n return this.decodeRepayWithBoost();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isUnstakeSpoolTransaction()) {\n return this.decodeUnstakeSpool();\n }\n if (this.isMigrateAndClaim()) {\n return this.decodeMigrateAndClaim();\n }\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isOpenObligationTransaction()) {\n return this.decodeOpenObligation();\n }\n if (this.isMigrateScoinTransaction()) {\n return this.decodeMigrateScoin();\n }\n return undefined;\n }\n\n private isMigrateScoinTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::mint_s_coin`);\n }\n\n private isSupplyLendingTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n }\n\n private isSupplyWithStakeSpoolTransaction() {\n const supplyMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::mint::mint`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n return supplyMoveCall && stakeMoveCall;\n }\n\n private isUnstakeAndWithdrawTransaction() {\n const unstakeMoveCall = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n const withdrawMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n return unstakeMoveCall && withdrawMoveCall;\n }\n\n private isStakeSpoolTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::stake`);\n }\n\n private isWithdrawLendingTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n }\n\n private isWithdrawLendingScoinTransaction() {\n const redeem = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::redeem::redeem`);\n const burnScoin = this.hasMoveCallCommand(`${this.coreId.scoin}::s_coin_converter::burn_s_coin`);\n return redeem && burnScoin;\n }\n\n private isDepositCollateralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`);\n }\n\n private isWithdrawCollateralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`);\n }\n\n private isBorrowTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n }\n\n private isBorrowWithBoostTransaction() {\n const borrowMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return borrowMoveCall && stakeMoveCall;\n }\n\n private isBorrowWithReferralTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::borrow::borrow_with_referral`);\n }\n\n private isRepayTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n }\n\n private isRepayWithBoostTransaction() {\n const repayMoveCall = this.hasMoveCallCommand(`${this.coreId.protocolPkg}::repay::repay`);\n const stakeMoveCall = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return repayMoveCall && stakeMoveCall;\n }\n\n private isUnstakeSpoolTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::unstake`);\n }\n\n private isCreateStakeAccountTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::new_spool_account`);\n }\n\n private isClaimRewardTransaction() {\n const lendingIncentive = this.hasMoveCallCommand(`${this.coreId.spoolPkg}::user::redeem_rewards`);\n const borrowIncentiveV2 = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`);\n return lendingIncentive || borrowIncentiveV2;\n }\n\n private isOpenObligationTransaction() {\n return this.hasMoveCallCommand(`${this.coreId.protocolPkg}::open_obligation::open_obligation`);\n }\n\n private isMigrateAndClaim() {\n const oldBorrowIncentive = this.hasMoveCallCommand(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`);\n const stakeWithVeSca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n const stakeWithoutVesca = this.hasMoveCallCommand(`${this.coreId.borrowIncentivePkg}::user::stake`);\n return oldBorrowIncentive && (stakeWithVeSca || stakeWithoutVesca);\n }\n\n private get helperClaimLendingReward() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::redeem_rewards`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperClaimBorrowV2Reward() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::redeem_rewards`),\n )\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperClaimBorrowReward() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`),\n )\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperMint() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::mint::mint`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstakes() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperRedeems() {\n const moveCalls = this.commands\n .filter((command) => this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`))\n .map((command) => new MoveCallHelper(command, this.transaction));\n return moveCalls;\n }\n\n private get helperRedeem() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::redeem::redeem`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBurnScoin() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.scoin}::s_coin_converter::burn_s_coin`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n // private get helperSlippage() {\n // const moveCall = this.commands.find((command) =>\n // this.filterMoveCallCommands(\n // command,\n // `0x5857d185897aaff40ae37b2eecc895efc1a9dff1b210c4fb894eabbce4ac2603::slippage_check::check_slippage`,\n // ),\n // );\n // return new MoveCallHelper(moveCall, this.transaction);\n // }\n\n private get helperStake() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::stake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstake() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.spoolPkg}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperDepositCollateral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperWithdrawCollateral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBorrow() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperBorrowWithReferral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::borrow::borrow_with_referral`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRepay() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.protocolPkg}::repay::repay`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeMigrateScoin(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateScoin,\n intentionData: {},\n };\n }\n\n private decodeMigrateAndClaim(): DecodeResult {\n let veScaKey;\n if (this.helperStakeObligationWithVeSca.moveCall) {\n veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n }\n const obligationKey = this.helperClaimBorrowReward[0].decodeOwnedObjectId(2);\n const obligationId = this.helperClaimBorrowReward[0].decodeSharedObjectId(3);\n const rewardCoinName = this.utils.parseCoinNameFromType(this.helperClaimBorrowReward[0].typeArg(0));\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateAndClaim,\n intentionData: {\n obligationKey,\n obligationId,\n rewardCoinName,\n veScaKey,\n },\n };\n }\n\n private decodeOpenObligation(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenObligation,\n intentionData: {},\n };\n }\n\n // @TODO: Decode from event rather than from transaction block\n private decodeSupplyLending(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SupplyLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeWithdrawLending(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n const amount = this.helperRedeem.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeWithdrawLendingScoin(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n console.log({ coinName });\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n },\n };\n }\n\n private decodeDepositCollateral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperDepositCollateral.typeArg(0));\n const amount = this.helperDepositCollateral.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperDepositCollateral.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DepositCollateral,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n collateralCoinName: coinName,\n },\n };\n }\n\n private decodeWithdrawCollateral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperWithdrawCollateral.typeArg(0));\n const amount = this.helperWithdrawCollateral.decodeInputU64(5);\n const obligationId = this.helperWithdrawCollateral.decodeSharedObjectId(1);\n const obligationKey = this.helperWithdrawCollateral.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawCollateral,\n intentionData: {\n amount,\n collateralCoinName: coinName,\n obligationKey,\n obligationId,\n },\n };\n }\n\n private decodeBorrow(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n const amount = this.helperBorrow.decodeInputU64(5);\n const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Borrow,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n },\n };\n }\n\n private decodeBorrowWithBoost(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrow.typeArg(0));\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const amount = this.helperBorrow.decodeInputU64(5);\n const obligationId = this.helperBorrow.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrow.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BorrowWithBoost,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n veScaKey,\n },\n };\n }\n\n private decodeBorrowWithReferral(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperBorrowWithReferral.typeArg(0));\n let veScaKey;\n if (this.helperStakeObligationWithVeSca.moveCall) {\n veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n }\n const amount = this.helperBorrowWithReferral.decodeInputU64(6);\n const obligationId = this.helperBorrowWithReferral.decodeSharedObjectId(1);\n const obligationKey = this.helperBorrowWithReferral.decodeOwnedObjectId(2);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BorrowWithReferral,\n intentionData: {\n amount,\n coinName,\n obligationKey,\n obligationId,\n veScaKey,\n },\n };\n }\n\n private decodeRepay(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperRepay.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Repay,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n coinName,\n },\n };\n }\n\n private decodeRepayWithBoost(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const amount = this.helperRepay.getNestedInputParam<SplitCoinTransactionType>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const obligationId = this.helperRepay.decodeSharedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RepayWithBoost,\n intentionData: {\n amount: amountFromSplitCoin,\n obligationId,\n coinName,\n veScaKey,\n },\n };\n }\n\n private decodeStakeSpool(): DecodeResult {\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n let amountFromSplitCoin = 0;\n if (this.helperBurnScoin.moveCall) {\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n if (this.helperStake.moveCall && amountFromSplitCoin === 0) {\n const amount = this.helperStake.getNestedInputParam<SplitCoinTransactionType>(2);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n const coinType = this.helperStake.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(coinType);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeSpool,\n intentionData: {\n amount: amountFromSplitCoin,\n marketCoinName: coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeUnstakeSpool(): DecodeResult {\n const stakeSpoolAccount = this.helperUnstake.decodeOwnedObjectId(1);\n const amount = this.helperUnstake.decodeInputU64(2);\n const coinType = this.helperUnstake.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(coinType);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnstakeSpool,\n intentionData: {\n amount,\n marketCoinName: coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeSupplyWithStakeSpool(): DecodeResult {\n const coinName = this.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinTransactionType>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SupplyAndStakeLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n stakeAccountId: stakeSpoolAccount,\n },\n };\n }\n\n private decodeUnstakeAndWithdraw(): DecodeResult {\n const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n this.helperUnstakes.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(1);\n const amount = tx.decodeInputU64(2);\n stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n });\n const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n let amountFromSplitCoin = 0;\n if (this.helperBurnScoin.moveCall) {\n const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawAndUnstakeLending,\n intentionData: {\n amount: amountFromSplitCoin,\n coinName,\n stakeAccountId: stakeAccountWithAmount,\n },\n };\n }\n\n // private decodeMoveAsset(): DecodeResult {\n // const stakeAccountWithAmount: { id: string; coin: number }[] = [];\n // this.helperUnstakes.forEach((tx) => {\n // const stakeAccountId = tx.decodeOwnedObjectId(1);\n // const amount = tx.decodeInputU64(2);\n // stakeAccountWithAmount.push({ id: stakeAccountId, coin: amount });\n // });\n // const coinName = this.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n // let amountFromSplitCoin = 0;\n // if (this.helperBurnScoin.moveCall) {\n // const amount = this.helperBurnScoin.getNestedInputParam<SplitCoinTransactionType>(1);\n // amountFromSplitCoin = new SplitCoinHelper(amount, this.transaction).getAmountInput().reduce((a, b) => a + b, 0);\n // }\n // const slippage = this.helperSlippage.decodePureArg(1, 'U64');\n // const validSwapAmount = this.helperSlippage.decodePureArg(2, 'String');\n\n // return {\n // txType: TransactionType.Other,\n // type: TransactionSubType.MigrateWusdcToUsdc,\n // intentionData: {\n // amount: amountFromSplitCoin,\n // coinName,\n // slippage,\n // validSwapAmount,\n // stakeAccountId: stakeAccountWithAmount,\n // },\n // };\n // }\n\n private decodeClaimReward(): DecodeResult {\n const lendingReward: {\n stakeMarketCoinName: string;\n stakeAccountId: string;\n }[] = [];\n const borrowRewardV2: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: string;\n }[] = [];\n\n const borrowReward: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: string;\n }[] = [];\n\n this.helperClaimLendingReward.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(2);\n const stakeMarketCoinName = tx.typeArg(0);\n const coinName = this.utils.parseCoinNameFromType(stakeMarketCoinName);\n lendingReward.push({ stakeMarketCoinName: coinName as string, stakeAccountId });\n });\n\n this.helperClaimBorrowV2Reward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(4);\n const obligationId = tx.decodeOwnedObjectId(3);\n const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n borrowRewardV2.push({ obligationId, obligationKey, rewardCoinName });\n });\n\n this.helperClaimBorrowReward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(2);\n const obligationId = tx.decodeOwnedObjectId(3);\n const rewardCoinName = this.utils.parseCoinNameFromType(tx.typeArg(0));\n borrowReward.push({ obligationId, obligationKey, rewardCoinName });\n });\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimIncentiveReward,\n intentionData: {\n lendingIncentive: lendingReward,\n borrowIncentiveV2: borrowRewardV2,\n borrowIncentive: borrowReward,\n },\n };\n }\n}\n","// import { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { parseStructTag } from '@mysten/sui/utils';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { MoveCallCommand, TransactionCommand, TransactionCommands, TransactionInputs } from '../types/sui';\n\nexport class Decoder {\n protected inputs: TransactionInputs;\n\n protected commands: TransactionCommands;\n\n protected movecallsAsSet: Set<string>;\n\n constructor(\n public readonly transaction: Transaction,\n protected scallopClient: ScallopClient,\n // protected devInspectResult: DevInspectResults,\n ) {\n this.scallopClient = scallopClient;\n this.inputs = transaction.getData().inputs;\n this.commands = transaction.getData().commands;\n this.movecallsAsSet = new Set(\n this.commands\n .filter(this.isMoveCall)\n .map((command) => `${command.MoveCall!.package}::${command.MoveCall!.module}::${command.MoveCall!.function}`),\n );\n }\n\n get address() {\n return this.scallopClient.address;\n }\n\n get utils() {\n return this.scallopClient.utils;\n }\n\n protected get coreId() {\n return {\n protocolPkg: this.address.get('core.packages.protocol.id'),\n market: this.address.get('core.market'),\n version: this.address.get('core.version'),\n coinDecimalsRegistry: this.address.get('core.coinDecimalsRegistry'),\n xOracle: this.address.get('core.oracles.xOracle'),\n spoolPkg: this.address.get('spool.id'),\n borrowIncentivePkg: this.address.get('borrowIncentive.id'),\n veScaPkgId: this.address.get('vesca.id'),\n scoin: this.address.get('scoin.id'),\n referral: this.address.get('referral.id'),\n };\n }\n\n protected matchMoveCallCommand(moveCall: MoveCallCommand, target: string) {\n const { address, module, name } = parseStructTag(target);\n if (!moveCall) {\n return false;\n }\n return moveCall.package === address && moveCall.module === module && moveCall.function === name;\n }\n\n private isMoveCall(\n command: TransactionCommand,\n ): command is typeof command & NonNullable<{ MoveCall: MoveCallCommand }> {\n return command.$kind === 'MoveCall' && !!command.MoveCall;\n }\n\n protected filterMoveCallCommands(command: TransactionCommand, target: string) {\n return this.isMoveCall(command) && this.matchMoveCallCommand(command.MoveCall, target);\n }\n\n protected getMoveCallCommands(targets: string[]): MoveCallCommand[] {\n const targetSet = new Set(targets);\n const targetToIdxMap = targets.reduce(\n (acc, target, idx) => {\n acc[target] = idx;\n return acc;\n },\n {} as Record<string, number>,\n );\n\n const moveCallCommands: MoveCallCommand[] = [];\n this.commands.forEach((command) => {\n if (this.isMoveCall(command) && command.MoveCall && targetSet.has(command.MoveCall.package)) {\n moveCallCommands[targetToIdxMap[command.MoveCall.package]] = command.MoveCall;\n }\n });\n\n return moveCallCommands;\n }\n\n protected hasMoveCallCommand(target: string) {\n return this.movecallsAsSet.has(target);\n }\n}\n","import { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { TransactionBlockInput } from '@mysten/sui.js/transactions';\n\nimport {\n BcsType,\n MoveCallTransactionArgumentType,\n MoveCallTransactionType,\n SplitCoinTransactionType,\n TransactionCommand,\n} from '../types/sui';\n\nclass MoveCallHelper {\n private cmdIdx: number;\n\n constructor(\n public readonly moveCall: TransactionCommand | undefined,\n public readonly transaction: Transaction,\n ) {\n this.cmdIdx = moveCall?.MoveCall\n ? transaction.getData().commands.findIndex((t) => {\n if (t.$kind === 'MoveCall') {\n const target = `${t.MoveCall.package}::${t.MoveCall.module}::${t.MoveCall.function}`;\n const moveCallTarget = `${moveCall.MoveCall.package}::${moveCall.MoveCall.module}::${moveCall.MoveCall.function}`;\n return target === moveCallTarget;\n }\n return false;\n })\n : -1;\n }\n\n get txBlockTransactions(): MoveCallTransactionType {\n return this.transaction.blockData.transactions[this.cmdIdx] as MoveCallTransactionType;\n }\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'U64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'U8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'Address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'String');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'Bool');\n }\n\n decodePureArg<T>(argIndex: number, type: BcsType) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, type);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return arg;\n }\n\n getNestedInputParam<T = SplitCoinTransactionType>(argIndex: number) {\n const arg = this.txBlockTransactions.arguments[argIndex] as MoveCallTransactionArgumentType;\n if (arg.kind !== 'NestedResult') {\n throw new Error('not input type');\n }\n return this.transaction.blockData.transactions[arg.index] as T;\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, type: BcsType) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n const a = bcs[type];\n return bcs[type].parse(new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.U64.parse(new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.txBlockTransactions.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.transaction.blockData.inputs[index];\n }\n}\n\nexport default MoveCallHelper;\n","import { Transaction } from '@mysten/sui/transactions';\n\nimport MoveCallHelper from './moveCallHelper';\nimport { SplitCoinTransactionType } from '../types/sui';\n\nclass SplitCoinHelper {\n constructor(\n public readonly splitCoin: SplitCoinTransactionType,\n public readonly txb: Transaction,\n ) {}\n\n getAmountInput() {\n return this.splitCoin.amounts\n .map((input) => {\n if (input.kind === 'Input') {\n return Number(MoveCallHelper.getPureInputValue<number>(input, 'U64'));\n }\n return undefined;\n })\n .filter((input) => input !== undefined);\n }\n}\n\nexport default SplitCoinHelper;\n","import { normalizeStructTag, SUI_CLOCK_OBJECT_ID, SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { ScallopQuery, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\n\nexport const isObligationMigrated = async (query: ScallopQuery, obligationId: string) => {\n const obligation = await query.suiKit.client().getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n\n if (obligation?.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const fields = obligation.data.content.fields as any;\n const lockKey = fields.lock_key?.fields.name as string;\n if (!lockKey) {\n return false;\n }\n const borrowIncentiveObjectId = query.address.get('borrowIncentive.object');\n return lockKey === `${borrowIncentiveObjectId.slice(2)}::incentive_account::IncentiveProgramLockKey`;\n};\n\nconst OldBorrowIncentiveContract = {\n id: '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410',\n incentivePools: '0x64972b713ccec45ec3964809e477cea6f97350c0c50ca3aec85bb631639266ec',\n incentiveAccounts: '0x3c0b707068bdcea8bb859d751ad3e2149a9f83c13fcf4054ef91372a00bccdd3',\n} as const;\n\nexport const OldBorrowIncentiveTxBuilder = {\n unstakeObligation: (tx: ScallopTxBlock, obligationKey: string, obligationId: string) =>\n tx.moveCall(\n `${OldBorrowIncentiveContract.id}::user::unstake`,\n [\n OldBorrowIncentiveContract.incentivePools,\n OldBorrowIncentiveContract.incentiveAccounts,\n tx.object(obligationKey),\n tx.object(obligationId),\n SUI_CLOCK_OBJECT_ID,\n ],\n [normalizeStructTag(SUI_TYPE_ARG)],\n ),\n redeem_rewards: (tx: ScallopTxBlock, obligationKey: string, obligationId: string, rewardType: string) =>\n tx.moveCall(\n `${OldBorrowIncentiveContract.id}::user::redeem_rewards`,\n [\n OldBorrowIncentiveContract.incentivePools,\n OldBorrowIncentiveContract.incentiveAccounts,\n tx.object(obligationKey),\n tx.object(obligationId),\n SUI_CLOCK_OBJECT_ID,\n ],\n [normalizeStructTag(rewardType)],\n ),\n} as const;\n","import { TransactionType } from '@msafe/sui3-utils';\n\nimport { Decoder } from './decoder';\nimport { DecodeResult } from '../types';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper } from '../utils';\n\nexport class DecoderReferral extends Decoder {\n decode() {\n if (this.isCreateReferralLink()) {\n return this.decodeCreateReferralLink();\n }\n if (this.isClaimRevenueReferral()) {\n return this.decodeClaimRevenueReferral();\n }\n if (this.isBindReferral()) {\n return this.decodeBindReferral();\n }\n return undefined;\n }\n\n private isClaimRevenueReferral() {\n return this.hasMoveCallCommand(`${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`);\n }\n\n private isCreateReferralLink() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_placeholder_key`);\n }\n\n private isBindReferral() {\n return this.hasMoveCallCommand(`${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`);\n }\n\n private get helperClaimRevenueReferral() {\n const moveCalls = this.commands\n .filter((command) =>\n this.filterMoveCallCommands(\n command,\n `${this.coreId.referral}::referral_revenue_pool::claim_revenue_with_ve_sca_key`,\n ),\n )\n .map((trans) => new MoveCallHelper(trans, this.transaction));\n return moveCalls;\n }\n\n private get helperBindReferral() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.referral}::referral_bindings::bind_ve_sca_referrer`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeCreateReferralLink(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CreateReferralLink,\n intentionData: {},\n };\n }\n\n private decodeClaimRevenueReferral(): DecodeResult {\n const veScaKey = this.helperClaimRevenueReferral[0].decodeOwnedObjectId(2);\n const coins = this.helperClaimRevenueReferral.map((helper) => helper.typeArg(0));\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimRevenueReferral,\n intentionData: {\n veScaKey,\n coins,\n },\n };\n }\n\n private decodeBindReferral(): DecodeResult {\n const veScaKey = this.helperBindReferral.decodePureArg(1, 'Address');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BindReferral,\n intentionData: {\n veScaKey,\n },\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '@scallop-io/sui-scallop-sdk';\n\nimport { Decoder } from './decoder';\nimport { DecodeResult } from '../types';\nimport { SplitCoinTransactionType } from '../types/sui';\nimport { TransactionSubType } from '../types/utils';\nimport { MoveCallHelper, SplitCoinHelper } from '../utils';\n\nexport class DecoderVeSca extends Decoder {\n decode() {\n if (this.isExtendPeriodAndStakeMoreSca()) {\n return this.decodePeriodAndStakeMoreSca();\n }\n if (this.isStakeScaFirsTime() || this.isStakeMoreSca()) {\n return this.decodeStakeSca();\n }\n if (this.isRenewExpiredVeSca()) {\n return this.decodeRenewExpiredVeSca();\n }\n if (this.isExtendPeriod()) {\n return this.decodeExtendStakePeriod();\n }\n if (this.isRedeemSca()) {\n return this.decodeRedeemSca();\n }\n return undefined;\n }\n\n private isStakeScaFirsTime() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`);\n }\n\n private isExtendPeriodAndStakeMoreSca() {\n const extendPeriod = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n const stakeMoreSca = this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n return !!extendPeriod && !!stakeMoreSca;\n }\n\n private isRedeemSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::redeem`);\n }\n\n private isStakeMoreSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n }\n\n private isExtendPeriod() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n }\n\n private isRenewExpiredVeSca() {\n return this.hasMoveCallCommand(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`);\n }\n\n private get helperStakeMoreSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperStakeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperExtendStakePeriod() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRedeemSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::redeem`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperRenewExpired() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperOldUnstakeObligation() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperUnstakeObligation() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::unstake`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.commands.find((command) =>\n this.filterMoveCallCommands(command, `${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n );\n return new MoveCallHelper(moveCall, this.transaction);\n }\n\n private decodeRedeemSca(): DecodeResult {\n const veScaKey = this.helperRedeemSca.decodeOwnedObjectId(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RedeemSca,\n intentionData: {\n veScaKey,\n },\n };\n }\n\n private decodeRenewExpiredVeSca(): DecodeResult {\n const lockSca = this.helperRenewExpired.getNestedInputParam<SplitCoinTransactionType>(4);\n const unlockTime = this.helperRenewExpired.decodeInputU64(5);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n const veScaKey = this.helperRenewExpired.decodeOwnedObjectId(1);\n const isHaveRedeem = !!this.helperRedeemSca.moveCall;\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RenewExpStakePeriod,\n intentionData: {\n amount: amountFromSplitCoin,\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isHaveRedeem,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodeExtendStakePeriod(): DecodeResult {\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const veScaKey = this.helperExtendStakePeriod.decodeOwnedObjectId(1);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ExtendStakePeriod,\n intentionData: {\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodePeriodAndStakeMoreSca(): DecodeResult {\n const lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let veScaKey;\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeMoreSca.moveCall) {\n veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ExtendPeriodAndStakeMore,\n intentionData: {\n amount: amountFromSplitCoin,\n veScaKey,\n unlockTime,\n obligationId,\n obligationKey,\n isOldBorrowIncentive,\n isObligationLocked,\n },\n };\n }\n\n private decodeStakeSca(): DecodeResult {\n let lockSca;\n let unlockTime;\n if (this.helperStakeSca.moveCall && this.helperStakeMoreSca.moveCall === undefined) {\n lockSca = this.helperStakeSca.getNestedInputParam<SplitCoinTransactionType>(3);\n unlockTime = this.helperStakeSca.decodeInputU64(4);\n } else {\n lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinTransactionType>(4);\n }\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.transaction)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n let oldUnstakeObligation: string[] = [];\n let unstakeObligation: string[] = [];\n let veScaKey;\n let stakeObligation: string[] = [];\n if (this.helperOldUnstakeObligation.moveCall) {\n oldUnstakeObligation = [\n this.helperOldUnstakeObligation.decodeOwnedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeOwnedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeMoreSca.moveCall) {\n veScaKey = this.helperStakeMoreSca.decodeOwnedObjectId(1);\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeOwnedObjectId(3), // Obligation key\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n let isObligationLocked = false;\n let isOldBorrowIncentive = false;\n let obligationId;\n let obligationKey;\n\n const operations = [\n { condition: oldUnstakeObligation, isOld: true },\n { condition: unstakeObligation, isOld: false },\n { condition: stakeObligation, isOld: false },\n ];\n\n for (let i = 0; i < operations.length; i++) {\n if (operations[i].condition.length > 1) {\n [obligationKey, obligationId] = operations[i].condition;\n isObligationLocked = true;\n isOldBorrowIncentive = operations[i].isOld;\n }\n }\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeSca,\n intentionData: {\n amount: amountFromSplitCoin,\n unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient, ScallopTxBlock } from '@scallop-io/sui-scallop-sdk';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { SuiObjectArg } from '../types';\n\nexport abstract class ScallopCoreBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n get application() {\n return 'msafe-core';\n }\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n\n private isObligationLocked = async (suiClient: SuiClient, obligationId: SuiObjectArg) => {\n const obligationObjectData = await suiClient.getObject({\n id: typeof obligationId === 'string' ? obligationId : obligationId.objectId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectData &&\n obligationObjectData?.data.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectData.data.content.fields\n ) {\n obligationLocked = Boolean(obligationObjectData.data.content.fields.lock_key);\n }\n\n return obligationLocked;\n };\n\n protected async buildTxWithRefreshObligation(\n client: ScallopClient,\n input: {\n walletAddress: string;\n obligationId: string;\n obligationKey: string;\n veScaKey?: string;\n },\n callback: (\n client: ScallopClient,\n txBlock: ScallopTxBlock,\n args: {\n walletAddress: string;\n obligationId: string;\n obligationKey: string;\n veScaKey?: string;\n },\n ) => Promise<void>,\n ) {\n const txb = client.builder.createTxBlock();\n txb.setSender(input.walletAddress);\n\n const { obligationId, obligationKey } = input;\n\n // unstake obligation if it is locked\n const locked = await this.isObligationLocked(client.suiKit.client(), obligationId);\n if (locked) {\n await txb.unstakeObligationQuick(obligationId, obligationKey);\n await callback(client, txb, input);\n await txb.stakeObligationWithVeScaQuick(obligationId, obligationKey, input.veScaKey);\n } else {\n await callback(client, txb, input);\n }\n\n return txb;\n }\n\n abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction>;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class BorrowIntention extends ScallopCoreBaseIntention<BorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async borrow({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const { coinName, amount, obligationId, obligationKey } = this.data;\n const sender = account.address;\n const tx = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress: sender,\n obligationId,\n obligationKey,\n },\n async (_, innerTx) => {\n const coin = await innerTx.borrowQuick(+amount, coinName, obligationId, obligationKey);\n innerTx.transferObjects([coin], sender);\n },\n );\n\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrow(input);\n }\n\n static fromData(data: BorrowIntentionData): BorrowIntention {\n return new BorrowIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithBoostIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string;\n}\n\nexport class BorrowWithBoostIntention extends ScallopCoreBaseIntention<BorrowWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowWithBoostIntentionData) {\n super(data);\n }\n\n public async borrowWithBoost(\n client: ScallopClient,\n data: BorrowWithBoostIntentionData,\n walletAddress: string,\n ): Promise<Transaction> {\n const { obligationId, obligationKey, veScaKey, amount, coinName: poolCoinName } = this.data;\n const txb = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress,\n obligationId,\n obligationKey,\n veScaKey,\n },\n async (_, scallopTxBlock) => {\n const coin = await scallopTxBlock.borrowQuick(+amount, poolCoinName, obligationId, obligationKey);\n scallopTxBlock.transferObjects([coin], walletAddress);\n },\n );\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrowWithBoost(input.scallopClient, this.data, input.account.address);\n }\n\n static fromData(data: BorrowWithBoostIntentionData): BorrowWithBoostIntention {\n return new BorrowWithBoostIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BorrowWithReferralIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string | undefined;\n}\n\nexport class BorrowWithReferralIntention extends ScallopCoreBaseIntention<BorrowWithReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BorrowWithReferral;\n\n constructor(public readonly data: BorrowWithReferralIntentionData) {\n super(data);\n }\n\n async borrowWithReferral({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const walletAddress = account.address;\n const { obligationId, obligationKey, veScaKey, coinName: poolCoinName, amount } = this.data;\n const txb = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress,\n obligationId,\n obligationKey,\n veScaKey,\n },\n async (_, scallopTxBlock) => {\n const borrowReferral = scallopTxBlock.claimReferralTicket(poolCoinName);\n const coin = await scallopTxBlock.borrowWithReferralQuick(\n +amount,\n poolCoinName,\n borrowReferral,\n obligationId,\n obligationKey,\n );\n scallopTxBlock.burnReferralTicket(borrowReferral, poolCoinName);\n scallopTxBlock.transferObjects([coin], walletAddress);\n },\n );\n\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.borrowWithReferral(input);\n }\n\n static fromData(data: BorrowWithReferralIntentionData): BorrowWithReferralIntention {\n return new BorrowWithReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport { SUI_TYPE_ARG } from '@mysten/sui/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Lending, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { isObligationMigrated, OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport class ClaimIncentiveRewardIntention extends ScallopCoreBaseIntention<any> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimIncentiveReward;\n\n constructor(data = {}) {\n super(data);\n }\n\n async claimIncentiveRewards(client: ScallopClient, walletAddress: string) {\n const txb = client.builder.createTxBlock();\n txb.setSender(walletAddress);\n\n const allStakeAccounts = await client.query.getAllStakeAccounts(walletAddress);\n const lendings = await client.query.getLendings(undefined, walletAddress);\n const obligations = await client.query.getObligations(walletAddress);\n const obligationAccounts = Object.values((await client.query.getObligationAccounts(walletAddress)) ?? []);\n\n const lendingInfos = (() => {\n const spoolCoinNames = [...client.constants.whitelist.spool].map((marketCoinName) =>\n client.utils.parseCoinName(marketCoinName),\n );\n\n return (\n Object.values(lendings ?? []).filter(\n (lendingInfo) => !!lendingInfo && spoolCoinNames.includes(lendingInfo.coinName),\n ) as Lending[]\n ).reduce(\n (acc, lendingInfo) => {\n const marketCoinName = client.utils.parseMarketCoinName(lendingInfo.coinName);\n if (!acc[marketCoinName]) {\n acc[marketCoinName] = 0;\n }\n acc[marketCoinName] += lendingInfo.availableClaimCoin;\n return acc;\n },\n {} as Record<string, number>,\n );\n })();\n\n const rewardCoinCollection: Record<string, TransactionResult[]> = {};\n\n Object.entries(allStakeAccounts).forEach(([stakeMarketCoinName, stakeAccounts]) => {\n for (let i = 0; i < stakeAccounts.length; i++) {\n const stakeAccount = stakeAccounts[i];\n // skip if no points to save gas\n if (!lendingInfos[stakeMarketCoinName as string]) {\n continue;\n }\n const rewardCoin = txb.claim(stakeAccount.id, stakeMarketCoinName as string);\n\n // supposed to be all SUI reward for sCoin pool\n if (!rewardCoinCollection.sui) {\n rewardCoinCollection.sui = [rewardCoin];\n } else {\n rewardCoinCollection.sui.push(rewardCoin);\n }\n }\n });\n\n const totalClaimCoin = (() => {\n const coins = {} as Record<string, number>;\n coins.sui = Object.values(lendingInfos).reduce(\n (totalClaim, availableClaimCoin) => totalClaim + availableClaimCoin,\n 0,\n );\n\n obligationAccounts.forEach((obligationAccount) => {\n Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n if (borrowIncentive) {\n borrowIncentive.rewards.forEach((reward) => {\n if (!coins[reward.coinName]) {\n coins[reward.coinName] = 0;\n }\n if (coins[reward.coinName]) {\n coins[reward.coinName] += reward.availableClaimCoin;\n } else {\n coins[reward.coinName] = reward.availableClaimCoin;\n }\n });\n }\n });\n });\n return coins;\n })();\n\n if (obligations.length > 0 && obligationAccounts.length > 0) {\n for (let i = 0; i < obligationAccounts.length; i++) {\n const obligationAccount = obligationAccounts[i];\n\n let obligationHasReward = false;\n const obligationKeyId = obligations.find(\n (obligation) => obligation.id === obligationAccount.obligationId,\n )?.keyId;\n\n const isRewardCoinClaimed: Partial<Record<string, boolean>> = {};\n if (obligationKeyId) {\n Object.values(obligationAccount.borrowIncentives).forEach((borrowIncentive) => {\n if (borrowIncentive) {\n const filteredBorrowIncentives = borrowIncentive.rewards.filter((reward) => {\n const rewardCoinName = reward.coinName as string;\n // determine if this obligation has rewards at all to reduce overall movecalls\n return reward.availableClaimCoin > 0 && !isRewardCoinClaimed[rewardCoinName];\n });\n obligationHasReward = filteredBorrowIncentives.length > 0;\n filteredBorrowIncentives.forEach((filteredBorrowIncentive) => {\n const rewardCoin = txb.claimBorrowIncentive(\n obligationAccount.obligationId,\n obligationKeyId,\n filteredBorrowIncentive.coinName,\n );\n\n isRewardCoinClaimed[filteredBorrowIncentive.coinName] = true;\n if (!rewardCoinCollection[filteredBorrowIncentive.coinName]) {\n rewardCoinCollection[filteredBorrowIncentive.coinName] = [rewardCoin];\n } else {\n rewardCoinCollection[filteredBorrowIncentive.coinName].push(rewardCoin);\n }\n });\n }\n });\n\n // claim old reward\n // if no claim coin in sui, skip\n if (totalClaimCoin.sui > 0) {\n const oldRewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n txb,\n obligationKeyId,\n obligationAccount.obligationId,\n SUI_TYPE_ARG,\n );\n // should all be SUI\n if (rewardCoinCollection.sui) {\n rewardCoinCollection.sui.push(oldRewardCoin);\n } else {\n rewardCoinCollection.sui = [oldRewardCoin];\n }\n }\n\n if (obligationHasReward) {\n const isMigrated = await isObligationMigrated(client.query, obligationAccount.obligationId);\n\n // only restake if the obligation is migrated\n if (isMigrated) {\n txb.unstakeObligation(obligationAccount.obligationId, obligationKeyId);\n // Check if current obligationId is binded with veSCA before restake\n const bindedVeScaKey = await client.query.getBindedVeScaKey(obligationAccount.obligationId);\n if (bindedVeScaKey) {\n txb.stakeObligationWithVesca(obligationAccount.obligationId, obligationKeyId, bindedVeScaKey);\n } else {\n txb.stakeObligation(obligationAccount.obligationId, obligationKeyId);\n }\n }\n }\n }\n }\n }\n\n const objectsNeedToTransfer = (\n await Promise.all(\n Object.entries(rewardCoinCollection).map(async ([coinName, rewardCoins]) => {\n const mergeDest = rewardCoins[0];\n if (rewardCoins.length > 1) {\n txb.mergeCoins(mergeDest, rewardCoins.slice(1));\n }\n if (coinName === 'sui') {\n txb.mergeCoins(txb.gas, [mergeDest]);\n return undefined;\n }\n await client.builder.utils.mergeSimilarCoins(\n txb,\n mergeDest,\n client.utils.parseCoinType(coinName as string),\n walletAddress,\n );\n return mergeDest;\n }),\n )\n ).filter((t) => !!t);\n\n if (objectsNeedToTransfer.length > 0) {\n txb.transferObjects(objectsNeedToTransfer, walletAddress);\n }\n\n return txb.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.claimIncentiveRewards(input.scallopClient, input.account.address);\n }\n\n static fromData(data = {}): ClaimIncentiveRewardIntention {\n return new ClaimIncentiveRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface DepositCollateralIntentionData {\n collateralCoinName: string;\n amount: number | string;\n obligationId: string;\n}\n\nexport class DepositCollateralIntention extends ScallopCoreBaseIntention<DepositCollateralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DepositCollateral;\n\n constructor(public readonly data: DepositCollateralIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.depositCollateral(\n this.data.collateralCoinName,\n +this.data.amount,\n false,\n this.data.obligationId,\n );\n }\n\n static fromData(data: DepositCollateralIntentionData): DepositCollateralIntention {\n return new DepositCollateralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface MigrateAndClaimIntentionData {\n obligationKey: string;\n obligationId: string;\n rewardCoinName: string;\n veScaKey?: string;\n}\n\nexport class MigrateAndClaimIntention extends ScallopCoreBaseIntention<MigrateAndClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateAndClaim;\n\n constructor(public readonly data: MigrateAndClaimIntentionData) {\n super(data);\n }\n\n async migrateAndClaim({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { obligationKey, obligationId, rewardCoinName, veScaKey } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const rewardCoin = OldBorrowIncentiveTxBuilder.redeem_rewards(\n tx,\n obligationKey,\n obligationId,\n client.utils.parseCoinType(rewardCoinName),\n );\n tx.transferObjects([rewardCoin], sender);\n await tx.unstakeObligationQuick(obligationId, obligationKey);\n if (veScaKey) {\n await tx.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n } else {\n await tx.stakeObligationQuick(obligationId, obligationKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.migrateAndClaim(input);\n }\n\n static fromData(data: MigrateAndClaimIntentionData): MigrateAndClaimIntention {\n return new MigrateAndClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MigrateScoinIntentionData {}\n\nexport class MigrateScoinIntention extends ScallopCoreBaseIntention<MigrateScoinIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateScoin;\n\n constructor(public readonly data: MigrateScoinIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.migrateAllMarketCoin(false, false);\n }\n\n static fromData(data: MigrateScoinIntentionData): MigrateScoinIntention {\n return new MigrateScoinIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface OpenObligationIntentionData {}\n\nexport class OpenObligationIntention extends ScallopCoreBaseIntention<OpenObligationIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.OpenObligation;\n\n constructor(public readonly data: OpenObligationIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.openObligation(false);\n }\n\n static fromData(data: OpenObligationIntentionData): OpenObligationIntention {\n return new OpenObligationIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class RepayIntention extends ScallopCoreBaseIntention<RepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Repay;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async repay({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { coinName, amount, obligationId, obligationKey } = this.data;\n\n const tx = await this.buildTxWithRefreshObligation(\n client,\n {\n walletAddress: sender,\n obligationId,\n obligationKey,\n },\n async (_, innerTx) => {\n await innerTx.repayQuick(+amount, coinName, obligationId);\n },\n );\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.repay(input);\n }\n\n static fromData(data: RepayIntentionData): RepayIntention {\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RepayWithBoostIntentionData {\n coinName: string;\n amount: number | string;\n obligationId: string;\n veScaKey: string;\n}\n\nexport class RepayWithBoostIntention extends ScallopCoreBaseIntention<RepayWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RepayWithBoost;\n\n constructor(public readonly data: RepayWithBoostIntentionData) {\n super(data);\n }\n\n async repayWithBoost({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { coinName, amount, obligationId, veScaKey } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const availableStake = client.constants.whitelist.borrowing.has(coinName);\n if (availableStake) {\n await tx.unstakeObligationQuick(obligationId, undefined);\n }\n await tx.repayQuick(+amount, coinName, obligationId);\n if (availableStake) {\n await tx.stakeObligationWithVeScaQuick(obligationId, undefined, veScaKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.repayWithBoost(input);\n }\n\n static fromData(data: RepayWithBoostIntentionData): RepayWithBoostIntention {\n return new RepayWithBoostIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyLendingIntentionData {\n amount: number | string;\n coinName: string;\n}\n\nexport class SupplyLendingIntention extends ScallopCoreBaseIntention<SupplyLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyLending;\n\n constructor(public readonly data: SupplyLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.deposit(this.data.coinName, +this.data.amount, false, input.account.address);\n }\n\n static fromData(data: SupplyLendingIntentionData): SupplyLendingIntention {\n return new SupplyLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface UnstakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: string;\n stakeAccountId: string | null;\n}\n\nexport class UnstakeSpoolIntention extends ScallopCoreBaseIntention<UnstakeSpoolIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.UnstakeSpool;\n\n constructor(public readonly data: UnstakeSpoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.unstake(this.data.marketCoinName, +this.data.amount, false);\n }\n\n static fromData(data: UnstakeSpoolIntentionData): UnstakeSpoolIntention {\n return new UnstakeSpoolIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawAndUnstakeLendingIntentionData {\n amount: number | undefined;\n coinName: string;\n stakeAccountId: { id: string; coin: number }[];\n}\n\nexport class WithdrawAndUnstakeLendingIntention extends ScallopCoreBaseIntention<WithdrawAndUnstakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawAndUnstakeLending;\n\n constructor(public readonly data: WithdrawAndUnstakeLendingIntentionData) {\n super(data);\n }\n\n async unstakeAndWithdraw(client: ScallopClient, data: WithdrawAndUnstakeLendingIntentionData, walletAddress: string) {\n const tx = client.builder.createTxBlock();\n tx.setSender(walletAddress);\n\n const { stakeAccountId, amount: totalAmount, coinName } = this.data;\n const withdrawCoins = [];\n for (let i = 0; i < stakeAccountId.length; i++) {\n const { id: stakeAccount, coin: amount } = stakeAccountId[i];\n const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n const [marketCoin] = await tx.unstakeQuick(amount, stakeMarketCoinName, stakeAccount);\n if (marketCoin) {\n const wdScoin = tx.withdraw(marketCoin, coinName);\n withdrawCoins.push(wdScoin);\n }\n }\n if (totalAmount > 0) {\n const wdCoin = await tx.withdrawQuick(totalAmount, coinName);\n withdrawCoins.push(wdCoin);\n }\n if (withdrawCoins.length > 1) {\n tx.mergeCoins(withdrawCoins[0], withdrawCoins.slice(1));\n }\n tx.transferObjects(withdrawCoins, walletAddress);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.unstakeAndWithdraw(input.scallopClient, this.data, input.account.address);\n }\n\n static fromData(data: WithdrawAndUnstakeLendingIntentionData): WithdrawAndUnstakeLendingIntention {\n return new WithdrawAndUnstakeLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawCollateralIntentionData {\n collateralCoinName: string;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class WithdrawCollateralIntention extends ScallopCoreBaseIntention<WithdrawCollateralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawCollateral;\n\n constructor(public readonly data: WithdrawCollateralIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.withdrawCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\n false,\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\n }\n\n static fromData(data: WithdrawCollateralIntentionData): WithdrawCollateralIntention {\n return new WithdrawCollateralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks, TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawLendingIntentionData {\n amount: string | number;\n coinName: string;\n}\n\nexport class WithdrawLendingIntention extends ScallopCoreBaseIntention<WithdrawLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawLending;\n\n constructor(public readonly data: WithdrawLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return input.scallopClient.withdraw(this.data.coinName, Number(this.data.amount), false, input.account.address);\n }\n\n static fromData(data: WithdrawLendingIntentionData): WithdrawLendingIntention {\n return new WithdrawLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface BindReferralIntentionData {\n veScaKey: string;\n}\n\nexport class BindReferralIntention extends ScallopCoreBaseIntention<BindReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BindReferral;\n\n constructor(public readonly data: BindReferralIntentionData) {\n super(data);\n }\n\n async bindReferral({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n tx.bindToReferral(this.data.veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.bindReferral(input);\n }\n\n static fromData(data: BindReferralIntentionData): BindReferralIntention {\n return new BindReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ClaimRevenueReferralIntentionData {\n veScaKey: string;\n coins: string[];\n}\n\nexport class ClaimRevenueReferralIntention extends ScallopCoreBaseIntention<ClaimRevenueReferralIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimRevenueReferral;\n\n constructor(public readonly data: ClaimRevenueReferralIntentionData) {\n super(data);\n }\n\n async claimRevenueReferral({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { veScaKey, coins } = this.data;\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const coinsName = coins.map((coin) => client.utils.parseCoinNameFromType(coin));\n\n await tx.claimReferralRevenueQuick(veScaKey, coinsName);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.claimRevenueReferral(input);\n }\n\n static fromData(data: ClaimRevenueReferralIntentionData): ClaimRevenueReferralIntention {\n return new ClaimRevenueReferralIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface CreateReferralLinkIntentionData {}\n\nexport class CreateReferralLinkIntention extends ScallopCoreBaseIntention<CreateReferralLinkIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CreateReferralLink;\n\n constructor(public readonly data: CreateReferralLinkIntentionData) {\n super(data);\n }\n\n async createReferralLink({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const referralTicket = tx.mintEmptyVeSca();\n tx.transferObjects([referralTicket], sender);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.createReferralLink(input);\n }\n\n static fromData(data: CreateReferralLinkIntentionData): CreateReferralLinkIntention {\n return new CreateReferralLinkIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendPeriodAndStakeMoreIntentionData {\n amount: number;\n veScaKey: string;\n unlockTime: number;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n isOldBorrowIncentive: boolean;\n isObligationLocked: boolean;\n}\n\nexport class ExtendPeriodAndStakeMoreIntention extends ScallopCoreBaseIntention<ExtendPeriodAndStakeMoreIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendPeriodAndStakeMore;\n\n constructor(public readonly data: ExtendPeriodAndStakeMoreIntentionData) {\n super(data);\n }\n\n async extendPeriodAndStakeMoreSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { amount, veScaKey, unlockTime, obligationId, obligationKey, isOldBorrowIncentive, isObligationLocked } =\n this.data;\n\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n tx.extendLockPeriod(veScaKey, unlockTime);\n tx.extendLockAmount(veScaKey, takeCoin);\n tx.transferObjects([leftCoin], sender);\n if (!obligationId || !obligationKey) {\n return tx.txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationId, obligationKey);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.extendPeriodAndStakeMoreSca(input);\n }\n\n static fromData(data: ExtendPeriodAndStakeMoreIntentionData): ExtendPeriodAndStakeMoreIntention {\n return new ExtendPeriodAndStakeMoreIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface ExtendStakePeriodIntentionData {\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n unlockTime: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class ExtendStakePeriodIntention extends ScallopCoreBaseIntention<ExtendStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendStakePeriod;\n\n constructor(public readonly data: ExtendStakePeriodIntentionData) {\n super(data);\n }\n\n async extendStakeScaLockPeriod({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n const { veScaKey, unlockTime, obligationId, obligationKey, isObligationLocked, isOldBorrowIncentive } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n tx.extendLockPeriod(veScaKey, unlockTime);\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.extendStakeScaLockPeriod(input);\n }\n\n static fromData(data: ExtendStakePeriodIntentionData): ExtendStakePeriodIntention {\n return new ExtendStakePeriodIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RedeemScaIntentionData {\n veScaKey: string;\n}\n\nexport class RedeemScaIntention extends ScallopCoreBaseIntention<RedeemScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RedeemSca;\n\n constructor(public readonly data: RedeemScaIntentionData) {\n super(data);\n }\n\n async redeemSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const { veScaKey } = this.data;\n const sender = account.address;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n await tx.redeemScaQuick(veScaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.redeemSca(input);\n }\n\n static fromData(data: RedeemScaIntentionData): RedeemScaIntention {\n return new RedeemScaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface RenewExpStakePeriodIntentionData {\n amount: number;\n unlockTime: number;\n vescaKey: string;\n isHaveRedeem: boolean;\n obligation?: string;\n obligationKey?: string;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n}\n\nexport class RenewExpStakePeriodIntention extends ScallopCoreBaseIntention<RenewExpStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RenewExpStakePeriod;\n\n constructor(public readonly data: RenewExpStakePeriodIntentionData) {\n super(data);\n }\n\n async renewExpiredStakeSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const sender = account.address;\n const {\n amount,\n unlockTime,\n vescaKey,\n isHaveRedeem,\n obligation,\n obligationKey,\n isObligationLocked,\n isOldBorrowIncentive,\n } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n if (isHaveRedeem) {\n const redeem = tx.redeemSca(vescaKey);\n tx.transferObjects([redeem], sender);\n }\n\n // Get all SCA and merge them into one.\n const coins = await client.builder.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n tx.transferObjects([leftCoin], sender);\n\n // renew veSCA\n tx.renewExpiredVeSca(vescaKey, takeCoin, unlockTime);\n if (!obligation || !obligationKey) {\n return tx.txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligation);\n } else {\n tx.unstakeObligation(obligation, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.renewExpiredStakeSca(input);\n }\n\n static fromData(data: RenewExpStakePeriodIntentionData): RenewExpStakePeriodIntention {\n return new RenewExpStakePeriodIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { SCA_COIN_TYPE, ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { OldBorrowIncentiveTxBuilder } from '../../utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface StakeScaIntentionData {\n amount: number;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n unlockTime: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class StakeScaIntention extends ScallopCoreBaseIntention<StakeScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSca;\n\n constructor(public readonly data: StakeScaIntentionData) {\n super(data);\n }\n\n async stakeSca({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { amount, isObligationLocked, isOldBorrowIncentive, obligationId, obligationKey, unlockTime, veScaKey } =\n this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await client.utils.selectCoins(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = tx.takeAmountFromCoins(coins, amount);\n\n let newVescaKey;\n if (!veScaKey) {\n newVescaKey = tx.lockSca(takeCoin, unlockTime);\n } else {\n tx.extendLockAmount(veScaKey, takeCoin);\n }\n\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n OldBorrowIncentiveTxBuilder.unstakeObligation(tx, obligationKey, obligationId);\n } else {\n tx.unstakeObligation(obligationId, obligationKey);\n }\n }\n tx.stakeObligationWithVesca(obligationId, obligationKey, veScaKey || newVescaKey);\n }\n\n if (!veScaKey) {\n tx.transferObjects([newVescaKey, leftCoin], sender);\n }\n\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.stakeSca(input);\n }\n\n static fromData(data: StakeScaIntentionData): StakeScaIntention {\n return new StakeScaIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface SupplyAndStakeLendingIntentionData {\n amount: number | string;\n coinName: string;\n stakeAccountId?: string | null;\n}\n\nexport class SupplyAndStakeLendingIntention extends ScallopCoreBaseIntention<SupplyAndStakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyAndStakeLending;\n\n constructor(public readonly data: SupplyAndStakeLendingIntentionData) {\n super(data);\n }\n\n async supplyAndStake({ account, scallopClient: client }: { account: WalletAccount; scallopClient: ScallopClient }) {\n const sender = account.address;\n const { amount, coinName, stakeAccountId } = this.data;\n\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n const marketCoin = await tx.depositQuick(+amount, coinName);\n const stakeMarketCoinName = client.utils.parseMarketCoinName(coinName);\n if (client.constants.whitelist.spool.has(stakeMarketCoinName)) {\n return tx.txBlock;\n }\n const stakeAccounts = await client.query.getStakeAccounts(stakeMarketCoinName, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await tx.stakeQuick(marketCoin, stakeMarketCoinName, targetStakeAccount);\n } else {\n const newStakeAccount = tx.createStakeAccount(stakeMarketCoinName);\n await tx.stakeQuick(marketCoin, stakeMarketCoinName, newStakeAccount);\n tx.transferObjects([newStakeAccount], sender);\n }\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.supplyAndStake(input);\n }\n\n static fromData(data: SupplyAndStakeLendingIntentionData): SupplyAndStakeLendingIntention {\n return new SupplyAndStakeLendingIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { ScallopClient } from '@scallop-io/sui-scallop-sdk';\n\nimport { SuiNetworks } from '@/types';\n\nimport { TransactionSubType } from '../../types/utils';\nimport { ScallopCoreBaseIntention } from '../scallopCoreBaseIntention';\n\nexport interface WithdrawStakedScaIntentionData {\n vescaKey?: string;\n}\n\nexport class WithdrawStakedScaIntention extends ScallopCoreBaseIntention<WithdrawStakedScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawStakedSca;\n\n constructor(public readonly data: WithdrawStakedScaIntentionData) {\n super(data);\n }\n\n async withdrawUnlockedSca({\n account,\n scallopClient: client,\n }: {\n account: WalletAccount;\n scallopClient: ScallopClient;\n }) {\n const { vescaKey } = this.data;\n const sender = account.address;\n const tx = client.builder.createTxBlock();\n tx.setSender(sender);\n\n await tx.redeemScaQuick(vescaKey);\n return tx.txBlock;\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n scallopClient: ScallopClient;\n }): Promise<Transaction> {\n return this.withdrawUnlockedSca(input);\n }\n\n static fromData(data: WithdrawStakedScaIntentionData): WithdrawStakedScaIntention {\n return new WithdrawStakedScaIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n ConvertAndDepositIntentionData,\n ConvertIntentionData,\n SpringSuiIntentionData,\n StakeAndDepositIntentionData,\n StakeIntentionData,\n UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ConvertIntention } from './intentions/convert';\nimport { ConvertAndDepositIntention } from './intentions/convertAndDeposit';\nimport { StakeIntention } from './intentions/stake';\nimport { StakeAndDepositIntention } from './intentions/stakeAndDeposit';\nimport { UnstakeIntention } from './intentions/unstake';\nimport { Utils, TransactionSubType, getUtils, IntentionInput } from './types/helper';\n\nexport type SpringSuiIntention =\n | StakeIntention\n | StakeAndDepositIntention\n | ConvertIntention\n | ConvertAndDepositIntention\n | UnstakeIntention;\n\nexport class SpringSuiAppHelper implements IAppHelperInternal<SpringSuiIntentionData> {\n application = 'SpringSui';\n\n supportSDK = '@mysten/sui' as const;\n\n private utils: Utils | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SpringSuiIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: account.address,\n transactionBlock: transaction,\n });\n console.log('SpringSuiAppHelper.deserialize', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: SpringSuiIntentionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { network, txSubType, intentionData, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n let intention: SpringSuiIntention;\n switch (txSubType) {\n case TransactionSubType.STAKE:\n intention = StakeIntention.fromData(intentionData as StakeIntentionData);\n break;\n case TransactionSubType.STAKE_AND_DEPOSIT:\n intention = StakeAndDepositIntention.fromData(intentionData as StakeAndDepositIntentionData);\n break;\n case TransactionSubType.CONVERT:\n intention = ConvertIntention.fromData(intentionData as ConvertIntentionData);\n break;\n case TransactionSubType.CONVERT_AND_DEPOSIT:\n intention = ConvertAndDepositIntention.fromData(intentionData as ConvertAndDepositIntentionData);\n break;\n case TransactionSubType.UNSTAKE:\n intention = UnstakeIntention.fromData(intentionData as UnstakeIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({\n network,\n suiClient,\n account,\n\n suilendClient: this.utils.suilendClient,\n LIQUID_STAKING_INFO_MAP: this.utils.LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap: this.utils.obligationOwnerCaps?.[0],\n obligation: this.utils.obligations?.[0],\n } as IntentionInput);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\n\nimport {\n ConvertAndDepositIntentionData,\n ConvertIntentionData,\n StakeAndDepositIntentionData,\n StakeIntentionData,\n UnstakeIntentionData,\n} from '@/apps/springSui/types/intention';\n\nimport { DecodeResult, TransactionSubType } from './types/helper';\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n decode() {\n if (this.isStakeTransaction()) {\n return this.decodeStake();\n }\n if (this.isStakeAndDepositTransaction()) {\n return this.decodeStakeAndDeposit();\n }\n if (this.isConvertTransaction()) {\n return this.decodeConvert();\n }\n if (this.isConvertAndDepositTransaction()) {\n return this.decodeConvertAndDeposit();\n }\n if (this.isUnstakeTransaction()) {\n return this.decodeUnstake();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private hasSuilendDepositTransactionMoveCallCommands() {\n return (\n !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n );\n }\n\n private hasMintMoveCallCommands() {\n return !!this.getMoveCallCommand('mint');\n }\n\n private hasRedeemMoveCallCommands() {\n return !!this.getMoveCallCommand('redeem');\n }\n\n // is*\n private isStakeTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n !this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isStakeAndDepositTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n !this.hasRedeemMoveCallCommands() &&\n this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isConvertTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isConvertAndDepositTransaction() {\n return (\n this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n private isUnstakeTransaction() {\n return (\n !this.hasMintMoveCallCommands() &&\n this.hasRedeemMoveCallCommands() &&\n !this.hasSuilendDepositTransactionMoveCallCommands()\n );\n }\n\n // decode*\n private decodeStake(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n console.log('Decoder.decodeStake', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.STAKE,\n intentionData: {\n amount,\n outCoinType,\n } as StakeIntentionData,\n };\n }\n\n private decodeStakeAndDeposit(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.MintEvent.parsedJson as any).event.sui_amount_in as string;\n console.log('Decoder.decodeStakeAndDeposit', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.STAKE_AND_DEPOSIT,\n intentionData: {\n amount,\n outCoinType,\n } as StakeAndDepositIntentionData,\n };\n }\n\n private decodeConvert(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeConvert', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CONVERT,\n intentionData: {\n amount,\n inCoinType,\n outCoinType,\n } as ConvertIntentionData,\n };\n }\n\n private decodeConvertAndDeposit(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n MintEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::MintEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const outCoinType = normalizeStructTag((events.MintEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeConvertAndDeposit', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CONVERT_AND_DEPOSIT,\n intentionData: {\n amount,\n inCoinType,\n outCoinType,\n } as ConvertAndDepositIntentionData,\n };\n }\n\n private decodeUnstake(): DecodeResult {\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('liquid_staking::RedeemEvent')),\n };\n\n const inCoinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).event.typename.name as string);\n const amount = (events.RedeemEvent.parsedJson as any).event.lst_amount_in as string;\n console.log('Decoder.decodeUnstake', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UNSTAKE,\n intentionData: {\n amount,\n inCoinType,\n } as UnstakeIntentionData,\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { fetchRegistryLiquidStakingInfoMap, LiquidStakingObjectInfo } from '@suilend/springsui-sdk/client';\n\nimport { SpringSuiIntentionData } from '@/apps/springSui/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { getUtils as getSuilendUtils, Utils as SuilendUtils } from '../../suilend/helper';\n\nexport enum TransactionSubType {\n STAKE = 'stake',\n STAKE_AND_DEPOSIT = 'stakeAndDeposit',\n CONVERT = 'convert',\n CONVERT_AND_DEPOSIT = 'convertAndDeposit',\n UNSTAKE = 'unstake',\n}\n\nexport type DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: SpringSuiIntentionData;\n};\n\nexport type Utils = {\n LIQUID_STAKING_INFO_MAP: Record<string, LiquidStakingObjectInfo>;\n} & SuilendUtils;\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n const suilendUtils = await getSuilendUtils(suiClient, account);\n\n const LIQUID_STAKING_INFO_MAP = await fetchRegistryLiquidStakingInfoMap(suiClient);\n\n return { ...suilendUtils, LIQUID_STAKING_INFO_MAP };\n};\n\nexport type IntentionInput = {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n\n suilendClient: Utils['suilendClient'];\n LIQUID_STAKING_INFO_MAP: Utils['LIQUID_STAKING_INFO_MAP'];\n obligationOwnerCap: Utils['obligationOwnerCaps'][0] | undefined;\n obligation: Utils['obligations'][0] | undefined;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\nimport { LENDING_MARKET_ID, LENDING_MARKET_TYPE, SuilendClient } from '@suilend/sdk';\nimport { ObligationOwnerCap } from '@suilend/sdk/_generated/suilend/lending-market/structs';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport {\n BorrowIntentionData,\n ClaimAndDepositIntentionData,\n ClaimIntentionData,\n DepositIntentionData,\n RepayIntentionData,\n SuilendIntentionData,\n WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { BorrowIntention } from './intentions/borrow';\nimport { ClaimIntention } from './intentions/claim';\nimport { ClaimAndDepositIntention } from './intentions/claimAndDeposit';\nimport { DepositIntention } from './intentions/deposit';\nimport { RepayIntention } from './intentions/repay';\nimport { WithdrawIntention } from './intentions/withdraw';\nimport { TransactionSubType } from './types';\n\nexport type Utils = {\n suilendClient: SuilendClient;\n obligationOwnerCaps: ObligationOwnerCap<string>[];\n obligations: Obligation<string>[];\n};\n\nexport const getUtils = async (suiClient: SuiClient, account: WalletAccount): Promise<Utils> => {\n const suilendClient = await SuilendClient.initialize(LENDING_MARKET_ID, LENDING_MARKET_TYPE, suiClient);\n\n const obligationOwnerCaps = await SuilendClient.getObligationOwnerCaps(\n account.address,\n suilendClient.lendingMarket.$typeArgs,\n suiClient,\n );\n\n const obligations = await Promise.all(\n obligationOwnerCaps.map((ownerCap) =>\n SuilendClient.getObligation(ownerCap.obligationId, suilendClient.lendingMarket.$typeArgs, suiClient),\n ),\n );\n\n console.log(\n 'XXX getUtils - suilendClient:',\n suilendClient,\n 'obligations:',\n obligations,\n 'obligationOwnerCaps:',\n obligationOwnerCaps,\n );\n\n return { suilendClient, obligationOwnerCaps, obligations };\n};\n\nexport type SuilendIntention =\n | DepositIntention\n | WithdrawIntention\n | BorrowIntention\n | RepayIntention\n | ClaimIntention\n | ClaimAndDepositIntention;\n\nexport class SuilendAppHelper implements IAppHelperInternal<SuilendIntentionData> {\n application = 'Suilend';\n\n supportSDK = '@mysten/sui' as const;\n\n private utils: Utils | undefined;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: SuilendIntentionData }> {\n const { transaction, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: account.address,\n transactionBlock: transaction,\n });\n\n console.log('SuilendAppHelper.deserialize - simResult:', simResult, 'utils:', this.utils, 'suiClient:', suiClient);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n intentionData: SuilendIntentionData;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<Transaction> {\n const { network, txSubType, intentionData, suiClient, account } = input;\n\n if (!this.utils) {\n this.utils = await getUtils(suiClient, account);\n }\n\n let intention: SuilendIntention;\n switch (txSubType) {\n case TransactionSubType.DEPOSIT:\n intention = DepositIntention.fromData(intentionData as DepositIntentionData);\n break;\n case TransactionSubType.WITHDRAW:\n intention = WithdrawIntention.fromData(intentionData as WithdrawIntentionData);\n break;\n case TransactionSubType.BORROW:\n intention = BorrowIntention.fromData(intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.REPAY:\n intention = RepayIntention.fromData(intentionData as RepayIntentionData);\n break;\n case TransactionSubType.CLAIM:\n intention = ClaimIntention.fromData(intentionData as ClaimIntentionData);\n break;\n case TransactionSubType.CLAIM_AND_DEPOSIT:\n intention = ClaimAndDepositIntention.fromData(intentionData as ClaimAndDepositIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n const obligationId = window.localStorage.getItem('obligationId');\n const obligation = this.utils.obligations?.find((o) => o.id === obligationId) ?? this.utils.obligations?.[0];\n const obligationOwnerCap = this.utils.obligationOwnerCaps?.find((o) => o.obligationId === obligation?.id);\n\n return intention.build({\n network,\n suiClient,\n account,\n\n suilendClient: this.utils.suilendClient,\n obligationOwnerCap,\n obligation,\n } as IntentionInput);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64, toHex } from '@mysten/bcs';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag } from '@mysten/sui/utils';\nimport { MAX_U64 } from '@suilend/frontend-sui';\nimport BigNumber from 'bignumber.js';\n\nimport {\n BorrowIntentionData,\n ClaimAndDepositIntentionData,\n ClaimIntentionData,\n DepositIntentionData,\n RepayIntentionData,\n SuilendIntentionData,\n WithdrawIntentionData,\n} from '@/apps/suilend/types/helper';\n\nimport { TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: SuilendIntentionData;\n};\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n decode() {\n if (this.isDepositTransaction()) {\n return this.decodeDeposit();\n }\n if (this.isWithdrawTransaction()) {\n return this.decodeWithdraw();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isClaimTransaction()) {\n return this.decodeClaim();\n }\n if (this.isClaimAndDepositTransaction()) {\n return this.decodeClaimAndDeposit();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get inputs() {\n console.log('this.transaction.getData().inputs', this.transaction.getData().inputs);\n return this.transaction.getData().inputs;\n }\n\n private get commands() {\n console.log('this.transaction.getData().commands', this.transaction.getData().commands);\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private hasDepositTransactionMoveCallCommands() {\n return (\n !!this.getMoveCallCommand('deposit_liquidity_and_mint_ctokens') &&\n !!this.getMoveCallCommand('deposit_ctokens_into_obligation')\n );\n }\n\n private hasClaimTransactionMoveCallCommands() {\n return !!this.getMoveCallCommand('claim_rewards');\n }\n\n // is*\n private isDepositTransaction() {\n return !this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n }\n\n private isWithdrawTransaction() {\n return (\n !!this.getMoveCallCommand('withdraw_ctokens') &&\n !!this.getMoveCallCommand('redeem_ctokens_and_withdraw_liquidity_request')\n );\n }\n\n private isBorrowTransaction() {\n return !!this.getMoveCallCommand('borrow_request');\n }\n\n private isRepayTransaction() {\n return !!this.getMoveCallCommand('repay');\n }\n\n private isClaimTransaction() {\n return this.hasClaimTransactionMoveCallCommands() && !this.hasDepositTransactionMoveCallCommands();\n }\n\n private isClaimAndDepositTransaction() {\n return this.hasClaimTransactionMoveCallCommands() && this.hasDepositTransactionMoveCallCommands();\n }\n\n // decode*\n private decodeDeposit(): DecodeResult {\n const events = {\n MintEvent: this.simResult.events.find((event) => event.type.includes('lending_market::MintEvent')),\n };\n\n const coinType = normalizeStructTag((events.MintEvent.parsedJson as any).coin_type.name as string);\n const value = (events.MintEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeDeposit', coinType, value);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DEPOSIT,\n intentionData: {\n coinType,\n value,\n } as DepositIntentionData,\n };\n }\n\n private decodeWithdraw(): DecodeResult {\n const commands = {\n withdraw_ctokens: this.getMoveCallCommand('withdraw_ctokens'),\n };\n const events = {\n RedeemEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RedeemEvent')),\n };\n\n const coinType = normalizeStructTag((events.RedeemEvent.parsedJson as any).coin_type.name as string);\n let value = (events.RedeemEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeWithdraw', coinType, value);\n\n const inputIndex = (commands.withdraw_ctokens.MoveCall.arguments[4] as any).Input as number;\n const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n const isMax = inputValue === MAX_U64.toString();\n console.log(\n 'decodeWithdraw - isMax:',\n isMax,\n 'inputIndex:',\n inputIndex,\n 'inputValue:',\n inputValue,\n 'MAX_U64.toString():',\n MAX_U64.toString(),\n );\n if (isMax) {\n value = MAX_U64.toString();\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WITHDRAW,\n intentionData: {\n coinType,\n value,\n } as WithdrawIntentionData,\n };\n }\n\n private decodeBorrow(): DecodeResult {\n const commands = {\n borrow_request: this.getMoveCallCommand('borrow_request'),\n };\n const events = {\n BorrowEvent: this.simResult.events.find((event) => event.type.includes('lending_market::BorrowEvent')),\n };\n\n const coinType = normalizeStructTag((events.BorrowEvent.parsedJson as any).coin_type.name as string);\n let value = `${+(events.BorrowEvent.parsedJson as any).liquidity_amount - +(events.BorrowEvent.parsedJson as any).origination_fee_amount}`;\n console.log('Decoder.decodeBorrow', coinType, value);\n\n const inputIndex = (commands.borrow_request.MoveCall.arguments[4] as any).Input as number;\n const inputValue = new BigNumber(toHex(fromBase64(this.inputs[inputIndex].Pure!.bytes)), 16).toString();\n\n const isMax = inputValue === MAX_U64.toString();\n console.log(\n 'decodeBorrow - isMax:',\n isMax,\n 'inputIndex:',\n inputIndex,\n 'inputValue:',\n inputValue,\n 'MAX_U64.toString():',\n MAX_U64.toString(),\n );\n if (isMax) {\n value = MAX_U64.toString();\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.BORROW,\n intentionData: {\n coinType,\n value,\n } as BorrowIntentionData,\n };\n }\n\n private decodeRepay(): DecodeResult {\n const events = {\n RepayEvent: this.simResult.events.find((event) => event.type.includes('lending_market::RepayEvent')),\n };\n\n const coinType = normalizeStructTag((events.RepayEvent.parsedJson as any).coin_type.name as string);\n const value = (events.RepayEvent.parsedJson as any).liquidity_amount as string;\n console.log('Decoder.decodeRepay', coinType, value);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.REPAY,\n intentionData: {\n coinType,\n value,\n } as RepayIntentionData,\n };\n }\n\n private decodeClaim(): DecodeResult {\n const events = {\n ClaimReward: this.simResult.events.filter((event) => event.type.includes('lending_market::ClaimReward')),\n };\n\n const result: Record<string, string> = {};\n for (let i = 0; i < events.ClaimReward.length; i++) {\n const claimRewardEvent = events.ClaimReward[i];\n\n const coinType = normalizeStructTag((claimRewardEvent.parsedJson as any).coin_type.name as string);\n const value = (claimRewardEvent.parsedJson as any).liquidity_amount as string;\n\n result[coinType] = `${+(result[coinType] ?? '0') + +value}`;\n }\n console.log('Decoder.decodeClaimRewards', result);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM,\n intentionData: {\n value: result,\n } as ClaimIntentionData,\n };\n }\n\n private decodeClaimAndDeposit(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CLAIM_AND_DEPOSIT,\n intentionData: this.decodeClaim().intentionData as ClaimAndDepositIntentionData,\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BorrowIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class BorrowIntention extends SuilendBaseIntention<BorrowIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.BORROW;\n\n constructor(public readonly data: BorrowIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('BorrowIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.borrowAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: BorrowIntentionData) {\n console.log('BorrowIntention.fromData', data);\n return new BorrowIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SuilendBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: IntentionInput): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimIntention extends SuilendBaseIntention<ClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM;\n\n constructor(public readonly data: ClaimIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('ClaimIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n suilendClient.claimRewardsAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n getRewards(suilendClient, obligation),\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: ClaimIntentionData) {\n console.log('ClaimIntention.fromData', data);\n return new ClaimIntention(data);\n }\n}\n","import { normalizeStructTag } from '@mysten/sui/utils';\nimport { isSendPoints } from '@suilend/frontend-sui';\nimport { ClaimRewardsReward, Side, SuilendClient } from '@suilend/sdk';\nimport { Obligation } from '@suilend/sdk/_generated/suilend/obligation/structs';\nimport BigNumber from 'bignumber.js';\n\nconst getRewards = (suilendClient: SuilendClient, obligation: Obligation<string>) => {\n const rewardsMap: Record<Side, ClaimRewardsReward[]> = {\n [Side.DEPOSIT]: [],\n [Side.BORROW]: [],\n };\n\n suilendClient.lendingMarket.reserves.forEach((reserve) => {\n [Side.DEPOSIT, Side.BORROW].forEach((side) => {\n const reservePrm = side === Side.DEPOSIT ? reserve.depositsPoolRewardManager : reserve.borrowsPoolRewardManager;\n\n const sideUrm = obligation.userRewardManagers.find((urm) => urm.poolRewardManagerId === reservePrm.id);\n if (!sideUrm) {\n return;\n }\n\n rewardsMap[side] = reservePrm.poolRewards\n .map((pr, index) => ({\n reserveArrayIndex: reserve.arrayIndex,\n rewardIndex: BigInt(index),\n rewardCoinType: normalizeStructTag(pr.coinType.name),\n side,\n }))\n .filter(\n (r) =>\n !isSendPoints(r.rewardCoinType) &&\n !!sideUrm.rewards[Number(r.rewardIndex)] &&\n new BigNumber(sideUrm.rewards[Number(r.rewardIndex)].earnedRewards.value.toString()).gt(0),\n );\n });\n });\n\n return Object.values(rewardsMap).flat();\n};\n\nexport default getRewards;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { ClaimAndDepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\nimport getRewards from '../utils/getRewards';\n\nexport class ClaimAndDepositIntention extends SuilendBaseIntention<ClaimAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CLAIM_AND_DEPOSIT;\n\n constructor(public readonly data: ClaimAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('ClaimAndDepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n suilendClient.claimRewardsAndDeposit(\n account.address,\n obligationOwnerCap.id,\n getRewards(suilendClient, obligation),\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: ClaimAndDepositIntentionData) {\n console.log('ClaimAndDepositIntention.fromData', data);\n return new ClaimAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { DepositIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class DepositIntention extends SuilendBaseIntention<DepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.DEPOSIT;\n\n constructor(public readonly data: DepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('DepositIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n const transaction = new Transaction();\n await suilendClient.depositIntoObligation(\n account.address,\n this.data.coinType,\n this.data.value,\n transaction,\n obligationOwnerCap?.id,\n );\n\n return transaction;\n }\n\n static fromData(data: DepositIntentionData) {\n console.log('DepositIntention.fromData', data);\n return new DepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { RepayIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class RepayIntention extends SuilendBaseIntention<RepayIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.REPAY;\n\n constructor(public readonly data: RepayIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('RepayIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.repayIntoObligation(\n account.address,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: RepayIntentionData) {\n console.log('RepayIntention.fromData', data);\n return new RepayIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { WithdrawIntentionData } from '@/apps/suilend/types/helper';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nimport { TransactionSubType } from '../types';\nimport { SuilendBaseIntention } from './suilendBaseIntention';\n\nexport class WithdrawIntention extends SuilendBaseIntention<WithdrawIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WITHDRAW;\n\n constructor(public readonly data: WithdrawIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, obligationOwnerCap, obligation } = input;\n console.log('WithdrawIntention.build', suiClient, account, suilendClient, obligationOwnerCap, obligation);\n\n if (!obligationOwnerCap || !obligation) {\n throw new Error('Obligation not found');\n }\n\n const transaction = new Transaction();\n await suilendClient.withdrawAndSendToUser(\n account.address,\n obligationOwnerCap.id,\n obligation.id,\n this.data.coinType,\n this.data.value,\n transaction,\n );\n\n return transaction;\n }\n\n static fromData(data: WithdrawIntentionData) {\n console.log('WithdrawIntention.fromData', data);\n return new WithdrawIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { convertLstsAndSendToUser, LstClient } from '@suilend/springsui-sdk';\n\nimport { ConvertIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertIntention extends SpringSuiBaseIntention<ConvertIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CONVERT;\n\n constructor(public readonly data: ConvertIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'ConvertIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n convertLstsAndSendToUser(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: ConvertIntentionData) {\n console.log('ConvertIntention.fromData', data);\n return new ConvertIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { BaseIntention } from '@/apps/interface/sui';\nimport { IntentionInput } from '@/apps/suilend/types/intention';\n\nexport abstract class SpringSuiBaseIntention<D> implements BaseIntention<D> {\n abstract txType: TransactionType;\n\n abstract txSubType: string;\n\n protected constructor(public readonly data: D) {}\n\n abstract build(input: IntentionInput): Promise<Transaction>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { convertLsts, LstClient } from '@suilend/springsui-sdk';\n\nimport { ConvertAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class ConvertAndDepositIntention extends SpringSuiBaseIntention<ConvertAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.CONVERT_AND_DEPOSIT;\n\n constructor(public readonly data: ConvertAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'ConvertAndDepositIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n\n const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n suilendClient,\n transaction,\n obligationOwnerCap,\n );\n\n const lstCoin = convertLsts(inLstClient, outLstClient, transaction, account.address, this.data.amount);\n suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n if (didCreate) {\n sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n }\n\n return transaction;\n }\n\n static fromData(data: ConvertAndDepositIntentionData) {\n console.log('ConvertAndDepositIntention.fromData', data);\n return new ConvertAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeIntention extends SpringSuiBaseIntention<StakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.STAKE;\n\n constructor(public readonly data: StakeIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'StakeIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n outLstClient.mintAmountAndRebalanceAndSendToUser(transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: StakeIntentionData) {\n console.log('StakeIntention.fromData', data);\n return new StakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { createObligationIfNoneExists, sendObligationToUser } from '@suilend/sdk';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { StakeAndDepositIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class StakeAndDepositIntention extends SpringSuiBaseIntention<StakeAndDepositIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.STAKE_AND_DEPOSIT;\n\n constructor(public readonly data: StakeAndDepositIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'StakeAndDepositIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const outLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.outCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n\n const { obligationOwnerCapId, didCreate } = createObligationIfNoneExists(\n suilendClient,\n transaction,\n obligationOwnerCap,\n );\n\n const lstCoin = outLstClient.mintAmountAndRebalance(transaction, account.address, this.data.amount);\n suilendClient.deposit(lstCoin, this.data.outCoinType, obligationOwnerCapId, transaction);\n\n if (didCreate) {\n sendObligationToUser(obligationOwnerCapId, account.address, transaction);\n }\n\n return transaction;\n }\n\n static fromData(data: StakeAndDepositIntentionData) {\n console.log('StakeAndDepositIntention.fromData', data);\n return new StakeAndDepositIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { LstClient } from '@suilend/springsui-sdk';\n\nimport { UnstakeIntentionData } from '@/apps/springSui/types/intention';\n\nimport { SpringSuiBaseIntention } from './springSuiBaseIntention';\nimport { IntentionInput, TransactionSubType } from '../types/helper';\n\nexport class UnstakeIntention extends SpringSuiBaseIntention<UnstakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.UNSTAKE;\n\n constructor(public readonly data: UnstakeIntentionData) {\n super(data);\n }\n\n async build(input: IntentionInput): Promise<Transaction> {\n const { suiClient, account, suilendClient, LIQUID_STAKING_INFO_MAP, obligationOwnerCap, obligation } = input;\n console.log(\n 'UnstakeIntention.build',\n suiClient,\n account,\n suilendClient,\n LIQUID_STAKING_INFO_MAP,\n obligationOwnerCap,\n obligation,\n );\n\n const inLstClient = await LstClient.initialize(\n suiClient,\n Object.values(LIQUID_STAKING_INFO_MAP).find((info) => info.type === this.data.inCoinType),\n );\n\n //\n\n const transaction = new Transaction();\n inLstClient.redeemAmountAndSendToUser(transaction, account.address, this.data.amount);\n\n return transaction;\n }\n\n static fromData(data: UnstakeIntentionData) {\n console.log('UnstakeIntention.fromData', data);\n return new UnstakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { MintIntention } from './intentions/mint';\nimport { RedeemIntention } from './intentions/redeem';\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\nexport type StSuiIntention = MintIntention | RedeemIntention;\n\nexport class StSuiHelper implements IAppHelperInternal<StSuiIntentionData> {\n application = 'stsui';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n appContext?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: StSuiIntentionData }> {\n const { transaction, suiClient } = input;\n\n const simResult = await suiClient.devInspectTransactionBlock({\n sender: transaction.getData().sender,\n transactionBlock: transaction,\n });\n console.log('StSuiHelper Sim result - ', simResult);\n\n const decoder = new Decoder(transaction, simResult);\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: StSuiIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { account } = input;\n console.log('StSui build transaction type', input.txSubType);\n\n let intention: StSuiIntention;\n switch (input.txSubType) {\n case TransactionSubType.MINT:\n intention = MintIntention.fromData(input.intentionData as MintIntentionData);\n break;\n case TransactionSubType.REDEEM:\n intention = RedeemIntention.fromData(input.intentionData as RedeemIntentionData);\n break;\n default:\n throw new Error('build not implemented');\n }\n\n return intention.build({ account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { DevInspectResults } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { MintIntentionData, RedeemIntentionData, StSuiIntentionData, TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: StSuiIntentionData;\n};\n\ntype MintEventType = {\n event: {\n sui_amount_in: string;\n };\n};\n\ntype RedeemEventType = {\n event: {\n lst_amount_in: string;\n };\n};\n\nexport class Decoder {\n constructor(\n public readonly transaction: Transaction,\n public readonly simResult: DevInspectResults,\n ) {}\n\n /**\n * Entry point for decoding the transaction. Determines the type of transaction\n * and calls the appropriate decode method.\n */\n decode(): DecodeResult {\n if (this.isMintTransaction()) {\n const liquidityChangeEvent = this.getLiquidityChangeEvent('MintEvent');\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as MintEventType;\n console.log('Decoder event data - ', eventData);\n\n return this.decodeMint(eventData);\n }\n\n if (this.isRedeemTransaction()) {\n const liquidityChangeEvent = this.getLiquidityChangeEvent('RedeemEvent');\n if (!liquidityChangeEvent) {\n throw new Error('No liquidity change event found. Unable to decode transaction.');\n }\n\n const eventData = liquidityChangeEvent.parsedJson as RedeemEventType;\n console.log('Decoder event data - ', eventData);\n\n return this.decodeRedeem(eventData);\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n // ---- Private Helpers ----\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getLiquidityChangeEvent(arg: string) {\n return this.simResult.events.find((event) => this.isLiquidityChangeEventType(event.type, arg));\n }\n\n // is*\n\n private isLiquidityChangeEventType(eventType: string, arg: string) {\n return eventType.includes(arg);\n }\n\n private isMintTransaction() {\n return !!this.getMoveCallCommand('mint');\n }\n\n private isRedeemTransaction() {\n return !!this.getMoveCallCommand('redeem');\n }\n\n // ---- Decode Methods ----\n\n private decodeMint(eventData: MintEventType): DecodeResult {\n const {\n event: { sui_amount_in: amount },\n } = eventData;\n console.log('Decoder.decodeMint', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MINT,\n intentionData: {\n amount,\n } as MintIntentionData,\n };\n }\n\n private decodeRedeem(eventData: RedeemEventType): DecodeResult {\n const {\n event: { lst_amount_in: amount },\n } = eventData;\n console.log('Decoder.decodeRedeem', amount);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.REDEEM,\n intentionData: {\n amount,\n } as RedeemIntentionData,\n };\n }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { MintIntentionData, TransactionSubType } from '../types';\n\nexport class MintIntention extends BaseIntention<MintIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MINT;\n\n constructor(public readonly data: MintIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { amount } = this.data;\n const lstParams: LstParams = {\n lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n };\n const lst = new LST(lstParams);\n const txb = await lst.mint(amount, account.address);\n txb.setGasBudget(100_000_000);\n return txb;\n }\n\n static fromData(data: MintIntentionData) {\n console.log('MintIntention.fromData', data);\n return new MintIntention(data);\n }\n}\n","import { LST, LstParams } from '@alphafi/stsui-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { RedeemIntentionData, TransactionSubType } from '../types';\n\nexport class RedeemIntention extends BaseIntention<RedeemIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.REDEEM;\n\n constructor(public readonly data: RedeemIntentionData) {\n super(data);\n }\n\n async build(input: { account: WalletAccount }): Promise<Transaction> {\n const { account } = input;\n const { amount } = this.data;\n const lstParams: LstParams = {\n lstInfo: '0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5',\n lstCointype: '0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI',\n };\n const lst = new LST(lstParams);\n const txb = await lst.redeem(amount, account.address);\n txb.setGasBudget(100_000_000);\n return txb;\n }\n\n static fromData(data: RedeemIntentionData) {\n console.log('RedeemIntention.fromData', data);\n return new RedeemIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\n// eslint-disable-next-line import/no-cycle\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\n\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { BurnIntention } from './intentions/burn';\nimport { CollectFeeIntention } from './intentions/collect-fee';\nimport { CollectRewardIntention } from './intentions/collect-reward';\nimport { CreatePoolIntention } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention } from './intentions/decrease-liquidity';\nimport { IncreaseLiquidityIntention } from './intentions/increase-liquidity';\nimport { PrixClaimIntention } from './intentions/prix-claim';\nimport { PrixJoinIntention } from './intentions/prix-join';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport { SwapExactBaseForQuoteIntention } from './intentions/swap-exact-base-for-quote';\nimport { SwapExactQuoteForBaseIntention } from './intentions/swap-exact-quote-for-base';\nimport {\n AddLiquidityIntentionData,\n BurnIntentionData,\n CollectFeeIntentionData,\n CollectRewardIntentionData,\n CreatePoolIntentionData,\n DecreaseLiquidityIntentionData,\n IncreaseLiquidityIntentionData,\n PrixClaimIntentionData,\n PrixJoinIntentionData,\n RemoveLiquidityIntentionData,\n SuiNetworks,\n SwapExactBaseForQuoteIntentionData,\n SwapExactQuoteForBaseIntentionData,\n SwapIntentionData,\n TransactionSubType,\n TURBOSIntentionData,\n} from './types';\n\nexport type TURBOSIntention =\n | CreatePoolIntention\n | AddLiquidityIntention\n | IncreaseLiquidityIntention\n | DecreaseLiquidityIntention\n | CollectFeeIntention\n | CollectRewardIntention\n | RemoveLiquidityIntention\n | BurnIntention\n | SwapIntention\n | PrixClaimIntention\n | PrixJoinIntention\n | SwapExactQuoteForBaseIntention\n | SwapExactBaseForQuoteIntention;\n\nexport class TURBOSAppHelper implements IAppHelperInternalLegacy<TURBOSIntentionData> {\n application = 'turbos';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount } & {\n action?: string;\n txbParams?: any;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: TURBOSIntentionData;\n }> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const contract = await turbosSdk.contract.getConfig();\n const { transactionBlock, account } = input;\n console.log(input, 'input');\n const decoder = new Decoder(transactionBlock, turbosSdk, contract);\n const result = await decoder.decode(account.address);\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: TURBOSIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { suiClient, account, network } = input;\n let intention: TURBOSIntention;\n console.log(input.intentionData, 'intentionData');\n switch (input.txSubType) {\n case TransactionSubType.CreatePool:\n intention = CreatePoolIntention.fromData(input.intentionData as CreatePoolIntentionData);\n break;\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n break;\n case TransactionSubType.IncreaseLiquidity:\n intention = IncreaseLiquidityIntention.fromData(input.intentionData as IncreaseLiquidityIntentionData);\n break;\n case TransactionSubType.DecreaseLiquidity:\n intention = DecreaseLiquidityIntention.fromData(input.intentionData as DecreaseLiquidityIntentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n break;\n case TransactionSubType.CollectFee:\n intention = CollectFeeIntention.fromData(input.intentionData as CollectFeeIntentionData);\n break;\n case TransactionSubType.CollectReward:\n intention = CollectRewardIntention.fromData(input.intentionData as CollectRewardIntentionData);\n break;\n case TransactionSubType.Burn:\n intention = BurnIntention.fromData(input.intentionData as BurnIntentionData);\n break;\n case TransactionSubType.Swap:\n intention = SwapIntention.fromData(input.intentionData as SwapIntentionData);\n break;\n case TransactionSubType.PrixJoin:\n intention = PrixJoinIntention.fromData(input.intentionData as PrixJoinIntentionData);\n break;\n case TransactionSubType.PrixClaim:\n intention = PrixClaimIntention.fromData(input.intentionData as PrixClaimIntentionData);\n break;\n case TransactionSubType.SwapExactBaseForQuote:\n intention = SwapExactBaseForQuoteIntention.fromData(input.intentionData as SwapExactBaseForQuoteIntentionData);\n break;\n case TransactionSubType.SwapExactQuoteForBase:\n intention = SwapExactQuoteForBaseIntention.fromData(input.intentionData as SwapExactQuoteForBaseIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account, network });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { BN, Contract, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig, prixConfig } from './config';\nimport { TransactionSubType, TURBOSIntentionData } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: TURBOSIntentionData;\n};\n\nconst getAtoB = (layer: 0 | 1, target: string, swap1Layer: string[], swap2Layer: string[]): boolean[] => {\n if (layer === 1) {\n const index = swap2Layer.findIndex((item) => item === target);\n switch (index) {\n case 0:\n return [true, true];\n case 1:\n return [true, false];\n case 2:\n return [false, true];\n case 3:\n return [false, false];\n default:\n throw new Error(`not target: ${target}`);\n }\n }\n const index = swap1Layer.findIndex((item) => item === target);\n switch (index) {\n case 0:\n return [true];\n case 1:\n return [false];\n default:\n throw new Error(`not target: ${target}`);\n }\n};\n\nexport class Decoder {\n constructor(\n public readonly txb: TransactionBlock,\n public readonly turbosSdk: TurbosSdk,\n public readonly config: Contract.Config,\n ) {}\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get swap1Layer() {\n return [`${this.config.PackageId}::swap_router::swap_a_b`, `${this.config.PackageId}::swap_router::swap_b_a`];\n }\n\n private get swap2Layer() {\n return [\n `${this.config.PackageId}::swap_router::swap_a_b_b_c`,\n `${this.config.PackageId}::swap_router::swap_a_b_c_b`,\n `${this.config.PackageId}::swap_router::swap_b_a_b_c`,\n `${this.config.PackageId}::swap_router::swap_b_a_c_b`,\n ];\n }\n\n async decode(address: string) {\n if (this.isSwapTransaction()) {\n return this.decodeSwap();\n }\n\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n\n if (this.isIncreaseLiquidityTransaction()) {\n return this.decodeIncreaseLiquidity(address);\n }\n\n if (this.isRemoveLiquidityTransaction()) {\n return this.decodeRemoveLiquidity(address);\n }\n\n if (this.isDecreaseLiquidityTransaction()) {\n return this.decodeDecreaseLiquidity(address);\n }\n\n if (this.isCollectFeeTransaction()) {\n return this.decodeCollectFee();\n }\n\n if (this.isCollectRewardTransaction()) {\n return this.decodeCollectReward();\n }\n\n if (this.isBurnTransaction()) {\n return this.decodeBurn();\n }\n\n if (this.isPrixClaimTransaction()) {\n return this.decodePrixClaim();\n }\n\n if (this.isPrixJoinTransaction()) {\n return this.decodePrixJoin();\n }\n\n if (this.isSwapExactBaseForQuoteTransaction()) {\n return this.decodeSwapExactBaseForQuote();\n }\n\n if (this.isSwapExactQuoteForBaseTransaction()) {\n return this.decodeSwapExactQuoteForBase();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private getMoveCallsTransaction(targets: string[]) {\n return targets.every((target) =>\n this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target),\n );\n }\n\n private getSwapMoveCallTransaction(targets: string[]) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && targets.includes(trans.target));\n }\n\n private isSwapTransaction() {\n return !!this.getSwapMoveCallTransaction([...this.swap1Layer, ...this.swap2Layer]);\n }\n\n private isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::mint`);\n }\n\n private isIncreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::increase_liquidity`);\n }\n\n private isDecreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::decrease_liquidity`);\n }\n\n private isCollectFeeTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect`);\n }\n\n private isCollectRewardTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::collect_reward`);\n }\n\n private isBurnTransaction() {\n return !!this.getMoveCallTransaction(`${this.config.PackageId}::position_manager::burn`);\n }\n\n private isPrixJoinTransaction() {\n return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::join`);\n }\n\n private isPrixClaimTransaction() {\n return !!this.getMoveCallTransaction(`${prixConfig.PackageId}::claim::claim`);\n }\n\n private isRemoveLiquidityTransaction() {\n return !!this.getMoveCallsTransaction([\n `${this.config.PackageId}::position_manager::decrease_liquidity`,\n `${this.config.PackageId}::position_manager::burn`,\n ]);\n }\n\n private isSwapExactBaseForQuoteTransaction() {\n return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`);\n }\n\n private isSwapExactQuoteForBaseTransaction() {\n return !!this.getMoveCallTransaction(`${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`);\n }\n\n private async decodeSwap(): Promise<DecodeResult> {\n const moveCall = this.transactions.find((trans) => trans.kind === 'MoveCall') as MoveCallTransaction;\n let layer: 0 | 1 = 0;\n if (this.swap2Layer.includes(moveCall.target)) {\n layer = 1;\n }\n\n const atob = getAtoB(layer, moveCall.target, this.swap1Layer, this.swap2Layer);\n\n const routes = atob.map((item, index) => {\n const pool = this.helper.decodeSharedObjectId(index);\n const sqrtPrice = this.helper.decodeInputU128(4 + index + layer);\n const nextTickIndex = this.turbosSdk.math.sqrtPriceX64ToTickIndex(new BN(sqrtPrice.toString()));\n\n return {\n pool,\n a2b: item,\n nextTickIndex,\n };\n });\n\n // eslint-disable-next-line no-nested-ternary\n const coinTypeA = atob[0]\n ? moveCall.typeArguments[0]\n : layer === 1\n ? moveCall.typeArguments[0]\n : moveCall.typeArguments[1];\n const coinTypeB =\n // eslint-disable-next-line no-nested-ternary\n layer === 1 ? moveCall.typeArguments[4] : atob[0] ? moveCall.typeArguments[1] : moveCall.typeArguments[0];\n\n const address = this.helper.decodeInputAddress(6 + 2 * layer);\n const deadline = this.helper.decodeInputU64(7 + 2 * layer);\n const amountSpecifiedIsInput = this.helper.decodeInputBool(5 + 2 * layer);\n const amountA = this.helper.decodeInputU64(2 + layer);\n const amountB = this.helper.decodeInputU64(3 + layer);\n\n const result = await this.turbosSdk.trade.computeSwapResultV2({\n pools: [{ pool: routes[0].pool, a2b: routes[0].a2b, amountSpecified: amountA }],\n address,\n amountSpecifiedIsInput,\n });\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Swap,\n intentionData: {\n routes,\n coinTypeA,\n coinTypeB,\n address,\n amountA: amountSpecifiedIsInput ? amountA : amountB,\n amountB: amountSpecifiedIsInput ? amountB : amountA,\n amountSpecifiedIsInput,\n slippage: '0.1',\n deadline,\n },\n };\n }\n\n private decodeAddLiquidity(): DecodeResult {\n console.log(this.helper, 'decodeAddLiquidity this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const address = this.helper.decodeInputAddress(12);\n\n const amountA = this.helper.decodeInputU64(8);\n const amountB = this.helper.decodeInputU64(9);\n const tickLower = this.helper.decodeInputU32(4);\n const tickLowerIsNeg = this.helper.decodeInputBool(5);\n const tickUpper = this.helper.decodeInputU32(6);\n const tickUpperIsNeg = this.helper.decodeInputBool(7);\n\n const deadline = this.helper.decodeInputU64(13);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n pool,\n slippage: 10,\n address,\n amountA,\n amountB,\n tickLower: tickLowerIsNeg ? -tickLower : tickLower,\n tickUpper: tickUpperIsNeg ? -tickUpper : tickUpper,\n deadline,\n },\n };\n }\n\n private decodeIncreaseLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeIncreaseLiquidity this.helper');\n\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(4);\n const amountA = this.helper.decodeInputU64(5);\n const amountB = this.helper.decodeInputU64(6);\n\n const deadline = this.helper.decodeInputU64(9);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.IncreaseLiquidity,\n intentionData: {\n pool,\n slippage: 10,\n address,\n amountA,\n amountB,\n nft,\n deadline,\n },\n };\n }\n\n private decodeDecreaseLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeDecreaseLiquidity this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const decreaseLiquidity = this.helper.decodeInputU64(3);\n const amountA = this.helper.decodeInputU64(4);\n const amountB = this.helper.decodeInputU64(5);\n\n const deadline = this.helper.decodeInputU64(6);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.DecreaseLiquidity,\n intentionData: {\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage: 10, // DO NOT use slippage by user setting for now.\n address,\n deadline,\n },\n };\n }\n\n private decodeCollectFee(): DecodeResult {\n console.log(this.helper, 'decodeCollectFee this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const address = this.helper.decodeInputAddress(5);\n const collectAmountA = this.helper.decodeInputU64(3);\n const collectAmountB = this.helper.decodeInputU64(4);\n\n const deadline = this.helper.decodeInputU64(6);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectFee,\n intentionData: {\n pool,\n address,\n collectAmountA,\n collectAmountB,\n nft,\n deadline,\n },\n };\n }\n\n private decodeCollectReward(): DecodeResult {\n console.log(this.helper, 'decodeCollectReward this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const address = this.helper.decodeInputAddress(6);\n const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n const deadline = this.helper.decodeInputU64(7);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectReward,\n intentionData: {\n pool,\n address,\n rewardAmounts,\n nft,\n deadline,\n },\n };\n }\n\n private decodeBurn(): DecodeResult {\n console.log(this.helper, 'decodeBurn this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Burn,\n intentionData: {\n pool,\n nft,\n },\n };\n }\n\n private decodeRemoveLiquidity(address: string): DecodeResult {\n console.log(this.helper, 'decodeRemoveLiquidity this.helper');\n const pool = this.decreaseLiquidityHelper.decodeSharedObjectId(0);\n const nft = this.decreaseLiquidityHelper.decodeSharedObjectId(2);\n const decreaseLiquidity = this.decreaseLiquidityHelper.decodeInputU64(3);\n const amountA = this.decreaseLiquidityHelper.decodeInputU64(4);\n const amountB = this.decreaseLiquidityHelper.decodeInputU64(5);\n\n const deadline = this.decreaseLiquidityHelper.decodeInputU64(6);\n const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n const collectAmountA = this.collectFeeHelper.decodeInputU64(3) || 0;\n const collectAmountB = this.collectFeeHelper.decodeInputU64(4) || 0;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage: 10,\n address,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n },\n };\n }\n\n private decodePrixClaim(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixClaim,\n intentionData: {},\n };\n }\n\n private decodePrixJoin(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixJoin,\n intentionData: {},\n };\n }\n\n private decodeSwapExactBaseForQuote(): DecodeResult {\n const poolId = this.swapExactBaseForQuoteHelper.decodeSharedObjectId(0);\n const amountIn = this.swapExactBaseForQuoteHelper.decodeInputU64(3);\n const token1 = this.swapExactBaseForQuoteHelper.shortTypeArg(0);\n const token2 = this.swapExactBaseForQuoteHelper.shortTypeArg(1);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SwapExactBaseForQuote,\n intentionData: {\n poolId,\n amountIn,\n token1,\n token2,\n },\n };\n }\n\n private decodeSwapExactQuoteForBase(): DecodeResult {\n const poolId = this.swapExactQuoteForBaseHelper.decodeSharedObjectId(0);\n const amountIn = this.swapExactQuoteForBaseHelper.decodeInputU64(3);\n const token1 = this.swapExactQuoteForBaseHelper.shortTypeArg(0);\n const token2 = this.swapExactQuoteForBaseHelper.shortTypeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.SwapExactQuoteForBase,\n intentionData: {\n poolId,\n amountIn,\n token1,\n token2,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target !== '0x2::coin::zero' &&\n trans.target !== '0x0000000000000000000000000000000000000000000000000000000000000002::coin::zero',\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get collectRewardHelper() {\n const moveCalls = this.transactions.filter(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::collect_reward`,\n ) as MoveCallTransaction[];\n return moveCalls.map((moveCall) => new MoveCallHelper(moveCall, this.txb));\n }\n\n private get collectFeeHelper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::collect`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get decreaseLiquidityHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${this.config.PackageId}::position_manager::decrease_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get swapExactBaseForQuoteHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get swapExactQuoteForBaseHelper() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target === `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU128(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u128');\n return Number(strVal);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU32(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u32');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n shortTypeArg(index: number) {\n return this.moveCall.typeArguments[index];\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","export const prixConfig = {\n PackageId: '0x02fe4933f4521250e55a15441096d1d4a38a7311195b0bca126fc0138c1f5a97',\n Claim: '0x0c822cec42f7ca703696b4232f1c47b348330c23580172a29aab465bc071d894',\n turbosCoinType: '0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c355171f84bb1ba4a::turbos::TURBOS',\n};\n\nexport const deepbookConfig = {\n PackageId: '0xdee9',\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { AddLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class AddLiquidityIntention extends BaseIntentionLegacy<AddLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: AddLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, tickLower, tickUpper, deadline, txb } = this.data;\n\n return turbosSdk.pool.addLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n tickLower,\n tickUpper,\n deadline,\n txb,\n });\n }\n\n static fromData(data: AddLiquidityIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { BurnIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class BurnIntention extends BaseIntentionLegacy<BurnIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: BurnIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, nft, txb } = this.data;\n\n return turbosSdk.nft.burn({\n pool,\n nft,\n txb,\n });\n }\n\n static fromData(data: BurnIntentionData) {\n return new BurnIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CollectFeeIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectFeeIntention extends BaseIntentionLegacy<CollectFeeIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CollectFeeIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, nft, collectAmountA, collectAmountB, deadline, txb } = this.data;\n\n return turbosSdk.pool.collectFee({\n pool,\n address,\n collectAmountA,\n collectAmountB,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CollectFeeIntentionData) {\n return new CollectFeeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CollectRewardIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CollectRewardIntention extends BaseIntentionLegacy<CollectRewardIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CollectRewardIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, nft, rewardAmounts, deadline, txb } = this.data;\n\n return turbosSdk.pool.collectReward({\n pool,\n address,\n rewardAmounts,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CollectRewardIntentionData) {\n return new CollectRewardIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { CreatePoolIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class CreatePoolIntention extends BaseIntentionLegacy<CreatePoolIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: CreatePoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const {\n fee,\n address,\n tickLower,\n tickUpper,\n sqrtPrice,\n slippage,\n coinTypeA,\n coinTypeB,\n amountA,\n amountB,\n deadline,\n txb,\n } = this.data;\n\n return turbosSdk.pool.createPool({\n fee,\n amountA,\n amountB,\n address,\n tickLower,\n tickUpper,\n sqrtPrice,\n slippage,\n coinTypeA,\n coinTypeB,\n deadline,\n txb,\n });\n }\n\n static fromData(data: CreatePoolIntentionData) {\n return new CreatePoolIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { DecreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class DecreaseLiquidityIntention extends BaseIntentionLegacy<DecreaseLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: DecreaseLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, nft, decreaseLiquidity, deadline, txb } = this.data;\n\n return turbosSdk.pool.decreaseLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n nft,\n decreaseLiquidity,\n deadline,\n txb,\n });\n }\n\n static fromData(data: DecreaseLiquidityIntentionData) {\n return new DecreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { IncreaseLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class IncreaseLiquidityIntention extends BaseIntentionLegacy<IncreaseLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: IncreaseLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { pool, address, amountA, amountB, slippage, nft, deadline, txb } = this.data;\n\n return turbosSdk.pool.increaseLiquidity({\n pool,\n slippage,\n address,\n amountA,\n amountB,\n nft,\n deadline,\n txb,\n });\n }\n\n static fromData(data: IncreaseLiquidityIntentionData) {\n return new IncreaseLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { prixConfig } from '../config';\nimport { PrixClaimIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixClaimIntention extends BaseIntentionLegacy<PrixClaimIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixClaim;\n\n constructor(public override readonly data: PrixClaimIntentionData) {\n super(data);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n txb.moveCall({\n target: `${prixConfig.PackageId}::claim::claim`,\n typeArguments: [prixConfig.turbosCoinType],\n arguments: [txb.object(prixConfig.Claim), txb.object(SUI_CLOCK_OBJECT_ID)],\n });\n return txb;\n }\n\n static fromData(data: PrixClaimIntentionData) {\n return new PrixClaimIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { prixConfig } from '../config';\nimport { PrixJoinIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class PrixJoinIntention extends BaseIntentionLegacy<PrixJoinIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixJoin;\n\n constructor(public override readonly data: PrixJoinIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const txb = new TransactionBlock();\n txb.moveCall({\n target: `${prixConfig.PackageId}::claim::join`,\n typeArguments: [prixConfig.turbosCoinType],\n arguments: [txb.object(prixConfig.Claim)],\n });\n return txb;\n }\n\n static fromData(data: PrixJoinIntentionData) {\n return new PrixJoinIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { RemoveLiquidityIntentionData, SuiNetworks, TransactionSubType } from '../types';\n\nexport class RemoveLiquidityIntention extends BaseIntentionLegacy<RemoveLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: RemoveLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n let txb = new TransactionBlock();\n txb = await turbosSdk.pool.collectFee({ txb, ...this.data });\n txb = await turbosSdk.pool.collectReward({ txb, ...this.data });\n txb = await turbosSdk.pool.decreaseLiquidity({ txb, ...this.data });\n txb = await turbosSdk.nft.burn({ txb, nft: this.data.nft, pool: this.data.pool });\n return txb;\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { SuiNetworks, SwapIntentionData, TransactionSubType } from '../types';\n\nexport class SwapIntention extends BaseIntentionLegacy<SwapIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: SwapIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n console.log(this.data, 'this.data');\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const { routes, coinTypeA, coinTypeB, address, amountA, amountB, slippage, amountSpecifiedIsInput, deadline, txb } =\n this.data;\n return turbosSdk.trade.swap({\n routes,\n coinTypeA,\n coinTypeB,\n address,\n amountA,\n amountB,\n amountSpecifiedIsInput,\n slippage,\n deadline,\n txb,\n });\n }\n\n static fromData(data: SwapIntentionData) {\n return new SwapIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { swap_exact_base_for_quote } from '../api/deepbook';\nimport { SuiNetworks, SwapExactBaseForQuoteIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactBaseForQuoteIntention extends BaseIntentionLegacy<SwapExactBaseForQuoteIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.SwapExactBaseForQuote;\n\n constructor(public override readonly data: SwapExactBaseForQuoteIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const txb = await swap_exact_base_for_quote({ ...this.data, turbosSdk, currentAddress: input.account.address });\n return txb;\n }\n\n static fromData(data: SwapExactBaseForQuoteIntentionData) {\n return new SwapExactBaseForQuoteIntention(data);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeSuiObjectId } from '@mysten/sui.js/utils';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\nimport { SuiKit } from '../utils/sui-kit';\n\nconst client_order_id = 89;\nconst gasBudget = 1_000_000;\n\ninterface SwapExactOptions {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n turbosSdk: TurbosSdk;\n currentAddress: string;\n}\n\nexport const swap_exact_quote_for_base = async (options: SwapExactOptions) => {\n const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n const txb = new TransactionBlock();\n\n const suiKit = new SuiKit(turbosSdk);\n // get token objectId\n const coinsData = await suiKit.getCoinsData(currentAddress, token2, amountIn);\n const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n if (!sendCoin) {\n throw new Error(`Not enough balance: ${token2}`);\n }\n\n // get accountCap id\n const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n typeArguments: [token1, token2],\n target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_quote_for_base`,\n arguments: [\n txb.object(String(poolId)),\n txb.pure(client_order_id),\n accountCap,\n txb.pure(amountIn),\n txb.object(normalizeSuiObjectId('0x6')),\n sendCoin,\n ],\n });\n\n if (mergeCoin) {\n txb.transferObjects([mergeCoin], txb.pure(currentAddress));\n }\n\n txb.transferObjects([base_coin_ret!], txb.pure(currentAddress));\n txb.transferObjects([quote_coin_ret!], txb.pure(currentAddress));\n\n if (!currentAccountCap) {\n txb.transferObjects([accountCap], txb.pure(currentAddress));\n }\n\n txb.setSenderIfNotSet(currentAddress);\n txb.setGasBudget(gasBudget);\n\n return txb;\n};\n\nexport const swap_exact_base_for_quote = async (options: SwapExactOptions) => {\n const { token1, token2, poolId, amountIn, currentAddress, turbosSdk } = options;\n const txb = new TransactionBlock();\n\n const suiKit = new SuiKit(turbosSdk);\n // get token objectId\n const coinsData = await suiKit.getCoinsData(currentAddress, token1, amountIn);\n const [sendCoin, mergeCoin] = suiKit.splitAndMergeCoin(coinsData, amountIn, txb);\n\n if (!sendCoin) {\n throw new Error(`Not enough balance: ${token1}`);\n }\n\n // get accountCap id\n const currentAccountCap = await suiKit.IsAccountCap(currentAddress);\n const accountCap = !currentAccountCap ? suiKit.createAccount(txb) : txb.object(currentAccountCap);\n\n const zero = suiKit.zero(token2, txb);\n\n const [base_coin_ret, quote_coin_ret, _amount] = txb.moveCall({\n typeArguments: [token1, token2],\n target: `${deepbookConfig.PackageId}::clob_v2::swap_exact_base_for_quote`,\n arguments: [\n txb.object(String(poolId)),\n txb.pure(client_order_id),\n accountCap,\n txb.pure(amountIn),\n sendCoin,\n zero,\n txb.object(normalizeSuiObjectId('0x6')),\n ],\n });\n if (mergeCoin) {\n txb.transferObjects([mergeCoin], txb.pure(currentAddress));\n }\n\n txb.transferObjects([base_coin_ret!], txb.pure(currentAddress));\n txb.transferObjects([quote_coin_ret!], txb.pure(currentAddress));\n\n if (!currentAccountCap) {\n txb.transferObjects([accountCap], txb.pure(currentAddress));\n }\n\n txb.setSenderIfNotSet(currentAddress);\n txb.setGasBudget(gasBudget);\n\n return txb;\n};\n","import { PaginatedCoins } from '@mysten/sui.js/client';\nimport { TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { TurbosSdk, unstable_getObjectId } from 'turbos-clmm-sdk';\n\nimport { deepbookConfig } from '../config';\n\ntype CoinData = PaginatedCoins['data'];\n\nexport class SuiKit {\n constructor(public readonly turbosSdk: TurbosSdk) {}\n\n async getCoinsData(currentAddress: string, type: string, amount: number): Promise<CoinData> {\n const coinObjects: CoinData = [];\n let coinFields: PaginatedCoins | undefined;\n do {\n coinFields = await this.turbosSdk.provider.getCoins({\n owner: currentAddress,\n coinType: type,\n cursor: coinFields?.nextCursor,\n });\n coinObjects.push(...coinFields.data);\n } while (coinFields.hasNextPage);\n\n const resultCoinObjects: CoinData = [];\n let currentBalance = 0;\n coinObjects\n .sort((coinA, coinB) => Number(coinB.balance) - Number(coinA.balance))\n .some((object) => {\n if (currentBalance >= amount) {\n return true;\n }\n currentBalance += Number(object.balance);\n resultCoinObjects.push(object);\n return false;\n });\n return resultCoinObjects;\n }\n\n splitAndMergeCoin(\n coins: CoinData | undefined,\n amount: number,\n txb: TransactionBlock,\n ): [TransactionObjectArgument | undefined, TransactionObjectArgument | undefined] {\n if (!coins || coins.length < 1) {\n return [undefined, undefined];\n }\n\n if (this.isSuiCoinAddress(coins[0]!.coinType)) {\n const [sendCoin] = txb.splitCoins(txb.gas, [txb.pure(amount)]);\n return [sendCoin, undefined];\n }\n\n const mergeCoin = txb.object(coins[0]!.coinObjectId);\n if (coins.length > 1) {\n txb.mergeCoins(\n mergeCoin,\n coins.slice(1).map((coin) => txb.object(coin.coinObjectId)),\n );\n }\n\n const [sendCoin] = txb.splitCoins(mergeCoin, [txb.pure(amount)]);\n return [sendCoin, mergeCoin];\n }\n\n isSuiCoinAddress(type: string) {\n return type.toLocaleLowerCase() === '0x2::sui::sui';\n }\n\n async IsAccountCap(currentAddress: string): Promise<string | undefined> {\n const dynamicFields = await this.turbosSdk.provider.getOwnedObjects({\n owner: currentAddress,\n options: { showContent: true, showType: true, showOwner: true },\n filter: {\n StructType: `${deepbookConfig.PackageId}::custodian_v2::AccountCap`,\n },\n });\n return dynamicFields.data[0]?.data ? unstable_getObjectId(dynamicFields.data[0].data) : undefined;\n }\n\n createAccount(txb: TransactionBlock): TransactionObjectArgument {\n const [cap] = txb.moveCall({\n typeArguments: [],\n target: `${deepbookConfig.PackageId}::clob_v2::create_account`,\n arguments: [],\n });\n return cap;\n }\n\n zero(token: string, txb: TransactionBlock): TransactionObjectArgument {\n return txb.moveCall({\n typeArguments: [token],\n target: `0x2::coin::zero`,\n arguments: [],\n });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport { swap_exact_quote_for_base } from '../api/deepbook';\nimport { SuiNetworks, SwapExactQuoteForBaseIntentionData, TransactionSubType } from '../types';\n\nexport class SwapExactQuoteForBaseIntention extends BaseIntentionLegacy<SwapExactQuoteForBaseIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.SwapExactQuoteForBase;\n\n constructor(public override readonly data: SwapExactQuoteForBaseIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const turbosSdk = new TurbosSdk(input.network.replace('sui:', '') as Network, input.suiClient);\n const txb = await swap_exact_quote_for_base({ ...this.data, turbosSdk, currentAddress: input.account.address });\n return txb;\n }\n\n static fromData(data: SwapExactQuoteForBaseIntentionData) {\n return new SwapExactQuoteForBaseIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternalLegacy } from '@/apps/interface/sui-js';\nimport { SuiNetworks } from '@/types';\n\nimport { Decoder } from './decoder';\nimport { ClaimTicketIntention, ClaimTicketIntentionData } from './intentions/claimTicket';\nimport { StakeIntention, StakeIntentionData } from './intentions/stake';\nimport { UnStakeIntention, UnStakeIntentionData } from './intentions/unStake';\nimport { TransactionSubType } from './types';\n\nexport type VoloIntention = StakeIntention | UnStakeIntention | ClaimTicketIntention;\n\nexport type VoloIntentionData = StakeIntentionData | UnStakeIntentionData | ClaimTicketIntentionData;\n\nexport class VoloAppHelper implements IAppHelperInternalLegacy<VoloIntentionData> {\n application = 'volo';\n\n supportSDK = '@mysten/sui.js' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: TransactionSubType; intentionData: VoloIntentionData }> {\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock);\n const result = decoder.decode();\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: VoloIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n let intention: VoloIntention;\n switch (input.txSubType) {\n case TransactionSubType.Stake:\n intention = StakeIntention.fromData(input.intentionData as StakeIntentionData);\n break;\n case TransactionSubType.UnStake:\n intention = UnStakeIntention.fromData(input.intentionData as UnStakeIntentionData);\n break;\n case TransactionSubType.ClaimTicket:\n intention = ClaimTicketIntention.fromData(input.intentionData as ClaimTicketIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ suiClient, account });\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { bcs } from '@mysten/sui.js/bcs';\nimport { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/transactions';\nimport { TransactionBlock, TransactionBlockInput } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { TransactionSubType } from './types';\n\nexport function isSameCoinType(type1: string, type2: string) {\n return normalizeStructTag(type1) === normalizeStructTag(type2);\n}\n\nexport function isSameTarget(target1: string, target2: string): boolean {\n return normalizeStructTag(target1) === normalizeStructTag(target2);\n}\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n decode() {\n console.log('txb', this.txb);\n if (this.isStakeTransaction()) {\n return this.decodeStake();\n }\n\n if (this.isUnStakeTransaction()) {\n return this.decodeUnStake();\n }\n\n if (this.isClaimTicketTransaction()) {\n return this.decodeClaimTicket();\n }\n\n throw new Error(`Unknown transaction type`);\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isStakeTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::stake`);\n }\n\n private isUnStakeTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::unstake`);\n }\n\n private isClaimTicketTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::native_pool::burn_ticket`);\n }\n\n private decodeStake(): DecodeResult {\n const amount = (this.transactions[0] as any).amounts[0].value.toNumber() as number;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.Stake,\n intentionData: {\n amount,\n },\n };\n }\n\n private decodeUnStake(): DecodeResult {\n const splitCoinTrans = this.transactions.find((trans) => trans.kind === 'SplitCoins') as any;\n const amount = splitCoinTrans.amounts[0].value.toNumber() as number;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnStake,\n intentionData: {\n amount,\n },\n };\n }\n\n private decodeClaimTicket(): DecodeResult {\n const ticketId = this.helper.decodeOwnedObjectId(2);\n console.log(ticketId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimTicket,\n intentionData: {\n ticketId,\n },\n };\n }\n\n private get helper() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(config.packageId),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class MoveCallHelper {\n constructor(\n public readonly moveCall: MoveCallTransaction,\n public readonly txb: TransactionBlock,\n ) {}\n\n decodeSharedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getSharedObjectId(input);\n }\n\n decodeOwnedObjectId(argIndex: number) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getOwnedObjectId(input);\n }\n\n decodeInputU64(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return Number(strVal);\n }\n\n decodeInputU8(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u8');\n return Number(strVal);\n }\n\n decodeInputAddress(argIndex: number) {\n const input = this.decodePureArg<string>(argIndex, 'address');\n return normalizeSuiAddress(input);\n }\n\n decodeInputString(argIndex: number) {\n return this.decodePureArg<string>(argIndex, 'string');\n }\n\n decodeInputBool(argIndex: number) {\n return this.decodePureArg<boolean>(argIndex, 'bool');\n }\n\n decodePureArg<T>(argIndex: number, bcsType: string) {\n const input = this.getInputParam(argIndex);\n return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n }\n\n getInputParam(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'Input') {\n throw new Error('not input type');\n }\n return this.txb.blockData.inputs[arg.index];\n }\n\n static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value === 'object' && 'Pure' in input.value) {\n const bcsNums = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n }\n return input.value as T;\n }\n\n static getOwnedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value === 'object') {\n if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n throw new Error('not ImmOrOwned');\n }\n return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n }\n return normalizeSuiAddress(input.value as string);\n }\n\n static getSharedObjectId(input: TransactionBlockInput) {\n if (input.type !== 'object') {\n throw new Error(`not object argument: ${JSON.stringify(input)}`);\n }\n if (typeof input.value !== 'object') {\n return normalizeSuiAddress(input.value as string);\n }\n if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n throw new Error('not Shared');\n }\n return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n }\n\n static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n if (input.type !== 'pure') {\n throw new Error('not pure argument');\n }\n if (typeof input.value !== 'object') {\n return input.value as T;\n }\n if (!('Pure' in input.value)) {\n throw new Error('Pure not in value');\n }\n const bcsVal = input.value.Pure;\n return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n }\n\n typeArg(index: number) {\n return normalizeStructTag(this.moveCall.typeArguments[index]);\n }\n\n txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","const config = {\n packageId: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n poolObjectId: '0x7fa2faa111b8c65bea48a23049bfd81ca8f971a262d981dcd9a17c3825cb5baf',\n metadataObjectId: '0x680cd26af32b2bde8d3361e804c53ec1d1cfe24c7f039eb7f549e8dfde389a60',\n systemStateObjectId: '0x0000000000000000000000000000000000000000000000000000000000000005',\n certType: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT',\n gasBudget: 50_000_000,\n};\n\nexport default config;\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimTicketIntentionData {\n ticketId: string;\n}\n\nexport class ClaimTicketIntention extends BaseIntentionLegacy<ClaimTicketIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: ClaimTicketIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { ticketId } = this.data;\n tx.moveCall({\n target: `${config.packageId}::native_pool::burn_ticket`,\n arguments: [tx.object(config.poolObjectId), tx.object(config.systemStateObjectId), tx.object(ticketId)],\n });\n return tx;\n }\n\n static fromData(data: ClaimTicketIntentionData) {\n return new ClaimTicketIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface StakeIntentionData {\n amount: number;\n}\n\nexport class StakeIntention extends BaseIntentionLegacy<StakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: StakeIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { amount } = this.data;\n const [coin] = tx.splitCoins(tx.gas, [tx.pure(amount)]);\n tx.moveCall({\n target: `${config.packageId}::native_pool::stake`,\n arguments: [\n tx.object(config.poolObjectId),\n tx.object(config.metadataObjectId),\n tx.object(config.systemStateObjectId),\n coin,\n ],\n });\n return tx;\n }\n\n static fromData(data: StakeIntentionData) {\n return new StakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntentionLegacy } from '@/apps/interface/sui-js';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface UnStakeIntentionData {\n amount: number;\n}\n\nexport class UnStakeIntention extends BaseIntentionLegacy<UnStakeIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Stake;\n\n constructor(public readonly data: UnStakeIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n console.log(input);\n const tx = new TransactionBlock();\n const { amount } = this.data;\n const coins = (\n await input.suiClient.getAllCoins({\n owner: input.account.address,\n limit: 100,\n })\n ).data;\n const [primaryCoin, ...mergeCoins] = coins.filter(\n (coin) => coin.coinType.split('::')[0] === config.certType.split('::')[0],\n );\n\n const primaryCoinInput = tx.object(primaryCoin.coinObjectId);\n if (mergeCoins.length) {\n tx.mergeCoins(\n primaryCoinInput,\n mergeCoins.map((coin) => tx.object(coin.coinObjectId)),\n );\n }\n const coin = tx.splitCoins(tx.object(primaryCoin.coinObjectId), [tx.pure(amount)]);\n\n tx.moveCall({\n target: `${config.packageId}::native_pool::unstake`,\n arguments: [\n tx.object(config.poolObjectId),\n tx.object(config.metadataObjectId),\n tx.object(config.systemStateObjectId),\n coin,\n ],\n });\n return tx;\n }\n\n static fromData(data: UnStakeIntentionData) {\n return new UnStakeIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { IdentifierString, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\n\nimport { Decoder } from './decoder';\nimport { ClosePosition } from './intentions/close-position';\nimport { CollectFee } from './intentions/collect-fee';\nimport { CollectRewards } from './intentions/collect-rewards';\nimport { CollectRewardsAndFee } from './intentions/collect-rewards-and-fee';\nimport { OpenAndAddLiquidity } from './intentions/open-position-with-liquidity';\nimport { ProvideLiquidity } from './intentions/provide-liquidity';\nimport { RemoveLiquidity } from './intentions/remove-liquidity';\nimport { SuiNetworks, BluefinIntentionData, TransactionSubType } from './types';\n\nexport type BluefinIntention =\n | OpenAndAddLiquidity\n | ProvideLiquidity\n | RemoveLiquidity\n | ClosePosition\n | CollectFee\n | CollectRewards\n | CollectRewardsAndFee;\nexport class BluefinHelper implements IAppHelperInternal<BluefinIntentionData> {\n application = 'bluefin';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(input: {\n transaction: Transaction;\n chain: IdentifierString;\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n action?: string;\n txbParams?: any;\n }): Promise<{ txType: TransactionType; txSubType: string; intentionData: BluefinIntentionData }> {\n console.log('Bluefin helper deserialize input: ', input);\n const { transaction } = input;\n\n const decoder = new Decoder(transaction);\n\n const result = decoder.decode();\n\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.intentionData,\n };\n }\n\n async build(input: {\n intentionData: BluefinIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n const { suiClient, account, network } = input;\n\n console.log(input.txSubType);\n let intention: BluefinIntention;\n switch (input.txSubType) {\n case TransactionSubType.OpenPosition:\n intention = OpenAndAddLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.ProvideLiquidity:\n intention = ProvideLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidity.fromData(input.intentionData);\n break;\n\n case TransactionSubType.ClosePosition:\n intention = ClosePosition.fromData(input.intentionData);\n break;\n\n case TransactionSubType.CollectFee:\n intention = CollectFee.fromData(input.intentionData);\n break;\n case TransactionSubType.CollectRewards:\n intention = CollectRewards.fromData(input.intentionData);\n break;\n case TransactionSubType.CollectRewardsAndFee:\n intention = CollectRewardsAndFee.fromData(input.intentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n\n return intention.build({ suiClient, account, network });\n }\n}\n","import { asIntN } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { fromBase64 } from '@mysten/bcs';\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport {\n ClosePositionIntentionData,\n CollectFeeIntentionData,\n CollectRewardsAndFeeIntentionData,\n CollectRewardsIntentionData,\n CollectTokens,\n DecodeResult,\n FeeTokens,\n OpenPositionIntentionData,\n ProvideLiquidityIntentionData,\n RemoveLiquidityIntentionData,\n RewardCollection,\n RewardTokens,\n TransactionSubType,\n} from './types';\n\nexport class Decoder {\n constructor(public readonly transaction: Transaction) {}\n\n decode() {\n if (this.isOpenPositionTx()) {\n return this.decodeOpenPositionTx();\n }\n if (this.isClosePositionTx()) {\n return this.decodeClosePositionTx();\n }\n if (this.isProvideLiquidityTx()) {\n return this.decodeProvideLiquidityTx();\n }\n if (this.isRemoveLiquidityTx()) {\n return this.decodeRemoveLiquidityTx();\n }\n if (this.isCollectRewardsAndFeeTx()) {\n return this.decodeCollectRewardsAndFeeTx();\n }\n if (this.isCollectRewardsTx()) {\n return this.decodeCollectRewardsTx();\n }\n if (this.isCollectFeeTx()) {\n return this.decodeCollectFeeTx();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private decodeOpenPositionTx(): DecodeResult {\n const openPosCommand = this.getMoveCallCommand('open_position');\n const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenPosition,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(openPosCommand, 1)),\n lowerTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 2)))).toString()),\n upperTick: Number(asIntN(BigInt(this.getU32(this.getInputIndex(openPosCommand, 3)))).toString()),\n tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n } as OpenPositionIntentionData,\n };\n }\n\n private decodeClosePositionTx(): DecodeResult {\n const closePosCommand = this.getMoveCallCommand('close_position');\n\n const rewardsCallData = this.getCollectRewardCallData();\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClosePosition,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(closePosCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(closePosCommand, 3)),\n transferTokensTo: this.getAddress(this.getInputIndex(closePosCommand, 4)),\n collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType) as RewardTokens,\n collectFeeTokens: this.getTypeArguments(closePosCommand) as FeeTokens,\n } as ClosePositionIntentionData,\n };\n }\n\n private decodeProvideLiquidityTx(): DecodeResult {\n const addLiqCommand = this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ProvideLiquidity,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(addLiqCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(addLiqCommand, 3)),\n tokenAmount: this.getU64(this.getInputIndex(addLiqCommand, 6)),\n maxAmountTokenA: this.getU64(this.getInputIndex(addLiqCommand, 7)),\n maxAmountTokenB: this.getU64(this.getInputIndex(addLiqCommand, 8)),\n isTokenAFixed: this.getBoolean(this.getInputIndex(addLiqCommand, 9)),\n } as ProvideLiquidityIntentionData,\n };\n }\n\n private decodeRemoveLiquidityTx(): DecodeResult {\n const removeLiqCommand = this.getMoveCallCommand('remove_liquidity');\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n pool: this.getSharedObjectID(this.getInputIndex(removeLiqCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(removeLiqCommand, 3)),\n liquidity: this.getU128(this.getInputIndex(removeLiqCommand, 4)),\n maxAmountTokenA: this.getU64(this.getInputIndex(removeLiqCommand, 5)),\n maxAmountTokenB: this.getU64(this.getInputIndex(removeLiqCommand, 6)),\n transferTokensTo: this.getAddress(this.getInputIndex(removeLiqCommand, 7)),\n ...this.collectTokens(),\n } as RemoveLiquidityIntentionData,\n };\n }\n\n private decodeCollectRewardsTx(): DecodeResult {\n const rewardsCallData = this.getCollectRewardCallData();\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectRewards,\n intentionData: {\n pool: rewardsCallData[0].pool,\n position: rewardsCallData[0].position,\n collectRewardTokens: rewardsCallData.map((r) => r.rewardCoinType),\n } as CollectRewardsIntentionData,\n };\n }\n\n private decodeCollectFeeTx(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectFee,\n intentionData: this.getFeeCallData() as CollectFeeIntentionData,\n };\n }\n\n private decodeCollectRewardsAndFeeTx(): DecodeResult {\n const callData = this.getFeeCallData();\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectRewardsAndFee,\n intentionData: {\n pool: callData.pool,\n position: callData.position,\n ...this.collectTokens(),\n } as CollectRewardsAndFeeIntentionData,\n };\n }\n\n private getFeeCallData(): CollectFeeIntentionData {\n const collectFeeCommand = this.getMoveCallCommand('collect_fee');\n return {\n pool: this.getSharedObjectID(this.getInputIndex(collectFeeCommand, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(collectFeeCommand, 3)),\n collectFeeTokens: this.getTypeArguments(collectFeeCommand) as FeeTokens,\n };\n }\n\n private getCollectRewardCallData(): Array<RewardCollection> {\n const collectRewards: RewardCollection[] = [];\n this.commands.forEach((command) => {\n if (command.$kind === 'MoveCall' && command.MoveCall.function === 'collect_reward') {\n collectRewards.push({\n pool: this.getSharedObjectID(this.getInputIndex(command, 2)),\n position: this.getOwnedObjectID(this.getInputIndex(command, 3)),\n rewardCoinType: this.getTypeArguments(command)[2],\n });\n }\n });\n return collectRewards;\n }\n\n private collectTokens(): CollectTokens {\n const fee = this.getFeeCallData();\n const rewards = this.getCollectRewardCallData();\n\n return {\n collectFeeTokens: fee.collectFeeTokens,\n collectRewardTokens: rewards.map((r) => r.rewardCoinType) as RewardTokens,\n };\n }\n\n private get commands() {\n return this.transaction.getData().commands;\n }\n\n private get inputs() {\n return this.transaction.getData().inputs;\n }\n\n private isOpenPositionTx() {\n return !!this.getMoveCallCommand('open_position');\n }\n\n private isProvideLiquidityTx() {\n return !!this.getMoveCallCommand('provide_liquidity_with_fixed_amount');\n }\n\n private isRemoveLiquidityTx() {\n return !!this.getMoveCallCommand('remove_liquidity');\n }\n\n private isCollectRewardsTx() {\n return !!this.getMoveCallCommand('collect_reward');\n }\n\n private isCollectFeeTx() {\n return !!this.getMoveCallCommand('collect_fee');\n }\n\n private isCollectRewardsAndFeeTx() {\n return this.isCollectRewardsTx() && this.isCollectFeeTx();\n }\n\n private isClosePositionTx() {\n return !!this.getMoveCallCommand('close_position');\n }\n\n private getMoveCallCommand(fn: string) {\n return this.commands.find((command) => command.$kind === 'MoveCall' && command.MoveCall.function === fn);\n }\n\n private getSharedObjectID(index: number): string {\n return this.inputs[index].Object.SharedObject.objectId as string;\n }\n\n private getOwnedObjectID(index: number): string {\n return this.inputs[index].Object.ImmOrOwnedObject.objectId as string;\n }\n\n private getU32(index: number): string {\n return String(bcs.u32().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes))));\n }\n\n private getU64(index: number): string {\n return bcs.u64().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getU128(index: number): string {\n return bcs.u128().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getBoolean(index: number): boolean {\n return bcs.bool().parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getAddress(index: number): string {\n return bcs.Address.parse(Uint8Array.from(fromBase64(this.inputs[index].Pure.bytes)));\n }\n\n private getTypeArguments(command: any): Array<string> {\n return command.MoveCall.typeArguments || [];\n }\n\n private getInputIndex(command: any, index: number): number {\n return command.MoveCall.arguments[index].Input;\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ClosePositionIntentionData } from '../types';\n\nexport class ClosePosition extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ClosePosition;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.closePosition(this.data as ClosePositionIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new ClosePosition(data);\n }\n}\n","import { BN, ClmmPoolUtil, LiquidityInput } from '@firefly-exchange/library-sui';\nimport { Pool } from '@firefly-exchange/library-sui/dist/src/spot/types';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { getBluefinSpotSDK } from './config';\nimport {\n ClosePositionIntentionData,\n CollectRewardsAndFeeIntentionData,\n CollectFeeIntentionData,\n CollectRewardsIntentionData,\n OpenPositionIntentionData,\n ProvideLiquidityIntentionData,\n RemoveLiquidityIntentionData,\n SuiNetworks,\n} from './types';\n\nexport default class TxBuilder {\n static async OpenPosition(\n txParams: OpenPositionIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const liquidityInput = this.prototype.buildLiqInput(pool, { ...txParams, slippage: 0 });\n\n const txb: Transaction = (await sdk.openPositionWithFixedAmount(\n pool,\n txParams.lowerTick,\n txParams.upperTick,\n liquidityInput,\n {\n returnTx: true,\n sender: account.address,\n },\n )) as unknown as Transaction;\n\n return txb;\n }\n\n static async provideLiquidity(\n txParams: ProvideLiquidityIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const res = this.prototype.buildLiqInput(pool, txParams);\n\n const txb = (await sdk.provideLiquidityWithFixedAmount(pool, txParams.position, res, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async removeLiquidity(\n txParams: RemoveLiquidityIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb = (await sdk.removeLiquidity(\n pool,\n txParams.position,\n {\n liquidityAmount: new BN(txParams.liquidity),\n tokenMaxA: new BN(txParams.maxAmountTokenA),\n tokenMaxB: new BN(txParams.maxAmountTokenB),\n } as any as LiquidityInput,\n {\n returnTx: true,\n sender: account.address,\n },\n )) as any as Transaction;\n\n return txb;\n }\n\n static async closePosition(\n txParams: ClosePositionIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb = (await sdk.closePosition(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectRewards(\n txParams: CollectRewardsIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb: Transaction = (await sdk.collectRewards(pool, txParams.position, {\n rewardCoinsType: txParams.collectRewardTokens,\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectFee(\n txParams: CollectFeeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n const txb: Transaction = (await sdk.collectFee(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n static async collectRewardsAndFee(\n txParams: CollectRewardsAndFeeIntentionData,\n account: WalletAccount,\n network: SuiNetworks,\n ): Promise<Transaction> {\n const sdk = getBluefinSpotSDK(network, account);\n\n const pool = await sdk.queryChain.getPool(txParams.pool);\n\n console.log(txParams.position);\n const txb: Transaction = (await sdk.collectFeeAndRewards(pool, txParams.position, {\n returnTx: true,\n sender: account.address,\n })) as any as Transaction;\n\n return txb;\n }\n\n /// Method to create the liquidity input payload\n private buildLiqInput(pool: Pool, params: any): LiquidityInput {\n const res = ClmmPoolUtil.estLiquidityAndCoinAmountFromOneAmounts(\n params.lowerTick,\n params.upperTick,\n new BN(params.tokenAmount),\n params.isTokenAFixed,\n true,\n 0,\n new BN(pool.current_sqrt_price),\n );\n return { ...res, tokenMaxA: new BN(params.maxAmountTokenA), tokenMaxB: new BN(params.maxAmountTokenB) };\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { SuiClient } from '@firefly-exchange/library-sui';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { IBluefinSpotContracts, OnChainCalls } from '@firefly-exchange/library-sui/dist/src/spot';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from './types';\n\nexport const config = {\n rpc: 'https://fullnode.mainnet.sui.io/',\n objects: {\n GlobalConfig: '0x03db251ba509a8d5d8777b6338836082335d93eecbdd09a11e190a1cff51c352',\n BasePackage: '0x3492c874c1e3b3e2984e8c41b589e642d4d0a5d6459e5a9cfc2d52fd7c89c267',\n CurrentPackage: '0x6c796c3ab3421a68158e0df18e4657b2827b1f8fed5ed4b82dba9c935988711b',\n } as any as IBluefinSpotContracts,\n};\n\nexport const getBluefinSpotSDK = (network: SuiNetworks, account: WalletAccount) => {\n if (network !== 'sui:mainnet') {\n throw new Error('Bluefin spot protocol is only available on sui::mainnet');\n }\n\n const client = new SuiClient({ url: config.rpc });\n\n const spotSDK = new OnChainCalls(client, config.objects, { address: account.address, isUIWallet: false });\n\n return spotSDK;\n};\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectFeeIntentionData } from '../types';\n\nexport class CollectFee extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectFee;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectFee(this.data as CollectFeeIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectFee(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsIntentionData } from '../types';\n\nexport class CollectRewards extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectRewards;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectRewards(this.data as CollectRewardsIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectRewards(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, CollectRewardsAndFeeIntentionData } from '../types';\n\nexport class CollectRewardsAndFee extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.CollectRewardsAndFee;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.collectRewardsAndFee(this.data as CollectRewardsAndFeeIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new CollectRewardsAndFee(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, OpenPositionIntentionData } from '../types';\n\nexport class OpenAndAddLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.OpenPosition;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.OpenPosition(this.data as OpenPositionIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new OpenAndAddLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, ProvideLiquidityIntentionData } from '../types';\n\nexport class ProvideLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.ProvideLiquidity;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.provideLiquidity(this.data as ProvideLiquidityIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new ProvideLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport TxBuilder from '../tx-builder';\nimport { SuiNetworks, TransactionSubType, BluefinIntentionData, RemoveLiquidityIntentionData } from '../types';\n\nexport class RemoveLiquidity extends BaseIntention<BluefinIntentionData> {\n txType = TransactionType.Other;\n\n txSubType = TransactionSubType.RemoveLiquidity;\n\n constructor(public readonly data: BluefinIntentionData) {\n super(data);\n }\n\n async build(input: { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount }): Promise<Transaction> {\n const { account, network } = input;\n console.log(this.data);\n return TxBuilder.removeLiquidity(this.data as RemoveLiquidityIntentionData, account, network);\n }\n\n static fromData(data: BluefinIntentionData) {\n return new RemoveLiquidity(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { IAppHelperInternal } from '@/apps/interface/sui';\nimport { SuiNetworks } from '@/types';\n\nimport { AddLiquidityIntention } from './intentions/add-liquidity';\nimport { AddLiquiditySingleSideIntention } from './intentions/add-liquidity-single-side';\nimport { ClaimAllRewardsIntention } from './intentions/claim-all-rewards';\nimport { ClaimRewardsIntention } from './intentions/claim-rewards';\nimport { RemoveLiquidityIntention } from './intentions/remove-liquidity';\nimport { SwapIntention } from './intentions/swap';\nimport {\n AddLiquidityIntentionData,\n AddLiquiditySingleSideIntentionData,\n ClaimAllRewardsIntentionData,\n ClaimRewardsIntentionData,\n RemoveLiquidityIntentionData,\n SwapIntentionData,\n MMTDEXIntentionData,\n TransactionSubType,\n} from './types';\n\nexport type MMTDEXIntention =\n | AddLiquidityIntention\n | AddLiquiditySingleSideIntention\n | ClaimRewardsIntention\n | ClaimAllRewardsIntention\n | RemoveLiquidityIntention\n | SwapIntention;\n\nexport class MMTDEXAppHelper implements IAppHelperInternal<MMTDEXIntentionData> {\n application = 'mmt-dex';\n\n supportSDK = '@mysten/sui' as const;\n\n async deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n transaction: Transaction;\n appContext: MMTDEXIntentionData;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: MMTDEXIntentionData;\n }> {\n const { appContext } = input;\n return {\n txType: TransactionType.Other,\n txSubType: appContext.action,\n intentionData: appContext,\n };\n }\n\n async build(input: {\n intentionData: MMTDEXIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<Transaction> {\n let intention: MMTDEXIntention;\n switch (input.txSubType) {\n case TransactionSubType.Swap:\n intention = SwapIntention.fromData(input.intentionData as SwapIntentionData);\n break;\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n break;\n case TransactionSubType.AddLiquiditySingleSide:\n intention = AddLiquiditySingleSideIntention.fromData(\n input.intentionData as AddLiquiditySingleSideIntentionData,\n );\n break;\n case TransactionSubType.ClaimRewards:\n intention = ClaimRewardsIntention.fromData(input.intentionData as ClaimRewardsIntentionData);\n break;\n case TransactionSubType.ClaimAllRewards:\n intention = ClaimAllRewardsIntention.fromData(input.intentionData as ClaimAllRewardsIntentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build();\n }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, AddLiquidityIntentionData } from '../types';\nimport { executeClmmDeposit } from '../utils/liquidity';\n\nexport class AddLiquidityIntention extends BaseIntention<AddLiquidityIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.AddLiquidity;\n\n constructor(public override readonly data: AddLiquidityIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { address, amountA, amountB, pool, selectedLowTick, selectedHighTick } = params;\n const tx = new Transaction();\n\n await executeClmmDeposit(\n sdk,\n tx,\n address,\n amountA,\n amountB,\n pool,\n pool.objectId,\n selectedLowTick,\n selectedHighTick,\n );\n\n return tx;\n }\n\n static fromData(data: AddLiquidityIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","/* eslint-disable no-bitwise */\nimport { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { convertI32ToSigned, TickMath } from '@mmt-finance/clmm-sdk/dist/utils/math/tickMath';\nimport { SuiClient } from '@mysten/sui/dist/cjs/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport BN from 'bn.js';\n\nimport { getExactCoinByAmount, normalizeSuiCoinType } from './common';\nimport { Pools } from './swap';\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy);\n twoN0.imaskn(bitWidth - shiftBy + 1);\n return twoN0.fromTwos(bitWidth - shiftBy);\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n let ratio: BN;\n\n if ((tick & 1) !== 0) {\n ratio = new BN('79232123823359799118286999567');\n } else {\n ratio = new BN('79228162514264337593543950336');\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256);\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256);\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256);\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256);\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256);\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256);\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256);\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256);\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256);\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256);\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256);\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256);\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256);\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256);\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256);\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256);\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256);\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256);\n }\n\n return signedShiftRight(ratio, 32, 256);\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n const tick = Math.abs(tickIndex);\n let ratio: BN;\n\n if ((tick & 1) !== 0) {\n ratio = new BN('18445821805675392311');\n } else {\n ratio = new BN('18446744073709551616');\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256);\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256);\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256);\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256);\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256);\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256);\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256);\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256);\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256);\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256);\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256);\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256);\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256);\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256);\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256);\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256);\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256);\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256);\n }\n\n return ratio;\n}\n\nexport const tickIndexToSqrtPriceX64 = (tickIndex: number, tickSpacing: number, scaleUp?: boolean): BN => {\n const signedTick = convertI32ToSigned(\n scaleUp ? tickIndex + (tickIndex % (tickSpacing ?? 1)) : tickIndex - (tickIndex % (tickSpacing ?? 1)),\n );\n if (signedTick > 0) {\n return new BN(tickIndexToSqrtPricePositive(signedTick));\n }\n return new BN(tickIndexToSqrtPriceNegative(signedTick));\n};\n\nexport const executeClmmDeposit = async (\n mmt: MmtSDK,\n tx: Transaction,\n address: string,\n amountA: string,\n amountB: string,\n pool: Pools,\n poolId: string,\n selectedLowTick: number,\n selectedHighTick: number,\n) => {\n const lowerTickSqrtPrice = tickIndexToSqrtPriceX64(convertI32ToSigned(selectedLowTick), pool.tickSpacing);\n\n const upperTickSqrtPrice = tickIndexToSqrtPriceX64(convertI32ToSigned(selectedHighTick), pool.tickSpacing);\n\n const inputAmountA = BigInt(Math.ceil(Number(amountA) * 10 ** pool.tokenX.decimals));\n\n const inputAmountB = BigInt(Math.ceil(Number(amountB) * 10 ** pool.tokenY.decimals));\n\n let inputCoinX;\n let inputCoinY;\n\n if (!Number(amountA)) {\n [inputCoinX] = tx.moveCall({\n target: `0x2::coin::zero`,\n typeArguments: [pool.tokenX.coinType],\n arguments: [],\n });\n } else {\n inputCoinX = await getExactCoinByAmount(mmt, address, normalizeSuiCoinType(pool.tokenX.coinType), inputAmountA, tx);\n }\n\n if (!Number(amountB)) {\n [inputCoinY] = tx.moveCall({\n target: `0x2::coin::zero`,\n typeArguments: [pool.tokenY.coinType],\n arguments: [],\n });\n } else {\n inputCoinY = await getExactCoinByAmount(mmt, address, normalizeSuiCoinType(pool.tokenY.coinType), inputAmountB, tx);\n }\n\n const poolModel = {\n objectId: poolId,\n tokenXType: pool.tokenXType,\n tokenYType: pool.tokenYType,\n tickSpacing: pool.tickSpacing,\n };\n\n const position = mmt.Position.openPosition(\n tx,\n poolModel,\n lowerTickSqrtPrice.toString(),\n upperTickSqrtPrice.toString(),\n );\n\n mmt.Pool.addLiquidity(tx, poolModel, position, inputCoinX!, inputCoinY!, BigInt(0), BigInt(0), address);\n\n tx.transferObjects([position], tx.pure.address(address));\n};\n\nexport const executeSingleSidedClmmDeposit = async (\n mmt: MmtSDK,\n tx: Transaction,\n suiClient: SuiClient,\n address: string,\n amount: string,\n isTokenX: boolean,\n pool: Pools,\n selectedLowTick: number,\n selectedHighTick: number,\n) => {\n try {\n const inputCoinAmount = BigInt(\n Math.ceil(Number(amount) * 10 ** (isTokenX ? pool.tokenX.decimals : pool.tokenY.decimals)),\n );\n\n let inputCoinType = isTokenX ? pool.tokenX.coinType : pool.tokenY.coinType;\n inputCoinType = normalizeSuiCoinType(inputCoinType);\n\n const inputCoin = await getExactCoinByAmount(mmt, address, inputCoinType, inputCoinAmount, tx);\n\n const poolModel = {\n objectId: pool.objectId,\n tokenXType: normalizeSuiCoinType(pool.tokenX.coinType),\n tokenYType: normalizeSuiCoinType(pool.tokenY.coinType),\n tickSpacing: pool.tickSpacing,\n };\n\n const lowerTickSqrtPrice = tickIndexToSqrtPriceX64(convertI32ToSigned(selectedLowTick), pool.tickSpacing!);\n\n const upperTickSqrtPrice = tickIndexToSqrtPriceX64(convertI32ToSigned(selectedHighTick), pool.tickSpacing!);\n\n const position = mmt.Position.openPosition(\n tx,\n poolModel,\n lowerTickSqrtPrice.toString(),\n upperTickSqrtPrice.toString(),\n );\n\n const rpcPool = await suiClient.getObject({\n id: pool.objectId,\n options: { showContent: true },\n });\n\n const rpcPoolCurrentPrice = (rpcPool?.data?.content as any)?.fields?.sqrt_price ?? pool.currentSqrtPrice;\n\n const currentPrice = TickMath.sqrtPriceX64ToPrice(\n new BN(rpcPoolCurrentPrice?.toString()),\n pool.tokenX.decimals,\n pool.tokenY.decimals,\n );\n\n const limitSqrtPrice = TickMath.priceToSqrtPriceX64(\n currentPrice.mul(isTokenX ? 0.99 : 1.01),\n pool.tokenX.decimals,\n pool.tokenY.decimals,\n );\n\n await mmt.Pool.addLiquiditySingleSided(\n tx,\n poolModel,\n position,\n inputCoin,\n BigInt(0),\n BigInt(0),\n isTokenX,\n address,\n BigInt(limitSqrtPrice.toString()),\n );\n\n tx.transferObjects([position], tx.pure.address(address));\n } catch (error) {\n console.error(error);\n }\n};\n","/* eslint-disable no-restricted-syntax */\nimport { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { CoinStruct, SuiClient } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nexport const suiCoinType = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n\nexport const normalizeSuiCoinType = (coinType: string) => {\n if (coinType !== '0x2::sui::SUI') {\n return coinType;\n }\n return '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI';\n};\n\nexport const getUserCoins = async ({\n suiClient,\n address,\n type,\n}: {\n suiClient: SuiClient;\n address: string;\n type: string;\n}) => {\n let cursor;\n let coins: CoinStruct[] = [];\n let iter = 0;\n do {\n try {\n const res = await suiClient.getCoins({\n owner: address,\n coinType: type,\n cursor,\n limit: 50,\n });\n coins = coins.concat(res.data);\n cursor = res.nextCursor;\n if (!res.hasNextPage || iter === 8) {\n cursor = null;\n }\n } catch (error) {\n console.log(error);\n cursor = null;\n }\n iter++;\n } while (cursor !== null);\n return coins;\n};\n\nconst getCoinsGreaterThanAmount = (amount: bigint, coins: { balance: bigint; objectId: string }[]) => {\n const coinsWithBalance: string[] = [];\n let collectedAmount = BigInt(0);\n for (const coin of coins) {\n if (collectedAmount < amount && !coinsWithBalance.includes(coin.objectId)) {\n coinsWithBalance.push(coin.objectId);\n collectedAmount += BigInt(coin.balance);\n }\n if (coin.balance === BigInt(0) && !coinsWithBalance.includes(coin.objectId)) {\n coinsWithBalance.push(coin.objectId);\n }\n }\n if (collectedAmount >= amount) {\n return coinsWithBalance;\n }\n throw new Error('Insufficient balance');\n};\n\nexport const getExactCoinByAmountInner = (\n coinType: string,\n coins: { balance: bigint; objectId: string }[],\n amount: bigint,\n txb: Transaction,\n) => {\n if (coinType === suiCoinType) {\n const [coinA] = txb.splitCoins(txb.gas, [txb.pure.u64(amount)]);\n return coinA;\n // eslint-disable-next-line no-else-return\n } else {\n const coinsX = getCoinsGreaterThanAmount(amount, coins);\n if (coinsX.length > 1) {\n txb.mergeCoins(\n txb.object(coinsX[0]),\n coinsX.slice(1).map((coin) => txb.object(coin)),\n );\n }\n const [coinA] = txb.splitCoins(txb.object(coinsX[0]), [txb.pure.u64(amount)]);\n return coinA;\n }\n};\n\nexport async function getExactCoinByAmount(\n mmtSdk: MmtSDK,\n address: string,\n coinType: string,\n amount: bigint,\n tx: Transaction,\n) {\n const userCoins = await getUserCoins({\n suiClient: mmtSdk.rpcClient,\n address,\n type: coinType,\n });\n\n const coin = getExactCoinByAmountInner(\n normalizeSuiCoinType(coinType),\n userCoins.map((item) => ({\n balance: BigInt(item.balance),\n objectId: item.coinObjectId,\n })),\n amount,\n tx,\n );\n\n return coin;\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, AddLiquiditySingleSideIntentionData } from '../types';\nimport { executeSingleSidedClmmDeposit } from '../utils/liquidity';\n\nexport class AddLiquiditySingleSideIntention extends BaseIntention<AddLiquiditySingleSideIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.AddLiquiditySingleSide;\n\n constructor(public override readonly data: AddLiquiditySingleSideIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { address, amount, isTokenX, pool, selectedLowTick, selectedHighTick } = params;\n const tx = new Transaction();\n\n await executeSingleSidedClmmDeposit(\n sdk,\n tx,\n sdk.rpcClient,\n address,\n amount,\n isTokenX,\n pool,\n selectedLowTick,\n selectedHighTick,\n );\n\n return tx;\n }\n\n static fromData(data: AddLiquiditySingleSideIntentionData) {\n return new AddLiquiditySingleSideIntention(data);\n }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { ClaimAllRewardsIntentionData, TransactionSubType } from '../types';\nimport { claimV3Rewards } from '../utils/reward';\n\nexport class ClaimAllRewardsIntention extends BaseIntention<ClaimAllRewardsIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimAllRewards;\n\n constructor(public override readonly data: ClaimAllRewardsIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { address, positions, pools } = params;\n const tx = new Transaction();\n\n // eslint-disable-next-line no-restricted-syntax\n for (const position of positions) {\n const pool = pools.find((v3Pool) => v3Pool.objectId === position.poolId);\n claimV3Rewards(sdk, address, position, pool, tx);\n }\n\n return tx;\n }\n\n static fromData(data: ClaimAllRewardsIntentionData) {\n return new ClaimAllRewardsIntention(data);\n }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { Reward } from '@mmt-finance/clmm-sdk/dist/types';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { Pools } from './swap';\n\nexport type V3PositionType = {\n objectId: string;\n poolId: string;\n upperPrice: number;\n lowerPrice: number;\n upperTick: number;\n lowerTick: number;\n liquidity: string;\n amount: number;\n status: string;\n claimableRewards: number;\n rewarders: Reward[];\n feeAmountXUsd: number;\n feeAmountX: number;\n feeAmountYUsd: number;\n feeAmountY: number;\n claimableMaya: number;\n};\n\nexport const claimV3Rewards = (\n mmt: MmtSDK,\n address: string,\n position: V3PositionType,\n pool: Pools,\n tx: Transaction,\n) => {\n const poolModel = {\n objectId: pool.objectId,\n tokenXType: pool.tokenXType,\n tokenYType: pool.tokenYType,\n };\n\n if ((pool?.rewarders?.length ?? 0) > 0) {\n mmt.Pool.collectAllRewards(tx, poolModel, pool.rewarders, position.objectId, address);\n }\n\n mmt.Pool.collectFee(tx, pool, position.objectId, address);\n};\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { ClaimRewardsIntentionData, TransactionSubType } from '../types';\nimport { claimV3Rewards } from '../utils/reward';\n\nexport class ClaimRewardsIntention extends BaseIntention<ClaimRewardsIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimRewards;\n\n constructor(public override readonly data: ClaimRewardsIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { address, position, pool } = params;\n const tx = new Transaction();\n\n claimV3Rewards(sdk, address, position, pool, tx);\n\n return tx;\n }\n\n static fromData(data: ClaimRewardsIntentionData) {\n return new ClaimRewardsIntention(data);\n }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport BigNumber from 'bignumber.js';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, RemoveLiquidityIntentionData } from '../types';\nimport { claimV3Rewards } from '../utils/reward';\n\nexport class RemoveLiquidityIntention extends BaseIntention<RemoveLiquidityIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RemoveLiquidity;\n\n constructor(public override readonly data: RemoveLiquidityIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { pool, position, address, withdrawPercentage } = params;\n const tx = new Transaction();\n\n const typeX = pool.tokenX.coinType;\n const typeY = pool.tokenY.coinType;\n\n const poolModel = {\n objectId: pool.objectId,\n tokenXType: typeX,\n tokenYType: typeY,\n };\n\n const removeLiqAmount = BigInt(\n withdrawPercentage === 100\n ? position.liquidity\n : new BigNumber(position.liquidity).multipliedBy(withdrawPercentage / 100).toFixed(0),\n );\n\n sdk.Pool.removeLiquidity(tx, poolModel, position.objectId, removeLiqAmount, BigInt(0), BigInt(0), address);\n\n claimV3Rewards(sdk, address, position, pool, tx);\n\n if (withdrawPercentage === 100) {\n sdk.Position.closePosition(tx, position.objectId);\n }\n\n return tx;\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { BaseIntention } from '@/apps/interface/sui';\n\nimport { TransactionSubType, SwapIntentionData } from '../types';\nimport { performMmtSwap } from '../utils/swap';\n\nexport class SwapIntention extends BaseIntention<SwapIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Swap;\n\n constructor(public override readonly data: SwapIntentionData) {\n super(data);\n }\n\n async build(): Promise<Transaction> {\n const sdk = MmtSDK.NEW({\n network: 'mainnet',\n });\n const { params } = this.data;\n const { route, tokenIn, amountIn, address } = params;\n const tx = new Transaction();\n await performMmtSwap(sdk, route, tokenIn, amountIn, address, tx);\n return tx;\n }\n\n static fromData(data: SwapIntentionData) {\n return new SwapIntention(data);\n }\n}\n","/* eslint-disable no-restricted-syntax */\nimport { MmtSDK } from '@mmt-finance/clmm-sdk';\nimport type { Rewarder, ExtendedPoolWithApr } from '@mmt-finance/clmm-sdk/dist/types';\nimport { mappedMmtV3Pool } from '@mmt-finance/clmm-sdk/dist/utils/poolUtils';\nimport { Transaction, TransactionArgument } from '@mysten/sui/transactions';\n\nimport { getExactCoinByAmount, normalizeSuiCoinType } from './common';\n\nexport type Pools = {\n tokenXReserve: string;\n lspSupply: string;\n protocolFeesPercent: string;\n createdAt?: string;\n farmSource?: string;\n volume: number;\n packageId: string;\n farmId?: string;\n objectId: string;\n poolSource: string;\n lspType?: string;\n lpFeesPercent?: string;\n tokenYType: string;\n data?: string;\n updatedAt?: string;\n isStable: boolean;\n tokenXType: string;\n tokenYReserve: string;\n tokenX: {\n coinType: string;\n ticker: string;\n tokenName: string;\n updatedAt?: string;\n createdAt?: string;\n decimals: number;\n iconUrl: string;\n description: string;\n price: string;\n };\n tokenY: {\n coinType: string;\n ticker: string;\n tokenName: string;\n updatedAt?: string;\n createdAt?: string;\n decimals: number;\n iconUrl: string;\n description: string;\n price: string;\n };\n tvl: number;\n apy: number;\n feeApy?: number;\n lspBalance?: number;\n currentSqrtPrice?: string;\n currentTickIndex?: string;\n liquidity?: string;\n rewarders?: Rewarder[];\n feeRate?: number;\n tickSpacing?: number;\n volume24h?: string;\n fees24h?: string;\n fees?: number;\n aprBreakdown?: ExtendedPoolWithApr['aprBreakdown'];\n};\n\nexport type Tokens = {\n coinType: string;\n tokenName: string;\n ticker: string;\n iconUrl: string;\n decimals: number;\n price: string;\n description: string;\n source?: 'hop' | 'af';\n tokenType?: 'lst' | 'meme' | 'bridged' | '';\n isVerified?: boolean;\n};\n\nexport const performMmtSwap = async (\n mmtSdk: MmtSDK,\n route: Pools[],\n tokenIn: Tokens,\n amountIn: string,\n address: string,\n tx: Transaction,\n) => {\n let inputAmount = BigInt(Math.ceil(Number(amountIn) * 10 ** tokenIn.decimals)) as bigint | TransactionArgument;\n\n let inputCoin = await getExactCoinByAmount(\n mmtSdk,\n address,\n normalizeSuiCoinType(tokenIn.coinType),\n inputAmount as bigint,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n tx,\n );\n\n let inputCoinType = tokenIn.coinType;\n\n for (let i = 0; i < route.length; i += 1) {\n const { objectId, tokenX: routeTokenX, tokenY: routeTokenY, isStable } = route[i]!;\n\n const { id: v3PoolId, isReverse } = mappedMmtV3Pool[objectId as keyof typeof mappedMmtV3Pool] || {\n id: objectId,\n isReverse: false,\n };\n\n let isXtoY = normalizeSuiCoinType(routeTokenX.coinType) === normalizeSuiCoinType(inputCoinType);\n\n isXtoY = isReverse ? !isXtoY : isXtoY;\n\n const tokenXType = isReverse ? routeTokenY.coinType : routeTokenX.coinType;\n const tokenYType = isReverse ? routeTokenX.coinType : routeTokenY.coinType;\n\n const outputCoin = mmtSdk.Pool.swap(\n tx,\n {\n objectId: v3PoolId,\n tokenXType,\n tokenYType,\n isStable,\n },\n inputAmount,\n inputCoin,\n isXtoY,\n undefined,\n // BigInt(limitSqrtPrice.toString())\n );\n\n tx.transferObjects([inputCoin], tx.pure.address(address));\n inputCoin = outputCoin;\n\n inputCoinType = isXtoY ? tokenYType : tokenXType;\n\n [inputAmount] = tx.moveCall({\n target: '0x2::coin::value',\n typeArguments: [inputCoinType],\n arguments: [inputCoin],\n });\n }\n\n tx.transferObjects([inputCoin], tx.pure.address(address));\n};\n"],"mappings":"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","names":["require_bn","__commonJSMin","exports","module","assert","val","msg","inherits","ctor","superCtor","TempCtor","BN","number","base","endian","Buffer","num","left","right","start","i","j","w","off","parseHex4Bits","string","index","parseHexByte","lowerBound","r","parseLength","parseBase","str","end","mul","b","len","c","limbLen","limbPow","total","mod","word","pow","dest","move","src","size","inspect","zeros","groupSizes","groupBases","padding","out","carry","groupSize","groupBase","ret","length","allocate","ArrayType","byteLength","reqLength","res","postfix","position","shift","t","hi","toBitArray","bit","wbit","width","a","bytesNeeded","bitsLeft","cmp","smallMulTo","self","lo","k","ncarry","rword","maxJ","comb10MulTo","o","mid","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","bigMulTo","hncarry","jumboMulTo","FFTM","x","y","N","l","rb","rbt","rws","iws","rtws","itws","s","rtwdf","itwdf","p","rtwdf_","itwdf_","re","ie","ro","io","rx","n","m","odd","ws","ph","_","rwst","iwst","nrws","nrwst","niwst","rmws","isNegNum","q","bits","carryMask","newCarry","hint","extended","h","mask","maskedWords","mode","bhi","bhiBits","diff","qj","positive","div","dm","half","r2","acc","A","B","C","D","g","yp","xp","im","jm","x1","x2","delta","negative","Red","ctx","primes","MPrime","name","tmp","rlen","input","K256","output","outLen","prev","next","P224","P192","P25519","prime","mod3","one","nOne","lpow","z","inv","windowSize","wnd","current","currentLen","Mont","u","index_exports","__export","appHelpers","__toCommonJS","import_sui3_utils","import_alphafi_sdk","import_sui3_utils","import_bcs","Decoder","transaction","simResult","liquidityChangeEvent","eventData","poolId","poolName","fn","command","event","type","inputWithPure","input","bytes","res","amount_a","amount_b","isAmountA","amount","coin","expo","xTokensAmount","amount_withdrawn_from_locked","import_alphafi_sdk","import_sort_keys_recursive","BaseIntention","data","sortKeys","ClaimRewardIntention","_ClaimRewardIntention","BaseIntention","data","input","account","import_alphafi_sdk","DepositDoubleAssetIntention","_DepositDoubleAssetIntention","BaseIntention","data","input","account","poolName","amount","isAmountA","import_alphafi_sdk","DepositSingleAssetIntention","_DepositSingleAssetIntention","BaseIntention","data","input","account","poolName","amount","import_alphafi_sdk","WithdrawIntention","_WithdrawIntention","BaseIntention","data","input","account","poolName","xTokensAmount","import_alphafi_sdk","WithdrawAlphaIntention","_WithdrawAlphaIntention","BaseIntention","data","input","account","withdrawFromLocked","xTokensAmount","AlphaFiHelper","input","transaction","suiClient","account","simResult","result","Decoder","intention","DepositSingleAssetIntention","DepositDoubleAssetIntention","WithdrawIntention","WithdrawAlphaIntention","ClaimRewardIntention","import_sui3_utils","import_sui3_utils","import_bcs","import_bucket_protocol_sdk","Decoder","transaction","fn","command","module","package_","coinType","buckToCoin","amount","inputCoinObject","collateralType","borrowAmount","insertionPlace","strapId","collateralAmount","buckAmount","insertPlaceArg","insertionPlaces","buckOutput","repayAmount","withdrawAmount","withdrawArg","inputAmount","isStake","stakeProofs","unlockCommands","i","unstakeCommands","argument","objectId","toBuck","intentionData","commands","amountArg","proofCount","sbuckClaimCommands","lstClaimCommands","idx","strapArg","input","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","import_bucket_protocol_sdk","getBucketClient","network","account","config","getPsmTx","txbParams","account","network","coinType","amount","buckToCoin","tx","client","getBucketClient","PsmIntention","_PsmIntention","BaseIntention","data","input","account","network","getPsmTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getBorrowTx","txbParams","account","network","collateralType","collateralAmount","borrowAmount","insertionPlace","strapId","tx","client","getBucketClient","getWithdrawTx","withdrawAmount","getRepayTx","repayAmount","isSurplus","getCloseTx","recipient","BorrowIntention","_BorrowIntention","BaseIntention","data","input","account","network","getBorrowTx","import_sui3_utils","RepayIntention","_RepayIntention","BaseIntention","data","input","account","network","getRepayTx","import_sui3_utils","WithdrawIntention","_WithdrawIntention","BaseIntention","data","input","account","network","getWithdrawTx","import_sui3_utils","CloseIntention","_CloseIntention","BaseIntention","data","input","account","network","getCloseTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getSBUCKDepositTx","txbParams","account","network","coinType","amount","isStake","tx","client","getBucketClient","getSBUCKUnstakeTx","stakeProofs","toBuck","getSBUCKWithdrawTx","getSBUCKClaimTx","SBUCKDepositIntention","_SBUCKDepositIntention","BaseIntention","data","input","account","network","getSBUCKDepositTx","SBUCKUnstakeIntention","_SBUCKUnstakeIntention","getSBUCKUnstakeTx","SBUCKWithdrawIntention","_SBUCKWithdrawIntention","getSBUCKWithdrawTx","SBUCKClaimIntention","_SBUCKClaimIntention","getSBUCKClaimTx","import_sui3_utils","import_transactions","import_bucket_protocol_sdk","getTankDepositTx","txbParams","account","network","coinType","amount","tx","client","getBucketClient","getTankWithdrawTx","getTankClaimTx","import_transactions","import_bucket_protocol_sdk","getLockClaimTx","txbParams","account","network","coinType","proofCount","tx","client","getBucketClient","TankDepositIntention","_TankDepositIntention","BaseIntention","data","input","account","network","getTankDepositTx","TankWithdrawIntention","_TankWithdrawIntention","getTankWithdrawTx","TankClaimIntention","_TankClaimIntention","getTankClaimTx","import_sui3_utils","LockClaimIntention","_LockClaimIntention","BaseIntention","data","input","account","network","getLockClaimTx","BucketHelper","input","transaction","result","Decoder","suiClient","account","network","intention","PsmIntention","BorrowIntention","WithdrawIntention","RepayIntention","CloseIntention","TankDepositIntention","TankWithdrawIntention","TankClaimIntention","SBUCKDepositIntention","SBUCKUnstakeIntention","SBUCKWithdrawIntention","SBUCKClaimIntention","LockClaimIntention","import_sui3_utils","import_sui3_utils","import_aggregator_sdk","import_cetus_periphery_sdk","import_cetus_sui_clmm_sdk","import_cetus_xcetus_sdk","import_vaults_sdk","import_client","clmmConfig","peripheryConfig","xcetusConfig","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","aggregatorURL","getAggregatorSdk","suiClient","vaultsSDKOptions","getVaultsSdk","vaultsSDK","CetusVaultsSDK","getXcetusSdk","xcetusSDk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getAddLiquidityTxb","import_sui3_utils","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","BaseIntention","data","input","account","network","txbParams","getClaimFeeAndMiningTxb","import_sui3_utils","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getDecreaseLiquidityTxb","import_sui3_utils","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","getFarmingBatchHarvest","peripherySdk","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingAddLiquidityTxb","import_sui3_utils","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","BaseIntention","data","input","account","network","txbParams","getFarmingBatchHarvest","import_sui3_utils","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","BaseIntention","data","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","import_sui3_utils","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","import_sui3_utils","FarmingHarvestIntention","_FarmingHarvestIntention","BaseIntention","data","input","account","network","txbParams","getFarmingHarvest","import_sui3_utils","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","import_sui3_utils","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","import_sui3_utils","FarmingStakeIntention","_FarmingStakeIntention","BaseIntention","data","input","account","network","txbParams","getFarmingStake","import_sui3_utils","FarmingUnstakeIntention","_FarmingUnstakeIntention","BaseIntention","data","input","account","network","txbParams","getFarmingUnstake","import_sui3_utils","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getIncreaseLiquidityTxb","import_sui3_utils","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntention","data","input","account","network","txbParams","getRemoveLiquidityTxb","import_sui3_utils","import_aggregator_sdk","import_transactions","getSwapRouterTxb","txbParams","account","network","aggregatorSdk","getAggregatorSdk","txb","SwapIntention","_SwapIntention","BaseIntention","data","input","account","network","txbParams","getSwapRouterTxb","import_sui3_utils","getAddVaultsPositionPayload","txbParams","account","network","getVaultsSdk","getRemoveVaultsPositionPayload","AddVaultsPositionIntention","_AddVaultsPositionIntention","BaseIntention","data","input","account","network","txbParams","getAddVaultsPositionPayload","import_sui3_utils","RemoveVaultsPositionIntention","_RemoveVaultsPositionIntention","BaseIntention","data","input","account","network","txbParams","getRemoveVaultsPositionPayload","import_sui3_utils","import_transactions","VestingConfing","getVestingRedeemTxb","txbParams","account","network","pool","nftId","periods","CLOCK_ADDRESS","txb","period","VestingRedeemIntention","_VestingRedeemIntention","BaseIntention","data","input","account","network","txbParams","getVestingRedeemTxb","import_sui3_utils","getXcetusConvertTxb","txbParams","account","network","getXcetusSdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","BaseIntention","data","input","account","network","txbParams","getXcetusCancelRedeemTxb","import_sui3_utils","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","BaseIntention","data","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","import_sui3_utils","XcetusConvertIntention","_XcetusConvertIntention","BaseIntention","data","input","account","network","txbParams","getXcetusConvertTxb","import_sui3_utils","XcetusRedeemIntention","_XcetusRedeemIntention","BaseIntention","data","input","account","network","txbParams","getXcetusRedeemTxb","import_sui3_utils","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","BaseIntention","data","input","account","network","txbParams","getXcetusRedeemLockTxb","CetusHelper","input","txbParams","action","suiClient","account","network","intention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","ClaimFeeAndMiningIntention","FarmingAddLiquidityIntention","FarmingIncreaseLiquidityIntention","FarmingDecreaseLiquidityIntention","FarmingRemoveLiquidityIntention","FarmingClaimFeeAndRewardIntention","FarmingHarvestIntention","FarmingBatchHarvestIntention","FarmingStakeIntention","FarmingUnstakeIntention","XcetusConvertIntention","XcetusRedeemLockIntention","XcetusClaimingStakeRewardsIntention","XcetusCancelIntention","XcetusRedeemIntention","VestingRedeemIntention","SwapIntention","AddVaultsPositionIntention","RemoveVaultsPositionIntention","import_sui3_utils","import_sort_keys_recursive","BaseIntentionLegacy","data","sortKeys","import_client","dev_exports","__export","contractId","dev_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","prod_exports","__export","contractId","prod_default","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","DEV_RPC_ENDPOINT","STG_RPC_ENDPOINT","PREV_RPC_ENDPOINT","PROD_RPC_ENDPOINT","DEV_BE_API","STG_BE_API","PREV_BE_API","PROD_BE_API","CONTRACT_DEV","dev_exports","CONTRACT_PROD","prod_exports","ENV_CONFIG","getConfig","env","options","ec","import_client","MPayError","mpayErrorCode","msg","options","cause","context","NoBackendError","MPayError","WalletNotConnectedError","MPayError","import_axios","BackendError","MPayError","msg","context","Backend","_Backend","apiURL","response","BackendError","recipient","options","res","axios","sender","query","paginatedData","event","formalizedEvent","address","Globals","_Globals","envConfig","Backend","env","options","ec","getConfig","NoBackendError","b","wallet","WalletNotConnectedError","import_utils","import_transactions","import_transactions","import_utils","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","MoveObject","object","txb","ObjectVector","objects","o","ResultRef","_ResultRef","result","target","property","nestedResultFor","resultIndex","i","import_buffer","import_utils","InvalidRpcResultError","MPayError","msg","ctx","InspectViewer","results","index","returned","callIndex","returnIndex","callResult","value","type","InvalidRpcResultError","import_bcs","InvalidInputError","MPayError","msg","fieldKey","fieldValue","metadataBcsType","MAX_NAME_SIZE","encodeMetadata","metadata","validateMetadata","decodeMetadata","metaStr","isAsciiString","InvalidInputError","str","import_utils","isSameCoinType","type1","type2","isSameTarget","target1","target2","GAS_OBJECT_SPEC","import_nanoid","generateGroupId","CreateStreamHelper","_CreateStreamHelper","globals","feeContract","streamContract","info","encodeMetadata","generateGroupId","recipient","txb","paymentWithFee","coinReqs","coinResp","paymentMergedObject","flatFeeMergedObject","i","paymentAmount","feeAmount","paymentCoin","flatFeeCoin","ResultRef","createInfo","infoInternal","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","coins","mergedCoin","coinId","GAS_OBJECT_SPEC","payment","streamCoinType","isSameCoinType","streamPayment","sum","totalAmount","fee","numEpoch","streamAmount","res","InspectViewer","import_transactions","CLOCK_ID","BaseContract","moduleName","config","globals","txb","input","target","arg","ObjectVector","MoveObject","ResultRef","callArgs","typeArgs","object","CLOCK_ID","FeeContract","_FeeContract","BaseContract","config","globals","txb","createFeeNumerator","roleObject","feeObject","flatFee","claimFee","amount","StreamContract","_StreamContract","BaseContract","config","globals","txb","input","feeObject","vaultObject","paymentCoinObject","flatFeeObject","clockObject","streamObject","MPayBuilder","globals","config","FeeContract","StreamContract","info","infoInternal","CreateStreamHelper","streamId","enabled","coinType","txb","import_utils","import_luxon","TransactionFailedError","MPayError","status","msg","MIN_INTERVAL_MS","MPayHelper","globals","CoinMetaHelper","MPayBuilder","res","TransactionFailedError","change","info","input","InvalidInputError","cliffFraction","cliffAmount","amountPerStep","timeEnd","intervalMilli","address","coinType","balance","coinMeta","allBalance","coinMetas","bal","txb","val","originTotalAmount","suiClient","normalized","meta","import_utils","import_luxon","import_transactions","import_utils","import_luxon","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","SanityError","MPayError","msg","options","StreamNotFoundError","MPayError","streamId","import_luxon","MAX_U64","TIME_ROUND_UNIT","roundDateTime","date","dateMs","roundMs","roundDuration","duration","durationMs","Stream","_Stream","globals","streamId","rawData","StreamContract","data","SanityError","pagination","NotCreatorError","txb","NotRecipientError","enabled","roundDuration","metadata","decodeMetadata","roundDateTime","rawConfig","duration","rawStatus","MAX_U64","timeNowMs","timeStartMs","epoch","res","StreamNotFoundError","RpcError","content","typeParams","coinType","dataFields","config","status","InvalidStreamGroupError","MPayError","msg","context","getAllFromIterator","it","res","val","PagedIterator","requester","EntryIterator","REQUEST_PAGE_SIZE","getObjectsById","suiClient","ids","options","oidIter","ListOidIterator","iter","ObjectBatchIterator","getAllFromIterator","EntryIterator","idIter","ObjectBatchRequester","stringIter","requestPage","objId","res","filtered","filter","r","StreamGroup","_StreamGroup","globals","streams","InvalidStreamGroupError","gids","st","InvalidInputError","ids","streamObjs","getObjectsById","obj","SanityError","responses","commonInfos","stream","expInfo","isEqual","info","isEqualStreamGroupCommonInfo","i","sum","pagination","Stream","info1","info2","PagedStreamListIterator","_PagedStreamListIterator","it","pageSize","input","StreamListIterator","res","_StreamListIterator","requester","StreamListRequester","SanityError","_StreamListRequester","globals","recipient","groupRefs","query","oidIter","ListOidIterator","ref","ObjectBatchIterator","backendQuery","convertToIncomingBackendQuery","filtered","groupedRefs","groupAndSortRefs","convertToOutgoingBackendQuery","sender","refs","stRefs","stream","getStreamFromIterator","isStreamOfQuery","sg","getStreamGroupFromIterator","isStreamGroupOfQuery","m","groupList","gl1","gl2","isStatus","isStreamOfStatus","isClaimable","filter","streamId","data","getStreamObjectResponseFromIter","Stream","streamIds","objResponses","StreamGroup","convertStreamStatus","normalizeCoinTypeFilter","normalizeAddressFilter","status","st","sts","convertStreamStatusSingle","InvalidInputError","coinType","ct","address","addr","NotEnoughBalanceError","MPayError","coinType","requestAmount","gotAmount","DEF_REQ_PAGE_SIZE","getCoinsWithAmount","suiClient","owner","requestAmount","coinType","pageSize","it","OwnedCoinIterator","totalAmount","res","val","NotEnoughBalanceError","OwnedCoinIterator","EntryIterator","suiClient","owner","coinType","reqPageSize","OwnedCoinRequester","SanityError","res","MSafeAccountAdapter","msafe","reqs","MSafeSingleWallet","account","SingleWalletAdapter","singleWallet","suiClient","req","isSameCoinType","GAS_OBJECT_SPEC","InvalidInputError","coins","getCoinsWithAmount","SanityError","coin","MPayClient","env","options","Globals","MPayHelper","wallet","adapter","info","streamId","Stream","query","pageSize","PagedStreamListIterator","address","coinType","recipient","creator","MPayBuilder","StreamIntention","BaseIntentionLegacy","network","account","mpayClient","MPayClient","MSafeSingleWallet","CancelStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","ClaimByProxyStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","ClaimStreamIntention","StreamIntention","data","input","network","account","import_sui3_utils","CreateStreamIntention","StreamIntention","data","input","network","account","import_bcs","import_utils","MoveCallHelper","_MoveCallHelper","moveCall","txb","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","CreateStreamDecodeHelper","globals","txb","streamInfo","fees","infos","moveCall","txs","tx","isSameTarget","SanityError","MoveCallHelper","metadata","name","groupId","decodeMetadata","recipient","timeStart","cliff","epochInterval","totalEpoch","amountPerEpoch","cancelable","coinType","info","InvalidInputError","recipients","StreamContract","FeeContract","CreateStreamHelper","arg","DecodeHelper","globals","txb","StreamContract","tx","isSameTarget","CreateStreamDecodeHelper","streamId","enabled","moveCall","MoveCallHelper","import_sui3_utils","SetAutoClaimStreamIntention","StreamIntention","data","input","network","account","MPayAppHelper","input","network","transactionBlock","globals","Globals","result","DecodeHelper","intention","CreateStreamIntention","SetAutoClaimStreamIntention","ClaimStreamIntention","ClaimByProxyStreamIntention","CancelStreamIntention","intentionData","import_sui3_utils","import_sui3_utils","CoinTransferIntention","_CoinTransferIntention","BaseIntentionLegacy","data","input","suiClient","account","import_sui3_utils","ObjectTransferIntention","_ObjectTransferIntention","BaseIntentionLegacy","data","input","suiClient","account","CoreHelper","input","suiClient","account","intention","CoinTransferIntention","ObjectTransferIntention","import_sui3_utils","updated","config","updatePackageId","data","res","packageId","borrowFee","borrowFeeAddress","pool","e","config_default","import_sui3_utils","import_bcs","import_utils","Decoder","txb","target","trans","config_default","transactions","assetId","findPool","pool","amount","list","helper","MoveCallHelper","moveCall","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_navi_sdk","depositToken","txb","pool","coinObject","amount","withdrawToken","userAddress","coin","borrowToken","tx","borrowedCoin","repayToken","claimReward","client","claimSupply","ClaimRewardIntention","_ClaimRewardIntention","BaseIntentionLegacy","data","input","type","claimReward","ClaimSupplyIntention","_ClaimSupplyIntention","BaseIntentionLegacy","data","input","type","claimSupply","import_transactions","import_navi_sdk","getPoolConfigByAssetId","assetId","item","EntryBorrowIntention","_EntryBorrowIntention","BaseIntentionLegacy","data","input","assetId","amount","tx","pool","getPoolConfigByAssetId","borrowToken","import_transactions","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","BaseIntentionLegacy","data","input","suiClient","account","assetId","amount","tx","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryRepayIntention","_EntryRepayIntention","BaseIntentionLegacy","data","input","suiClient","account","assetId","amount","tx","pool","getPoolConfigByAssetId","toDeposit","repayToken","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryWithdrawIntention","_EntryWithdrawIntention","BaseIntentionLegacy","data","input","assetId","amount","tx","pool","getPoolConfigByAssetId","withdrawToken","import_transactions","EntryMultiDepositIntention","_EntryMultiDepositIntention","BaseIntentionLegacy","data","input","suiClient","account","list","tx","i","assetId","amount","pool","getPoolConfigByAssetId","toDeposit","depositToken","tokenInfo","getTokenObjs","coinObj","j","NAVIAppHelper","input","updatePackageId","transactionBlock","result","Decoder","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","EntryMultiDepositIntention","ClaimRewardIntention","ClaimSupplyIntention","import_sui3_utils","import_bcs","import_transactions","import_sort_keys_recursive","PlainTransactionApplication","PlainTransactionType","PlainTransactionIntention","_PlainTransactionIntention","data","sortKeys","input","PlainTransactionHelper","content","suiClient","network","account","import_client","import_transactions","import_client_js","CODE_TO_ERROR_TYPE","SuiHTTPTransportError","JsonRpcError","message","code","getWebsocketUrl","httpUrl","url","DEFAULT_CLIENT_OPTIONS","WebsocketClient","#requestId","#disconnects","#webSocket","#connectionPromise","#subscriptions","#pendingRequests","endpoint","options","method","params","webSocket","#setupWebSocket","resolve","reject","error","result","JsonRpcError","#reconnect","data","json","timeout","subscription","input","RpcSubscription","message","client","subscriptionId","newSubscriptionId","MSafeHTTPTransport","url","websocketUrl","websocketOptions","rpc","transport","WebsocketClient","input","unsubscribe","MSafeApps","_MSafeApps","apps","mApps","i","app","SuiJsSdkAdapter","SuiSdkAdapter","appName","helper","input","client","MSafeHTTPTransport","clientLegacy","SuiClientLegacy","build","tx","accountSuiBalance","bytes","import_sui3_utils","import_sui_scallop_sdk","import_sui3_utils","import_sui_scallop_sdk","import_utils","Decoder","transaction","scallopClient","command","moveCall","target","address","module","name","targets","targetSet","targetToIdxMap","acc","idx","moveCallCommands","import_bcs","import_utils","MoveCallHelper","_MoveCallHelper","moveCall","transaction","t","target","moveCallTarget","argIndex","input","strVal","type","arg","bcsNums","a","bcsVal","index","moveCallHelper_default","SplitCoinHelper","splitCoin","txb","input","moveCallHelper_default","splitCoinHelper_default","import_utils","isObligationMigrated","query","obligationId","obligation","lockKey","borrowIncentiveObjectId","OldBorrowIncentiveContract","OldBorrowIncentiveTxBuilder","tx","obligationKey","rewardType","DecoderLending","Decoder","supplyMoveCall","stakeMoveCall","unstakeMoveCall","withdrawMoveCall","redeem","burnScoin","borrowMoveCall","repayMoveCall","lendingIncentive","borrowIncentiveV2","oldBorrowIncentive","stakeWithVeSca","stakeWithoutVesca","command","moveCallHelper_default","moveCall","veScaKey","obligationKey","obligationId","rewardCoinName","coinName","amount","amountFromSplitCoin","splitCoinHelper_default","a","b","stakeSpoolAccount","coinType","stakeAccountWithAmount","tx","stakeAccountId","lendingReward","borrowRewardV2","borrowReward","stakeMarketCoinName","import_sui3_utils","DecoderReferral","Decoder","command","trans","moveCallHelper_default","moveCall","veScaKey","coins","helper","import_sui3_utils","import_sui_scallop_sdk","DecoderVeSca","Decoder","extendPeriod","stakeMoreSca","moveCall","command","moveCallHelper_default","veScaKey","lockSca","unlockTime","amountFromSplitCoin","splitCoinHelper_default","a","b","isHaveRedeem","oldUnstakeObligation","unstakeObligation","stakeObligation","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","operations","i","import_sort_keys_recursive","ScallopCoreBaseIntention","data","sortKeys","suiClient","obligationId","obligationObjectData","obligationLocked","client","input","callback","txb","obligationKey","BorrowIntention","_BorrowIntention","ScallopCoreBaseIntention","data","account","client","coinName","amount","obligationId","obligationKey","sender","_","innerTx","coin","input","BorrowWithBoostIntention","_BorrowWithBoostIntention","ScallopCoreBaseIntention","data","client","walletAddress","obligationId","obligationKey","veScaKey","amount","poolCoinName","_","scallopTxBlock","coin","input","BorrowWithReferralIntention","_BorrowWithReferralIntention","ScallopCoreBaseIntention","data","account","client","walletAddress","obligationId","obligationKey","veScaKey","poolCoinName","amount","_","scallopTxBlock","borrowReferral","coin","input","import_utils","ClaimIncentiveRewardIntention","_ClaimIncentiveRewardIntention","ScallopCoreBaseIntention","data","client","walletAddress","txb","allStakeAccounts","lendings","obligations","obligationAccounts","lendingInfos","spoolCoinNames","marketCoinName","lendingInfo","acc","rewardCoinCollection","stakeMarketCoinName","stakeAccounts","i","stakeAccount","rewardCoin","totalClaimCoin","coins","totalClaim","availableClaimCoin","obligationAccount","borrowIncentive","reward","obligationHasReward","obligationKeyId","obligation","isRewardCoinClaimed","filteredBorrowIncentives","rewardCoinName","filteredBorrowIncentive","oldRewardCoin","OldBorrowIncentiveTxBuilder","isObligationMigrated","bindedVeScaKey","objectsNeedToTransfer","coinName","rewardCoins","mergeDest","t","input","DepositCollateralIntention","_DepositCollateralIntention","ScallopCoreBaseIntention","data","input","MigrateAndClaimIntention","_MigrateAndClaimIntention","ScallopCoreBaseIntention","data","account","client","sender","obligationKey","obligationId","rewardCoinName","veScaKey","tx","rewardCoin","OldBorrowIncentiveTxBuilder","input","MigrateScoinIntention","_MigrateScoinIntention","ScallopCoreBaseIntention","data","input","OpenObligationIntention","_OpenObligationIntention","ScallopCoreBaseIntention","data","input","RepayIntention","_RepayIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","obligationKey","_","innerTx","input","RepayWithBoostIntention","_RepayWithBoostIntention","ScallopCoreBaseIntention","data","account","client","sender","coinName","amount","obligationId","veScaKey","tx","availableStake","input","SupplyLendingIntention","_SupplyLendingIntention","ScallopCoreBaseIntention","data","input","UnstakeSpoolIntention","_UnstakeSpoolIntention","ScallopCoreBaseIntention","data","input","WithdrawAndUnstakeLendingIntention","_WithdrawAndUnstakeLendingIntention","ScallopCoreBaseIntention","data","client","walletAddress","tx","stakeAccountId","totalAmount","coinName","withdrawCoins","i","stakeAccount","amount","stakeMarketCoinName","marketCoin","wdScoin","wdCoin","input","WithdrawCollateralIntention","_WithdrawCollateralIntention","ScallopCoreBaseIntention","data","input","WithdrawLendingIntention","_WithdrawLendingIntention","ScallopCoreBaseIntention","data","input","BindReferralIntention","_BindReferralIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","input","ClaimRevenueReferralIntention","_ClaimRevenueReferralIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","coins","sender","tx","coinsName","coin","input","CreateReferralLinkIntention","_CreateReferralLinkIntention","ScallopCoreBaseIntention","data","account","client","sender","tx","referralTicket","input","import_sui_scallop_sdk","ExtendPeriodAndStakeMoreIntention","_ExtendPeriodAndStakeMoreIntention","ScallopCoreBaseIntention","data","account","client","amount","veScaKey","unlockTime","obligationId","obligationKey","isOldBorrowIncentive","isObligationLocked","sender","tx","coins","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","ExtendStakePeriodIntention","_ExtendStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","veScaKey","unlockTime","obligationId","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","OldBorrowIncentiveTxBuilder","input","RedeemScaIntention","_RedeemScaIntention","ScallopCoreBaseIntention","data","account","client","veScaKey","sender","tx","input","import_sui_scallop_sdk","RenewExpStakePeriodIntention","_RenewExpStakePeriodIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","unlockTime","vescaKey","isHaveRedeem","obligation","obligationKey","isObligationLocked","isOldBorrowIncentive","tx","redeem","coins","takeCoin","leftCoin","OldBorrowIncentiveTxBuilder","input","import_sui_scallop_sdk","StakeScaIntention","_StakeScaIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","isObligationLocked","isOldBorrowIncentive","obligationId","obligationKey","unlockTime","veScaKey","tx","coins","takeCoin","leftCoin","newVescaKey","OldBorrowIncentiveTxBuilder","input","SupplyAndStakeLendingIntention","_SupplyAndStakeLendingIntention","ScallopCoreBaseIntention","data","account","client","sender","amount","coinName","stakeAccountId","tx","marketCoin","stakeMarketCoinName","stakeAccounts","targetStakeAccount","newStakeAccount","input","WithdrawStakedScaIntention","_WithdrawStakedScaIntention","ScallopCoreBaseIntention","data","account","client","vescaKey","sender","tx","input","ScallopAppHelper","input","scallop","transaction","decoderLending","DecoderLending","decoderReferral","DecoderReferral","decoderVesca","DecoderVeSca","result","suiClient","account","network","txSubType","intentionData","intention","SupplyLendingIntention","WithdrawLendingIntention","BorrowIntention","RepayIntention","DepositCollateralIntention","WithdrawCollateralIntention","OpenObligationIntention","UnstakeSpoolIntention","ClaimIncentiveRewardIntention","BorrowWithBoostIntention","StakeScaIntention","ExtendStakePeriodIntention","ExtendPeriodAndStakeMoreIntention","RenewExpStakePeriodIntention","WithdrawStakedScaIntention","SupplyAndStakeLendingIntention","WithdrawAndUnstakeLendingIntention","RedeemScaIntention","MigrateAndClaimIntention","BorrowWithReferralIntention","CreateReferralLinkIntention","ClaimRevenueReferralIntention","BindReferralIntention","MigrateScoinIntention","RepayWithBoostIntention","import_sui3_utils","import_sui3_utils","import_utils","import_client","import_sui3_utils","import_sdk","import_sui3_utils","import_bcs","import_utils","import_frontend_sui","import_bignumber","Decoder","transaction","simResult","fn","command","events","event","coinType","value","commands","inputIndex","inputValue","BigNumber","isMax","result","i","claimRewardEvent","import_transactions","import_sort_keys_recursive","SuilendBaseIntention","data","sortKeys","BorrowIntention","_BorrowIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","import_utils","import_frontend_sui","import_sdk","import_bignumber","getRewards","suilendClient","obligation","rewardsMap","reserve","side","reservePrm","sideUrm","urm","pr","index","r","BigNumber","getRewards_default","ClaimIntention","_ClaimIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getRewards_default","import_transactions","ClaimAndDepositIntention","_ClaimAndDepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getRewards_default","import_transactions","DepositIntention","_DepositIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","RepayIntention","_RepayIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","import_transactions","WithdrawIntention","_WithdrawIntention","SuilendBaseIntention","data","input","suiClient","account","suilendClient","obligationOwnerCap","obligation","transaction","getUtils","suiClient","account","suilendClient","obligationOwnerCaps","obligations","ownerCap","SuilendAppHelper","input","transaction","simResult","result","Decoder","network","txSubType","intentionData","intention","DepositIntention","WithdrawIntention","BorrowIntention","RepayIntention","ClaimIntention","ClaimAndDepositIntention","obligationId","obligation","o","obligationOwnerCap","getUtils","suiClient","account","suilendUtils","LIQUID_STAKING_INFO_MAP","Decoder","transaction","simResult","fn","command","events","event","outCoinType","amount","inCoinType","import_transactions","import_springsui_sdk","import_sort_keys_recursive","SpringSuiBaseIntention","data","sortKeys","ConvertIntention","_ConvertIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","outLstClient","transaction","import_transactions","import_sdk","import_springsui_sdk","ConvertAndDepositIntention","_ConvertAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","outLstClient","transaction","obligationOwnerCapId","didCreate","lstCoin","import_transactions","import_springsui_sdk","StakeIntention","_StakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","info","transaction","import_transactions","import_sdk","import_springsui_sdk","StakeAndDepositIntention","_StakeAndDepositIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","outLstClient","info","transaction","obligationOwnerCapId","didCreate","lstCoin","import_transactions","import_springsui_sdk","UnstakeIntention","_UnstakeIntention","SpringSuiBaseIntention","data","input","suiClient","account","suilendClient","LIQUID_STAKING_INFO_MAP","obligationOwnerCap","obligation","inLstClient","info","transaction","SpringSuiAppHelper","input","transaction","suiClient","account","getUtils","simResult","result","Decoder","network","txSubType","intentionData","intention","StakeIntention","StakeAndDepositIntention","ConvertIntention","ConvertAndDepositIntention","UnstakeIntention","import_sui3_utils","import_sui3_utils","Decoder","transaction","simResult","liquidityChangeEvent","eventData","fn","command","arg","event","eventType","amount","import_stsui_sdk","MintIntention","_MintIntention","BaseIntention","data","input","account","amount","lstParams","txb","import_stsui_sdk","RedeemIntention","_RedeemIntention","BaseIntention","data","input","account","amount","lstParams","txb","StSuiHelper","input","transaction","suiClient","simResult","result","Decoder","account","intention","MintIntention","RedeemIntention","import_sui3_utils","import_turbos_clmm_sdk","import_sui3_utils","import_bcs","import_utils","import_turbos_clmm_sdk","prixConfig","deepbookConfig","getAtoB","layer","target","swap1Layer","swap2Layer","item","Decoder","txb","turbosSdk","config","address","trans","targets","prixConfig","deepbookConfig","moveCall","atob","routes","index","pool","sqrtPrice","nextTickIndex","coinTypeA","coinTypeB","deadline","amountSpecifiedIsInput","amountA","amountB","result","tickLower","tickLowerIsNeg","tickUpper","tickUpperIsNeg","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","helper","poolId","amountIn","token1","token2","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","import_turbos_clmm_sdk","AddLiquidityIntention","_AddLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","import_turbos_clmm_sdk","BurnIntention","_BurnIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","nft","txb","import_turbos_clmm_sdk","CollectFeeIntention","_CollectFeeIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","import_turbos_clmm_sdk","CollectRewardIntention","_CollectRewardIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","nft","rewardAmounts","deadline","txb","import_turbos_clmm_sdk","CreatePoolIntention","_CreatePoolIntention","BaseIntentionLegacy","data","input","turbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","import_turbos_clmm_sdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","import_turbos_clmm_sdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","import_transactions","import_utils","PrixClaimIntention","_PrixClaimIntention","BaseIntentionLegacy","data","input","txb","prixConfig","import_transactions","PrixJoinIntention","_PrixJoinIntention","BaseIntentionLegacy","data","input","txb","prixConfig","import_transactions","import_turbos_clmm_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntentionLegacy","data","input","turbosSdk","txb","import_turbos_clmm_sdk","SwapIntention","_SwapIntention","BaseIntentionLegacy","data","input","turbosSdk","routes","coinTypeA","coinTypeB","address","amountA","amountB","slippage","amountSpecifiedIsInput","deadline","txb","import_turbos_clmm_sdk","import_transactions","import_utils","import_turbos_clmm_sdk","SuiKit","turbosSdk","currentAddress","type","amount","coinObjects","coinFields","resultCoinObjects","currentBalance","coinA","coinB","object","coins","txb","sendCoin","mergeCoin","coin","dynamicFields","deepbookConfig","cap","token","client_order_id","gasBudget","swap_exact_quote_for_base","options","token1","token2","poolId","amountIn","currentAddress","turbosSdk","txb","suiKit","SuiKit","coinsData","sendCoin","mergeCoin","currentAccountCap","accountCap","base_coin_ret","quote_coin_ret","_amount","deepbookConfig","swap_exact_base_for_quote","zero","SwapExactBaseForQuoteIntention","_SwapExactBaseForQuoteIntention","BaseIntentionLegacy","data","input","turbosSdk","swap_exact_base_for_quote","import_turbos_clmm_sdk","SwapExactQuoteForBaseIntention","_SwapExactQuoteForBaseIntention","BaseIntentionLegacy","data","input","turbosSdk","swap_exact_quote_for_base","TURBOSAppHelper","input","turbosSdk","contract","transactionBlock","account","result","Decoder","suiClient","network","intention","CreatePoolIntention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","CollectFeeIntention","CollectRewardIntention","BurnIntention","SwapIntention","PrixJoinIntention","PrixClaimIntention","SwapExactBaseForQuoteIntention","SwapExactQuoteForBaseIntention","import_sui3_utils","import_sui3_utils","import_bcs","import_utils","config","config_default","Decoder","txb","target","trans","config_default","amount","ticketId","moveCall","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","ClaimTicketIntention","_ClaimTicketIntention","BaseIntentionLegacy","data","input","tx","ticketId","config_default","import_transactions","StakeIntention","_StakeIntention","BaseIntentionLegacy","data","input","tx","amount","coin","config_default","import_transactions","UnStakeIntention","_UnStakeIntention","BaseIntentionLegacy","data","input","tx","amount","coins","primaryCoin","mergeCoins","coin","config_default","primaryCoinInput","VoloAppHelper","input","transactionBlock","result","Decoder","suiClient","account","intention","StakeIntention","UnStakeIntention","ClaimTicketIntention","import_sui3_utils","import_cetus_sui_clmm_sdk","import_sui3_utils","import_bcs","Decoder","transaction","openPosCommand","addLiqCommand","closePosCommand","rewardsCallData","r","removeLiqCommand","callData","collectFeeCommand","collectRewards","command","fee","rewards","fn","index","import_sui3_utils","import_library_sui","import_library_sui","import_spot","config","getBluefinSpotSDK","network","account","client","TxBuilder","txParams","account","network","sdk","getBluefinSpotSDK","pool","liquidityInput","res","params","ClosePosition","_ClosePosition","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectFee","_CollectFee","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectRewards","_CollectRewards","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","CollectRewardsAndFee","_CollectRewardsAndFee","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","OpenAndAddLiquidity","_OpenAndAddLiquidity","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","ProvideLiquidity","_ProvideLiquidity","BaseIntention","data","input","account","network","TxBuilder","import_sui3_utils","RemoveLiquidity","_RemoveLiquidity","BaseIntention","data","input","account","network","TxBuilder","BluefinHelper","input","transaction","result","Decoder","suiClient","account","network","intention","OpenAndAddLiquidity","ProvideLiquidity","RemoveLiquidity","ClosePosition","CollectFee","CollectRewards","CollectRewardsAndFee","import_sui3_utils","import_clmm_sdk","import_transactions","import_tickMath","import_bn","suiCoinType","normalizeSuiCoinType","coinType","getUserCoins","suiClient","address","type","cursor","coins","iter","res","error","getCoinsGreaterThanAmount","amount","coinsWithBalance","collectedAmount","coin","getExactCoinByAmountInner","txb","coinA","coinsX","getExactCoinByAmount","mmtSdk","tx","userCoins","item","signedShiftRight","n0","shiftBy","bitWidth","twoN0","tickIndexToSqrtPricePositive","tick","ratio","BN","tickIndexToSqrtPriceNegative","tickIndex","tickIndexToSqrtPriceX64","tickSpacing","scaleUp","signedTick","executeClmmDeposit","mmt","tx","address","amountA","amountB","pool","poolId","selectedLowTick","selectedHighTick","lowerTickSqrtPrice","upperTickSqrtPrice","inputAmountA","inputAmountB","inputCoinX","inputCoinY","getExactCoinByAmount","normalizeSuiCoinType","poolModel","position","executeSingleSidedClmmDeposit","suiClient","amount","isTokenX","inputCoinAmount","inputCoinType","inputCoin","rpcPoolCurrentPrice","currentPrice","limitSqrtPrice","error","AddLiquidityIntention","_AddLiquidityIntention","BaseIntention","data","sdk","params","address","amountA","amountB","pool","selectedLowTick","selectedHighTick","tx","executeClmmDeposit","import_clmm_sdk","import_transactions","AddLiquiditySingleSideIntention","_AddLiquiditySingleSideIntention","BaseIntention","data","sdk","params","address","amount","isTokenX","pool","selectedLowTick","selectedHighTick","tx","executeSingleSidedClmmDeposit","import_clmm_sdk","import_transactions","claimV3Rewards","mmt","address","position","pool","tx","poolModel","ClaimAllRewardsIntention","_ClaimAllRewardsIntention","BaseIntention","data","sdk","params","address","positions","pools","tx","position","pool","v3Pool","claimV3Rewards","import_clmm_sdk","import_transactions","ClaimRewardsIntention","_ClaimRewardsIntention","BaseIntention","data","sdk","params","address","position","pool","tx","claimV3Rewards","import_clmm_sdk","import_transactions","import_bignumber","RemoveLiquidityIntention","_RemoveLiquidityIntention","BaseIntention","data","sdk","params","pool","position","address","withdrawPercentage","tx","typeX","typeY","poolModel","removeLiqAmount","BigNumber","claimV3Rewards","import_clmm_sdk","import_transactions","import_poolUtils","performMmtSwap","mmtSdk","route","tokenIn","amountIn","address","tx","inputAmount","inputCoin","getExactCoinByAmount","normalizeSuiCoinType","inputCoinType","i","objectId","routeTokenX","routeTokenY","isStable","v3PoolId","isReverse","isXtoY","tokenXType","tokenYType","outputCoin","SwapIntention","_SwapIntention","BaseIntention","data","sdk","params","route","tokenIn","amountIn","address","tx","performMmtSwap","MMTDEXAppHelper","input","appContext","intention","SwapIntention","AddLiquidityIntention","AddLiquiditySingleSideIntention","ClaimRewardsIntention","ClaimAllRewardsIntention","RemoveLiquidityIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper","MMTDEXAppHelper","ScallopAppHelper","VoloAppHelper","BucketHelper","SuilendAppHelper","SpringSuiAppHelper","AlphaFiHelper","BluefinHelper","StSuiHelper"]}
|