@msafe/sui-app-store 0.0.111 → 0.0.113

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/apps/cetus/helper.ts","../src/apps/cetus/intentions/add-liquidity.ts","../src/apps/msafe-core/intention.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/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/mpay/config/dev.json","../src/apps/mpay/config/prod.json","../src/apps/mpay/common/env.ts","../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/error/SanityError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.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/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/stream/helper.ts","../src/apps/mpay/error/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/interface.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/msafe-core/plain-payload.ts","../src/apps/navi/helper.ts","../src/apps/navi/config.ts","../src/apps/navi/decoder.ts","../src/apps/navi/intentions/claim-reward.ts","../src/apps/navi/api/incentiveV2.ts","../src/apps/navi/intentions/entry-borrow.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/plain-transaction/helper.ts","../src/apps/registry.ts","../src/apps/scallop/helper.ts","../src/apps/scallop/decoder.ts","../src/apps/scallop/constants/common.ts","../src/apps/scallop/constants/enum.ts","../src/apps/scallop/models/scallopClient.ts","../src/apps/scallop/config.ts","../src/apps/scallop/models/scallopAddress.ts","../src/apps/scallop/models/scallopBuilder.ts","../src/apps/scallop/models/scallopUtils.ts","../src/apps/scallop/utils/builder.ts","../src/apps/scallop/utils/query.ts","../src/apps/scallop/utils/util.ts","../src/apps/scallop/queries/coreQuery.ts","../src/apps/scallop/queries/spoolQuery.ts","../src/apps/scallop/queries/borrowIncentiveQuery.ts","../src/apps/scallop/queries/priceQuery.ts","../src/apps/scallop/queries/vescaQuery.ts","../src/apps/scallop/models/scallopQuery.ts","../src/apps/scallop/builders/borrowIncentiveBuilder.ts","../src/apps/scallop/builders/coreBuilder.ts","../src/apps/scallop/builders/oracle.ts","../src/apps/scallop/constants/pyth.ts","../src/apps/scallop/models/pythClient.ts","../src/apps/scallop/builders/spoolBuilder.ts","../src/apps/scallop/builders/vescaBuilder.ts","../src/apps/scallop/intentions/borrow.ts","../src/apps/scallop/intentions/borrow-with-boost.ts","../src/apps/scallop/intentions/claim-incentive-reward.ts","../src/apps/scallop/intentions/deposit-collateral.ts","../src/apps/scallop/intentions/extend-period-and-stake-more.ts","../src/apps/scallop/intentions/extend-stake-period.ts","../src/apps/scallop/intentions/migrate-and-claim.ts","../src/apps/scallop/intentions/open-obligation.ts","../src/apps/scallop/intentions/redeem-sca.ts","../src/apps/scallop/intentions/renew-exp-stake-period.ts","../src/apps/scallop/intentions/repay.ts","../src/apps/scallop/intentions/stake-sca.ts","../src/apps/scallop/intentions/stake-spool.ts","../src/apps/scallop/intentions/supply-and-stake-lending.ts","../src/apps/scallop/intentions/supply-lending.ts","../src/apps/scallop/intentions/unstake-spool.ts","../src/apps/scallop/intentions/withdraw-and-unstake-lending.ts","../src/apps/scallop/intentions/withdraw-collateral.ts","../src/apps/scallop/intentions/withdraw-lending.ts","../src/apps/scallop/intentions/withdraw-staked-sca.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/kriya/helper.ts","../src/apps/kriya/decoder.ts","../src/apps/kriya/config.ts","../src/apps/kriya/types.ts","../src/apps/kriya/intentions/add-liquidity.ts","../src/apps/kriya/intentions/add-liquiditySingleSided.ts","../src/apps/kriya/intentions/claim-rewards.ts","../src/apps/kriya/intentions/remove-liquidity.ts","../src/apps/kriya/intentions/stake-liquidity.ts","../src/apps/kriya/intentions/unstake-liquidity.ts"],"sourcesContent":["import { 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 { TURBOSAppHelper } from '@/apps/turbos/helper';\nimport { VoloAppHelper } from '@/apps/volo/helper';\nimport { KRIYAAppHelper } from './apps/kriya/helper';\n\nexport const appHelpers = new MSafeApps([\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]);\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 { MSafeAppHelper } from '@/apps/interface';\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 { 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\nexport class CetusHelper implements MSafeAppHelper<CetusIntentionData> {\n application = 'cetus';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount } & {\n action?: string;\n txbParams?: any;\n },\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<TransactionBlock> {\n const { suiClient, account, network } = input;\n console.log('helper build input: ', input);\n console.log('helper build input.intentionData: ', input.intentionData);\n console.log('helper build input.intentionData JSON: ', JSON.stringify(input.intentionData));\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 default:\n throw new Error('not implemented');\n }\n console.log('helper build intention: ', intention);\n console.log('helper build account: ', account);\n console.log('helper build network: ', network);\n return intention.build({ suiClient, account, network });\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getAddLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { 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 sortKeys from 'sort-keys-recursive';\n\nimport { TransactionIntention } from '@/apps/interface';\nimport { SuiNetworks } from '@/types';\n\nexport abstract class CoreBaseIntention<D> implements TransactionIntention<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 abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock>;\n}\n","import { CetusPeripherySDK, SdkOptions as PeripherySdkOptions } from '@cetusprotocol/cetus-periphery-sdk';\nimport { CetusClmmSDK, SdkOptions } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '../types';\n\nexport const clmmConfig: SdkOptions = {\n fullRpcUrl: 'https://fullnode.mainnet.sui.io/',\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: '0xc33c3e937e5aa2009cc0c3fdb3f345a0c3193d4ee663ffc601fe8b894fbc4ba6',\n version: 4,\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0xd43348b8879c1457f882b02555ba862f2bc87bcc31b16294ca14a82f608875d2',\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: '0xcec352932edc6663a118e8d64ed54da6b8107e8719603bf728f80717592cd9e8',\n version: 3,\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '',\n dividend_settle_id: '',\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: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n version: 1,\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\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: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\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 haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0x1d56b8ec33c3fae897eb7bb1acb79914e8152faed614868928e684c25c8b198d',\n version: 1,\n config: {\n support_stakings: [\n {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n from_coin_type: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n to_coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n ],\n },\n },\n};\n\nexport const clmmConfigTestnet: SdkOptions = {\n fullRpcUrl: 'https://fullnode.testnet.sui.io/',\n simulationAccount: {\n address: '0xcd0247d0b67e53dde69b285e7a748e3dc390e8a5244eb9dd9c5c53d95e4cf0aa',\n },\n cetus_config: {\n package_id: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n published_at: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n config: {\n coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n admin_cap_id: '0x1a496f6c67668eb2c27c99e07e1d61754715c1acf86dac45020c886ac601edb8',\n global_config_id: '0xe1f3db327e75f7ec30585fa52241edf66f7e359ef550b533f89aa1528dd1be52',\n coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n },\n },\n clmm_pool: {\n package_id: '0x0868b71c0cba55bf0faf6c40df8c179c67a4d0ba0e79965b68b3d72d7dfbf666',\n published_at: '0x1c29d658882c40eeb39a8bb8fe58f71a216a918acb3e3eb3b47d24efd07257f2',\n config: {\n pools_id: '0xc090b101978bd6370def2666b7a31d7d07704f84e833e108a969eda86150e8cf',\n global_config_id: '0x6f4149091a5aea0e818e7243a13adcfb403842d670b9a2089de058512620687a',\n global_vault_id: '0xf3114a74d54cbe56b3e68f9306661c043ede8c6615f0351b0c3a93ce895e1699',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x8627c5cdcd8b63bc3daa09a6ab7ed81a829a90cafce6003ae13372d611fbb1a9',\n published_at: '0xf1a5d0c5b0593e41d13f9684ca91365bdfe54a98836c1d33c90e361a031fac74',\n version: 6,\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0xa34ffca2c6540e1ca9e53963ab43e7b1eed7b82e37696c743bb7c6179c15dfa6',\n published_at: '0xa34ffca2c6540e1ca9e53963ab43e7b1eed7b82e37696c743bb7c6179c15dfa6',\n },\n aggregatorUrl: 'https://api-sui.devcetus.com/router',\n swapCountUrl: 'https://api-sui.devcetus.com/v2/sui/swap/count',\n};\n\nexport const peripheryConfigTestnet: PeripherySdkOptions = {\n launchpad: {\n package_id: '0x3beee8416089a5cbff9cfd5c0a2ce2937b0452dc7e2a3ab4dc431c7be05c2335',\n published_at: '0x3beee8416089a5cbff9cfd5c0a2ce2937b0452dc7e2a3ab4dc431c7be05c2335',\n config: {\n pools_id: '0xccc10403ab3da4ae943847908e0e674fe1fdab81c6383e4c6dcd0eea0edade3d',\n admin_cap_id: '0x8a72713049dbcfc40902ff209dc5e6066fe455d152baa235957c84d7a3b875ed',\n config_cap_id: '0x16492b4252b01debb60f8a825334020d7fdb9d895b52f8139c98618de30817fc',\n },\n },\n ido: {\n package_id: '0x1352bf18ef20458f7cc773852d4a90b240015a6a54479dda3a1debfc500bf044',\n published_at: '0xbd09a0889ea9970b821512428bab3e2fd01e16809a90a325cd3b3d3573eab6a4',\n config: {\n pools_id: '0x346bee25ab4d15bcfa9484ef5ebd4d7c94eb665ebaa745ff4094936a7f59a8b1',\n admin_cap_id: '0xc1bb19a24d3bb65dfd4f3835637b63347c223c67cde4b0888f1a857974f33cbb',\n package_version_id: '0x3ccf1b38e3259e638b980d4e6b49eac8c5aa94d3cb2ace5e75f0a551c8e67e5e',\n },\n },\n xcetus: {\n package_id: '0xdebaab6b851fd3414c0a62dbdf8eb752d6b0d31f5cfce5e38541bc6c6daa8966',\n published_at: '0xdebaab6b851fd3414c0a62dbdf8eb752d6b0d31f5cfce5e38541bc6c6daa8966',\n config: {\n xcetus_manager_id: '0x3be34cbad122c8b100ed7157d762b9610e68b3c65734e08bc3c3baf857da807d',\n lock_manager_id: '0x7c67e805182e3fecd098bd68a6b06c317f28f8c6249bd771e07904a10b424e60',\n lock_handle_id: '0xc5f3bbfefe9a45c13da7a34bc72cac122ee45d633690476a8ac56bd2c4e78c86',\n },\n },\n xcetus_dividends: {\n package_id: '0x20d948d640edd0c749f533d41efc5f843f212d441220324ad7959c6e1d281828',\n published_at: '0x20d948d640edd0c749f533d41efc5f843f212d441220324ad7959c6e1d281828',\n config: {\n dividend_manager_id: '0x13b7facb704fae1d199ff0038b8acabc253415a77d142b39189dee97d457e442',\n dividend_admin_id: '0x5eb78463007422d4130b21f61c180bcd190819b7792f56e00a61df3b8fb928ef',\n dividend_settle_id: '0x495095e13a170ff494d242ae44ac2c7453011ca6c33cff27498010105e10e4b4',\n },\n },\n cetus_faucet: {\n package_id: '0x1a69aee6be709054750949959a67aedbb4200583b39586d5e3eabe57f40012c7',\n published_at: '0x1a69aee6be709054750949959a67aedbb4200583b39586d5e3eabe57f40012c7',\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: '0x25cff94bdb454bae6a5565d09047bfe2b230025ef3bd2199622ec48d854b86b9',\n published_at: '0x25cff94bdb454bae6a5565d09047bfe2b230025ef3bd2199622ec48d854b86b9',\n config: {\n admin_cap_id: '0x9b2d6f5be2650d16d27cd630c4539a76d7793970343ed3cbb023e13f1637c07c',\n vaults_manager_id: '0xc0a1a937df08880e395d85014ff40c74f13abe7a53abdbffea36f51adaaaf79e',\n vaults_pool_handle: '0x3ab02203de753de9c8198cc0ce7594dc960878f2c34c5c5a4b7742082241860a',\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: '0xfa0d98e99c1dbdbea1b0fe089fa93ebab40a7719ae4160c42cc78ebfe029fda0',\n published_at: '0xfa0d98e99c1dbdbea1b0fe089fa93ebab40a7719ae4160c42cc78ebfe029fda0',\n config: {\n global_config_id: '0x5082c7a5ee9a758025d7b0a5e8aa08b56625c7cd535b8909d2b7993991e229cc',\n rewarder_manager_id: '0xe789e092dbd9dceadbe89350c4761a6f2e11647aab97f09746a01b151926cc0e',\n rewarder_manager_handle: '0x7e7dd42392b5d82564dc9ad5093a111c5f0598cc9f806cff257d7dacb71f7837',\n admin_cap_id: '0x4ec248bca2d1fc05f39fd7491ab490464a46d128624caa4d3c2a66d957ef40b0',\n },\n },\n haedal: {\n package_id: '0xac2afb455cbcdc2ff1a2e9bbb8aa4ccb4506a544b08c740886892a5cdf92f472',\n published_at: '0x9dac9c5770e5f930d2223ff68782958701acfaee9337e8d8363978ce7670dffb',\n config: {\n support_stakings: [\n {\n staking_id: '0x6e384d2da5b040b27f973155e25bbe4beb0ad5ca8ee0a36e20dff356094c9fc0',\n from_coin_type: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n to_coin_type: '0xac2afb455cbcdc2ff1a2e9bbb8aa4ccb4506a544b08c740886892a5cdf92f472::hasui::HASUI',\n },\n ],\n },\n },\n};\n\nexport const getClmmSdk = (network: SuiNetworks, account: WalletAccount) => {\n const config = network === 'sui:mainnet' ? clmmConfig : clmmConfigTestnet;\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 = network === 'sui:mainnet' ? peripheryConfig : peripheryConfigTestnet;\n const peripherySdk = new CetusPeripherySDK(config, clmmSdk);\n return peripherySdk;\n};\n","import { TransactionBlock } from '@mysten/sui.js/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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = await clmmSdk.Rewarder.collectRewarderTransactionPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getClaimFeeAndMiningTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class ClaimFeeAndMiningIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getDecreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class DecreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingAddLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingAddLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { TransactionBlock } from '@mysten/sui.js/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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n console.log('getFarmingHarvest txbParams: ', txbParams);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const params: any = Object.values(txbParams);\n console.log('getFarmingBatchHarvest params: ', params);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.Farms.withdrawPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingBatchHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingBatchHarvestIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingClaimFeeAndRewardTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingClaimFeeAndRewardIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingDecreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingDecreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingHarvestIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingIncreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingIncreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingRemoveLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingRemoveLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingStake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingStakeIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingUnstake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingUnstakeIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getIncreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class IncreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getRemoveLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusCancelRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusCancelIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getPeripherySdk } from './config';\n\nexport const getXcetusConvertTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.convertPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemLockTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemLockPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusClaimingStakeRewardsTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemDividendV2Payload(\n txbParams.venft_id,\n txbParams.bonus_types,\n txbParams.xTokenType,\n );\n return txb;\n};\n\nexport const getXcetusCancelRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.cancelRedeemPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusClaimingStakeRewardsTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusClaimingStakeRewardsIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusConvertTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusConvertIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusRedeemIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusRedeemLockTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusRedeemLockIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 txType: TransactionType;\n txSubType: string;\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","{\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 * 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 = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const STG_RPC_ENDPOINT = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const PREV_RPC_ENDPOINT = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\nexport const PROD_RPC_ENDPOINT = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\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","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 { 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';\nimport { Stream } from './Stream';\nimport { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\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 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 { 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 { 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 { 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 { 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, 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 {\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 { 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 { 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 { 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 MSafeAppHelper<T> {\n application: string;\n deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\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 TransactionIntention<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n serialize(): string;\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: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { BaseIntention } from '../interface';\n\nexport abstract class StreamIntention<T> extends BaseIntention<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 txType: TransactionType;\n txSubType: string;\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 txType: TransactionType;\n txSubType: string;\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 txType: TransactionType;\n txSubType: string;\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/builder';\nimport { TransactionBlockInput, TransactionBlock } 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/builder';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { MoveCallHelper } from './moveCall';\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { Globals } from '../common';\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/src/builder/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 StreamDecodedTransaction,\n DecodedCreateStream,\n DecodedSetAutoClaim,\n StreamTransactionType,\n DecodedClaimStream,\n DecodedClaimByProxy,\n DecodedCancelStream,\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 txType: TransactionType;\n txSubType: string;\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 { MSafeAppHelper } from '@/apps/interface';\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 MSafeAppHelper<MPayIntentionData> {\n application = 'mpay';\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 { MSafeAppHelper } from '@/apps/interface';\nimport { CoinTransferIntention, CoinTransferIntentionData } from '@/apps/msafe-core/coin-transfer';\n\nimport { ObjectTransferIntention, ObjectTransferIntentionData } from './object-transfer';\nimport { PlainPayloadIntention, PlainPayloadIntentionData } from './plain-payload';\n\nexport type CoreIntention = CoinTransferIntention | ObjectTransferIntention | PlainPayloadIntention;\n\nexport type CoreIntentionData = CoinTransferIntentionData | ObjectTransferIntentionData | PlainPayloadIntentionData;\n\nexport class CoreHelper implements MSafeAppHelper<CoreIntentionData> {\n application: string;\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 case TransactionSubTypes.others.plain:\n intention = PlainPayloadIntention.fromData(input.intentionData as PlainPayloadIntentionData);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface CoinTransferIntentionData {\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport class CoinTransferIntention extends CoreBaseIntention<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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface ObjectTransferIntentionData {\n receiver: string;\n objectType: string;\n objectId: string;\n}\n\nexport class ObjectTransferIntention extends CoreBaseIntention<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, isSameAddress } 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface PlainPayloadIntentionData {\n content: string;\n}\n\nexport class PlainPayloadIntention extends CoreBaseIntention<PlainPayloadIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: 'PlainPayload';\n\n constructor(public readonly data: PlainPayloadIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { account } = input;\n const tb = TransactionBlock.from(this.data.content);\n\n if (!isSameAddress(tb.blockData.sender, account.address)) {\n throw new Error('Invalid sender address');\n }\n\n return tb;\n }\n\n static fromData(data: PlainPayloadIntentionData) {\n return new PlainPayloadIntention(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 { MSafeAppHelper } from '@/apps/interface';\nimport { SuiNetworks } from '@/types';\n\nimport { updatePackageId } from './config';\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention, ClaimRewardIntentionData } from './intentions/claim-reward';\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 { TransactionSubType } from './types';\n\nexport type NAVIIntention =\n | EntryDepositIntention\n | EntryBorrowIntention\n | EntryRepayIntention\n | EntryWithdrawIntention\n | ClaimRewardIntention;\n\nexport type NAVIIntentionData =\n | EntryDepositIntentionData\n | EntryBorrowIntentionData\n | EntryRepayIntentionData\n | EntryWithdrawIntentionData\n | ClaimRewardIntentionData;\n\nexport class NAVIAppHelper implements MSafeAppHelper<NAVIIntentionData> {\n application = 'navi';\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.ClaimReward:\n intention = ClaimRewardIntention.fromData(input.intentionData as ClaimRewardIntentionData);\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: '0xc6374c7da60746002bfee93014aeb607e023b2d6b25c9e55a152b826dbc8c1ce',\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 usdc: {\n name: 'USDC',\n assetId: 1,\n coinType: CoinType.usdc,\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 } as Pool,\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/package').then((res) => res.json());\n const { packageId } = data;\n config.ProtocolPackage = packageId;\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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { CoinType, 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.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 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 return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::claim_reward`);\n }\n\n private isEntryBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_borrow`);\n }\n\n private isEntryDepositTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_deposit`);\n }\n\n private isEntryRepayTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_repay`);\n }\n\n private isEntryWithdrawTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_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 decodeClaimReward(): DecodeResult {\n const claims = [] as {\n coinType: CoinType;\n option: number;\n poolId: string;\n assetId: number;\n typeArguments: string[];\n }[];\n this.transactions.forEach((trans) => {\n if (trans.kind === 'MoveCall' && trans.target === `${config.ProtocolPackage}::incentive_v2::claim_reward`) {\n const helper = new MoveCallHelper(trans, this.txb);\n const assetId = helper.decodeInputU8(4);\n const optionId = helper.decodeInputU8(5);\n const poolId = helper.decodeSharedObjectId(2);\n const pool = this.findPoolByAssetId(assetId);\n const typeArguments = [...trans.typeArguments];\n claims.push({\n coinType: pool.coinType,\n option: optionId,\n typeArguments,\n assetId,\n poolId,\n });\n }\n });\n console.log('decode claims', claims);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimReward,\n intentionData: {\n claims,\n },\n };\n }\n\n private decodeEntryBorrow(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryBorrow,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryDeposit(): DecodeResult {\n const assetId = this.helper.decodeInputU8(3);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryDeposit,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryRepay(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(6);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryRepay,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryWithdraw(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryWithdraw,\n intentionData: {\n amount,\n coinType: pool.coinType,\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 { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { claimReward } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType, OptionType } from '../types';\n\nexport interface ClaimRewardIntentionData {\n claims: {\n coinType: CoinType;\n option: OptionType;\n poolId: string;\n assetId: number;\n typeArguments: string[];\n }[];\n}\n\nexport class ClaimRewardIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { claims } = this.data;\n const tx = new TransactionBlock();\n\n claims.forEach((claim) => {\n const { assetId, poolId, option, typeArguments } = claim;\n\n claimReward(tx, assetId, poolId, option, typeArguments);\n });\n\n tx.setGasBudget(config.gasBudget);\n\n return tx;\n }\n\n static fromData(data: ClaimRewardIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport config from '../config';\nimport { OptionType, PoolConfig } from '../types';\n\nexport function depositToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_deposit`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n coinObject,\n txb.pure(amount),\n txb.object(config.Incentive),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function withdrawToken(txb: TransactionBlock, pool: PoolConfig, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_withdraw`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n txb.pure(amount),\n txb.object(config.Incentive),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function borrowToken(txb: TransactionBlock, pool: PoolConfig, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_borrow`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n txb.pure(amount),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function repayToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_repay`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n coinObject,\n txb.pure(amount),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function claimReward(\n txb: TransactionBlock,\n assetId: number,\n poolId: string,\n option: OptionType,\n typeArguments: string[],\n) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::claim_reward`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.IncentiveV2),\n txb.object(poolId),\n txb.object(config.StorageId),\n txb.pure(assetId),\n txb.pure(option),\n ],\n typeArguments,\n });\n return txb;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { borrowToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\n\nexport interface EntryBorrowIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryBorrowIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\n }\n\n return borrowToken(tx, pool, amount);\n }\n\n static fromData(data: EntryBorrowIntentionData) {\n return new EntryBorrowIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { depositToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\n\nexport interface EntryDepositIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryDepositIntention extends CoreBaseIntention<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 { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n if (coinType === 'sui') {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return depositToken(tx, config.pool.sui, toDeposit, amount);\n }\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\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 depositToken(tx, pool, tx.object(coinObj), amount);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { repayToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\n\nexport interface EntryRepayIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryRepayIntention extends CoreBaseIntention<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 { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n if (coinType === 'sui') {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return repayToken(tx, config.pool.sui, toDeposit, amount);\n }\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\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';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { withdrawToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\n\nexport interface EntryWithdrawIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryWithdrawIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n tx.setGasBudget(config.gasBudget);\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\n }\n\n return withdrawToken(tx, pool, amount);\n }\n\n static fromData(data: EntryWithdrawIntentionData) {\n return new EntryWithdrawIntention(data);\n }\n}\n","import { TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, toHEX } from '@mysten/sui.js/utils';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { MSafeAppHelper, TransactionIntention } from '@/apps/interface';\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}\nexport class PlainTransactionHelper implements MSafeAppHelper<PlainTransactionData> {\n application: string;\n\n constructor() {\n this.application = PlainTransactionApplication;\n }\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {\n const { transactionBlock, suiClient } = input;\n\n const content = await transactionBlock.build({ client: suiClient });\n\n return {\n txType: TransactionType.Other,\n txSubType: PlainTransactionType,\n intentionData: { content: toHEX(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<TransactionBlock> {\n const { suiClient, account } = input;\n const txb = TransactionBlock.from(fromHEX(input.intentionData.content));\n\n const inspectResult = await suiClient.devInspectTransactionBlock({\n transactionBlock: txb,\n sender: account.address,\n });\n const success = inspectResult.effects.status.status === 'success';\n if (!success) {\n throw new Error(inspectResult.effects.status.error);\n }\n\n return txb;\n }\n}\n","import { MSafeAppHelper } from '@/apps/interface';\n\nexport class MSafeApps {\n apps: Map<string, MSafeAppHelper<any>>;\n\n constructor(apps: MSafeAppHelper<any>[]) {\n this.apps = new Map(apps.map((app) => [app.application, app]));\n }\n\n getAppHelper(appName: string): MSafeAppHelper<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","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 { Decoder } from './decoder';\nimport { BorrowIntention, BorrowIntentionData } from './intentions/borrow';\nimport { BorrowWithBoostIntention, BorrowWithBoostIntentionData } from './intentions/borrow-with-boost';\nimport { ClaimIncentiveRewardIntention, ClaimIncentiveRewardIntentionData } from './intentions/claim-incentive-reward';\nimport { DepositCollateralIntention, DepositCollateralIntentionData } from './intentions/deposit-collateral';\nimport {\n ExtendPeriodAndStakeMoreIntention,\n ExtendPeriodAndStakeMoreIntentionData,\n} from './intentions/extend-period-and-stake-more';\nimport { ExtendStakePeriodIntention, ExtendStakePeriodIntentionData } from './intentions/extend-stake-period';\nimport { MigrateAndClaimIntention, MigrateAndClaimIntentionData } from './intentions/migrate-and-claim';\nimport { OpenObligationIntention, OpenObligationIntentionData } from './intentions/open-obligation';\nimport { RedeemScaIntention, RedeemScaIntentionData } from './intentions/redeem-sca';\nimport { RenewExpStakePeriodIntention, RenewExpStakePeriodIntentionData } from './intentions/renew-exp-stake-period';\nimport { RepayIntention, RepayIntentionData } from './intentions/repay';\nimport { StakeScaIntention, StakeScaIntentionData } from './intentions/stake-sca';\nimport { StakeSpoolIntention, StakeSpoolIntentionData } from './intentions/stake-spool';\nimport {\n SupplyAndStakeLendingIntention,\n SupplyAndStakeLendingIntentionData,\n} from './intentions/supply-and-stake-lending';\nimport { SupplyLendingIntention, SupplyLendingIntentionData } from './intentions/supply-lending';\nimport { UnstakeSpoolIntention, UnstakeSpoolIntentionData } from './intentions/unstake-spool';\nimport {\n WithdrawAndUnstakeLendingIntention,\n WithdrawAndUnstakeLendingIntentionData,\n} from './intentions/withdraw-and-unstake-lending';\nimport { WithdrawCollateralIntention, WithdrawCollateralIntentionData } from './intentions/withdraw-collateral';\nimport { WithdrawLendingIntention, WithdrawLendingIntentionData } from './intentions/withdraw-lending';\nimport { WithdrawStakedScaIntention, WithdrawStakedScaIntentionData } from './intentions/withdraw-staked-sca';\nimport { ScallopBuilder } from './models';\nimport { SuiNetworks } from './types';\nimport { TransactionSubType } from './types/utils';\nimport { MSafeAppHelper } from '../interface';\n\nexport type ScallopIntention =\n | SupplyLendingIntention\n | WithdrawLendingIntention\n | BorrowIntention\n | RepayIntention\n | DepositCollateralIntention\n | WithdrawCollateralIntention\n | OpenObligationIntention\n | StakeSpoolIntention\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\nexport type ScallopIntentionData =\n | SupplyLendingIntentionData\n | WithdrawLendingIntentionData\n | BorrowIntentionData\n | RepayIntentionData\n | DepositCollateralIntentionData\n | WithdrawCollateralIntentionData\n | OpenObligationIntentionData\n | StakeSpoolIntentionData\n | UnstakeSpoolIntentionData\n | ClaimIncentiveRewardIntentionData\n | BorrowWithBoostIntentionData\n | StakeScaIntentionData\n | ExtendStakePeriodIntentionData\n | ExtendPeriodAndStakeMoreIntentionData\n | RenewExpStakePeriodIntentionData\n | WithdrawStakedScaIntentionData\n | SupplyAndStakeLendingIntentionData\n | WithdrawAndUnstakeLendingIntentionData\n | RedeemScaIntentionData\n | MigrateAndClaimIntentionData;\n\nexport class ScallopAppHelper implements MSafeAppHelper<ScallopIntentionData> {\n application = 'scallop';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: ScallopIntentionData;\n }> {\n const builder = new ScallopBuilder({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await builder.init();\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock, builder);\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: ScallopIntentionData;\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: ScallopIntention;\n switch (input.txSubType) {\n case TransactionSubType.SupplyLending:\n intention = SupplyLendingIntention.fromData(input.intentionData as SupplyLendingIntentionData);\n break;\n case TransactionSubType.WithdrawLending:\n intention = WithdrawLendingIntention.fromData(input.intentionData as WithdrawLendingIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(input.intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(input.intentionData as RepayIntentionData);\n break;\n case TransactionSubType.DepositCollateral:\n intention = DepositCollateralIntention.fromData(input.intentionData as DepositCollateralIntentionData);\n break;\n case TransactionSubType.WithdrawCollateral:\n intention = WithdrawCollateralIntention.fromData(input.intentionData as WithdrawCollateralIntentionData);\n break;\n case TransactionSubType.OpenObligation:\n intention = OpenObligationIntention.fromData(input.intentionData as OpenObligationIntentionData);\n break;\n case TransactionSubType.StakeSpool:\n intention = StakeSpoolIntention.fromData(input.intentionData as StakeSpoolIntentionData);\n break;\n case TransactionSubType.UnstakeSpool:\n intention = UnstakeSpoolIntention.fromData(input.intentionData as UnstakeSpoolIntentionData);\n break;\n case TransactionSubType.ClaimIncentiveReward:\n intention = ClaimIncentiveRewardIntention.fromData(input.intentionData as ClaimIncentiveRewardIntentionData);\n break;\n case TransactionSubType.BorrowWithBoost:\n intention = BorrowWithBoostIntention.fromData(input.intentionData as BorrowWithBoostIntentionData);\n break;\n case TransactionSubType.StakeSca:\n intention = StakeScaIntention.fromData(input.intentionData as StakeScaIntentionData);\n break;\n case TransactionSubType.ExtendStakePeriod:\n intention = ExtendStakePeriodIntention.fromData(input.intentionData as ExtendStakePeriodIntentionData);\n break;\n case TransactionSubType.ExtendPeriodAndStakeMore:\n intention = ExtendPeriodAndStakeMoreIntention.fromData(\n input.intentionData as ExtendPeriodAndStakeMoreIntentionData,\n );\n break;\n case TransactionSubType.RenewExpStakePeriod:\n intention = RenewExpStakePeriodIntention.fromData(input.intentionData as RenewExpStakePeriodIntentionData);\n break;\n case TransactionSubType.WithdrawStakedSca:\n intention = WithdrawStakedScaIntention.fromData(input.intentionData as WithdrawStakedScaIntentionData);\n break;\n case TransactionSubType.SupplyAndStakeLending:\n intention = SupplyAndStakeLendingIntention.fromData(input.intentionData as SupplyAndStakeLendingIntentionData);\n break;\n case TransactionSubType.WithdrawAndUnstakeLending:\n intention = WithdrawAndUnstakeLendingIntention.fromData(\n input.intentionData as WithdrawAndUnstakeLendingIntentionData,\n );\n break;\n case TransactionSubType.RedeemSca:\n intention = RedeemScaIntention.fromData(input.intentionData as RedeemScaIntentionData);\n break;\n case TransactionSubType.MigrateAndClaim:\n intention = MigrateAndClaimIntention.fromData(input.intentionData as MigrateAndClaimIntentionData);\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, SplitCoinsTransaction } from '@mysten/sui.js/dist/cjs/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from './constants';\nimport { ScallopBuilder } from './models';\nimport { SupportBorrowIncentiveRewardCoins, SupportStakeMarketCoins } from './types';\nimport { TransactionSubType } from './types/utils';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n private _builder: ScallopBuilder;\n\n constructor(\n public readonly txb: TransactionBlock,\n builder: ScallopBuilder,\n ) {\n this._builder = builder;\n }\n\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.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.isWithdrawLendingTransaction()) {\n return this.decodeWithdrawLending();\n }\n if (this.isSupplyLendingTransaction()) {\n return this.decodeSupplyLending();\n }\n if (this.isBorrowWithBoostTransaction()) {\n return this.decodeBorrowWithBoost();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isUnstakeSpoolTransaction()) {\n return this.decodeUnstakeSpool();\n }\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isRenewExpiredVeSca()) {\n return this.decodeRenewExpiredVeSca();\n }\n if (this.isExtendPeriod()) {\n return this.decodeExtendStakePeriod();\n }\n if (this.isOpenObligationTransaction()) {\n return this.decodeOpenObligation();\n }\n if (this.isRedeemSca()) {\n return this.decodeRedeemSca();\n }\n if (this.isMigrateAndClaim()) {\n return this.decodeMigrateAndClaim();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private get coreId() {\n return {\n protocolPkg: this._builder.address.get('core.packages.protocol.id'),\n market: this._builder.address.get('core.market'),\n version: this._builder.address.get('core.version'),\n coinDecimalsRegistry: this._builder.address.get('core.coinDecimalsRegistry'),\n xOracle: this._builder.address.get('core.oracles.xOracle'),\n spoolPkg: this._builder.address.get('spool.id'),\n borrowIncentivePkg: this._builder.address.get('borrowIncentive.id'),\n veScaPkgId: this._builder.address.get('vesca.id'),\n };\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get inputTransaction() {\n return this.txb.blockData.inputs;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isSupplyLendingTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::mint::mint`);\n }\n\n private isSupplyWithStakeSpoolTransaction() {\n const supplyMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::mint::mint`);\n const stakeMoveCall = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::stake`);\n return !!supplyMoveCall && !!stakeMoveCall;\n }\n\n private isUnstakeAndWithdrawTransaction() {\n const unstakeMoveCall = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::unstake`);\n const withdrawMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::redeem::redeem`);\n return !!unstakeMoveCall && !!withdrawMoveCall;\n }\n\n private isStakeSpoolTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::stake`);\n }\n\n private isWithdrawLendingTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::redeem::redeem`);\n }\n\n private isDepositCollateralTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`);\n }\n\n private isWithdrawCollateralTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`);\n }\n\n private isBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::borrow::borrow`);\n }\n\n private isBorrowWithBoostTransaction() {\n const borrowMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::borrow::borrow`);\n const stakeMoveCall = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return !!borrowMoveCall && !!stakeMoveCall;\n }\n\n private isRepayTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::repay::repay`);\n }\n\n private isUnstakeSpoolTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::unstake`);\n }\n\n private isCreateStakeAccountTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::new_spool_account`);\n }\n\n private isClaimRewardTransaction() {\n const lendingIncentive = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::redeem_rewards`);\n const borrowIncentiveV2 = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`);\n return !!lendingIncentive || !!borrowIncentiveV2;\n }\n\n private isStakeScaFirsTime() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`);\n }\n\n private isExtendPeriodAndStakeMoreSca() {\n const extendPeriod = this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n const stakeMoreSca = this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n return !!extendPeriod && !!stakeMoreSca;\n }\n\n private isRedeemSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::redeem`);\n }\n\n private isStakeMoreSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n }\n\n private isExtendPeriod() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n }\n\n private isRenewExpiredVeSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`);\n }\n\n private isOpenObligationTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::open_obligation::open_obligation_entry`);\n }\n\n private isMigrateAndClaim() {\n const oldBorrowIncentive = this.getMoveCallTransaction(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`);\n const stakeWithVeSca = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return !!oldBorrowIncentive && !!stakeWithVeSca;\n }\n\n private decodeMigrateAndClaim(): DecodeResult {\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const obligationKey = this.helperClaimBorrowReward[0].decodeSharedObjectId(2);\n const obligationId = this.helperClaimBorrowReward[0].decodeOwnedObjectId(3);\n const rewardCoinName = this._builder.utils.parseCoinNameFromType(\n this.helperClaimBorrowReward[0].typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateAndClaim,\n intentionData: {\n veScaKey,\n obligationKey,\n obligationId,\n rewardCoinName,\n },\n };\n }\n\n private decodeOpenObligation(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenObligation,\n intentionData: {},\n };\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<SplitCoinsTransaction>(4);\n const unlockTime = this.helperRenewExpired.decodeInputU64(5);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(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 lockPeriodInDays: 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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(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 lockPeriodInDays: 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<SplitCoinsTransaction>(4);\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(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.decodeSharedObjectId(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 lockPeriodInDays: 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<SplitCoinsTransaction>(3);\n unlockTime = this.helperStakeSca.decodeInputU64(4);\n } else {\n lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinsTransaction>(4);\n console.log(lockSca);\n }\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(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.decodeSharedObjectId(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 lockPeriodInDays: unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodeSupplyLending(): DecodeResult {\n const coinName = this._builder.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n const amount = this.helperRedeem.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperDepositCollateral.typeArg(0));\n const amount = this.helperDepositCollateral.getNestedInputParam<SplitCoinsTransaction>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.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._builder.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._builder.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 decodeRepay(): DecodeResult {\n const coinName = this._builder.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const amount = this.helperRepay.getNestedInputParam<SplitCoinsTransaction>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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 decodeStakeSpool(): DecodeResult {\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n const amount = this.helperStake.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().reduce((a, b) => a + b, 0);\n const coinType = this.helperStake.typeArg(0);\n const coinName = this._builder.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._builder.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._builder.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n const findWithdrawWithNested = this.helperRedeems.find((tx) => tx.isHaveNestedInput(2));\n let amount;\n if (findWithdrawWithNested) {\n amount = new SplitCoinHelper(findWithdrawWithNested.getNestedInputParam<SplitCoinsTransaction>(2), this.txb)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawAndUnstakeLending,\n intentionData: {\n amount,\n coinName,\n stakeAccountId: stakeAccountWithAmount,\n },\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n const lendingReward: {\n stakeMarketCoinName: SupportStakeMarketCoins;\n stakeAccountId: string;\n }[] = [];\n const borrowRewardV2: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n }[] = [];\n\n const borrowReward: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n }[] = [];\n\n this.helperClaimLendingReward.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(2);\n const stakeMarketCoinName = tx.typeArg(0);\n const coinName = this._builder.utils.parseCoinNameFromType(stakeMarketCoinName);\n lendingReward.push({ stakeMarketCoinName: coinName as SupportStakeMarketCoins, stakeAccountId });\n });\n\n this.helperClaimBorrowV2Reward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(3);\n const obligationId = tx.decodeOwnedObjectId(4);\n const rewardCoinName = this._builder.utils.parseCoinNameFromType(\n tx.typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\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._builder.utils.parseCoinNameFromType(\n tx.typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\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 private get helperClaimLendingReward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperClaimBorrowV2Reward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperStakeMoreSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStakeSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperExtendStakePeriod() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRedeemSca() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::redeem`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRenewExpired() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperOldUnstakeObligation() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstakeObligation() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperClaimBorrowReward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperMint() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::mint::mint`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstakes() {\n const moveCalls = this.transactions\n .filter((trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::unstake`))\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperRedeems() {\n const moveCalls = this.transactions\n .filter(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::redeem::redeem`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperRedeem() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::redeem::redeem`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::stake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperDepositCollateral() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperWithdrawCollateral() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperBorrow() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::borrow::borrow`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRepay() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::repay::repay`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class SplitCoinHelper {\n constructor(\n public readonly splitCoin: SplitCoinsTransaction,\n public readonly txb: TransactionBlock,\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 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\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 getNestedInputParam<T>(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'NestedResult') {\n throw new Error('not input type');\n }\n return this.txb.blockData.transactions[arg.index] as T;\n }\n\n isHaveNestedInput(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n return arg.kind === 'NestedResult';\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","export const API_BASE_URL = 'https://sui.api.scallop.io';\nexport const SDK_API_BASE_URL = 'https://sdk.api.scallop.io';\n\nexport const ADDRESSES_ID = '6601955b8b0024600a917079';\n\nexport const PROTOCOL_OBJECT_ID = '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf';\n\nexport const BORROW_FEE_PROTOCOL_ID = '0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da';\n\nexport const OLD_BORROW_INCENTIVE_PROTOCOL_ID =\n '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410' as const;\n\nexport const SCA_COIN_TYPE = '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA' as const;\n\nexport const SUPPORT_POOLS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n] as const;\n\nexport const SUPPORT_COLLATERALS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n] as const;\n\nexport const SUPPORT_SPOOLS = ['seth', 'ssui', 'susdc', 'susdt', 'scetus', 'safsui', 'shasui', 'svsui'] as const;\n\nexport const SUPPORT_SPOOLS_REWARDS = ['sui'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_POOLS = ['sui', 'usdc', 'usdt'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_REWARDS = ['sui', 'sca'] as const;\nexport const SUPPORT_ORACLES = ['supra', 'switchboard', 'pyth'] as const;\n\nexport const SUPPORT_PACKAGES = [\n 'coinDecimalsRegistry',\n 'math',\n 'whitelist',\n 'x',\n 'protocol',\n 'protocolWhitelist',\n 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n","import type {\n SupportCoinDecimals,\n AssetCoins,\n MarketCoins,\n StakeMarketCoins,\n StakeRewardCoins,\n BorrowIncentiveRewardCoins,\n AssetCoinIds,\n WormholeCoinIds,\n VoloCoinIds,\n} from '../types';\n\nexport const coinDecimals: SupportCoinDecimals = {\n eth: 8,\n btc: 8,\n usdc: 6,\n usdt: 6,\n sui: 9,\n apt: 8,\n sol: 8,\n sca: 9,\n cetus: 9,\n afsui: 9,\n hasui: 9,\n vsui: 9,\n seth: 8,\n sbtc: 8,\n susdc: 6,\n susdt: 6,\n ssui: 9,\n sapt: 8,\n ssol: 8,\n scetus: 9,\n safsui: 9,\n shasui: 9,\n svsui: 9,\n ssca: 9,\n};\n\nexport const assetCoins: AssetCoins = {\n eth: 'eth',\n btc: 'btc',\n usdc: 'usdc',\n usdt: 'usdt',\n sui: 'sui',\n apt: 'apt',\n sol: 'sol',\n cetus: 'cetus',\n afsui: 'afsui',\n hasui: 'hasui',\n vsui: 'vsui',\n sca: 'sca',\n};\n\nexport const marketCoins: MarketCoins = {\n seth: 'seth',\n sbtc: 'sbtc',\n susdc: 'susdc',\n susdt: 'susdt',\n ssui: 'ssui',\n sapt: 'sapt',\n ssol: 'ssol',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n ssca: 'ssca',\n};\n\nexport const stakeMarketCoins: StakeMarketCoins = {\n seth: 'seth',\n ssui: 'ssui',\n susdc: 'susdc',\n susdt: 'susdt',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n};\n\nexport const spoolRewardCoins: StakeRewardCoins = {\n seth: 'sui',\n ssui: 'sui',\n susdc: 'sui',\n susdt: 'sui',\n scetus: 'sui',\n safsui: 'sui',\n shasui: 'sui',\n svsui: 'sui',\n};\n\nexport const borrowIncentiveRewardCoins: BorrowIncentiveRewardCoins = {\n sui: ['sui', 'sca'],\n usdc: ['sui', 'sca'],\n usdt: ['sui', 'sca'],\n};\n\nexport const coinIds: AssetCoinIds = {\n sui: '0x0000000000000000000000000000000000000000000000000000000000000002',\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n cetus: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n afsui: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n hasui: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n sca: '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n};\n\nexport const wormholeCoinIds: WormholeCoinIds = {\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n};\n\nexport const voloCoinIds: VoloCoinIds = {\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock, TransactionResult } from '@mysten/sui.js/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport BigNumber from 'bignumber.js';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { generateBorrowIncentiveQuickMethod } from '../builders/borrowIncentiveBuilder';\nimport { generateCoreQuickMethod } from '../builders/coreBuilder';\nimport { generateSpoolQuickMethod } from '../builders/spoolBuilder';\nimport { generateQuickVeScaMethod } from '../builders/vescaBuilder';\nimport { ADDRESSES_ID, SCA_COIN_TYPE, SUPPORT_BORROW_INCENTIVE_POOLS, SUPPORT_SPOOLS } from '../constants';\nimport type {\n ScallopInstanceParams,\n ScallopClientParams,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportStakeMarketCoins,\n BorrowIncentiveParams,\n SpoolIncentiveParams,\n SupportBorrowIncentiveRewardCoins,\n} from '../types';\n\n/**\n * @description\n * It provides contract interaction operations for general users.\n *\n * @example\n * ```typescript\n * const scallopClient = new ScallopClient(<parameters>);\n * await scallopClient.init();\n * scallopClient.<client functions>();\n * await scallopClient.<client async functions>();\n * ```\n */\nexport class ScallopClient {\n public readonly params: ScallopClientParams;\n\n public client: SuiClient;\n\n public address: ScallopAddress;\n\n public builder: ScallopBuilder;\n\n public query: ScallopQuery;\n\n public utils: ScallopUtils;\n\n public walletAddress: string;\n\n public constructor(params: ScallopClientParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.client = params.client;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(params, {\n address: this.address,\n query: this.query,\n });\n this.builder =\n instance?.builder ??\n new ScallopBuilder(params, {\n address: this.address,\n query: this.query,\n utils: this.utils,\n });\n this.walletAddress = normalizeSuiAddress(params.walletAddress);\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n */\n public init(force = false) {\n if (force || !this.address.getAddresses()) {\n this.address.read();\n }\n\n this.builder.init(force, this.address);\n this.query.init(force, this.address);\n this.utils.init(force, this.address);\n }\n\n /* ==================== Query Method ==================== */\n\n /**\n * Get obligations data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getObligations(owner);\n }\n\n /**\n * Query all stake accounts data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return All stake accounts data.\n */\n async getAllStakeAccounts(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getAllStakeAccounts(owner);\n }\n\n /**\n * Query stake account data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n async getStakeAccounts(stakeMarketCoinName: SupportStakeMarketCoins, ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getStakeAccounts(stakeMarketCoinName, owner);\n }\n\n /**\n * Query stake pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Stake pool data.\n */\n async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return this.query.getStakePool(stakeMarketCoinName);\n }\n\n /**\n * Query reward pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Reward pool data.\n */\n async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return this.query.getStakeRewardPool(stakeMarketCoinName);\n }\n\n /* ==================== Core Method ==================== */\n\n /**\n * Open obligation.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async openObligation(walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const coreQuickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n coreQuickMethod.normalMethod.openObligationEntry();\n return txBlock;\n }\n\n /**\n * Deposit collateral into the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n obligationId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n\n const obligations = await this.query.getObligations(sender);\n const specificObligationId = obligationId || obligations?.[0]?.id;\n if (specificObligationId) {\n await quickMethod.addCollateralQuick(amount, collateralCoinName, specificObligationId);\n } else {\n const [obligation, obligationKey, hotPotato] = quickMethod.normalMethod.openObligation();\n await quickMethod.addCollateralQuick(amount, collateralCoinName, obligation);\n quickMethod.normalMethod.returnObligation(obligation, hotPotato);\n txBlock.transferObjects([obligationKey], sender);\n }\n return txBlock;\n }\n\n /**\n * Withdraw collateral from the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdrawCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await quickMethod.takeCollateralQuick(\n amount,\n collateralCoinName,\n obligationId,\n obligationKey,\n );\n txBlock.transferObjects([collateralCoin], sender);\n return txBlock;\n }\n\n /**\n * Deposit asset into the specific pool.\n *\n * @param poolCoinName - Types of pool coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async deposit(\n poolCoinName: SupportPoolCoins,\n amount: number,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await quickMethod.depositQuick(amount, poolCoinName, walletAddress);\n txBlock.transferObjects([marketCoin], sender);\n return txBlock;\n }\n\n /**\n * Withdraw asset from the specific pool, must return market coin.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would withdraw.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdraw(\n poolCoinName: SupportPoolCoins,\n amount: number,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const sender = walletAddress || this.walletAddress;\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n txBlock.setSender(sender);\n\n const coin = await quickMethod.withdrawQuick(amount, poolCoinName);\n txBlock.transferObjects([coin], sender);\n return txBlock;\n }\n\n /**\n * Borrow asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrow(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n const coin = await quickMethod.borrowQuick(amount, poolCoinName, obligationId, obligationKey);\n txBlock.transferObjects([coin], sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKey);\n }\n return txBlock;\n }\n\n /**\n * Borrow asset from the specific pool with boost from SCA stake.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param veScaKey - The vesca key object to verifying sca staker.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrowWithBoost(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n veScaKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n const coin = await quickMethod.borrowQuick(amount, poolCoinName, obligationId, obligationKey);\n txBlock.transferObjects([coin], sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n }\n return txBlock;\n }\n\n /**\n * Repay asset into the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would repay.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async repay(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n await quickMethod.repayQuick(amount, poolCoinName, obligationId, sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKey);\n }\n return txBlock;\n }\n\n /* ==================== Spool Method ==================== */\n\n /**\n * Create stake account.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async createStakeAccount(\n marketCoinName: SupportStakeMarketCoins,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccount = spoolQuickMethod.normalMethod.createStakeAccount(marketCoinName);\n txBlock.transferObjects([stakeAccount], sender);\n return txBlock;\n }\n\n public async supplyAndStake(\n poolCoinName: SupportPoolCoins,\n amount: number,\n stakeAccountId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await quickMethod.depositQuick(amount, poolCoinName, walletAddress);\n const stakeMarketCoinName = this.utils.parseMarketCoinName(poolCoinName);\n if (!SUPPORT_SPOOLS.find((coin) => coin === stakeMarketCoinName)) {\n return txBlock;\n }\n const stakeAccounts = await this.query.getStakeAccounts(stakeMarketCoinName as SupportStakeMarketCoins, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await spoolQuickMethod.stakeQuick(marketCoin, stakeMarketCoinName as SupportStakeMarketCoins, targetStakeAccount);\n } else {\n const account = spoolQuickMethod.normalMethod.createStakeAccount(stakeMarketCoinName as SupportStakeMarketCoins);\n await spoolQuickMethod.stakeQuick(marketCoin, stakeMarketCoinName as SupportStakeMarketCoins, account);\n txBlock.transferObjects([account], sender);\n }\n return txBlock;\n }\n\n public async unstakeAndWithdraw(\n poolCoinName: SupportPoolCoins,\n amount: number,\n unstakeAccount: { id: string; coin: number }[],\n ) {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n const withdrawCoins = [];\n txBlock.setSender(sender);\n const stakeMarketCoinName = this.utils.parseMarketCoinName(poolCoinName) as SupportStakeMarketCoins;\n for (let i = 0; i < unstakeAccount.length; i++) {\n const account = unstakeAccount[i];\n const [marketCoin] = await spoolQuickMethod.unstakeQuick(account.coin, stakeMarketCoinName, account.id);\n if (marketCoin) {\n const wdScoin = quickMethod.normalMethod.withdraw(marketCoin, poolCoinName);\n withdrawCoins.push(wdScoin);\n }\n }\n if (amount > 0) {\n const wdCoin = await quickMethod.withdrawQuick(amount, poolCoinName);\n withdrawCoins.push(wdCoin);\n }\n txBlock.transferObjects(withdrawCoins, sender);\n return txBlock;\n }\n\n /**\n * Stake market coin into the specific spool.\n *\n * @param marketCoinName - Types of market coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n stakeAccountId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccounts = await this.query.getStakeAccounts(stakeMarketCoinName, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await spoolQuickMethod.stakeQuick(amount, stakeMarketCoinName, targetStakeAccount);\n } else {\n const account = spoolQuickMethod.normalMethod.createStakeAccount(stakeMarketCoinName);\n await spoolQuickMethod.stakeQuick(amount, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n return txBlock;\n }\n\n /**\n * Unstake market coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n stakeAccountId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoins = await spoolQuickMethod.unstakeQuick(amount, stakeMarketCoinName, stakeAccountId);\n txBlock.transferObjects(marketCoins, sender);\n return txBlock;\n }\n\n /**\n * Claim reward coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async claim(\n lendingIncentive: SpoolIncentiveParams[],\n borrowIncentiveV2: BorrowIncentiveParams[],\n borrowIncentive: BorrowIncentiveParams[],\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveRewarad = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoins: { sui: TransactionResult[]; sca: TransactionResult[] } = {\n sui: [],\n sca: [],\n };\n\n for (let i = 0; i < lendingIncentive.length; i++) {\n const { stakeMarketCoinName, stakeAccountId } = lendingIncentive[i];\n const rewardCoin = spoolQuickMethod.normalMethod.claim(stakeAccountId, stakeMarketCoinName);\n rewardCoins.sui.push(rewardCoin);\n }\n\n for (let i = 0; i < borrowIncentiveV2.length; i++) {\n const { obligationId, obligationKey, rewardCoinName } = borrowIncentiveV2[i];\n const rewardCoin = borrowIncentiveRewarad.normalMethod.claimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n rewardCoins[rewardCoinName].push(rewardCoin);\n }\n\n for (let i = 0; i < borrowIncentive.length; i++) {\n const { obligationId, obligationKey, rewardCoinName } = borrowIncentive[i];\n const rewardCoin = borrowIncentiveRewarad.normalMethod.oldClaimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n rewardCoins[rewardCoinName].push(rewardCoin);\n }\n\n if (rewardCoins.sui.length > 0) {\n if (rewardCoins.sui.length > 1) {\n txBlock.mergeCoins(rewardCoins.sui[0], rewardCoins.sui.slice(1));\n }\n txBlock.transferObjects([rewardCoins.sui[0]], txBlock.pure(sender));\n }\n\n if (rewardCoins.sca.length > 0) {\n if (rewardCoins.sca.length > 1) {\n txBlock.mergeCoins(rewardCoins.sca[0], rewardCoins.sca.slice(1));\n }\n txBlock.transferObjects([rewardCoins.sca[0]], txBlock.pure(sender));\n }\n return txBlock;\n }\n\n /* ==================== Borrow Incentive Method ==================== */\n\n /**\n * stake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async stakeObligation(\n obligationId: string,\n obligationKeyId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = this.builder.createTxBlock();\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKeyId);\n return txBlock;\n }\n\n /**\n * unstake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async unstakeObligation(\n obligationId: string,\n obligationKeyId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = this.builder.createTxBlock();\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKeyId);\n return txBlock;\n }\n\n /**\n * Stake SCA.\n *\n * @param amount - Types of mak coin.\n * @param lockPeriod - The amount of coins would deposit.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stakeSca(\n amount: number,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n obligationId?: string,\n obligationKey?: string,\n lockPeriod?: number,\n vescaKey?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n\n let newVescaKey;\n if (!vescaKey) {\n newVescaKey = vescaQuickMethod.normalMethod.lockSca(takeCoin, lockPeriod);\n } else {\n vescaQuickMethod.normalMethod.extendLockAmount(vescaKey, takeCoin);\n }\n\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligationId, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligationId, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligationId, obligationKey, vescaKey || newVescaKey);\n }\n\n if (!vescaKey) {\n txBlock.transferObjects([newVescaKey, leftCoin], sender);\n }\n\n return txBlock;\n }\n\n /**\n * Stake more SCA.\n *\n * @param amount - Types of mak coin.\n * @param vescaKey - The vesca key object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stakeMoreSca(amount: number, vescaKey?: string, walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n // const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // await vescaQuickMethod.extendLockAmountQuick(amount, vescaKey);\n return txBlock;\n }\n\n /**\n * Extend stake lock period.\n *\n * @param lockPeriodInDays\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async extendStakeScaLockPeriod(\n lockPeriodInDays: number,\n vescaKey: string,\n obligationId?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n vescaQuickMethod.normalMethod.extendLockPeriod(vescaKey, lockPeriodInDays);\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligationId, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligationId, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligationId, obligationKey, vescaKey);\n }\n return txBlock;\n }\n\n public async extendPeriodAndStakeMoreSca(\n amount: number,\n vescaKey: string,\n lockPeriodInDays: number,\n obligation?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n vescaQuickMethod.normalMethod.extendLockPeriod(vescaKey, lockPeriodInDays);\n vescaQuickMethod.normalMethod.extendLockAmount(vescaKey, takeCoin);\n txBlock.transferObjects([leftCoin], sender);\n if (!obligation || !obligationKey) {\n return txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligation, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligation, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return txBlock;\n }\n\n /**\n * Renew expired stake SCA.\n *\n * @param amount\n * @param lockPeriodInDays\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async renewExpiredStakeSca(\n amount: number,\n lockPeriodInDays: number,\n vescaKey: string,\n isHaveRedeem = false,\n obligation?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n if (isHaveRedeem) {\n const redeem = vescaQuickMethod.normalMethod.redeemSca(vescaKey);\n txBlock.transferObjects([redeem], sender);\n }\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n txBlock.transferObjects([leftCoin], sender);\n // renew veSCA\n vescaQuickMethod.normalMethod.renewExpiredVeSca(vescaKey, takeCoin, lockPeriodInDays);\n if (!obligation || !obligationKey) {\n return txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligation, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligation, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return txBlock;\n }\n\n public async redeemSca(veScaKey: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n txBlock.setSender(sender);\n\n await vescaQuickMethod.redeemScaQuick(veScaKey);\n return txBlock;\n }\n\n public async migrateAndClaim(\n veScaKey: string,\n obligationKey: string,\n obligationId: string,\n rewardCoinName: SupportBorrowIncentiveRewardCoins,\n ) {\n const txBlock = new TransactionBlock();\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoin = borrowIncentive.normalMethod.oldClaimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n txBlock.transferObjects([rewardCoin], sender);\n borrowIncentive.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n return txBlock;\n }\n\n /**\n * Withdraw unlocked SCA.\n *\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async withdrawUnlockedSca(vescaKey?: string, walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await vescaQuickMethod.redeemScaQuick(vescaKey);\n return txBlock;\n }\n\n private calculateAvailableClaimCoin(accountPoint: any, poolPoint: any): BigNumber {\n const borrowAmount = new BigNumber(accountPoint.weightedAmount);\n const baseIndexRate = 1e9;\n const increasePointRate = poolPoint.currentPointIndex\n ? BigNumber(poolPoint.currentPointIndex - accountPoint.index).dividedBy(baseIndexRate)\n : 1;\n return borrowAmount\n .multipliedBy(increasePointRate)\n .plus(accountPoint.points)\n .shiftedBy(-1 * poolPoint.coinDecimal);\n }\n}\n","export const config = {\n mainnet: {\n core: {\n version: '0x07871c4b3c847a0f674510d4978d5cf6f960452795e8ff6f189fd2088a3f6ac7',\n versionCap: '0x590a4011cb649b3878f3ea14b3a78674642a9548d79b7e091ef679574b158a07',\n object: '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf',\n market: '0xa757975255146dc9686aa823b7838b507f315d704f428cbadad2f4ea061939d9',\n adminCap: '0x09689d018e71c337d9db6d67cbca06b74ed92196103624028ccc3ecea411777c',\n coinDecimalsRegistry: '0x200abe9bf19751cc566ae35aa58e2b7e4ff688fc1130f8d8909ea09bc137d668',\n obligationAccessStore: '0x733e30b7c94d619d78cb8f5bc4bfbb759ced9a531239028caabb2474e5be59c9',\n coins: {\n cetus: {\n id: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n metaData: '0x4c0dce55eff2db5419bbd2d239d1aa22b4a400c01bbb648b058a9883989025da',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef',\n feedObject: '0x24c0247fb22457a719efac7f670cdc79be321b521460bd6bd2ccfa9f80713b14',\n },\n },\n },\n apt: {\n id: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n metaData: '0xc969c5251f372c0f34c32759f1d315cf1ea0ee5e4454b52aea08778eacfdd0a8',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5',\n feedObject: '0x7c5b7837c44a69b469325463ac0673ac1aa8435ff44ddb4191c9ae380463647f',\n },\n },\n },\n sol: {\n id: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n metaData: '0x4d2c39082b4477e3e79dc4562d939147ab90c42fc5f3e4acf03b94383cd69b6e',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',\n feedObject: '0x9d0d275efbd37d8a8855f6f2c761fa5983293dd8ce202ee5196626de8fcd4469',\n },\n },\n },\n btc: {\n id: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n metaData: '0x5d3c6e60eeff8a05b693b481539e7847dfe33013e7070cdcb387f5c0cac05dfd',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n feedObject: '0x9a62b4863bdeaabdc9500fce769cf7e72d5585eeb28a6d26e4cafadc13f76ab2',\n },\n },\n },\n eth: {\n id: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n metaData: '0x8900e4ceede3363bef086d6b50ca89d816d0e90bf6bc46efefe1f8455e08f50f',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n feedObject: '0x9193fd47f9a0ab99b6e365a464c8a9ae30e6150fc37ed2a89c1586631f6fc4ab',\n },\n },\n },\n usdc: {\n id: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n metaData: '0x4fbf84f3029bd0c0b77164b587963be957f853eccf834a67bb9ecba6ec80f189',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n feedObject: '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n },\n },\n usdt: {\n id: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n metaData: '0xfb0e3eb97dd158a5ae979dddfa24348063843c5b20eb8381dd5fa7c93699e45c',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n feedObject: '0x985e3db9f93f76ee8bace7c3dd5cc676a096accd5d9e09e9ae0fb6e492b14572',\n },\n },\n },\n sui: {\n id: '0x0000000000000000000000000000000000000000000000000000000000000002',\n metaData: '0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '0xbca474133638352ba83ccf7b5c931d50f764b09550e16612c9f70f1e21f3f594',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n afsui: {\n id: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n metaData: '0x2f9217f533e51334873a39b8026a4aa6919497b47f49d0986a4f1aec66f8a34d',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n hasui: {\n id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n metaData: '0x2c5f33af93f6511df699aaaa5822d823aac6ed99d4a0de2a4a50b3afa0172e24',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n vsui: {\n id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n metaData: '0xabd84a23467b33854ab25cf862006fd97479f8f6f53e50fe732c43a274d939bd',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n sca: {\n id: '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n metaData: '0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n feedObject: '0xf6de1d3279a269a597d813cbaca59aa906543ab9a8c64e84a4722f1a20863985',\n },\n },\n },\n },\n oracles: {\n xOracle: '0x93d5bf0936b71eb27255941e532fac33b5a5c7759e377b4923af0a1359ad494f',\n xOracleCap: '0x1edeae568fde99e090dbdec4bcdbd33a15f53a1ce1f87aeef1a560dedf4b4a90',\n supra: {\n registry: '',\n registryCap: '',\n holder: '',\n },\n switchboard: {\n registry: '',\n registryCap: '',\n },\n pyth: {\n registry: '0xedc293f9413a5a7a5d53bdba1fd889d0a4030894469228f0acdae4aa3c55a213',\n registryCap: '0xbcb07141eb1f7e01fbda4130ecf5f5adaeabb77f5d9c32158b7532bcd2197acd',\n state: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n wormhole: '0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a',\n wormholeState: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '0xca5a5a62f01c79a104bf4d31669e29daa387f325c241de4edbe30986a9bc8b0d',\n upgradeCap: '0x34e76a945d29f195bc53ca704fa70877d1cf3a5d7bbfdda1b13e633fff13c0f6',\n },\n math: {\n id: '0xad013d5fde39e15eabda32b3dbdafd67dac32b798ce63237c27a8f73339b9b6f',\n upgradeCap: '0x3a329598231de02e6135c62284b66005b41cad1d9ab7ca2dc79c08293aba2ec6',\n },\n whitelist: {\n id: '0x1318fdc90319ec9c24df1456d960a447521b0a658316155895014a6e39b5482f',\n upgradeCap: '0xf5a22aea23db664f7b69855b6a546747f17c1ec4230319cfc17225e462b05761',\n },\n x: {\n id: '0x779b5c547976899f5474f3a5bc0db36ddf4697ad7e5a901db0415c2281d28162',\n upgradeCap: '0x3f203f6fff6a69d151e4f1cd931f22b68c489ef2759765662fc7baf673943c9e',\n },\n protocol: {\n id: '0x38fe42a5a69f7eb3635404389e8003be9457b1a5c873f133184648c7e9bd47b7',\n upgradeCap: '0x38527d154618d1fd5a644b90717fe07cf0e9f26b46b63e9568e611a3f86d5c1a',\n },\n protocolWhitelist: {\n id: '0x4c262d9343dac53ecb28f482a2a3f62c73d0ebac5b5f03d57383d56ff219acdf',\n upgradeCap: '0x4a5e88a75039b00988f633f811f58117f31b8627a46bf822aa114d9010049449',\n },\n query: {\n id: '0xb8d603a39114a5efef3dd0bf84df0bed1be1fbd39b78b7dd6e8a61ccc5e6006f',\n upgradeCap: '0x0d535c35f608b9b01b7ccce11acf43b1dd80c1b72bf8b541744a6e28e8d2745f',\n },\n supra: {\n id: '',\n upgradeCap: '',\n },\n pyth: {\n id: '0x910f30cbc7f601f75a5141a01265cd47c62d468707c5e1aecb32a18f448cb25a',\n upgradeCap: '0xdf0ffbae1ea5bb25fbca5efba433dcf00c7cced65679af2f04728901275c6157',\n },\n switchboard: {\n id: '',\n upgradeCap: '',\n },\n xOracle: {\n id: '0x1478a432123e4b3d61878b629f2c692969fdb375644f1251cd278a4b1e7d7cd6',\n upgradeCap: '0x0f928a6b2e26b73330fecaf9b44acfc9800a4a9794d6415c2a3153bc70e3c1f0',\n },\n testCoin: {\n id: '',\n upgradeCap: '',\n },\n },\n },\n spool: {\n id: '0xec1ac7f4d01c5bf178ff4e62e523e7df7721453d81d4904a42a0ffc2686c843d',\n adminCap: '0xdd8a047cbbf802bfcde5288b8ef1910965d789cc614da11d39af05fca0bd020a',\n object: '0xe87f1b2d498106a2c61421cec75b7b5c5e348512b0dc263949a0e7a3c256571a',\n pools: {\n seth: {\n id: '0xeec40beccb07c575bebd842eeaabb835f77cd3dab73add433477e57f583a6787',\n rewardPoolId: '0x957de68a18d87817de8309b30c1ec269a4d87ae513abbeed86b5619cb9ce1077',\n },\n ssui: {\n id: '0x4f0ba970d3c11db05c8f40c64a15b6a33322db3702d634ced6536960ab6f3ee4',\n rewardPoolId: '0x162250ef72393a4ad3d46294c4e1bdfcb03f04c869d390e7efbfc995353a7ee9',\n },\n susdc: {\n id: '0x4ace6648ddc64e646ba47a957c562c32c9599b3bba8f5ac1aadb2ae23a2f8ca0',\n rewardPoolId: '0xf4268cc9b9413b9bfe09e8966b8de650494c9e5784bf0930759cfef4904daff8',\n },\n susdt: {\n id: '0xcb328f7ffa7f9342ed85af3fdb2f22919e1a06dfb2f713c04c73543870d7548f',\n rewardPoolId: '0x2c9f934d67a5baa586ceec2cc24163a2f049a6af3d5ba36b84d8ac40f25c4080',\n },\n scetus: {\n id: '0xac1bb13bf4472a637c18c2415fb0e3c1227ea2bcf35242e50563c98215bd298e',\n rewardPoolId: '0x6835c1224126a45086fc6406adc249e3f30df18d779ca4f4e570e38716a17f3f',\n },\n safsui: {\n id: '0xeedf438abcaa6ce4d9625ffca110920592d5867e4c5637d84ad9f466c4feb800',\n rewardPoolId: '0x89255a2f86ed7fbfef35ab8b7be48cc7667015975be2685dd9a55a9a64baf76e',\n },\n shasui: {\n id: '0xa6148bc1b623e936d39a952ceb5bea79e8b37228a8f595067bf1852efd3c34aa',\n rewardPoolId: '0x6f3563644d3e2ef13176dbf9d865bd93479df60ccbe07b7e66db57f6309f5a66',\n },\n svsui: {\n id: '0x69ce8e537e750a95381e6040794afa5ab1758353a1a2e1de7760391b01f91670',\n rewardPoolId: '0xbca914adce058ad0902c7f3cfcd698392a475f00dcfdc3f76001d0370b98777a',\n },\n },\n version: '',\n versionCap: '',\n },\n borrowIncentive: {\n id: '0x874f1d43d81e2256e120bab2485938fe07ba0cc21d87129a99a1db11cacb382d',\n adminCap: '0xc486afa253646f4d381e81d7f1df8aa4723b845a6bb356f69bad635ffefffe2c',\n object: '0x002875153e09f8145ab63527bc85c00f2bd102e12f9573c47f8cdf1a1cb62934',\n query: '0x529edc54a3dce2207703ceebbccb0ac14133f7825c1f528775ba0d85a4063489',\n incentivePools: '0x6547e143d406b5ccd5f46aae482497de279cc1a68c406f701df70a05f9212ab4',\n incentiveAccounts: '0xc4701fdbc1c92f9a636d334d66012b3027659e9fb8aff27279a82edfb6b77d02',\n config: '0xdf5d04b4691cc67e82fd4db8394d89ff44823a9de29716c924f74bb4f11cc1f7',\n version: '',\n versionCap: '',\n },\n vesca: {\n id: '0xcfe2d87aa5712b67cad2732edb6a2201bfdf592377e5c0968b7cb02099bd8e21',\n adminCap: '0x4d105b16467acca81d18c132cdd1a3cee159920a86c1ef4bdbf2e8d7878500c5',\n tableId: '0x0a0b7f749baeb61e3dfee2b42245e32d0e6b484063f0a536b33e771d573d7246',\n table: '0xd3a4632b1080f7d96e1c2487d4dabf2c1196916937c505a69954ac9f393be8d0',\n treasury: '0xafa4b6231e49c15a22d641ce33fda761baaf650fa21899dfa2eb1716146e7306',\n config: '0x7cbcb0a342179577a117dfdff974cf1ab765d3b571067bf22ddf5f9e3a667922',\n },\n },\n};\n","import { config } from '../config';\nimport type { ScallopAddressParams, AddressesInterface, AddressStringPath, NetworkType } from '../types';\n\n/**\n * @description\n * It provides methods for managing addresses.\n *\n * @example\n * ```typescript\n * const scallopAddress = new ScallopAddress(<parameters>);\n * scallopAddress.<address functions>();\n * await scallopAddress.<address async functions>();\n * ```\n */\nexport class ScallopAddress {\n private readonly _auth?: string;\n\n private _id?: string;\n\n private _network: NetworkType;\n\n private _currentAddresses?: AddressesInterface;\n\n private _addressesMap: Map<NetworkType, AddressesInterface>;\n\n public constructor(params: ScallopAddressParams) {\n const { id, auth, network } = params;\n\n if (auth) {\n this._auth = auth;\n }\n this._id = id;\n this._network = network || 'mainnet';\n this._addressesMap = new Map();\n }\n\n /**\n * Get addresses API id.\n *\n * @return The addresses API id.\n */\n public getId() {\n return this._id || undefined;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @return The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._currentAddresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object' ? nestedAddressObj[key] : nestedAddressObj,\n this._currentAddresses,\n );\n return value || undefined;\n }\n return undefined;\n }\n\n /**\n * Sets the address for the specified path, it does not interact with the API.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @return The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._currentAddresses) {\n const keys = path.split('.');\n keys.reduce((nestedAddressObj: any, key: string, index) => {\n if (index === keys.length - 1) {\n const updatedAddressObj = nestedAddressObj;\n updatedAddressObj[key] = address;\n }\n return nestedAddressObj[key];\n }, this._currentAddresses);\n }\n return this._currentAddresses;\n }\n\n /**\n * Synchronize the specified network addresses from the addresses map to the\n * current addresses and change the default network to specified network.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @return Current addresses.\n */\n public switchCurrentAddresses(network: NetworkType) {\n if (this._addressesMap.has(network)) {\n this._currentAddresses = this._addressesMap.get(network);\n this._network = network;\n }\n return this._currentAddresses;\n }\n\n /**\n * Get the addresses, If `network` is not provided, returns the current\n * addresses or the default network addresses in the addresses map.\n *\n * @param network - Specifies which network's addresses you want to get.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n }\n return this._currentAddresses ?? this._addressesMap.get(this._network);\n }\n\n /**\n * Set the addresses into addresses map. If the specified network is the same\n * as the current network, the current addresses will be updated at the same time.\n *\n * @param addresses - The addresses be setted to the tartget network.\n * @param network - Specifies which network's addresses you want to set.\n * @return The addresses.\n */\n public setAddresses(addresses: AddressesInterface, network?: NetworkType) {\n const targetNetwork = network || this._network;\n if (targetNetwork === this._network) {\n this._currentAddresses = addresses;\n }\n this._addressesMap.set(targetNetwork, addresses);\n }\n\n /**\n * Get all addresses.\n *\n * @return All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n public read() {\n Object.entries<AddressesInterface>(config).forEach(([network, addresses]) => {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) {\n this._currentAddresses = addresses;\n }\n this._addressesMap.set(network as NetworkType, addresses);\n }\n });\n return this.getAllAddresses();\n }\n}\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID } from '../constants';\nimport type {\n ScallopInstanceParams,\n ScallopBuilderParams,\n ScallopTxBlock,\n SupportMarketCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * @description\n * It provides methods for operating the transaction block, making it more convenient to organize transaction combinations.\n *\n * @example\n * ```typescript\n * const scallopBuilder = new ScallopBuilder(<parameters>);\n * await scallopBuilder.init();\n * const txBlock = scallopBuilder.<builder functions>();\n * ```\n */\nexport class ScallopBuilder {\n public readonly params: ScallopBuilderParams;\n\n public readonly isTestnet: boolean;\n\n public address: ScallopAddress;\n\n public query: ScallopQuery;\n\n public utils: ScallopUtils;\n\n public client: SuiClient;\n\n public walletAddress: string;\n\n public constructor(params: ScallopBuilderParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n address: this.address,\n query: this.query,\n });\n this.client = params.client;\n this.walletAddress = normalizeSuiAddress(params.walletAddress);\n this.isTestnet = params.networkType ? params.networkType === 'testnet' : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public async init(force = false, address?: ScallopAddress) {\n if (force || !this.address.getAddresses() || !address?.getAddresses()) {\n this.address.read();\n } else {\n this.address = address;\n }\n this.query.init(force, this.address);\n this.utils.init(force, this.address);\n }\n\n /**\n * Create a scallop txBlock instance that enhances transaction block.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop txBlock.\n */\n public createTxBlock(txBlock?: ScallopTxBlock | TransactionBlock) {\n return new TransactionBlock(txBlock);\n }\n\n /**\n * Specifying the sender's amount of coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param assetCoinName - Specific support asset coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectCoin(txBlock: ScallopTxBlock, assetCoinName: SupportAssetCoins, amount: number, sender: string) {\n const coinType = this.utils.parseCoinType(assetCoinName);\n const coins = await this.utils.selectCoinIds(amount, coinType, sender);\n const [takeCoin, leftCoin] = this.utils.takeAmountFromCoins(txBlock, coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Specifying the sender's amount of market coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support market coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectMarketCoin(\n txBlock: TransactionBlock,\n marketCoinName: SupportMarketCoins,\n amount: number,\n sender: string,\n ) {\n const marketCoinType = this.utils.parseMarketCoinType(marketCoinName);\n const coins = await this.utils.selectCoinIds(amount, marketCoinType, sender);\n const [takeCoin, leftCoin] = this.utils.takeAmountFromCoins(txBlock, coins, amount);\n return { takeCoin, leftCoin };\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { ScallopAddress } from './scallopAddress';\nimport {\n ADDRESSES_ID,\n PROTOCOL_OBJECT_ID,\n spoolRewardCoins,\n borrowIncentiveRewardCoins,\n coinDecimals,\n wormholeCoinIds,\n voloCoinIds,\n coinIds,\n UNLOCK_ROUND_DURATION,\n MAX_LOCK_DURATION,\n} from '../constants';\nimport type {\n ScallopUtilsParams,\n ScallopInstanceParams,\n SupportCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n CoinWrappedType,\n SupportPoolCoins,\n SuiTxArg,\n} from '../types';\nimport { findClosestUnlockRound, isMarketCoin, parseAssetSymbol } from '../utils';\n\n/**\n * @description\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopUtils = new ScallopUtils(<parameters>);\n * await scallopUtils.init();\n * scallopUtils.<utils functions>();\n * await scallopUtils.<utils functions>();\n * ```\n */\nexport class ScallopUtils {\n public readonly params: ScallopUtilsParams;\n\n public readonly isTestnet: boolean;\n\n private _address: ScallopAddress;\n\n public client: SuiClient;\n\n public constructor(params: ScallopUtilsParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this._address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.isTestnet = params.networkType ? params.networkType === 'testnet' : false;\n this.client = params.client;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public init(force = false, address?: ScallopAddress) {\n if (force || !this._address.getAddresses() || !address?.getAddresses()) {\n this._address.read();\n } else {\n this._address = address;\n }\n }\n\n /**\n * Convert coin name to symbol.\n *\n * @param coinName - Specific support coin name.\n * @return Symbol string.\n */\n public parseSymbol(coinName: SupportCoins) {\n if (isMarketCoin(coinName)) {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName);\n }\n return parseAssetSymbol(coinName);\n }\n\n /**\n * Convert coin name to coin type.\n *\n * @description\n * The Coin type of wormhole is fixed `coin:Coin`. Here using package id\n * to determine and return the type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Coin type.\n */\n public parseCoinType(coinName: SupportCoins) {\n const validCoinName = isMarketCoin(coinName) ? this.parseCoinName(coinName) : coinName;\n const coinPackageId =\n this._address.get(`core.coins.${validCoinName as SupportPoolCoins}.id`) ||\n coinIds[coinName as SupportPoolCoins] ||\n undefined;\n if (!coinPackageId) {\n throw Error(`Coin ${coinName} is not supported`);\n }\n if (coinName === 'sui') {\n return normalizeStructTag(`${coinPackageId}::sui::SUI`);\n }\n const wormHolePckageIds = [\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc,\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt,\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth,\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc,\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol,\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt,\n ];\n const voloPckageIds = [this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui];\n if (wormHolePckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n }\n if (voloPckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::cert::CERT`;\n }\n return `${coinPackageId}::${validCoinName}::${validCoinName.toUpperCase()}`;\n }\n\n /**\n * Convert coin name to market coin type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Market coin type.\n */\n public parseMarketCoinType(coinName: SupportCoins) {\n const protocolObjectId = this._address.get('core.object') || PROTOCOL_OBJECT_ID;\n const coinType = this.parseCoinType(coinName);\n return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;\n }\n\n /**\n * Convert coin type to coin name.\n *\n * @description\n * The coin name cannot be obtained directly from the wormhole type. Here\n * the package id is used to determine and return a specific name.\n *\n * @param coinType - Specific support coin type.\n * @return Coin Name.\n */\n public parseCoinNameFromType<T extends SupportAssetCoins>(\n coinType: string,\n ): T extends SupportAssetCoins ? T : SupportAssetCoins;\n public parseCoinNameFromType<T extends SupportMarketCoins>(\n coinType: string,\n ): T extends SupportMarketCoins ? T : SupportMarketCoins;\n public parseCoinNameFromType<T extends SupportCoins>(coinType: string): T extends SupportCoins ? T : SupportCoins;\n public parseCoinNameFromType(coinType: string) {\n let type = normalizeStructTag(coinType);\n const coinTypeRegex = /((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)/;\n const coinTypeMatch = coinType.match(coinTypeRegex);\n const isMarketCoinType = coinType.includes('reserve::MarketCoin');\n type = coinTypeMatch?.[1] || coinType;\n\n const wormHoleCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc}::coin::COIN`]: 'usdc',\n [`${this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt}::coin::COIN`]: 'usdt',\n [`${this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth}::coin::COIN`]: 'eth',\n [`${this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc}::coin::COIN`]: 'btc',\n [`${this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol}::coin::COIN`]: 'sol',\n [`${this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt}::coin::COIN`]: 'apt',\n };\n const voloCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui}::cert::CERT`]: 'vsui',\n };\n\n const assetCoinName =\n wormHoleCoinTypeMap[type] || voloCoinTypeMap[type] || (type.split('::')[2].toLowerCase() as SupportAssetCoins);\n\n return isMarketCoinType ? this.parseMarketCoinName(assetCoinName) : assetCoinName;\n }\n\n /**\n * Convert marke coin name to coin name.\n *\n * @param marketCoinName - Specific support market coin name.\n * @return Coin Name.\n */\n public parseCoinName<T extends SupportAssetCoins>(marketCoinName: string) {\n return marketCoinName.slice(1) as T;\n }\n\n /**\n * Convert coin name to market coin name.\n *\n * @param coinName - Specific support coin name.\n * @return Market coin name.\n */\n public parseMarketCoinName<T extends SupportMarketCoins>(coinName: SupportCoins) {\n return `s${coinName}` as T;\n }\n\n /**\n * Get reward type of spool.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Spool reward coin name.\n */\n public getSpoolRewardCoinName = (stakeMarketCoinName: SupportStakeMarketCoins) =>\n spoolRewardCoins[stakeMarketCoinName];\n\n /**\n * Get reward type of borrow incentive pool.\n *\n * @param borrowIncentiveCoinName - Support borrow incentive coin.\n * @return Borrow incentive reward coin name.\n */\n public getBorrowIncentiveRewardCoinName = (borrowIncentiveCoinName: SupportBorrowIncentiveCoins) =>\n borrowIncentiveRewardCoins[borrowIncentiveCoinName];\n\n /**\n * Get coin decimal.\n *\n * return Coin decimal.\n */\n public getCoinDecimal(coinName: SupportCoins) {\n return coinDecimals[coinName];\n }\n\n /**\n * Get coin wrapped type.\n *\n * return Coin wrapped type.\n */\n public getCoinWrappedType(assetCoinName: SupportAssetCoins): CoinWrappedType {\n return assetCoinName === 'usdc' ||\n assetCoinName === 'usdt' ||\n assetCoinName === 'eth' ||\n assetCoinName === 'btc' ||\n assetCoinName === 'apt' ||\n assetCoinName === 'sol'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n }\n\n /**\n * Select coin id that add up to the given amount as transaction arguments.\n *\n * @param ownerAddress - The address of the owner.\n * @param amount - The amount that including coin decimals.\n * @param coinType - The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoinIds(amount: number, coinType: string = SUI_TYPE_ARG, ownerAddress?: string) {\n const address = ownerAddress;\n\n const selectedCoins: {\n objectId: string;\n digest: string;\n version: string;\n }[] = [];\n let totalAmount = 0;\n let hasNext = true;\n let nextCursor: string | null | undefined = null;\n while (hasNext && totalAmount < amount) {\n const coins = await this.client.getCoins({\n owner: address,\n coinType,\n cursor: nextCursor,\n });\n // Sort the coins by balance in descending order\n coins.data.sort((a, b) => parseInt(b.balance, 10) - parseInt(a.balance, 10));\n for (let i = 0; i < coins.data.length; i++) {\n selectedCoins.push({\n objectId: coins.data[i].coinObjectId,\n digest: coins.data[i].digest,\n version: coins.data[i].version,\n });\n totalAmount += parseInt(coins.data[i].balance, 10);\n if (totalAmount >= amount) {\n break;\n }\n }\n nextCursor = coins.nextCursor;\n hasNext = coins.hasNextPage;\n }\n\n if (!selectedCoins.length) {\n throw new Error('No valid coins found for the transaction.');\n }\n return selectedCoins.map((coin) => coin.objectId);\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The annual percentage rate (APR).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage yield (APY) for the given APR and compounding frequency.\n */\n public parseAprToApy(apr: number, compoundFrequency = 365) {\n return (1 + apr / compoundFrequency) ** compoundFrequency - 1;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The equivalent annual percentage yield (APY).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage rate (APR) for the given APY and compounding frequency.\n */\n public parseApyToApr(apy: number, compoundFrequency = 365) {\n return ((1 + apy) ** (1 / compoundFrequency) - 1) * compoundFrequency;\n }\n\n public takeAmountFromCoins(txBlock: TransactionBlock, coinObjectId: string[], amount: SuiTxArg) {\n const coinObjects = coinObjectId.map((objectId) => txBlock.object(objectId));\n const mergedCoin = coinObjects[0];\n if (coinObjects.length > 1) {\n txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = txBlock.splitCoins(mergedCoin, [txBlock.pure(amount)]);\n return [sendCoin, mergedCoin];\n }\n\n /**\n * Give extend lock period to get unlock at in seconds timestamp.\n *\n * @description\n * - When the user without remaining unlock period, If the extended unlock day is not specified,\n * the unlock period will be increased by one day by default.\n * - When the given extended day plus the user's remaining unlock period exceeds the maximum\n * unlock period, the maximum unlock period is used as unlock period.\n *\n * @param extendLockPeriodInDay The extend lock period in day.\n * @param unlockAtInSecondTimestamp The unlock timestamp from veSca object.\n * @return New unlock at in seconds timestamp.\n */\n public getUnlockAt(extendLockPeriodInDay?: number, unlockAtInSecondTimestamp?: number) {\n const now = Math.floor(new Date().getTime() / 1000);\n const remainingLockPeriod = unlockAtInSecondTimestamp ? Math.max(unlockAtInSecondTimestamp - now, 0) : 0;\n\n let newUnlockAtInSecondTimestamp = 0;\n\n if (remainingLockPeriod === 0) {\n const lockPeriod = (extendLockPeriodInDay ?? 1) * UNLOCK_ROUND_DURATION;\n newUnlockAtInSecondTimestamp = Math.min(now + lockPeriod, now + MAX_LOCK_DURATION);\n } else {\n const lockPeriod = Math.min(\n extendLockPeriodInDay\n ? extendLockPeriodInDay * UNLOCK_ROUND_DURATION + remainingLockPeriod\n : remainingLockPeriod,\n MAX_LOCK_DURATION,\n );\n newUnlockAtInSecondTimestamp = now + lockPeriod;\n }\n return findClosestUnlockRound(newUnlockAtInSecondTimestamp);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport {\n MAX_LOCK_DURATION,\n MAX_LOCK_ROUNDS,\n MIN_INITIAL_LOCK_AMOUNT,\n MIN_TOP_UP_AMOUNT,\n UNLOCK_ROUND_DURATION,\n} from '../constants';\nimport { SuiObjectArg } from '../types';\n\n/**\n * Check and get the sender from the transaction block.\n *\n * @param txBlock - TxBlock created by SuiKit.\n * @return Sender of transaction.\n */\nexport const requireSender = (txBlock: TransactionBlock) => {\n const { sender } = txBlock.blockData;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n\nexport const checkLockSca = (\n scaAmountOrCoin?: number | SuiObjectArg | undefined,\n lockPeriodInDays?: number,\n newUnlockAtInSecondTimestamp?: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isInitialLock || isLockExpired) {\n if (scaAmountOrCoin !== undefined && lockPeriodInDays !== undefined) {\n if (lockPeriodInDays <= 0) {\n throw new Error('Lock period must be greater than 0');\n }\n if (typeof scaAmountOrCoin === 'number' && scaAmountOrCoin < MIN_INITIAL_LOCK_AMOUNT) {\n throw new Error(\n `Minimum lock amount for ${isLockExpired ? 'renewing expired veSca' : 'initial lock'} is 10 SCA`,\n );\n }\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond > MAX_LOCK_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days)`);\n }\n } else {\n throw new Error(\n `SCA amount and lock period is required for ${isLockExpired ? 'renewing expired veSca' : 'initial lock'}`,\n );\n }\n } else {\n checkVesca(prevUnlockAtInSecondTimestamp);\n if (typeof scaAmountOrCoin === 'number' && scaAmountOrCoin < MIN_TOP_UP_AMOUNT) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n if (!!newUnlockAtInSecondTimestamp && !!prevUnlockAtInSecondTimestamp) {\n const totalLockDuration = newUnlockAtInSecondTimestamp - prevUnlockAtInSecondTimestamp;\n if (totalLockDuration > MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n }\n }\n};\n\nexport const checkExtendLockPeriod = (\n lockPeriodInDays: number,\n newUnlockAtInSecondTimestamp: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (lockPeriodInDays <= 0) {\n throw new Error('Lock period must be greater than 0');\n }\n\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isLockExpired) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n\n if (prevUnlockAtInSecondTimestamp) {\n const totalLockDuration = newUnlockAtInSecondTimestamp - (prevUnlockAtInSecondTimestamp ?? 0);\n if (totalLockDuration > MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n }\n};\n\nexport const checkExtendLockAmount = (scaAmount: number, prevUnlockAtInSecondTimestamp?: number) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (scaAmount < MIN_TOP_UP_AMOUNT) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isLockExpired) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n};\n\nexport const checkRenewExpiredVeSca = (\n scaAmount: number,\n lockPeriodInDays: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (scaAmount < MIN_INITIAL_LOCK_AMOUNT) {\n throw new Error('Minimum lock amount for renewing expired vesca 10 SCA');\n }\n\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond >= MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n};\n\nexport const checkVesca = (prevUnlockAtInSecondTimestamp?: number) => {\n if (prevUnlockAtInSecondTimestamp === undefined) {\n throw new Error('veSca not found');\n }\n};\n","import { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport BigNumber from 'bignumber.js';\n\nimport type { ScallopUtils } from '../models';\nimport type {\n OriginMarketPoolData,\n ParsedMarketPoolData,\n CalculatedMarketPoolData,\n OriginMarketCollateralData,\n ParsedMarketCollateralData,\n CalculatedMarketCollateralData,\n OriginSpoolData,\n ParsedSpoolData,\n CalculatedSpoolData,\n OriginSpoolRewardPoolData,\n ParsedSpoolRewardPoolData,\n CalculatedSpoolRewardPoolData,\n OriginBorrowIncentivePoolData,\n ParsedBorrowIncentivePoolData,\n OriginBorrowIncentiveAccountData,\n ParsedBorrowIncentiveAccountData,\n SupportPoolCoins,\n SupportCollateralCoins,\n OriginBorrowIncentiveAccountPoolData,\n ParsedBorrowIncentiveAccountPoolData,\n SupportBorrowIncentiveRewardCoins,\n ParsedBorrowIncentivePoolPointData,\n OriginBorrowIncentivePoolPointData,\n} from '../types';\n\n/**\n * Parse origin market pool data to a more readable format.\n *\n * @param originMarketPoolData - Origin market pool data\n * @return Parsed market pool data\n */\nexport const parseOriginMarketPoolData = (originMarketPoolData: OriginMarketPoolData): ParsedMarketPoolData => ({\n coinType: normalizeStructTag(originMarketPoolData.type.name),\n // Parse origin data required for basic calculations.\n maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,\n borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,\n borrowRateScale: Number(originMarketPoolData.interestRateScale),\n borrowIndex: Number(originMarketPoolData.borrowIndex),\n lastUpdated: Number(originMarketPoolData.lastUpdated),\n cashAmount: Number(originMarketPoolData.cash),\n debtAmount: Number(originMarketPoolData.debt),\n marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),\n reserveAmount: Number(originMarketPoolData.reserve),\n reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,\n borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,\n borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,\n // Parse origin data required for additional display.\n baseBorrowRate: Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,\n borrowRateOnHighKink: Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,\n borrowRateOnMidKink: Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,\n highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,\n midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,\n minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),\n});\n\nexport const calculateMarketPoolData = (\n utils: ScallopUtils,\n parsedMarketPoolData: ParsedMarketPoolData,\n): CalculatedMarketPoolData => {\n const poolCoinName = utils.parseCoinNameFromType<SupportPoolCoins>(parsedMarketPoolData.coinType);\n const coinDecimal = utils.getCoinDecimal(poolCoinName);\n\n const borrowYearFactor = 24 * 365 * 3600;\n\n const baseBorrowApr = (parsedMarketPoolData.baseBorrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowAprOnHighKink =\n (parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowAprOnMidKink =\n (parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const maxBorrowApr = (parsedMarketPoolData.maxBorrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowApr = (parsedMarketPoolData.borrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n\n const timeDelta = Math.floor(new Date().getTime() / 1000) - parsedMarketPoolData.lastUpdated;\n const borrowIndexDelta = BigNumber(parsedMarketPoolData.borrowIndex)\n .multipliedBy(BigNumber(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate))\n .dividedBy(parsedMarketPoolData.borrowRateScale);\n const currentBorrowIndex = BigNumber(parsedMarketPoolData.borrowIndex).plus(borrowIndexDelta);\n // How much accumulated interest since `lastUpdate`.\n const growthInterest = BigNumber(currentBorrowIndex).dividedBy(parsedMarketPoolData.borrowIndex).minus(1);\n const increasedDebtAmount = BigNumber(parsedMarketPoolData.debtAmount).multipliedBy(growthInterest);\n const borrowAmount = increasedDebtAmount.plus(parsedMarketPoolData.debtAmount);\n const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);\n const reserveAmount = BigNumber(parsedMarketPoolData.reserveAmount).plus(\n increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor),\n );\n const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);\n const supplyAmount = BigNumber(borrowAmount).plus(\n Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0),\n );\n const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);\n let utilizationRate = BigNumber(borrowAmount).dividedBy(supplyAmount);\n utilizationRate = utilizationRate.isFinite() ? utilizationRate : BigNumber(0);\n let supplyApr = BigNumber(borrowApr)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - parsedMarketPoolData.reserveFactor);\n supplyApr = supplyApr.isFinite() ? supplyApr : BigNumber(0);\n let conversionRate = supplyAmount.dividedBy(parsedMarketPoolData.marketCoinSupplyAmount);\n conversionRate = conversionRate.isFinite() && !conversionRate.isNaN() ? conversionRate : BigNumber(1);\n\n return {\n baseBorrowApr,\n baseBorrowApy: utils.parseAprToApy(baseBorrowApr),\n borrowAprOnHighKink,\n borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),\n borrowAprOnMidKink,\n borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),\n maxBorrowApr,\n maxBorrowApy: utils.parseAprToApy(maxBorrowApr),\n borrowApr: Math.min(borrowApr, maxBorrowApr),\n borrowApy: Math.min(utils.parseAprToApy(borrowApr), utils.parseAprToApy(maxBorrowApr)),\n borrowIndex: currentBorrowIndex.toNumber(),\n growthInterest: growthInterest.toNumber(),\n supplyAmount: supplyAmount.toNumber(),\n supplyCoin: supplyCoin.toNumber(),\n borrowAmount: borrowAmount.toNumber(),\n borrowCoin: borrowCoin.toNumber(),\n reserveAmount: reserveAmount.toNumber(),\n reserveCoin: reserveCoin.toNumber(),\n utilizationRate: utilizationRate.toNumber(),\n supplyApr: supplyApr.toNumber(),\n supplyApy: utils.parseAprToApy(supplyApr.toNumber()),\n conversionRate: conversionRate.toNumber(),\n };\n};\n\n/**\n * Parse origin market collateral data to a more readable format.\n *\n * @param originMarketCollateralData - Origin market collateral data\n * @return Parsed market collateral data\n */\nexport const parseOriginMarketCollateralData = (\n originMarketCollateralData: OriginMarketCollateralData,\n): ParsedMarketCollateralData => ({\n coinType: normalizeStructTag(originMarketCollateralData.type.name),\n collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,\n liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,\n liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,\n liquidationPanelty: Number(originMarketCollateralData.liquidationPanelty.value) / 2 ** 32,\n liquidationReserveFactor: Number(originMarketCollateralData.liquidationReserveFactor.value) / 2 ** 32,\n maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),\n totalCollateralAmount: Number(originMarketCollateralData.totalCollateralAmount),\n});\n\nexport const calculateMarketCollateralData = (\n utils: ScallopUtils,\n parsedMarketCollateralData: ParsedMarketCollateralData,\n): CalculatedMarketCollateralData => {\n const collateralCoinName = utils.parseCoinNameFromType<SupportCollateralCoins>(parsedMarketCollateralData.coinType);\n const coinDecimal = utils.getCoinDecimal(collateralCoinName);\n\n const maxCollateralCoin = BigNumber(parsedMarketCollateralData.maxCollateralAmount).shiftedBy(-1 * coinDecimal);\n const depositCoin = BigNumber(parsedMarketCollateralData.totalCollateralAmount).shiftedBy(-1 * coinDecimal);\n\n return {\n maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,\n maxDepositCoin: maxCollateralCoin.toNumber(),\n depositAmount: parsedMarketCollateralData.totalCollateralAmount,\n depositCoin: depositCoin.toNumber(),\n };\n};\n\n/**\n * Parse origin spool data to a more readable format.\n *\n * @param originSpoolData - Origin spool data\n * @return Parsed spool data\n */\nexport const parseOriginSpoolData = (originSpoolData: OriginSpoolData): ParsedSpoolData => ({\n stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),\n maxPoint: Number(originSpoolData.maxDistributedPoint),\n distributedPoint: Number(originSpoolData.distributedPoint),\n pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),\n period: Number(originSpoolData.pointDistributionTime),\n maxStake: Number(originSpoolData.maxStake),\n staked: Number(originSpoolData.stakes),\n index: Number(originSpoolData.index),\n createdAt: Number(originSpoolData.createdAt),\n lastUpdate: Number(originSpoolData.lastUpdate),\n});\n\nexport const calculateSpoolData = (\n parsedSpoolData: ParsedSpoolData,\n stakeMarketCoinPrice: number,\n stakeMarketCoinDecimal: number,\n): CalculatedSpoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(parsedSpoolData.period);\n\n const pointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(parsedSpoolData.period);\n const remainingPeriod = BigNumber(parsedSpoolData.maxPoint)\n .minus(parsedSpoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedSpoolData.createdAt;\n const endDate = remainingPeriod.plus(parsedSpoolData.lastUpdate).integerValue().toNumber();\n\n const timeDelta = BigNumber(Math.floor(new Date().getTime() / 1000) - parsedSpoolData.lastUpdate)\n .dividedBy(parsedSpoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(parsedSpoolData.maxPoint).minus(parsedSpoolData.distributedPoint);\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),\n remainingPoints,\n );\n\n const currentPointIndex = BigNumber(parsedSpoolData.index).plus(\n accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite()\n ? BigNumber(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedSpoolData.staked)\n : 0,\n );\n const currentTotalDistributedPoint = BigNumber(parsedSpoolData.distributedPoint).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedSpoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin spool reward pool data to a more readable format.\n *\n * @param originRewardPoolData - Origin reward pool data\n * @return Parsed spool reward pool data\n */\nexport const parseOriginSpoolRewardPoolData = (\n originSpoolRewardPoolData: OriginSpoolRewardPoolData,\n): ParsedSpoolRewardPoolData => ({\n claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),\n exchangeRateDenominator: Number(originSpoolRewardPoolData.exchange_rate_denominator),\n exchangeRateNumerator: Number(originSpoolRewardPoolData.exchange_rate_numerator),\n rewards: Number(originSpoolRewardPoolData.rewards),\n spoolId: String(originSpoolRewardPoolData.spool_id),\n});\n\nexport const calculateSpoolRewardPoolData = (\n parsedSpoolData: ParsedSpoolData,\n parsedSpoolRewardPoolData: ParsedSpoolRewardPoolData,\n calculatedSpoolData: CalculatedSpoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number,\n): CalculatedSpoolRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(calculatedSpoolData.distributedPointPerSec)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedSpoolData.maxPoint)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(parsedSpoolRewardPoolData.rewards);\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(parsedSpoolRewardPoolData.claimedRewards);\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n\n let rewardRate = rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).isFinite()\n ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber()\n : Infinity;\n\n if (parsedSpoolData.maxPoint === parsedSpoolData.distributedPoint) {\n rewardRate = Infinity;\n }\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n };\n};\n\n/**\n * Parse origin borrow incentive pool data to a more readable format.\n *\n * @param originBorrowIncentivePoolData - Origin borrow incentive pool data\n * @return Parsed borrow incentive pool data\n */\nexport const parseOriginBorrowIncentivesPoolPointData = (\n originBorrowIncentivePoolPointData: OriginBorrowIncentivePoolPointData,\n): ParsedBorrowIncentivePoolPointData => ({\n pointType: normalizeStructTag(originBorrowIncentivePoolPointData.point_type.name),\n distributedPointPerPeriod: Number(originBorrowIncentivePoolPointData.distributed_point_per_period),\n period: Number(originBorrowIncentivePoolPointData.point_distribution_time),\n distributedPoint: Number(originBorrowIncentivePoolPointData.distributed_point),\n points: Number(originBorrowIncentivePoolPointData.points),\n index: Number(originBorrowIncentivePoolPointData.index),\n baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),\n weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),\n lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),\n});\nexport const parseOriginBorrowIncentivePoolData = (\n originBorrowIncentivePoolData: OriginBorrowIncentivePoolData,\n): ParsedBorrowIncentivePoolData => ({\n poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),\n minStakes: Number(originBorrowIncentivePoolData.min_stakes),\n maxStakes: Number(originBorrowIncentivePoolData.max_stakes),\n staked: Number(originBorrowIncentivePoolData.stakes),\n createdAt: Number(originBorrowIncentivePoolData.created_at),\n poolPoints: originBorrowIncentivePoolData.points.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentivesPoolPointData(point);\n const name = parseStructTag(parsed.pointType).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;\n acc[name] = parsed;\n return acc;\n },\n {} as Record<SupportBorrowIncentiveRewardCoins, ParsedBorrowIncentivePoolPointData>,\n ),\n});\n\n/**\n * Parse origin borrow incentive reward pool data to a more readable format.\n *\n * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data\n * @return Parsed borrow incentive reward pool data\n */\n\nexport const minBigNumber = (...args: BigNumber.Value[]) =>\n BigNumber(args.reduce((min, current) => (new BigNumber(current).lt(min) ? current : min)));\n\nexport const maxBigNumber = (...args: BigNumber.Value[]) =>\n BigNumber(args.reduce((max, current) => (new BigNumber(current).gt(max) ? current : max)));\n\n/**\n * Dynamically adjust the decrease or increase ratio according to the amout\n * @param amount - The amount required to calculate factor.\n * @param scaleStep - The scale step required to determine the factor..\n * @param type - The type of the calculation.\n * @return The estimated factor\n * */\nexport const estimatedFactor = (amount: number, scaleStep: number, type: 'increase' | 'decrease') => {\n const amountOfDigits = Math.max(1, Math.floor(Math.log10(Math.abs(amount)) + 1));\n\n const adjustScale = Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;\n\n let adjustFactor = 10 ** -adjustScale;\n adjustFactor = type === 'increase' ? 1 - adjustFactor : 1 + adjustFactor;\n\n return adjustFactor;\n};\n\nexport const parseOriginBorrowIncentiveAccountPoolPointData = (\n originBorrowIncentiveAccountPoolPointData: OriginBorrowIncentiveAccountPoolData,\n): ParsedBorrowIncentiveAccountPoolData => ({\n pointType: normalizeStructTag(originBorrowIncentiveAccountPoolPointData.point_type.name),\n weightedAmount: Number(originBorrowIncentiveAccountPoolPointData.weighted_amount),\n points: Number(originBorrowIncentiveAccountPoolPointData.points),\n totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),\n index: Number(originBorrowIncentiveAccountPoolPointData.index),\n});\n\n/**\n * Parse origin borrow incentive account data to a more readable format.\n *\n * @param originBorrowIncentiveAccountData - Origin borrow incentive account data\n * @return Parsed borrow incentive account data\n */\nexport const parseOriginBorrowIncentiveAccountData = (\n originBorrowIncentiveAccountData: OriginBorrowIncentiveAccountData,\n): ParsedBorrowIncentiveAccountData => ({\n poolType: normalizeStructTag(originBorrowIncentiveAccountData.pool_type.name),\n debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),\n pointList: originBorrowIncentiveAccountData.points_list.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);\n const name = parseStructTag(parsed.pointType).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;\n acc[name] = parsed;\n return acc;\n },\n {} as Record<SupportBorrowIncentiveRewardCoins, ParsedBorrowIncentiveAccountPoolData>,\n ),\n});\n","import { SUPPORT_POOLS, SUPPORT_COLLATERALS, SUPPORT_SPOOLS_REWARDS, MAX_LOCK_DURATION } from '../constants';\nimport type { ScallopAddress } from '../models';\nimport type { SupportAssetCoins, SupportCoins, SupportMarketCoins } from '../types';\n\nexport const isMarketCoin = (coinName: SupportCoins): coinName is SupportMarketCoins => {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return (\n coinName.charAt(0).toLowerCase() === 's' &&\n [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS, ...SUPPORT_SPOOLS_REWARDS])].includes(assetCoinName)\n );\n};\n\nexport const parseAssetSymbol = (coinName: SupportAssetCoins): string => {\n switch (coinName) {\n case 'afsui':\n return 'afSUI';\n case 'hasui':\n return 'haSUI';\n case 'vsui':\n return 'vSUI';\n default:\n return coinName.toUpperCase();\n }\n};\n\n/**\n * Parse price from pyth price feed.\n *\n * @param feed - Price feed object from pyth.\n * @param address - Scallop address instance.\n * @return Price Data inclue coin name, price, and publish time.\n */\nexport const parseDataFromPythPriceFeed = (feed: any, address: ScallopAddress) => {\n const assetCoinNames = [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS])] as SupportAssetCoins[];\n const listAssetCoinName = assetCoinNames.find(\n (assetCoinName) => address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`) === feed.id,\n );\n if (listAssetCoinName) {\n const price = feed.price.price * 10 ** feed.price.expo;\n\n return {\n coinName: listAssetCoinName,\n price,\n publishTime: Number(feed.price.publishTime) * 10 ** 3,\n };\n }\n throw new Error('Invalid feed id');\n};\n\n/**\n * Find the closest unlock round timestamp (12AM) to the given unlock at timestamp in seconds.\n *\n * @param unlockAtInSecondTimestamp - Unlock at in seconds timestamp to find the closest round.\n * @returns Closest round (12AM) in seconds timestamp.\n */\nexport const findClosestUnlockRound = (unlockAtInSecondTimestamp: number) => {\n const unlockDate = new Date(unlockAtInSecondTimestamp * 1000);\n const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1000);\n\n closestTwelveAM.setUTCHours(0, 0, 0, 0); // Set the time to the next 12 AM UTC\n\n // If the current time is past 12 AM, set the date to the next day\n if (unlockDate.getUTCHours() >= 0) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);\n }\n\n const now = new Date().getTime();\n // check if unlock period > 4 years\n if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1000) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);\n }\n return Math.floor(closestTwelveAM.getTime() / 1000);\n};\n","import type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport BigNumber from 'bignumber.js';\n\nimport { SUPPORT_POOLS, PROTOCOL_OBJECT_ID } from '../constants';\nimport type { ScallopQuery } from '../models';\nimport {\n SupportAssetCoins,\n SupportPoolCoins,\n Obligation,\n CoinAmounts,\n MarketCoinAmounts,\n SupportMarketCoins,\n SuiAddressArg,\n ObligationQueryInterface,\n} from '../types';\n\n/**\n * Query all owned obligations.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned obligations.\n */\nexport const getObligations = async (query: ScallopQuery, ownerAddress: string) => {\n const owner = ownerAddress;\n const protocolObjectId = query.address.get('core.object') || PROTOCOL_OBJECT_ID;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedKeyObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n StructType: `${protocolObjectId}::obligation::ObligationKey`,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (paginatedKeyObjectsResponse.hasNextPage && paginatedKeyObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjectIds: string[] = keyObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const keyObjects = await query.client.multiGetObjects({\n ids: keyObjectIds,\n options: { showContent: true, showType: true },\n });\n const obligations: Obligation[] = [];\n for (let i = 0; i < keyObjects.length; i++) {\n const keyId = keyObjects[i].data.objectId;\n const { content } = keyObjects[i].data;\n if (content && 'fields' in content) {\n const fields = content.fields as any;\n const obligationId = String(fields.ownership.fields.of);\n const locked = await getObligationLocked(query, obligationId);\n obligations.push({ id: obligationId, keyId, locked });\n }\n }\n return obligations;\n};\n\n/**\n * Query obligation locked status.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation locked status.\n */\nexport const getObligationLocked = async (query: ScallopQuery, obligationId: string) => {\n const obligationObjectResponse = await query.client.getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectResponse.data &&\n obligationObjectResponse?.data?.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectResponse.data.content.fields\n ) {\n obligationLocked = Boolean(obligationObjectResponse.data.content.fields.lock_key);\n }\n\n return obligationLocked;\n};\n\n/**\n * Query all owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All owned coin amounts.\n */\nexport const getCoinAmounts = async (\n query: ScallopQuery,\n ownerAddress: string,\n assetCoinNames?: SupportAssetCoins[],\n) => {\n const updatedAssetCoinNames = assetCoinNames || [...SUPPORT_POOLS];\n const owner = ownerAddress;\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n MatchAny: updatedAssetCoinNames.map((assetCoinName) => {\n const coinType = query.utils.parseCoinType(assetCoinName);\n return { StructType: `0x2::coin::Coin<${coinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const coinAmounts: CoinAmounts = {};\n const coinObjects = coinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n coinObjects.forEach((coinObject) => {\n const type = coinObject.type as string;\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n const poolCoinName = query.utils.parseCoinNameFromType<SupportPoolCoins>(type);\n if (poolCoinName) {\n coinAmounts[poolCoinName as SupportPoolCoins] = BigNumber(coinAmounts[poolCoinName as SupportPoolCoins] ?? 0)\n .plus(fields.balance)\n .toNumber();\n }\n }\n });\n return coinAmounts;\n};\n\n/**\n * Query owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Owned coin amount.\n */\nexport const getCoinAmount = async (query: ScallopQuery, assetCoinName: SupportAssetCoins, ownerAddress?: string) => {\n const owner = ownerAddress;\n const coinType = query.utils.parseCoinType(assetCoinName);\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${coinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n let coinAmount = 0;\n const coinObjects = coinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n coinObjects.forEach((coinObject) => {\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n coinAmount = BigNumber(coinAmount).plus(fields.balance).toNumber();\n }\n });\n return coinAmount;\n};\n\n/**\n * Query all owned market coins (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All owned market coins amount.\n */\nexport const getMarketCoinAmounts = async (\n query: ScallopQuery,\n ownerAddress: string,\n marketCoinNames?: SupportMarketCoins[],\n) => {\n const updatedMarketCoinNames =\n marketCoinNames || [...SUPPORT_POOLS].map((poolCoinName) => query.utils.parseMarketCoinName(poolCoinName));\n const owner = ownerAddress;\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n MatchAny: updatedMarketCoinNames.map((marketCoinName) => {\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n return { StructType: `0x2::coin::Coin<${marketCoinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const marketCoinAmounts: MarketCoinAmounts = {};\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n marketCoinObjects.forEach((marketCoinObject) => {\n const type = marketCoinObject.type as string;\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n const marketCoinName = query.utils.parseCoinNameFromType<SupportMarketCoins>(type);\n if (marketCoinName) {\n marketCoinAmounts[marketCoinName as SupportMarketCoins] = BigNumber(\n marketCoinAmounts[marketCoinName as SupportMarketCoins] ?? 0,\n )\n .plus(fields.balance)\n .toNumber();\n }\n }\n });\n return marketCoinAmounts;\n};\n\n/**\n * Query owned market coin (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Owned market coin amount.\n */\nexport const getMarketCoinAmount = async (\n query: ScallopQuery,\n marketCoinName: SupportMarketCoins,\n ownerAddress: string,\n) => {\n const owner = ownerAddress;\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${marketCoinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n let marketCoinAmount = 0;\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n marketCoinObjects.forEach((marketCoinObject) => {\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n marketCoinAmount = BigNumber(marketCoinAmount).plus(fields.balance).toNumber();\n }\n });\n return marketCoinAmount;\n};\n\n/**\n * Query obligation data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\nexport const queryObligation = async (query: ScallopQuery, obligationId: SuiAddressArg) => {\n const packageId = query.address.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data` as `${string}::${string}::${string}`;\n const txBlock = new TransactionBlock();\n txBlock.moveCall({\n target: queryTarget,\n arguments: [txBlock.object(obligationId as string)],\n });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: query.walletAddress,\n });\n return queryResult.events[0].parsedJson as ObligationQueryInterface;\n};\n","import type { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport type { ScallopQuery } from '../models';\nimport type { StakePool, StakeRewardPool, StakeAccounts, SupportStakeMarketCoins, SupportStakeCoins } from '../types';\n\n/**\n * Get all stake accounts of the owner.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - Owner address.\n * @return Stake accounts.\n */\nexport const getStakeAccounts = async (query: ScallopQuery, ownerAddress: string) => {\n const owner = ownerAddress;\n const spoolObjectId = query.address.get('spool.object');\n const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;\n const stakeObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedStakeObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: stakeAccountType },\n options: {\n showContent: true,\n showType: true,\n },\n cursor: nextCursor,\n });\n stakeObjectsResponse.push(...paginatedStakeObjectsResponse.data);\n if (paginatedStakeObjectsResponse.hasNextPage && paginatedStakeObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedStakeObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const stakeAccounts: StakeAccounts = {\n seth: [],\n ssui: [],\n susdc: [],\n susdt: [],\n scetus: [],\n safsui: [],\n shasui: [],\n svsui: [],\n };\n\n const stakeMarketCoinTypes: Record<SupportStakeMarketCoins, string> = Object.keys(stakeAccounts).reduce(\n (types, stakeMarketCoinName) => {\n const stakeCoinName = query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const marketCoinType = query.utils.parseMarketCoinType(stakeCoinName);\n\n const updateTypes = { ...types };\n const newType = `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;\n updateTypes[stakeMarketCoinName as SupportStakeMarketCoins] = newType;\n return updateTypes;\n },\n {} as Record<SupportStakeMarketCoins, string>,\n );\n\n const stakeObjectIds: string[] = stakeObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const stakeObjects = await query.client.multiGetObjects({\n ids: stakeObjectIds,\n options: { showContent: true, showType: true },\n });\n stakeObjects.forEach((stakeObject) => {\n const id = stakeObject.data.objectId;\n const type = stakeObject.data.type!;\n if (stakeObject.data.content && 'fields' in stakeObject.data.content) {\n const fields = stakeObject.data.content.fields as any;\n const stakePoolId = String(fields.spool_id);\n const stakeType = String(fields.stake_type.fields.name);\n const staked = Number(fields.stakes);\n const index = Number(fields.index);\n const points = Number(fields.points);\n const totalPoints = Number(fields.total_points);\n if (normalizeStructTag(type) === stakeMarketCoinTypes.seth) {\n stakeAccounts.seth.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.ssui) {\n stakeAccounts.ssui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdc) {\n stakeAccounts.susdc.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdt) {\n stakeAccounts.susdt.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.scetus) {\n stakeAccounts.scetus.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.safsui) {\n stakeAccounts.safsui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.shasui) {\n stakeAccounts.shasui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.svsui) {\n stakeAccounts.svsui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n }\n }\n });\n return stakeAccounts;\n};\n\n/**\n * Get stake pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get stake pool info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\nexport const getStakePool = async (query: ScallopQuery, marketCoinName: SupportStakeMarketCoins) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n let stakePool: StakePool | undefined;\n const stakePoolObjectResponse = await query.client.getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakePoolObjectResponse.data) {\n const stakePoolObject = stakePoolObjectResponse.data;\n const id = stakePoolObject.objectId;\n const type = stakePoolObject.type!;\n if (stakePoolObject.content && 'fields' in stakePoolObject.content) {\n const fields = stakePoolObject.content.fields as any;\n const maxPoint = Number(fields.max_distributed_point);\n const distributedPoint = Number(fields.distributed_point);\n const pointPerPeriod = Number(fields.distributed_point_per_period);\n const period = Number(fields.point_distribution_time);\n const maxStake = Number(fields.max_stakes);\n const stakeType = String(fields.stake_type.fields.name);\n const totalStaked = Number(fields.stakes);\n const index = Number(fields.index);\n const createdAt = Number(fields.created_at);\n const lastUpdate = Number(fields.last_update);\n stakePool = {\n id,\n type: normalizeStructTag(type),\n maxPoint,\n distributedPoint,\n pointPerPeriod,\n period,\n maxStake,\n stakeType: normalizeStructTag(stakeType),\n totalStaked,\n index,\n createdAt,\n lastUpdate,\n };\n }\n }\n return stakePool;\n};\n\n/**\n * Get stake reward pool of the owner.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get reward info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool.\n */\nexport const getStakeRewardPool = async (query: ScallopQuery, marketCoinName: SupportStakeMarketCoins) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.rewardPoolId`);\n let stakeRewardPool: StakeRewardPool | undefined;\n const stakeRewardPoolObjectResponse = await query.client.getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakeRewardPoolObjectResponse.data) {\n const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;\n const id = stakeRewardPoolObject.objectId;\n const type = stakeRewardPoolObject.type!;\n if (stakeRewardPoolObject.content && 'fields' in stakeRewardPoolObject.content) {\n const rewardPoolFields = stakeRewardPoolObject.content.fields as any;\n const stakePoolId = String(rewardPoolFields.spool_id);\n const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);\n const ratioDenominator = Number(rewardPoolFields.exchange_rate_denominator);\n const rewards = Number(rewardPoolFields.rewards);\n const claimedRewards = Number(rewardPoolFields.claimed_rewards);\n\n stakeRewardPool = {\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n ratioNumerator,\n ratioDenominator,\n rewards,\n claimedRewards,\n };\n }\n }\n return stakeRewardPool;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\nimport BigNumber from 'bignumber.js';\n\nimport { SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport type { ScallopQuery } from '../models';\nimport type {\n BorrowIncentiveAccountsQueryInterface,\n BorrowIncentiveAccounts,\n SupportBorrowIncentiveCoins,\n BorrowIncentivePoolsQueryInterface,\n BorrowIncentivePools,\n OptionalKeys,\n BorrowIncentivePoolPoints,\n SupportBorrowIncentiveRewardCoins,\n} from '../types';\nimport { parseOriginBorrowIncentiveAccountData, parseOriginBorrowIncentivePoolData } from '../utils';\n\n/**\n * Query borrow incentive accounts data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive accounts data.\n */\nexport const queryBorrowIncentiveAccounts = async (\n query: ScallopQuery,\n obligationId: string,\n sender: string,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[],\n) => {\n const coinName = borrowIncentiveCoinNames || [...SUPPORT_BORROW_INCENTIVE_POOLS];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentiveAccountsId = query.address.get('borrowIncentive.incentiveAccounts');\n const queryTarget =\n `${queryPkgId}::incentive_account_query::incentive_account_data` as `${string}::${string}::${string}`;\n const txBlock = new TransactionBlock();\n txBlock.moveCall({\n target: queryTarget,\n arguments: [txBlock.object(incentiveAccountsId), txBlock.object(obligationId)],\n });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender,\n });\n const borrowIncentiveAccountsQueryData = queryResult.events[0].parsedJson as BorrowIncentiveAccountsQueryInterface;\n\n const borrowIncentiveAccounts: BorrowIncentiveAccounts = {};\n\n borrowIncentiveAccountsQueryData.pool_records.forEach((accountData) => {\n const parsedBorrowIncentiveAccount = parseOriginBorrowIncentiveAccountData(accountData);\n const { poolType } = parsedBorrowIncentiveAccount;\n const parsedCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolType);\n if (coinName.length >= 1 && coinName.includes(parsedCoinName)) {\n borrowIncentiveAccounts[parsedCoinName] = parsedBorrowIncentiveAccount;\n }\n }, {} as BorrowIncentiveAccounts);\n return borrowIncentiveAccounts;\n};\n\n/**\n * Query borrow incentive pools data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\nexport const queryBorrowIncentivePools = async (query: ScallopQuery, coinNames?: SupportBorrowIncentiveCoins[]) => {\n const borrowIncentiveCoinNames = coinNames || [...SUPPORT_BORROW_INCENTIVE_POOLS];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentivePoolsId = query.address.get('borrowIncentive.incentivePools');\n\n const txBlock = new TransactionBlock();\n const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data` as `${string}::${string}::${string}`;\n txBlock.moveCall({ target: queryTarget, arguments: [txBlock.object(incentivePoolsId)] });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: query.walletAddress,\n });\n const borrowIncentivePoolsQueryData = queryResult.events[0].parsedJson as BorrowIncentivePoolsQueryInterface;\n\n const borrowIncentivePools: BorrowIncentivePools = {};\n\n for (let i = 0; i < borrowIncentivePoolsQueryData.incentive_pools.length; i++) {\n const pool = borrowIncentivePoolsQueryData.incentive_pools[i];\n const borrowIncentivePoolPoints: OptionalKeys<Record<'sui' | 'sca', BorrowIncentivePoolPoints>> = {};\n const parsedBorrowIncentivePoolData = parseOriginBorrowIncentivePoolData(pool);\n const poolCoinType = normalizeStructTag(pool.pool_type.name);\n const poolCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolCoinType);\n\n // Filter pools not yet supported by the SDK.\n if (!borrowIncentiveCoinNames.includes(poolCoinName)) {\n continue;\n }\n // pool points for borrow incentive reward ('sui' and 'sca')\n\n Object.entries(parsedBorrowIncentivePoolData.poolPoints).forEach(([coinName, poolPoint]) => {\n const baseIndexRate = 1_000_000_000;\n const rewardCoinType = normalizeStructTag(poolPoint.pointType);\n const rewardCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveRewardCoins>(rewardCoinType);\n const timeDelta = BigNumber(Math.floor(new Date().getTime() / 1000) - poolPoint.lastUpdate)\n .dividedBy(poolPoint.period)\n .toFixed(0);\n\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(poolPoint.distributedPointPerPeriod),\n BigNumber(poolPoint.points),\n );\n\n const currentPointIndex = BigNumber(poolPoint.index).plus(\n accumulatedPoints.dividedBy(poolPoint.weightedAmount).isFinite()\n ? BigNumber(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(poolPoint.weightedAmount)\n : 0,\n );\n borrowIncentivePoolPoints[coinName as SupportBorrowIncentiveRewardCoins] = {\n points: poolPoint.points,\n coinDecimal: query.utils.getCoinDecimal(rewardCoinName),\n distributedPoint: poolPoint.distributedPoint,\n weightedAmount: poolPoint.weightedAmount,\n currentPointIndex: currentPointIndex.toNumber(),\n };\n });\n\n borrowIncentivePools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: poolCoinType,\n points: borrowIncentivePoolPoints,\n };\n }\n\n return borrowIncentivePools;\n};\n","import type { ScallopQuery } from '../models';\nimport type { SupportAssetCoins } from '../types';\n\n/**\n * Get price from pyth fee object.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\nexport const getPythPrice = async (query: ScallopQuery, assetCoinName: SupportAssetCoins) => {\n const pythFeedObjectId = query.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`);\n const priceFeedObjectResponse = await query.client.getObject({\n id: pythFeedObjectId,\n options: {\n showContent: true,\n },\n });\n\n if (priceFeedObjectResponse.data) {\n const priceFeedPoolObject = priceFeedObjectResponse.data;\n if (priceFeedPoolObject.content && 'fields' in priceFeedPoolObject.content) {\n const fields = priceFeedPoolObject.content.fields as any;\n const expoMagnitude = Number(fields.price_info.fields.price_feed.fields.price.fields.expo.fields.magnitude);\n const expoNegative = Number(fields.price_info.fields.price_feed.fields.price.fields.expo.fields.negative);\n const priceMagnitude = Number(fields.price_info.fields.price_feed.fields.price.fields.price.fields.magnitude);\n const priceNegative = Number(fields.price_info.fields.price_feed.fields.price.fields.price.fields.negative);\n\n return priceMagnitude * 10 ** ((expoNegative ? -1 : 1) * expoMagnitude) * (priceNegative ? -1 : 1);\n }\n }\n\n return 0;\n};\n","import type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport BigNumber from 'bignumber.js';\n\nimport type { ScallopQuery } from '../models';\nimport { Vesca } from '../types';\n\n/**\n * Query all owned veSca key.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veSca key.\n */\nexport const getVescaKeys = async (query: ScallopQuery, ownerAddress?: string) => {\n const owner = ownerAddress;\n const veScaPkgId = query.address.get('vesca.id');\n const veScaKeyType = `${veScaPkgId}::ve_sca::VeScaKey`;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n do {\n const paginatedKeyObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n StructType: veScaKeyType,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (paginatedKeyObjectsResponse.hasNextPage && paginatedKeyObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjectDatas = keyObjectsResponse\n .map((objResponse) => objResponse.data)\n .filter((data) => !!data) as SuiObjectData[];\n return keyObjectDatas;\n};\n\n/**\n * Query all owned veSca.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veScas.\n */\nexport const getVeScas = async (query: ScallopQuery, ownerAddress?: string) => {\n const keyObjectDatas = await getVescaKeys(query, ownerAddress);\n const keyObjectId: string[] = keyObjectDatas.map((data) => data.objectId);\n\n const veScas: Vesca[] = [];\n for (let i = 0; i < keyObjectId.length; i++) {\n const veSca = await getVeSca(query, keyObjectId[i]);\n if (veSca) {\n veScas.push(veSca);\n }\n }\n return veScas;\n};\n\n/**\n * Get veSca data.\n *\n * @param query - The Scallop query instance.\n * @param veScaKeyId - The vesca key id.\n * @param ownerAddress - The owner address.\n * @returns Vesca data.\n */\nexport const getVeSca = async (query: ScallopQuery, veScaKeyId?: string, ownerAddress?: string) => {\n const tableId = query.address.get(`vesca.tableId`);\n const veScaKeyIdValue = veScaKeyId || (await getVescaKeys(query, ownerAddress))[0].objectId;\n\n let vesca: Vesca | undefined;\n\n const veScaDynamicFieldObjectResponse = await query.client.getDynamicFieldObject({\n parentId: tableId,\n name: {\n type: '0x2::object::ID',\n value: veScaKeyIdValue,\n },\n });\n const veScaDynamicFieldObject = veScaDynamicFieldObjectResponse.data;\n if (\n veScaDynamicFieldObject &&\n veScaDynamicFieldObject.content &&\n veScaDynamicFieldObject.content.dataType === 'moveObject' &&\n 'fields' in veScaDynamicFieldObject.content\n ) {\n const dynamicFields = (veScaDynamicFieldObject.content.fields as any).value.fields;\n vesca = {\n id: veScaDynamicFieldObject.objectId,\n keyId: veScaKeyIdValue,\n lockedScaAmount: BigNumber(dynamicFields.locked_sca_amount).toNumber(),\n lockedScaCoin: BigNumber(dynamicFields.locked_sca_amount).shiftedBy(-9).toNumber(),\n unlockAt: BigNumber(dynamicFields.unlock_at).toNumber(),\n } as Vesca;\n }\n\n return vesca;\n};\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID, SUPPORT_SPOOLS } from '../constants';\nimport {\n getObligations,\n getStakeAccounts,\n getStakePool,\n getStakeRewardPool,\n getPythPrice,\n queryBorrowIncentiveAccounts,\n getCoinAmounts,\n getCoinAmount,\n getMarketCoinAmounts,\n getMarketCoinAmount,\n queryObligation,\n} from '../queries';\nimport {\n ScallopQueryParams,\n ScallopInstanceParams,\n SupportStakeMarketCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n StakePools,\n StakeRewardPools,\n SupportBorrowIncentiveCoins,\n SuiAddressArg,\n} from '../types';\n\n/**\n * @description\n * It provides methods for getting on-chain data from the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopQuery = new ScallopQuery(<parameters>);\n * await scallopQuery.init();\n * scallopQuery.<query functions>();\n * await scallopQuery.<query functions>();\n * ```\n */\nexport class ScallopQuery {\n public readonly params: ScallopQueryParams;\n\n public address: ScallopAddress;\n\n public client: SuiClient;\n\n public utils: ScallopUtils;\n\n public walletAddress: string;\n\n public constructor(params: ScallopQueryParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.client = params.client;\n this.utils = instance?.utils ?? new ScallopUtils(this.params, { address: this.address });\n this.walletAddress = params.walletAddress;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public init(force = false, address?: ScallopAddress) {\n if (force || !this.address.getAddresses() || !address?.getAddresses()) {\n this.address.read();\n } else {\n this.address = address;\n }\n }\n\n /* ==================== Core Query Methods ==================== */\n\n /**\n * Get obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n return getObligations(this, ownerAddress);\n }\n\n /**\n * Get all asset coin amounts.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All coin amounts.\n */\n public async getCoinAmounts(ownerAddress: string, assetCoinNames?: SupportAssetCoins[]) {\n return getCoinAmounts(this, ownerAddress, assetCoinNames);\n }\n\n /**\n * Get asset coin amount.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Coin amount.\n */\n public async getCoinAmount(assetCoinName: SupportAssetCoins, ownerAddress?: string) {\n return getCoinAmount(this, assetCoinName, ownerAddress);\n }\n\n /**\n * Get all market coin amounts.\n *\n * @param coinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All market market coin amounts.\n */\n public async getMarketCoinAmounts(ownerAddress: string, marketCoinNames?: SupportMarketCoins[]) {\n return getMarketCoinAmounts(this, ownerAddress, marketCoinNames);\n }\n\n /**\n * Get market coin amount.\n *\n * @param coinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Market market coin amount.\n */\n public async getMarketCoinAmount(marketCoinName: SupportMarketCoins, ownerAddress?: string) {\n return getMarketCoinAmount(this, marketCoinName, ownerAddress);\n }\n\n /**\n * Get price from pyth fee object.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\n public async getPriceFromPyth(assetCoinName: SupportAssetCoins) {\n return getPythPrice(this, assetCoinName);\n }\n\n /* ==================== Spool Query Methods ==================== */\n\n /**\n * Get stake accounts data for all stake pools (spools).\n *\n * @param ownerAddress - The owner address.\n * @return All Stake accounts data.\n */\n public async getAllStakeAccounts(ownerAddress?: string) {\n return getStakeAccounts(this, ownerAddress);\n }\n\n /**\n * Get stake accounts data for specific stake pool (spool).\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n public async getStakeAccounts(stakeMarketCoinName: SupportStakeMarketCoins, ownerAddress?: string) {\n const allStakeAccount = await this.getAllStakeAccounts(ownerAddress);\n return allStakeAccount[stakeMarketCoinName] ?? [];\n }\n\n /**\n * Get stake pools (spools) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Stake pools data.\n */\n public async getStakePools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n const marketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakePools: StakePools = {};\n for (let i = 0; i < marketCoinNames.length; i++) {\n const stakeMarketCoinName = marketCoinNames[i];\n const stakePool = await getStakePool(this, stakeMarketCoinName);\n\n if (stakePool) {\n stakePools[stakeMarketCoinName] = stakePool;\n }\n }\n return stakePools;\n }\n\n /**\n * Get stake pool (spool) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get all spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\n public async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return getStakePool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake reward pools data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of stake market coin name.\n * @return Stake reward pools data.\n */\n public async getStakeRewardPools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n const marketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakeRewardPools: StakeRewardPools = {};\n for (let i = 0; i < marketCoinNames.length; i++) {\n const stakeRewardPool = await getStakeRewardPool(this, marketCoinNames[i]);\n\n if (stakeRewardPool) {\n stakeRewardPools[marketCoinNames[i]] = stakeRewardPool;\n }\n }\n return stakeRewardPools;\n }\n\n /**\n * Get stake reward pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get spool data.\n *\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool data.\n */\n public async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return getStakeRewardPool(this, stakeMarketCoinName);\n }\n\n /**\n * Get borrow incentive accounts data.\n *\n * @param coinNames - Specific support borrow incentive coin name.\n * @param ownerAddress - The owner address.\n * @return Borrow incentive accounts data.\n */\n public async getBorrowIncentiveAccounts(\n obligationId: string,\n walletAddress: string,\n coinNames?: SupportBorrowIncentiveCoins[],\n ) {\n return queryBorrowIncentiveAccounts(this, obligationId, walletAddress || this.walletAddress, coinNames);\n }\n\n /**\n * Get all asset coin names in the obligation record by obligation id.\n *\n * @description\n * This can often be used to determine which assets in an obligation require\n * price updates before interacting with specific instructions of the Scallop contract.\n *\n * @param obligationId - The obligation id.\n * @return Asset coin Names.\n */\n public async getObligationCoinNames(obligationId: SuiAddressArg) {\n const obligation = await queryObligation(this, obligationId);\n const collateralCoinTypes = obligation.collaterals.map((collateral) => `0x${collateral.type.name}`);\n const debtCoinTypes = obligation.debts.map((debt) => `0x${debt.type.name}`);\n const obligationCoinTypes = [...new Set([...collateralCoinTypes, ...debtCoinTypes])];\n const obligationCoinNames = obligationCoinTypes.map((coinType) => this.utils.parseCoinNameFromType(coinType));\n return obligationCoinNames;\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\n\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '../constants';\nimport type { ScallopBuilder } from '../models';\nimport { getObligations, getObligationLocked, getVeSca, getVeScas } from '../queries';\nimport type {\n BorrowIncentiveIds,\n GenerateBorrowIncentiveNormalMethod,\n GenerateBorrowIncentiveQuickMethod,\n VescaIds,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get veSCA data from transaction block.\n *\n * @description\n * If the veScaKey id is provided, directly return it.\n * Otherwise, automatically get veScaKey from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param veScaKey - veSCA key.\n * @return veSCA key, ID, locked amount and unlock at timestamp.\n */\n\nexport const requireVeSca = async (\n ...params: [builder: ScallopBuilder, SuiTxBlock: TransactionBlock, veScaKey?: SuiAddressArg]\n) => {\n const [builder, txBlock, veScaKey] = params;\n if (params.length === 3 && veScaKey && typeof veScaKey === 'string') {\n const veSca = await getVeSca(builder.query, veScaKey);\n\n if (!veSca) {\n return undefined;\n }\n\n return veSca;\n }\n\n const sender = requireSender(txBlock);\n const veScas = await getVeScas(builder.query, sender);\n if (veScas.length === 0) {\n return undefined;\n }\n\n return veScas[0];\n};\n\n/**\n * Check veSca bind status\n * @param query\n * @param veScaKey\n * @returns\n */\nexport const getBindedObligationId = async (builder: ScallopBuilder, veScaKey: string) => {\n const borrowIncentiveObjId = builder.address.get('borrowIncentive.object');\n const incentivePoolsId = builder.address.get('borrowIncentive.incentivePools');\n const veScaPkgId = builder.address.get('vesca.id');\n\n const { client } = builder;\n\n // get incentive pools\n const incentivePoolsResponse = await client.getObject({\n id: incentivePoolsId,\n options: {\n showContent: true,\n },\n });\n\n if (incentivePoolsResponse.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const incentivePoolFields = incentivePoolsResponse.data.content.fields as any;\n const veScaBindTableId = incentivePoolFields.ve_sca_bind.fields.id.id as string;\n\n // check if veSca is inside the bind table\n const keyType = `${borrowIncentiveObjId}::typed_id::TypedID<${veScaPkgId}::ve_sca::VeScaKey>`;\n const veScaBindTableResponse = await client.getDynamicFieldObject({\n parentId: veScaBindTableId,\n name: {\n type: keyType,\n value: veScaKey,\n },\n });\n\n if (veScaBindTableResponse.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const veScaBindTableFields = veScaBindTableResponse.data.content.fields as any;\n // get obligationId pair\n const obligationId = veScaBindTableFields.value.fields.id as string;\n\n return obligationId;\n};\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [builder: ScallopBuilder, txBlock: TransactionBlock, obligationId?: string, obligationKey?: string]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (params.length === 4 && obligationId && obligationKey && typeof obligationId === 'string') {\n const obligationLocked = await getObligationLocked(builder.query, obligationId);\n return { obligationId, obligationKey, obligationLocked };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n obligationLocked: obligations[0].locked,\n };\n};\n\n/**\n * Generate borrow incentive normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow incentive normal methods.\n */\nexport const generateBorrowIncentiveNormalMethod: GenerateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {\n const borrowIncentiveIds: BorrowIncentiveIds = {\n borrowIncentivePkg: builder.address.get('borrowIncentive.id'),\n query: builder.address.get('borrowIncentive.query'),\n incentivePools: builder.address.get('borrowIncentive.incentivePools'),\n incentiveAccounts: builder.address.get('borrowIncentive.incentiveAccounts'),\n obligationAccessStore: builder.address.get('core.obligationAccessStore'),\n config: builder.address.get('borrowIncentive.config'),\n };\n const OldBorrowIncentiveContract = {\n id: '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410',\n incentivePools: '0x64972b713ccec45ec3964809e477cea6f97350c0c50ca3aec85bb631639266ec',\n incentiveAccounts: '0x3c0b707068bdcea8bb859d751ad3e2149a9f83c13fcf4054ef91372a00bccdd3',\n };\n const veScaIds: Omit<VescaIds, 'pkgId'> = {\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n return {\n stakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::stake`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(borrowIncentiveIds.obligationAccessStore),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n stakeObligationWithVesca: (obligationId, obligationKey, veScaKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::stake_with_ve_sca`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(borrowIncentiveIds.obligationAccessStore),\n txBlock.object(veScaIds.config),\n txBlock.object(veScaIds.treasury),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaKey as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n unstakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n oldUnstakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n arguments: [\n txBlock.object(OldBorrowIncentiveContract.incentivePools),\n txBlock.object(OldBorrowIncentiveContract.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [SUI_TYPE_ARG],\n });\n },\n claimBorrowIncentive: (obligationId, obligationKey, rewardCoinName) => {\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::redeem_rewards`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [rewardType],\n });\n },\n oldClaimBorrowIncentive(obligationId, obligationKey, rewardCoinName) {\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${OldBorrowIncentiveContract.id}::user::redeem_rewards`,\n arguments: [\n txBlock.object(OldBorrowIncentiveContract.incentivePools),\n txBlock.object(OldBorrowIncentiveContract.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [rewardType],\n });\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nexport const generateBorrowIncentiveQuickMethod: GenerateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateBorrowIncentiveNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n stakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n const unstakeObligationBeforeStake = !!txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' && txn.target === `${builder.address.get('borrowIncentive.id')}::user::unstake`,\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n },\n unstakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n if (obligationLocked) {\n normalMethod.unstakeObligation(obligationArg, obligationtKeyArg);\n }\n },\n stakeObligationWithVeScaQuick: async (obligation, obligationKey, veScaKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n const unstakeObligationBeforeStake = !!txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` ||\n txn.target === `${builder.address.get('borrowIncentive.id')}::user::unstake`),\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n if (veSca) {\n const bindedObligationId = await getBindedObligationId(builder, veSca.keyId);\n // if bindedObligationId is equal to obligationId, then use it again\n if (!bindedObligationId || bindedObligationId === obligationArg) {\n normalMethod.stakeObligationWithVesca(obligationArg, obligationtKeyArg, veSca.keyId);\n } else {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n } else {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n }\n },\n claimBorrowIncentiveQuick: (rewardCoinName, obligation, obligationKey) =>\n normalMethod.claimBorrowIncentive(obligation, obligationKey, rewardCoinName),\n };\n};\n","import { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { updateOracles } from './oracle';\nimport type { ScallopBuilder } from '../models';\nimport { getObligations } from '../queries';\nimport type {\n CoreIds,\n GenerateCoreNormalMethod,\n ScallopTxBlock,\n GenerateCoreQuickMethod,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n txBlock: TransactionBlock,\n builder: ScallopBuilder,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [txBlock, builder, obligationId, obligationKey] = params;\n if (params.length === 3 && obligationId) {\n return { obligationId };\n }\n if (params.length === 4 && obligationId && obligationKey) {\n return { obligationId, obligationKey };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n };\n};\n\n/**\n * Generate core normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core normal methods.\n */\nexport const generateCoreNormalMethod: GenerateCoreNormalMethod = ({ builder, txBlock }) => {\n const coreIds: CoreIds = {\n protocolPkg: builder.address.get('core.packages.protocol.id'),\n market: builder.address.get('core.market'),\n version: builder.address.get('core.version'),\n coinDecimalsRegistry: builder.address.get('core.coinDecimalsRegistry'),\n xOracle: builder.address.get('core.oracles.xOracle'),\n };\n return {\n openObligation: () =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n arguments: [txBlock.pure(coreIds.version)],\n }),\n returnObligation: (obligation, obligationHotPotato) =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationHotPotato as string),\n ],\n }),\n openObligationEntry: () =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n arguments: [txBlock.object(coreIds.version)],\n }),\n addCollateral: (obligation, coin, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n ],\n typeArguments: [coinType],\n });\n },\n takeCollateral: (obligation, obligationKey, amount, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n deposit: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::mint::mint`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n depositEntry: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::mint::mint_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n withdraw: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::redeem::redeem`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof marketCoin !== 'string' ? (marketCoin as TransactionArgument) : txBlock.pure(marketCoin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n withdrawEntry: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::redeem::redeem_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof marketCoin !== 'string' ? (marketCoin as TransactionArgument) : txBlock.pure(marketCoin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrow: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::borrow::borrow`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::borrow::borrow_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n repay: (obligation, coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::repay::repay`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrowFlashLoan: (amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n arguments: [txBlock.object(coreIds.version), txBlock.object(coreIds.market), txBlock.pure(amount)],\n typeArguments: [coinType],\n });\n },\n repayFlashLoan: (coin, loan, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::flash_loan::repay_flash_loan`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n txBlock.pure(coin),\n txBlock.object(loan as string),\n ],\n typeArguments: [coinType],\n });\n },\n };\n};\n\n/**\n * Generate core quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include query obligation info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core quick methods.\n */\nexport const generateCoreQuickMethod: GenerateCoreQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateCoreNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n addCollateralQuick: async (amount, collateralCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(txBlock, builder, obligationId);\n\n if (collateralCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n normalMethod.addCollateral(obligationArg, suiCoin, collateralCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n collateralCoinName,\n amount,\n sender,\n );\n normalMethod.addCollateral(obligationArg, takeCoin, collateralCoinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick: async (amount, collateralCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId, obligationKey);\n const updateCoinNames = await builder.query.getObligationCoinNames(obligationInfo.obligationId);\n await updateOracles(builder, txBlock, updateCoinNames);\n return normalMethod.takeCollateral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n collateralCoinName,\n );\n },\n depositQuick: async (amount, poolCoinName, walletAddress) => {\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n return normalMethod.deposit(suiCoin, poolCoinName);\n }\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n poolCoinName,\n amount,\n walletAddress as string,\n );\n txBlock.transferObjects([leftCoin], walletAddress as string);\n return normalMethod.deposit(takeCoin, poolCoinName);\n },\n withdrawQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n const marketCoinName = builder.utils.parseMarketCoinName(poolCoinName);\n const { leftCoin, takeCoin } = await builder.selectMarketCoin(txBlock, marketCoinName, amount, sender);\n txBlock.transferObjects([leftCoin], sender);\n return normalMethod.withdraw(takeCoin, poolCoinName);\n },\n borrowQuick: async (amount, poolCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId, obligationKey);\n const obligationCoinNames = await builder.query.getObligationCoinNames(obligationInfo.obligationId);\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return normalMethod.borrow(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n poolCoinName,\n );\n },\n repayQuick: async (amount, poolCoinName, obligationId, walletAddress) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId);\n\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n return normalMethod.repay(obligationInfo.obligationId, suiCoin, poolCoinName);\n }\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n poolCoinName,\n amount,\n walletAddress as string,\n );\n txBlock.transferObjects([leftCoin], walletAddress as string);\n return normalMethod.repay(obligationInfo.obligationId, takeCoin, poolCoinName);\n },\n updateAssetPricesQuick: async (assetCoinNames) => updateOracles(builder, txBlock, assetCoinNames),\n };\n};\n","import type { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport axios from 'axios';\n\nimport { SUPPORT_COLLATERALS, SUPPORT_POOLS } from '../constants';\nimport { PYTH_ENDPOINTS } from '../constants/pyth';\nimport type { ScallopBuilder } from '../models';\nimport { PythClient } from '../models/pythClient';\nimport type { SupportAssetCoins, SupportOracleType } from '../types';\n\nexport const getLatestVaas = async (endpoint: string, priceIds: string[]) => {\n const response = await axios.get(`${endpoint}/api/latest_vaas`, {\n params: {\n ids: priceIds,\n },\n });\n const latestVaas = response.data;\n return latestVaas.map((vaa: string) => Buffer.from(vaa, 'base64'));\n};\n\n/**\n * Update the price of the oracle for multiple coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinNames - Specific an array of support asset coin name.\n */\nexport const updateOracles = async (\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n assetCoinNames?: SupportAssetCoins[],\n) => {\n const coinNames = assetCoinNames ?? [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS])];\n const rules: SupportOracleType[] = builder.isTestnet ? ['pyth'] : ['pyth'];\n if (rules.includes('pyth')) {\n const pythClient = new PythClient(\n builder.client as any,\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get('core.oracles.pyth.wormholeState'),\n );\n const priceIds = coinNames.map((assetCoinName) =>\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`),\n );\n\n // iterate through the endpoints\n const endpoints = builder.params.pythEndpoints ?? PYTH_ENDPOINTS[builder.isTestnet ? 'testnet' : 'mainnet'];\n try {\n const priceUpdateData = await getLatestVaas(endpoints[0], priceIds);\n await pythClient.updatePriceFeeds(txBlock as any, priceUpdateData, priceIds);\n } catch (e) {\n console.warn(`Failed to update price feeds with endpoint ${endpoints[0]}: ${e}`);\n }\n }\n\n // Remove duplicate coin names.\n const updateAssetCoinNames = [...new Set(coinNames)];\n for (let i = 0; i < updateAssetCoinNames.length; i++) {\n await updateOracle(builder, txBlock, updateAssetCoinNames[i], rules);\n }\n};\n\n/**\n * Update the price of the oracle for specific coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinName - Specific support asset coin name.\n */\nconst updateOracle = async (\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n assetCoinName: SupportAssetCoins,\n rules: SupportOracleType[],\n) => {\n const coinType = builder.utils.parseCoinType(assetCoinName);\n\n updatePrice(\n txBlock,\n rules,\n builder.address.get('core.packages.xOracle.id'),\n builder.address.get('core.oracles.xOracle'),\n builder.address.get('core.packages.pyth.id'),\n builder.address.get('core.oracles.pyth.registry'),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`),\n builder.address.get('core.packages.switchboard.id'),\n builder.address.get('core.oracles.switchboard.registry'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.switchboard`),\n builder.address.get('core.packages.supra.id'),\n builder.address.get('core.oracles.supra.registry'),\n builder.address.get(`core.oracles.supra.holder`),\n coinType,\n );\n};\n\n/**\n * Construct a transaction block for update the price.\n *\n * @param txBlock - The transaction block.\n * @param rules - The oracle rules.\n * @param xOraclePackageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param pythPackageId - The pyth package id.\n * @param pythRegistryId - The registry id from pyth package.\n * @param pythStateId - The price state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param switchboardPackageId - The switchboard package id.\n * @param switchboardRegistryId - The registry id from switchboard package.\n * @param switchboardAggregatorId - The aggregator id from switchboard package.\n * @param supraPackageId - The supra package id.\n * @param supraRegistryId - The registry id from supra package.\n * @param supraHolderId - The holder id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePrice = (\n txBlock: TransactionBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n switchboardPackageId: string,\n switchboardRegistryId: TransactionArgument | string,\n switchboardAggregatorId: TransactionArgument | string,\n supraPackageId: string,\n supraRegistryId: TransactionArgument | string,\n supraHolderId: TransactionArgument | string,\n coinType: string,\n) => {\n const request = priceUpdateRequest(txBlock, xOraclePackageId, xOracleId, coinType);\n if (rules.includes('pyth')) {\n updatePythPrice(txBlock, pythPackageId, request, pythStateId, pythFeedObjectId, pythRegistryId, coinType);\n }\n if (rules.includes('switchboard')) {\n updateSwitchboardPrice(\n txBlock,\n switchboardPackageId,\n request,\n switchboardAggregatorId,\n switchboardRegistryId,\n coinType,\n );\n }\n if (rules.includes('supra')) {\n updateSupraPrice(txBlock, supraPackageId, request, supraHolderId, supraRegistryId, coinType);\n }\n confirmPriceUpdateRequest(txBlock, xOraclePackageId, xOracleId, request, coinType);\n return txBlock;\n};\n\n/**\n * Construct a transaction block for request price update.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst priceUpdateRequest = (\n txBlock: TransactionBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n coinType: string,\n) => {\n const validXOracleId = typeof xOracleId === 'string' ? txBlock.object(xOracleId) : xOracleId;\n const target = `${packageId}::x_oracle::price_update_request` as `${string}::${string}::${string}`;\n const typeArgs = [coinType];\n return txBlock.moveCall({ target, arguments: [validXOracleId], typeArguments: typeArgs });\n};\n\n/**\n * Construct a transaction block for confirm price update request.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param request - The result of the request.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst confirmPriceUpdateRequest = (\n txBlock: TransactionBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n request: TransactionArgument,\n coinType: string,\n) => {\n const target = `${packageId}::x_oracle::confirm_price_update_request` as `${string}::${string}::${string}`;\n const typeArgs = [coinType];\n const validXOracleId = typeof xOracleId === 'string' ? txBlock.object(xOracleId) : xOracleId;\n txBlock.moveCall({\n target,\n arguments: [validXOracleId, request, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: typeArgs,\n });\n return txBlock;\n};\n\n/**\n * Construct a transaction block for update supra price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The supra package id.\n * @param request - The result of the request.\n * @param holderId - The holder id from supra package.\n * @param registryId - The registry id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSupraPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument,\n holderId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validHolderId = typeof holderId === 'string' ? txBlock.object(holderId) : holderId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [request, validHolderId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n\n/**\n * Construct a transaction block for update switchboard price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The switchboard package id.\n * @param request - The result of the request.\n * @param aggregatorId - The aggregator id from switchboard package.\n * @param registryId - The registry id from switchboard package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSwitchboardPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument,\n aggregatorId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validAggregatorId = typeof aggregatorId === 'string' ? txBlock.object(aggregatorId) : aggregatorId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [request, validAggregatorId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n\n/**\n * Construct a transaction block for update pyth price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The pyth package id.\n * @param request - The result of the request.\n * @param stateId - The price state id from pyth package.\n * @param wormholeStateId - The whormhole state id from pyth package.\n * @param feedObjectId - The feed object id from pyth package.\n * @param vaaFromFeeId - The vaa from pyth api with feed id.\n * @param registryId - The registry id from pyth package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePythPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument | string,\n stateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validRequest = typeof request === 'string' ? txBlock.object(request) : request;\n const validStateId = typeof stateId === 'string' ? txBlock.object(stateId) : stateId;\n const validFeedObjectId = typeof feedObjectId === 'string' ? txBlock.object(feedObjectId) : feedObjectId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [validRequest, validStateId, validFeedObjectId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n","export const PYTH_ENDPOINTS: {\n [k in 'mainnet' | 'testnet']: Readonly<string[]>;\n} = {\n testnet: ['https://hermes-beta.pyth.network'],\n mainnet: ['https://hermes.pyth.network', 'https://scallop.rpc.p2p.world'],\n} as const;\n","import { bcs } from '@mysten/sui.js/bcs';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nconst MAX_ARGUMENT_SIZE = 16 * 1024;\n\nexport class PythClient {\n provider: SuiClient;\n\n pythStateId: string;\n\n wormholeStateId: string;\n\n private pythPackageId: any;\n\n private wormholePackageId: any;\n\n private priceTableInfo: { id: string; fieldType: string };\n\n private priceFeedObjectIdCache: Map<string, string> = new Map();\n\n private baseUpdateFee: any;\n\n constructor(provider: SuiClient, pythStateId: string, wormholeStateId: string) {\n this.provider = provider;\n this.pythStateId = pythStateId;\n this.wormholeStateId = wormholeStateId;\n this.pythPackageId = undefined;\n this.wormholePackageId = undefined;\n }\n\n async getBaseUpdateFee() {\n if (this.baseUpdateFee === undefined) {\n const result = await this.provider.getObject({\n id: this.pythStateId,\n options: { showContent: true },\n });\n if (!result.data || !result.data.content || result.data.content.dataType !== 'moveObject') {\n throw new Error('Unable to fetch pyth state object');\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.baseUpdateFee = result.data.content.fields.base_update_fee;\n }\n return this.baseUpdateFee;\n }\n\n /**\n * getPackageId returns the latest package id that the object belongs to. Use this to\n * fetch the latest package id for a given object id and handle package upgrades automatically.\n * @param objectId\n * @returns package id\n */\n async getPackageId(objectId: string) {\n const state = await this.provider\n .getObject({\n id: objectId,\n options: {\n showContent: true,\n },\n })\n .then((result) => {\n if (result.data?.content?.dataType === 'moveObject') {\n return result.data.content.fields;\n }\n console.log(result.data?.content);\n throw new Error(`Cannot fetch package id for object ${objectId}`);\n });\n if ('upgrade_cap' in state) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state.upgrade_cap.fields.package;\n }\n throw new Error('upgrade_cap not found');\n }\n\n /**\n * Adds the commands for calling wormhole and verifying the vaas and returns the verified vaas.\n * @param vaas array of vaas to verify\n * @param tx transaction block to add commands to\n */\n async verifyVaas(vaas: Buffer[], tx: TransactionBlock) {\n const wormholePackageId = await this.getWormholePackageId();\n const verifiedVaas: {\n index: number;\n resultIndex: number;\n kind: 'NestedResult';\n }[] = [];\n vaas.forEach((vaa) => {\n const [verifiedVaa] = tx.moveCall({\n target: `${wormholePackageId}::vaa::parse_and_verify`,\n arguments: [\n tx.object(this.wormholeStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(vaa), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n verifiedVaas.push(verifiedVaa);\n });\n return verifiedVaas;\n }\n\n /**\n * Adds the necessary commands for updating the pyth price feeds to the transaction block.\n * @param tx transaction block to add commands to\n * @param updates array of price feed updates received from the price service\n * @param feedIds array of feed ids to update (in hex format)\n */\n async updatePriceFeeds(tx: TransactionBlock, updates: Buffer[], feedIds: string[]) {\n const packageId = await this.getPythPackageId();\n let priceUpdatesHotPotato;\n if (updates.length > 1) {\n throw new Error('SDK does not support sending multiple accumulator messages in a single transaction');\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n verifiedVaas[0],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n const priceInfoObjects = [];\n const baseUpdateFee = await this.getBaseUpdateFee();\n const coins = tx.splitCoins(\n tx.gas,\n feedIds.map(() => tx.pure(baseUpdateFee)),\n );\n let coinId = 0;\n for (let i = 0; i < feedIds.length; i++) {\n const priceInfoObjectId = await this.getPriceFeedObjectId(feedIds[i]);\n if (!priceInfoObjectId) {\n throw new Error(`Price feed ${feedIds[0]} not found, please create it first`);\n }\n priceInfoObjects.push(priceInfoObjectId);\n [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::update_single_price_feed`,\n arguments: [\n tx.object(this.pythStateId),\n priceUpdatesHotPotato,\n tx.object(priceInfoObjectId),\n coins[coinId],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n coinId++;\n }\n tx.moveCall({\n target: `${packageId}::hot_potato_vector::destroy`,\n arguments: [priceUpdatesHotPotato],\n typeArguments: [`${packageId}::price_info::PriceInfo`],\n });\n return priceInfoObjects;\n }\n\n async createPriceFeed(tx: TransactionBlock, updates: Buffer[]) {\n const packageId = await this.getPythPackageId();\n if (updates.length > 1) {\n throw new Error('SDK does not support sending multiple accumulator messages in a single transaction');\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n tx.moveCall({\n target: `${packageId}::pyth::create_price_feeds_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n verifiedVaas[0],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n }\n\n /**\n * Get the packageId for the wormhole package if not already cached\n */\n async getWormholePackageId() {\n if (!this.wormholePackageId) {\n this.wormholePackageId = await this.getPackageId(this.wormholeStateId);\n }\n return this.wormholePackageId;\n }\n\n /**\n * Get the packageId for the pyth package if not already cached\n */\n async getPythPackageId() {\n if (!this.pythPackageId) {\n this.pythPackageId = await this.getPackageId(this.pythStateId);\n }\n return this.pythPackageId;\n }\n\n /**\n * Get the priceFeedObjectId for a given feedId if not already cached\n * @param feedId\n */\n async getPriceFeedObjectId(feedId: string) {\n const normalizedFeedId = feedId.replace('0x', '');\n if (!this.priceFeedObjectIdCache.has(normalizedFeedId)) {\n const { id: tableId, fieldType } = await this.getPriceTableInfo();\n const result = await this.provider.getDynamicFieldObject({\n parentId: tableId,\n name: {\n type: `${fieldType}::price_identifier::PriceIdentifier`,\n value: {\n bytes: Array.from(Buffer.from(normalizedFeedId, 'hex')),\n },\n },\n });\n if (!result.data || !result.data.content) {\n return undefined;\n }\n if (result.data.content.dataType !== 'moveObject') {\n throw new Error('Price feed type mismatch');\n }\n this.priceFeedObjectIdCache.set(\n normalizedFeedId,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result.data.content.fields.value,\n );\n }\n return this.priceFeedObjectIdCache.get(normalizedFeedId);\n }\n\n /**\n * Fetches the price table object id for the current state id if not cached\n * @returns price table object id\n */\n async getPriceTableInfo() {\n if (this.priceTableInfo === undefined) {\n const result = await this.provider.getDynamicFieldObject({\n parentId: this.pythStateId,\n name: {\n type: 'vector<u8>',\n value: 'price_info',\n },\n });\n if (!result.data || !result.data.type) {\n throw new Error('Price Table not found, contract may not be initialized');\n }\n let type = result.data.type.replace('0x2::table::Table<', '');\n type = type.replace('::price_identifier::PriceIdentifier, 0x2::object::ID>', '');\n this.priceTableInfo = { id: result.data.objectId, fieldType: type };\n }\n return this.priceTableInfo;\n }\n\n /**\n * Obtains the vaa bytes embedded in an accumulator message.\n * @param accumulatorMessage - the accumulator price update message\n * @returns vaa bytes as a uint8 array\n */\n extractVaaBytesFromAccumulatorMessage(accumulatorMessage: Buffer): Buffer {\n // the first 6 bytes in the accumulator message encode the header, major, and minor bytes\n // we ignore them, since we are only interested in the VAA bytes\n const trailingPayloadSize = accumulatorMessage.readUint8(6);\n const vaaSizeOffset =\n 7 + // header bytes (header(4) + major(1) + minor(1) + trailing payload size(1))\n trailingPayloadSize + // trailing payload (variable number of bytes)\n 1; // proof_type (1 byte)\n const vaaSize = accumulatorMessage.readUint16BE(vaaSizeOffset);\n const vaaOffset = vaaSizeOffset + 2;\n return accumulatorMessage.subarray(vaaOffset, vaaOffset + vaaSize);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport type { TransactionArgument, TransactionResult } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { spoolRewardCoins } from '../constants/enum';\nimport type { ScallopBuilder } from '../models';\nimport { getStakeAccounts } from '../queries/spoolQuery';\nimport type {\n SpoolIds,\n GenerateSpoolNormalMethod,\n GenerateSpoolQuickMethod,\n SupportStakeMarketCoins,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get stake account id from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return it.\n * Otherwise, automatically get all stake account id from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake account ids.\n */\nconst requireStakeAccountIds = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n if (params.length === 4 && stakeAccountId) {\n return [stakeAccountId];\n }\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account id found for sender ${sender}`);\n }\n return stakeAccounts[stakeMarketCoinName].map((account) => account.id);\n};\n\n/**\n * Check and get stake accounts information from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return its account.\n * Otherwise, automatically get all stake account from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake accounts.\n */\nconst requireStakeAccounts = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account found for sender ${sender}`);\n }\n\n const specificStakeAccounts = stakeAccountId\n ? stakeAccounts[stakeMarketCoinName].filter((account) => account.id === stakeAccountId)\n : stakeAccounts[stakeMarketCoinName];\n\n return specificStakeAccounts;\n};\n\n/**\n * Generate spool normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool normal methods.\n */\nexport const generateSpoolNormalMethod: GenerateSpoolNormalMethod = ({ builder, txBlock }) => {\n const spoolIds: SpoolIds = {\n spoolPkg: builder.address.get('spool.id'),\n };\n return {\n createStakeAccount: (stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::new_spool_account`,\n arguments: [txBlock.object(stakePoolId), txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [marketCoinType],\n });\n },\n stake: (stakeAccount, coin, stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::stake`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(stakeAccount as string),\n typeof coin === 'string' ? txBlock.pure(coin) : (coin as TransactionArgument),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType],\n });\n },\n unstake: (stakeAccount, amount, stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::unstake`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(stakeAccount as string),\n txBlock.pure(amount),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType],\n });\n },\n claim: (stakeAccount, stakeMarketCoinName) => {\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n const rewardPoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.rewardPoolId`);\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const rewardCoinName = spoolRewardCoins[stakeMarketCoinName];\n const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::redeem_rewards`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(rewardPoolId),\n txBlock.object(stakeAccount as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType, rewardCoinType],\n });\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nexport const generateSpoolQuickMethod: GenerateSpoolQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateSpoolNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n stakeQuick: async (amountOrMarketCoin, stakeMarketCoinName, stakeAccountId) => {\n const sender = requireSender(txBlock);\n const stakeAccountIds = await requireStakeAccountIds(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n if (typeof amountOrMarketCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(amountOrMarketCoin, marketCoinType, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, coins, amountOrMarketCoin);\n normalMethod.stake(stakeAccountIds[0], takeCoin, stakeMarketCoinName);\n txBlock.transferObjects([leftCoin], sender);\n } else {\n normalMethod.stake(stakeAccountIds[0], amountOrMarketCoin, stakeMarketCoinName);\n }\n },\n unstakeQuick: async (amount, stakeMarketCoinName, stakeAccountId) => {\n let remainingAmount = amount;\n const stakeAccounts = await requireStakeAccounts(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n const stakeMarketCoins: TransactionResult[] = [];\n for (let i = 0; i < stakeAccounts.length; i++) {\n if (stakeAccounts[i].staked === 0) {\n continue;\n }\n const amountToUnstake = Math.min(remainingAmount, stakeAccounts[i].staked);\n const marketCoin = normalMethod.unstake(stakeAccounts[i].id, amountToUnstake, stakeMarketCoinName);\n stakeMarketCoins.push(marketCoin);\n remainingAmount -= amountToUnstake;\n if (remainingAmount === 0) {\n break;\n }\n }\n return stakeMarketCoins;\n },\n claimQuick: async (stakeMarketCoinName, stakeAccountId) => {\n const stakeAccountIds = await requireStakeAccountIds(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n const rewardCoins: TransactionResult[] = [];\n stakeAccountIds.forEach((accountId) => {\n const rewardCoin = normalMethod.claim(accountId, stakeMarketCoinName);\n rewardCoins.push(rewardCoin);\n });\n return rewardCoins;\n },\n };\n};\n","import { TransactionArgument, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { requireVeSca } from './borrowIncentiveBuilder';\nimport { SCA_COIN_TYPE } from '../constants';\nimport { GenerateVeScaNormalMethod, GenerateVeScaQuickMethod, SuiAddressArg, SuiObjectArg, VescaIds } from '../types';\nimport {\n requireSender,\n checkLockSca,\n checkExtendLockPeriod,\n checkExtendLockAmount,\n checkRenewExpiredVeSca,\n checkVesca,\n} from '../utils';\n\n/**\n * Generate veSCA normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA normal methods.\n */\nconst generateNormalVeScaMethod: GenerateVeScaNormalMethod = ({ builder, txBlock }) => {\n const veScaIds: VescaIds = {\n pkgId: builder.address.get('vesca.id'),\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n\n return {\n lockSca: (scaCoin, unlockAtInSecondTimestamp) =>\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::mint_ve_sca_key`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.pure(unlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n }),\n extendLockPeriod: (veScaKey, newUnlockAtInSecondTimestamp) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::extend_lock_period`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n txBlock.pure(newUnlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n extendLockAmount: (veScaKey, scaCoin) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::lock_more_sca`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n renewExpiredVeSca: (veScaKey, scaCoin, newUnlockAtInSecondTimestamp) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::renew_expired_ve_sca`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.pure(newUnlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n redeemSca: (veScaKey) =>\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::redeem`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n }),\n };\n};\n\n/**\n * Generate veSCA quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get veSca info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA quick methods.\n */\nexport const generateQuickVeScaMethod: GenerateVeScaQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateNormalVeScaMethod({ builder, txBlock });\n return {\n normalMethod,\n lockScaQuick: async (amountOrCoin, lockPeriodInDays, autoCheck = true) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock);\n\n let scaCoin: TransactionObjectArgument | SuiObjectArg | undefined;\n const transferObjects = [];\n if (amountOrCoin !== undefined && typeof amountOrCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(amountOrCoin, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, coins, amountOrCoin);\n scaCoin = takeCoin;\n transferObjects.push(leftCoin);\n } else {\n // With amountOrCoin is SuiObjectArg, we cannot validate the minimum sca amount for locking and topup\n scaCoin = amountOrCoin as SuiObjectArg;\n }\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays, veSca?.unlockAt);\n if (autoCheck) {\n checkLockSca(amountOrCoin, lockPeriodInDays, newUnlockAt, veSca?.unlockAt);\n }\n console.log(\n new Date(newUnlockAt * 1000).toLocaleString('en-CA', {\n hour12: true,\n }),\n );\n\n const isInitialLock = !veSca?.unlockAt;\n const isLockExpired = !isInitialLock && veSca.unlockAt * 1000 <= new Date().getTime();\n if (isInitialLock || isLockExpired) {\n if (scaCoin) {\n if (isInitialLock) {\n const veScaKey = normalMethod.lockSca(scaCoin, newUnlockAt);\n transferObjects.push(veScaKey);\n } else {\n // user must withdraw current unlocked SCA first if any\n if (veSca.lockedScaAmount !== 0) {\n const unlockedSca = normalMethod.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n // enforce renew on expired\n normalMethod.renewExpiredVeSca(veSca.keyId, scaCoin, newUnlockAt);\n }\n }\n } else if (!!scaCoin && !!lockPeriodInDays) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n normalMethod.extendLockAmount(veSca.keyId, scaCoin);\n } else if (lockPeriodInDays) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n } else if (scaCoin) {\n normalMethod.extendLockAmount(veSca.keyId, scaCoin);\n }\n\n if (transferObjects.length > 0) {\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n extendLockPeriodQuick: async (lockPeriodInDays: number, veScaKey?: SuiAddressArg, autoCheck = true) => {\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays);\n if (autoCheck) {\n checkExtendLockPeriod(lockPeriodInDays, newUnlockAt, veSca?.unlockAt);\n }\n\n if (veSca) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n }\n },\n extendLockAmountQuick: async (scaAmount: number, veScaKey?: SuiAddressArg, autoCheck = true) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n if (autoCheck) {\n checkExtendLockAmount(scaAmount, veSca?.unlockAt);\n }\n\n if (veSca) {\n const scaCoins = await builder.utils.selectCoinIds(scaAmount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, scaCoins, scaAmount);\n\n normalMethod.extendLockAmount(veSca.keyId, takeCoin);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n renewExpiredVeScaQuick: async (\n scaAmount: number,\n lockPeriodInDays: number,\n veScaKey?: SuiAddressArg,\n autoCheck = true,\n ) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays, veSca?.unlockAt);\n if (autoCheck) {\n checkRenewExpiredVeSca(scaAmount, lockPeriodInDays, veSca?.unlockAt);\n }\n\n if (veSca) {\n const transferObjects = [];\n if (veSca.lockedScaAmount !== 0) {\n const unlockedSca = normalMethod.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n const scaCoins = await builder.utils.selectCoinIds(scaAmount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, scaCoins, scaAmount);\n transferObjects.push(leftCoin);\n\n normalMethod.renewExpiredVeSca(veSca.keyId, takeCoin, newUnlockAt);\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n redeemScaQuick: async (veScaKey?: SuiAddressArg) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n checkVesca(veSca?.unlockAt);\n\n if (veSca) {\n const sca = normalMethod.redeemSca(veSca.keyId);\n txBlock.transferObjects([sca], sender);\n }\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';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface BorrowIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class BorrowIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.borrow(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface BorrowWithBoostIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string;\n}\n\nexport class BorrowWithBoostIntention extends CoreBaseIntention<BorrowWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowWithBoostIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await scallopClient.init();\n return scallopClient.borrowWithBoost(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n this.data.veScaKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { BorrowIncentiveParams, SpoolIncentiveParams } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ClaimIncentiveRewardIntentionData {\n lendingIncentive: SpoolIncentiveParams[];\n borrowIncentiveV2: BorrowIncentiveParams[];\n borrowIncentive: BorrowIncentiveParams[];\n}\n\nexport class ClaimIncentiveRewardIntention extends CoreBaseIntention<ClaimIncentiveRewardIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimIncentiveReward;\n\n constructor(public readonly data: ClaimIncentiveRewardIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.claim(\n this.data.lendingIncentive,\n this.data.borrowIncentiveV2,\n this.data.borrowIncentive,\n input.account.address,\n );\n }\n\n static fromData(data: ClaimIncentiveRewardIntentionData): ClaimIncentiveRewardIntention {\n return new ClaimIncentiveRewardIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportCollateralCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface DepositCollateralIntentionData {\n collateralCoinName: SupportCollateralCoins;\n amount: number | string;\n obligationId: string;\n}\n\nexport class DepositCollateralIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.depositCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\n this.data.obligationId,\n input.account.address,\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ExtendPeriodAndStakeMoreIntentionData {\n amount: number;\n veScaKey: string;\n lockPeriodInDays: number;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n isOldBorrowIncentive: boolean;\n isObligationLocked: boolean;\n}\n\nexport class ExtendPeriodAndStakeMoreIntention extends CoreBaseIntention<ExtendPeriodAndStakeMoreIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendPeriodAndStakeMore;\n\n constructor(public readonly data: ExtendPeriodAndStakeMoreIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.extendPeriodAndStakeMoreSca(\n this.data.amount,\n this.data.veScaKey,\n this.data.lockPeriodInDays,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ExtendStakePeriodIntentionData {\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n lockPeriodInDays: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class ExtendStakePeriodIntention extends CoreBaseIntention<ExtendStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendStakePeriod;\n\n constructor(public readonly data: ExtendStakePeriodIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.extendStakeScaLockPeriod(\n this.data.lockPeriodInDays,\n this.data.veScaKey,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportBorrowIncentiveRewardCoins, TransactionSubType } from '../types';\n\nexport interface MigrateAndClaimIntentionData {\n veScaKey: string;\n obligationKey: string;\n obligationId: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n}\n\nexport class MigrateAndClaimIntention extends CoreBaseIntention<MigrateAndClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateAndClaim;\n\n constructor(public readonly data: MigrateAndClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await scallopClient.init();\n return scallopClient.migrateAndClaim(\n this.data.veScaKey,\n this.data.obligationKey,\n this.data.obligationId,\n this.data.rewardCoinName,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface OpenObligationIntentionData {}\n\nexport class OpenObligationIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.openObligation();\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, TransactionSubType } from '../types';\n\nexport interface RedeemScaIntentionData {\n veScaKey: string;\n}\n\nexport class RedeemScaIntention extends CoreBaseIntention<RedeemScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RedeemSca;\n\n constructor(public readonly data: RedeemScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.redeemSca(this.data.veScaKey);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface RenewExpStakePeriodIntentionData {\n amount: number;\n lockPeriodInDays: 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 CoreBaseIntention<RenewExpStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RenewExpStakePeriod;\n\n constructor(public readonly data: RenewExpStakePeriodIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.renewExpiredStakeSca(\n this.data.amount,\n this.data.lockPeriodInDays,\n this.data.vescaKey,\n this.data.isHaveRedeem,\n this.data.obligation,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface RepayIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class RepayIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.repay(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface StakeScaIntentionData {\n amount: number;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n lockPeriodInDays: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class StakeScaIntention extends CoreBaseIntention<StakeScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSca;\n\n constructor(public readonly data: StakeScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.stakeSca(\n this.data.amount,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.lockPeriodInDays,\n this.data.veScaKey,\n input.account.address,\n );\n }\n\n static fromData(data: StakeScaIntentionData): StakeScaIntention {\n return new StakeScaIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportStakeMarketCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface StakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: SupportStakeMarketCoins;\n stakeAccountId?: string | null;\n}\n\nexport class StakeSpoolIntention extends CoreBaseIntention<StakeSpoolIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSpool;\n\n constructor(public readonly data: StakeSpoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.stake(this.data.marketCoinName, Number(this.data.amount), undefined, input.account.address);\n }\n\n static fromData(data: StakeSpoolIntentionData): StakeSpoolIntention {\n return new StakeSpoolIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface SupplyAndStakeLendingIntentionData {\n amount: number | string;\n coinName: SupportAssetCoins;\n stakeAccountId?: string | null;\n}\n\nexport class SupplyAndStakeLendingIntention extends CoreBaseIntention<SupplyAndStakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyAndStakeLending;\n\n constructor(public readonly data: SupplyAndStakeLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.supplyAndStake(\n this.data.coinName,\n Number(this.data.amount),\n this.data.stakeAccountId,\n input.account.address,\n );\n }\n\n static fromData(data: SupplyAndStakeLendingIntentionData): SupplyAndStakeLendingIntention {\n return new SupplyAndStakeLendingIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface SupplyLendingIntentionData {\n amount: number | string;\n coinName: SupportAssetCoins;\n}\n\nexport class SupplyLendingIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.deposit(this.data.coinName, Number(this.data.amount), 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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportStakeMarketCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface UnstakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: SupportStakeMarketCoins;\n stakeAccountId: string | null;\n}\n\nexport class UnstakeSpoolIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.unstake(this.data.marketCoinName, Number(this.data.amount), undefined, input.account.address);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface WithdrawAndUnstakeLendingIntentionData {\n amount: number | undefined;\n coinName: SupportAssetCoins;\n stakeAccountId: { id: string; coin: number }[];\n}\n\nexport class WithdrawAndUnstakeLendingIntention extends CoreBaseIntention<WithdrawAndUnstakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawAndUnstakeLending;\n\n constructor(public readonly data: WithdrawAndUnstakeLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.unstakeAndWithdraw(this.data.coinName, Number(this.data.amount), this.data.stakeAccountId);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportCollateralCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface WithdrawCollateralIntentionData {\n collateralCoinName: SupportCollateralCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class WithdrawCollateralIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.withdrawCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins } from '../types';\nimport { SuiNetworks, TransactionSubType } from '../types/utils';\n\nexport interface WithdrawLendingIntentionData {\n amount: string | number;\n coinName: SupportAssetCoins;\n}\n\nexport class WithdrawLendingIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.withdraw(this.data.coinName, Number(this.data.amount), 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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface WithdrawStakedScaIntentionData {\n vescaKey?: string;\n}\n\nexport class WithdrawStakedScaIntention extends CoreBaseIntention<WithdrawStakedScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawStakedSca;\n\n constructor(public readonly data: WithdrawStakedScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.withdrawUnlockedSca(this.data.vescaKey, input.account.address);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\nimport { MSafeAppHelper } from '../interface';\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention, AddLiquidityIntentionData } from './intentions/add-liquidity';\nimport { BurnIntention, BurnIntentionData } from './intentions/burn';\nimport { CollectFeeIntention, CollectFeeIntentionData } from './intentions/collect-fee';\nimport { CollectRewardIntention, CollectRewardIntentionData } from './intentions/collect-reward';\nimport { CreatePoolIntention, CreatePoolIntentionData } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention, DecreaseLiquidityIntentionData } from './intentions/decrease-liquidity';\nimport { IncreaseLiquidityIntention, IncreaseLiquidityIntentionData } from './intentions/increase-liquidity';\nimport { PrixClaimIntention, PrixClaimIntentionData } from './intentions/prix-claim';\nimport { PrixJoinIntention, PrixJoinIntentionData } from './intentions/prix-join';\nimport { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\nimport { SwapIntention, SwapIntentionData } from './intentions/swap';\nimport {\n SwapExactBaseForQuoteIntention,\n SwapExactBaseForQuoteIntentionData,\n} from './intentions/swap-exact-base-for-quote';\nimport {\n SwapExactQuoteForBaseIntention,\n SwapExactQuoteForBaseIntentionData,\n} from './intentions/swap-exact-quote-for-base';\nimport { SuiNetworks, TransactionSubType } 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 type TURBOSIntentionData =\n | CreatePoolIntentionData\n | AddLiquidityIntentionData\n | IncreaseLiquidityIntentionData\n | DecreaseLiquidityIntentionData\n | CollectFeeIntentionData\n | CollectRewardIntentionData\n | RemoveLiquidityIntentionData\n | BurnIntentionData\n | SwapIntentionData\n | PrixJoinIntentionData\n | PrixClaimIntentionData\n | SwapExactQuoteForBaseIntentionData\n | SwapExactBaseForQuoteIntentionData;\n\nexport class TURBOSAppHelper implements MSafeAppHelper<TURBOSIntentionData> {\n application = 'turbos';\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 const decoder = new Decoder(transactionBlock, turbosSdk, contract);\n const result = 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 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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { deepbookConfig, prixConfig } from './config';\nimport { TURBOSIntentionData } from './helper';\nimport { TransactionSubType } from './types';\nimport { BN, Contract, TurbosSdk } from 'turbos-clmm-sdk';\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 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 return 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 decodeSwap(): 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: nextTickIndex,\n };\n });\n\n const coinTypeA = atob[0]\n ? moveCall.typeArguments[0]\n : layer === 1\n ? moveCall.typeArguments[0]\n : moveCall.typeArguments[1];\n const coinTypeB =\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 return {\n txType: TransactionType.Other,\n type: TransactionSubType.Swap,\n intentionData: {\n routes: 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 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 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 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 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 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 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 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 private decodePrixClaim(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixClaim,\n intentionData: {},\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) => trans.kind === 'MoveCall' && trans.target !== '0x2::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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiNetworks, TransactionSubType } from '../types';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\n\nexport interface AddLiquidityIntentionData extends Pool.AddLiquidityOptions {}\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { NFT } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface BurnIntentionData extends NFT.BurnOptions {}\n\nexport class BurnIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CollectFeeIntentionData = Pool.CollectFeeOptions;\n\nexport class CollectFeeIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CollectRewardIntentionData = Pool.CollectRewardOptions;\n\nexport class CollectRewardIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CreatePoolIntentionData = Pool.CreatePoolOptions;\n\nexport class CreatePoolIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface DecreaseLiquidityIntentionData extends Pool.DecreaseLiquidityOptions {}\n\nexport class DecreaseLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface IncreaseLiquidityIntentionData extends Pool.IncreaseLiquidityOptions {}\n\nexport class IncreaseLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { prixConfig } from '../config';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nexport interface PrixClaimIntentionData {}\n\nexport class PrixClaimIntention extends CoreBaseIntention<PrixClaimIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixClaim;\n\n constructor(public override readonly data: PrixClaimIntentionData) {\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::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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { prixConfig } from '../config';\n\nexport interface PrixJoinIntentionData {}\n\nexport class PrixJoinIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface RemoveLiquidityIntentionData extends Pool.RemoveLiquidityOptions {}\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiNetworks, TransactionSubType } from '../types';\nimport { Pool, Trade } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\n\nexport interface SwapIntentionData extends Trade.SwapOptions {}\n\nexport class SwapIntention extends CoreBaseIntention<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 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\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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network, Account } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { swap_exact_base_for_quote } from '../api/deepbook';\n\nexport interface SwapExactBaseForQuoteIntentionData {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n}\n\nexport class SwapExactBaseForQuoteIntention extends CoreBaseIntention<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 { normalizeSuiObjectId } from '@mysten/sui.js/utils';\nimport { TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { deepbookConfig } from '../config';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\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 let 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 let 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';\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 } else {\n currentBalance += Number(object.balance);\n resultCoinObjects.push(object);\n return false;\n }\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 let [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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { swap_exact_quote_for_base } from '../api/deepbook';\n\nexport interface SwapExactQuoteForBaseIntentionData {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n}\n\nexport class SwapExactQuoteForBaseIntention extends CoreBaseIntention<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 { MSafeAppHelper } from '@/apps/interface';\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 MSafeAppHelper<VoloIntentionData> {\n application = 'volo';\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/builder';\nimport { TransactionBlockInput, TransactionBlock } 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimTicketIntentionData {\n ticketId: string;\n}\n\nexport class ClaimTicketIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface StakeIntentionData {\n amount: number;\n}\n\nexport class StakeIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface UnStakeIntentionData {\n amount: number;\n}\n\nexport class UnStakeIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport { MSafeAppHelper } from '../interface';\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention, AddLiquidityIntentionData } from './intentions/add-liquidity';\nimport { AddLiquiditySingleSideIntention, AddLiquiditySingleSidedIntentionData } from './intentions/add-liquiditySingleSided';\nimport { ClaimRewardsIntention, ClaimRewardsIntentionData } from './intentions/claim-rewards';\nimport { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\nimport { StakeLiquidityIntention, StakeLiquidityIntentionData } from './intentions/stake-liquidity';\nimport { UnstakeLiquidityIntention, UnstakeLiquidityIntentionData } from './intentions/unstake-liquidity';\nimport { TransactionSubType } from './types';\nimport { SuiNetworks } from '@/types';\n\nexport type KRIYAIntention =\n | AddLiquidityIntention\n | AddLiquiditySingleSideIntention\n | ClaimRewardsIntention\n | RemoveLiquidityIntention\n | StakeLiquidityIntention\n | UnstakeLiquidityIntention;\n\nexport type KRIYAIntentionData =\n | AddLiquidityIntentionData\n | AddLiquiditySingleSidedIntentionData\n | ClaimRewardsIntentionData\n | RemoveLiquidityIntentionData\n | StakeLiquidityIntentionData\n | UnstakeLiquidityIntentionData\n\nexport class KRIYAAppHelper implements MSafeAppHelper<KRIYAIntentionData> {\n application = 'kriya';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: KRIYAIntentionData;\n }> {\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: KRIYAIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n\n }): Promise<TransactionBlock> {\n const { suiClient, account, network } = input;\n let intention: KRIYAIntention;\n switch (input.txSubType) {\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n break;\n case TransactionSubType.AddLiquiditySingleSided:\n intention = AddLiquiditySingleSideIntention.fromData(input.intentionData as AddLiquiditySingleSidedIntentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n break;\n case TransactionSubType.ClaimRewards:\n intention = ClaimRewardsIntention.fromData(input.intentionData as ClaimRewardsIntentionData);\n break;\n case TransactionSubType.StakeLiquidity:\n intention = StakeLiquidityIntention.fromData(input.intentionData as StakeLiquidityIntentionData);\n break;\n case TransactionSubType.UnstakeLiquidity:\n intention = UnstakeLiquidityIntention.fromData(input.intentionData as UnstakeLiquidityIntentionData);\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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\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\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) { }\n\n decode() {\n console.log('txb', this.txb);\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n if (this.isAddLiquiditySingleSidedTransaction()) {\n return this.decodeAddLiquiditySingleSided();\n }\n if (this.isClaimRewardsTransaction()) {\n return this.decodeClaimRewards();\n }\n if (this.isRemoveLiquidityTransaction()) {\n return this.decodeRemoveLiquidity();\n }\n if (this.isStakeLiquidityTransaction()) {\n return this.decodeStakeLiquidity();\n }\n if (this.isUnstakeLiquidityTransaction()) {\n return this.decodeUnstakeLiquidity();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::add_liquidity`);\n }\n\n private isAddLiquiditySingleSidedTransaction() {\n return (!!this.getMoveCallTransaction(`${config.packageId}::spot_dex::add_liquidity`) &&\n (!!this.getMoveCallTransaction(`${config.packageId}::spot_dex::${config.functions.swapX}`) || !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::${config.functions.swapY}`)));\n }\n\n private isClaimRewardsTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::claim`);\n }\n\n private isRemoveLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::remove_liquidity`);\n }\n\n private isStakeLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::stake`);\n }\n\n private isUnstakeLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::unstake`);\n }\n\n private decodeAddLiquidity(): DecodeResult {\n const objectId = this.helperLiquidityDex.getInputParam(0).value as string;\n const tokenXType = this.helperLiquidityDex.typeArg(0);\n const tokenYType = this.helperLiquidityDex.typeArg(1);\n const amountX = this.helperLiquidityDex.decodeInputU64String(4);\n const amountY = this.helperLiquidityDex.decodeInputU64String(3);\n const minAddAmountX = this.helperLiquidityDex.decodeInputU64String(6);\n const minAddAmountY = this.helperLiquidityDex.decodeInputU64String(5);\n const coinX = this.helperLiquidityDex.getInputParam(2).value as string;\n const coinY = this.helperLiquidityDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n amountX,\n amountY,\n minAddAmountX,\n minAddAmountY,\n coinX,\n coinY,\n },\n };\n }\n\n private decodeAddLiquiditySingleSided(): DecodeResult {\n const objectId = this.helperLiquidityDex.getInputParam(0).value as string;\n const tokenXType = this.helperLiquidityDex.typeArg(0);\n const tokenYType = this.helperLiquidityDex.typeArg(1);\n const inputCoinType = this.helperSwapDex.moveCall.target === `${config.packageId}::spot_dex::${config.functions.swapX}` ? tokenXType : tokenYType;\n const inputCoinAmount = this.helperSwapDex.decodeInputU64String(2);\n const inputCoin = this.helperSwapDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n inputCoinType,\n inputCoinAmount,\n inputCoin\n },\n };\n }\n\n private decodeRemoveLiquidity(): DecodeResult {\n const objectId = this.helperRemoveLiqDex.getInputParam(0).value as string;\n const tokenXType = this.helperRemoveLiqDex.typeArg(0);\n const tokenYType = this.helperRemoveLiqDex.typeArg(1);\n const amount = this.helperRemoveLiqDex.decodeInputU64String(2);\n const kriyaLpToken = this.helperRemoveLiqDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n amount,\n kriyaLpToken\n },\n };\n }\n\n private decodeClaimRewards(): DecodeResult {\n const objectId = this.helperFarmClaim.getInputParam(1).value as string;\n const positionObjectId = this.helperFarmClaim.getInputParam(2).value as string;\n const tokenXType = this.helperFarmClaim.typeArg(0);\n const tokenYType = this.helperFarmClaim.typeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimRewards,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n positionObjectId\n },\n };\n }\n\n private decodeStakeLiquidity(): DecodeResult {\n const objectId = this.helperFarmStake.getInputParam(1).value as string;\n const tokenXType = this.helperFarmStake.typeArg(0);\n const tokenYType = this.helperFarmStake.typeArg(1);\n const lpObject = this.helperFarmStake.getInputParam(2).value as string;\n const lockTime = this.helperFarmStake.decodeInputU64String(3);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeLiquidity,\n intentionData: {\n lpObject,\n lockTime,\n objectId,\n tokenXType,\n tokenYType\n },\n };\n }\n\n private decodeUnstakeLiquidity(): DecodeResult {\n const objectId = this.helperFarmUnstake.getInputParam(1).value as string;\n const positionObjectId = this.helperFarmUnstake.getInputParam(2).value as string;\n const tokenXType = this.helperFarmUnstake.typeArg(0);\n const tokenYType = this.helperFarmUnstake.typeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnstakeLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n positionObjectId\n },\n };\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 get helperRemoveLiqDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.packageId}::spot_dex::remove_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperLiquidityDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.packageId}::spot_dex::add_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperSwapDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' &&\n ((trans.target === `${config.packageId}::spot_dex::${config.functions.swapX}`) || (trans.target === `${config.packageId}::spot_dex::${config.functions.swapY}`)),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperFarmClaim() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::claim`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n private get helperFarmStake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::stake`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n private get helperFarmUnstake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::unstake`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\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 decodeInputU64String(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return 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","\nexport const config = {\n packageId: \"0xa0eba10b173538c8fecca1dff298e488402cc9ff374f8a12ca7758eebe830b66\",\n farmPackageId: \"0x88701243d0445aa38c0a13f02a9af49a58092dfadb93af9754edb41c52f40085\",\n functions: {\n swapX: \"swap_token_x\",\n swapY: \"swap_token_y\",\n }\n}","\nexport enum TransactionSubType {\n AddLiquidity = 'AddLiquidity',\n AddLiquiditySingleSided = 'AddLiquiditySingleSided',\n RemoveLiquidity = 'RemoveLiquidity',\n ClaimRewards = 'ClaimRewards',\n StakeLiquidity = 'StakeLiquidity',\n UnstakeLiquidity = 'UnstakeLiquidity'\n }\n \n export const Rpc =\"https://fullnode.mainnet.sui.io/\";","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk';\nimport { SuiNetworks } from '@/types';\n\nexport interface AddLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n amountX: string,\n amountY: string,\n minAddAmountX: string,\n minAddAmountY: string,\n coinX: string,\n coinY: string,\n}\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, amountX, amountY, minAddAmountX, minAddAmountY, coinX, coinY } = this.data;\n\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n dexSdk.addLiquidity(\n {\n objectId,\n tokenXType,\n tokenYType,\n isStable\n },\n BigInt(amountX),\n BigInt(amountY),\n BigInt(minAddAmountX),\n BigInt(minAddAmountY),\n coinX,\n coinY,\n // @ts-ignore\n txb,\n address\n ); \n\n return txb;\n }\n\n static fromData(data: AddLiquidityIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk';\nimport { SuiNetworks } from '@/types';\n\n\nexport interface AddLiquiditySingleSidedIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string\n inputCoinType: string,\n inputCoinAmount: string,\n inputCoin: string,\n}\n\nexport class AddLiquiditySingleSideIntention extends CoreBaseIntention<AddLiquiditySingleSidedIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquiditySingleSided;\n\n constructor(public override readonly data: AddLiquiditySingleSidedIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, inputCoinType, inputCoinAmount, inputCoin } = this.data;\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n dexSdk.addLiquiditySingleSided({\n objectId,\n tokenXType,\n tokenYType,\n isStable\n },\n inputCoinType,\n BigInt(inputCoinAmount),\n inputCoin,\n 1,\n // @ts-ignore\n txb,\n address,\n );\n return txb;\n }\n\n static fromData(data: AddLiquiditySingleSidedIntentionData) {\n return new AddLiquiditySingleSideIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface ClaimRewardsIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string\n positionObjectId: string\n}\n\nexport class ClaimRewardsIntention extends CoreBaseIntention<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(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { objectId, tokenXType, tokenYType, positionObjectId } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.claimTx(\n // @ts-ignore\n txb,\n farm,\n positionObjectId,\n address\n );\n\n return txb;\n }\n\n static fromData(data: ClaimRewardsIntentionData) {\n return new ClaimRewardsIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\nimport { SuiNetworks } from '@/types';\n\nexport interface RemoveLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n amount: string,\n kriyaLpToken: string,\n}\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, amount, kriyaLpToken } = this.data;\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n const pool = { objectId, tokenXType, tokenYType, isStable}\n dexSdk.removeLiquidity(\n pool,\n BigInt(amount),\n kriyaLpToken,\n // @ts-ignore\n txb,\n address\n );\n\n return txb;\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface StakeLiquidityIntentionData {\n lpObject: any,\n lockTime: string,\n objectId: string,\n tokenXType: string,\n tokenYType: string\n}\n\nexport class StakeLiquidityIntention extends CoreBaseIntention<StakeLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.StakeLiquidity;\n\n constructor(public override readonly data: StakeLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { lpObject, lockTime, objectId, tokenXType, tokenYType } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.stakeTx(\n // @ts-ignore\n txb,\n lpObject,\n Number(lockTime),\n farm,\n address\n );\n\n return txb;\n }\n\n static fromData(data: StakeLiquidityIntentionData) {\n return new StakeLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface UnstakeLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n positionObjectId: string,\n}\n\nexport class UnstakeLiquidityIntention extends CoreBaseIntention<UnstakeLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.UnstakeLiquidity;\n\n constructor(public override readonly data: UnstakeLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { objectId, tokenXType, tokenYType, positionObjectId } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.withdrawTx(\n // @ts-ignore\n txb,\n farm,\n positionObjectId,\n address\n );\n\n return txb;\n }\n\n static fromData(data: UnstakeLiquidityIntentionData) {\n return new UnstakeLiquidityIntention(data);\n }\n}\n"],"mappings":"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","names":["src_exports","__export","appHelpers","__toCommonJS","import_sui3_utils","import_sui3_utils","import_sort_keys_recursive","CoreBaseIntention","data","sortKeys","import_cetus_periphery_sdk","import_cetus_sui_clmm_sdk","clmmConfig","peripheryConfig","clmmConfigTestnet","peripheryConfigTestnet","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getAddLiquidityTxb","import_sui3_utils","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","CoreBaseIntention","data","input","account","network","txbParams","getClaimFeeAndMiningTxb","import_sui3_utils","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getDecreaseLiquidityTxb","import_sui3_utils","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","peripherySdk","getFarmingBatchHarvest","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingAddLiquidityTxb","import_sui3_utils","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingBatchHarvest","import_sui3_utils","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","import_sui3_utils","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","import_sui3_utils","FarmingHarvestIntention","_FarmingHarvestIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingHarvest","import_sui3_utils","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","import_sui3_utils","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","import_sui3_utils","FarmingStakeIntention","_FarmingStakeIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingStake","import_sui3_utils","FarmingUnstakeIntention","_FarmingUnstakeIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingUnstake","import_sui3_utils","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getIncreaseLiquidityTxb","import_sui3_utils","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getRemoveLiquidityTxb","import_sui3_utils","getXcetusConvertTxb","txbParams","account","network","getPeripherySdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusCancelRedeemTxb","import_sui3_utils","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","import_sui3_utils","XcetusConvertIntention","_XcetusConvertIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusConvertTxb","import_sui3_utils","XcetusRedeemIntention","_XcetusRedeemIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusRedeemTxb","import_sui3_utils","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","CoreBaseIntention","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","import_sui3_utils","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","SanityError","MPayError","msg","options","getAllFromIterator","it","res","val","PagedIterator","requester","EntryIterator","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","import_transactions","import_utils","import_luxon","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","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","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","InvalidStreamGroupError","MPayError","msg","context","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","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","import_sort_keys_recursive","BaseIntention","data","sortKeys","StreamIntention","BaseIntention","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","CoreBaseIntention","data","input","suiClient","account","import_sui3_utils","ObjectTransferIntention","_ObjectTransferIntention","CoreBaseIntention","data","input","suiClient","account","import_sui3_utils","import_transactions","PlainPayloadIntention","_PlainPayloadIntention","CoreBaseIntention","data","input","account","tb","CoreHelper","input","suiClient","account","intention","CoinTransferIntention","ObjectTransferIntention","PlainPayloadIntention","import_sui3_utils","updated","config","updatePackageId","data","res","packageId","e","config_default","import_sui3_utils","import_bcs","import_utils","Decoder","txb","target","trans","config_default","assetId","findPool","pool","claims","helper","MoveCallHelper","optionId","poolId","typeArguments","amount","moveCall","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","depositToken","txb","pool","coinObject","amount","config_default","withdrawToken","borrowToken","repayToken","claimReward","assetId","poolId","option","typeArguments","ClaimRewardIntention","_ClaimRewardIntention","CoreBaseIntention","data","claims","tx","claim","assetId","poolId","option","typeArguments","claimReward","config_default","import_transactions","EntryBorrowIntention","_EntryBorrowIntention","CoreBaseIntention","data","coinType","amount","tx","config_default","pool","borrowToken","import_transactions","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","config_default","toDeposit","depositToken","pool","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryRepayIntention","_EntryRepayIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","config_default","toDeposit","repayToken","pool","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryWithdrawIntention","_EntryWithdrawIntention","CoreBaseIntention","data","coinType","amount","tx","config_default","pool","withdrawToken","NAVIAppHelper","input","updatePackageId","transactionBlock","result","Decoder","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","ClaimRewardIntention","import_sui3_utils","import_transactions","import_utils","import_sort_keys_recursive","PlainTransactionApplication","PlainTransactionType","PlainTransactionHelper","PlainTransactionApplication","input","transactionBlock","suiClient","content","PlainTransactionType","account","txb","inspectResult","MSafeApps","apps","app","appName","import_sui3_utils","import_sui3_utils","import_bcs","import_utils","ADDRESSES_ID","PROTOCOL_OBJECT_ID","OLD_BORROW_INCENTIVE_PROTOCOL_ID","SCA_COIN_TYPE","SUPPORT_POOLS","SUPPORT_COLLATERALS","SUPPORT_SPOOLS","SUPPORT_SPOOLS_REWARDS","SUPPORT_BORROW_INCENTIVE_POOLS","coinDecimals","spoolRewardCoins","borrowIncentiveRewardCoins","coinIds","wormholeCoinIds","voloCoinIds","Decoder","txb","builder","target","trans","supplyMoveCall","stakeMoveCall","unstakeMoveCall","withdrawMoveCall","borrowMoveCall","lendingIncentive","borrowIncentiveV2","extendPeriod","stakeMoreSca","oldBorrowIncentive","OLD_BORROW_INCENTIVE_PROTOCOL_ID","stakeWithVeSca","veScaKey","obligationKey","obligationId","rewardCoinName","lockSca","unlockTime","amountFromSplitCoin","SplitCoinHelper","a","b","isHaveRedeem","oldUnstakeObligation","unstakeObligation","stakeObligation","isObligationLocked","isOldBorrowIncentive","operations","i","coinName","amount","stakeSpoolAccount","coinType","stakeAccountWithAmount","tx","stakeAccountId","findWithdrawWithNested","lendingReward","borrowRewardV2","borrowReward","stakeMarketCoinName","MoveCallHelper","moveCall","splitCoin","input","bcsType","bcsNums","_MoveCallHelper","argIndex","strVal","arg","bcsVal","index","import_transactions","import_utils","import_bignumber","config","ScallopAddress","params","id","auth","network","path","nestedAddressObj","key","address","keys","index","updatedAddressObj","addresses","targetNetwork","config","import_transactions","import_utils","import_utils","requireSender","txBlock","sender","checkLockSca","scaAmountOrCoin","lockPeriodInDays","newUnlockAtInSecondTimestamp","prevUnlockAtInSecondTimestamp","isInitialLock","isLockExpired","checkVesca","checkExtendLockPeriod","checkExtendLockAmount","scaAmount","checkRenewExpiredVeSca","import_utils","import_bignumber","parseOriginBorrowIncentiveAccountPoolPointData","originBorrowIncentiveAccountPoolPointData","parseOriginBorrowIncentiveAccountData","originBorrowIncentiveAccountData","acc","point","parsed","name","isMarketCoin","coinName","assetCoinName","SUPPORT_POOLS","SUPPORT_COLLATERALS","SUPPORT_SPOOLS_REWARDS","parseAssetSymbol","findClosestUnlockRound","unlockAtInSecondTimestamp","unlockDate","closestTwelveAM","now","ScallopUtils","params","instance","ScallopAddress","ADDRESSES_ID","force","address","coinName","isMarketCoin","assetCoinName","parseAssetSymbol","validCoinName","coinPackageId","coinIds","wormHolePckageIds","wormholeCoinIds","voloPckageIds","voloCoinIds","protocolObjectId","PROTOCOL_OBJECT_ID","coinType","type","coinTypeRegex","coinTypeMatch","isMarketCoinType","wormHoleCoinTypeMap","voloCoinTypeMap","marketCoinName","stakeMarketCoinName","spoolRewardCoins","borrowIncentiveCoinName","borrowIncentiveRewardCoins","coinDecimals","amount","ownerAddress","selectedCoins","totalAmount","hasNext","nextCursor","coins","a","b","i","coin","apr","compoundFrequency","apy","txBlock","coinObjectId","coinObjects","objectId","mergedCoin","sendCoin","extendLockPeriodInDay","unlockAtInSecondTimestamp","now","remainingLockPeriod","newUnlockAtInSecondTimestamp","lockPeriod","findClosestUnlockRound","import_transactions","import_bignumber","getObligations","query","ownerAddress","owner","protocolObjectId","PROTOCOL_OBJECT_ID","keyObjectsResponse","hasNextPage","nextCursor","paginatedKeyObjectsResponse","keyObjectIds","ref","id","keyObjects","obligations","i","keyId","content","fields","obligationId","locked","getObligationLocked","obligationObjectResponse","obligationLocked","getCoinAmounts","assetCoinNames","updatedAssetCoinNames","SUPPORT_POOLS","coinObjectsResponse","paginatedCoinObjectsResponse","assetCoinName","coinAmounts","response","object","coinObject","type","poolCoinName","BigNumber","getCoinAmount","coinType","coinAmount","getMarketCoinAmounts","marketCoinNames","updatedMarketCoinNames","marketCoinObjectsResponse","paginatedMarketCoinObjectsResponse","marketCoinName","marketCoinAmounts","marketCoinObject","getMarketCoinAmount","marketCoinType","marketCoinAmount","queryObligation","queryTarget","txBlock","import_utils","getStakeAccounts","query","ownerAddress","owner","spoolObjectId","stakeAccountType","stakeObjectsResponse","hasNextPage","nextCursor","paginatedStakeObjectsResponse","stakeAccounts","stakeMarketCoinTypes","types","stakeMarketCoinName","stakeCoinName","marketCoinType","updateTypes","newType","stakeObjectIds","ref","id","stakeObject","type","fields","stakePoolId","stakeType","staked","index","points","totalPoints","getStakePool","marketCoinName","poolId","stakePool","stakePoolObjectResponse","stakePoolObject","maxPoint","distributedPoint","pointPerPeriod","period","maxStake","totalStaked","createdAt","lastUpdate","getStakeRewardPool","stakeRewardPool","stakeRewardPoolObjectResponse","stakeRewardPoolObject","rewardPoolFields","ratioNumerator","ratioDenominator","rewards","claimedRewards","import_transactions","import_utils","import_bignumber","queryBorrowIncentiveAccounts","query","obligationId","sender","borrowIncentiveCoinNames","coinName","SUPPORT_BORROW_INCENTIVE_POOLS","queryPkgId","incentiveAccountsId","queryTarget","txBlock","borrowIncentiveAccountsQueryData","borrowIncentiveAccounts","accountData","parsedBorrowIncentiveAccount","parseOriginBorrowIncentiveAccountData","poolType","parsedCoinName","getPythPrice","query","assetCoinName","pythFeedObjectId","priceFeedObjectResponse","priceFeedPoolObject","fields","expoMagnitude","expoNegative","priceMagnitude","priceNegative","import_bignumber","getVescaKeys","query","ownerAddress","owner","veScaKeyType","keyObjectsResponse","hasNextPage","nextCursor","paginatedKeyObjectsResponse","objResponse","data","getVeScas","keyObjectId","veScas","i","veSca","getVeSca","veScaKeyId","tableId","veScaKeyIdValue","vesca","veScaDynamicFieldObject","dynamicFields","BigNumber","ScallopQuery","params","instance","ScallopAddress","ADDRESSES_ID","ScallopUtils","force","address","ownerAddress","getObligations","assetCoinNames","getCoinAmounts","assetCoinName","getCoinAmount","marketCoinNames","getMarketCoinAmounts","marketCoinName","getMarketCoinAmount","getPythPrice","getStakeAccounts","stakeMarketCoinName","stakeMarketCoinNames","SUPPORT_SPOOLS","stakePools","i","stakePool","getStakePool","stakeRewardPools","stakeRewardPool","getStakeRewardPool","obligationId","walletAddress","coinNames","queryBorrowIncentiveAccounts","obligation","queryObligation","collateralCoinTypes","collateral","debtCoinTypes","debt","coinType","ScallopBuilder","params","instance","ScallopAddress","ADDRESSES_ID","ScallopQuery","ScallopUtils","force","address","txBlock","assetCoinName","amount","sender","coinType","coins","takeCoin","leftCoin","marketCoinName","marketCoinType","import_utils","requireVeSca","params","builder","txBlock","veScaKey","veSca","getVeSca","sender","requireSender","veScas","getVeScas","getBindedObligationId","borrowIncentiveObjId","incentivePoolsId","veScaPkgId","client","incentivePoolsResponse","veScaBindTableId","keyType","veScaBindTableResponse","requireObligationInfo","obligationId","obligationKey","obligationLocked","getObligationLocked","obligations","getObligations","generateBorrowIncentiveNormalMethod","borrowIncentiveIds","OldBorrowIncentiveContract","veScaIds","rewardCoinName","rewardType","generateBorrowIncentiveQuickMethod","normalMethod","obligation","obligationArg","obligationtKeyArg","unstakeObligationBeforeStake","txn","OLD_BORROW_INCENTIVE_PROTOCOL_ID","bindedObligationId","import_utils","import_utils","import_axios","PYTH_ENDPOINTS","import_bcs","import_utils","MAX_ARGUMENT_SIZE","PythClient","provider","pythStateId","wormholeStateId","result","objectId","state","vaas","tx","wormholePackageId","verifiedVaas","vaa","verifiedVaa","updates","feedIds","packageId","priceUpdatesHotPotato","priceInfoObjects","baseUpdateFee","coins","coinId","i","priceInfoObjectId","feedId","normalizedFeedId","tableId","fieldType","type","accumulatorMessage","vaaSizeOffset","vaaSize","vaaOffset","getLatestVaas","endpoint","priceIds","axios","vaa","updateOracles","builder","txBlock","assetCoinNames","coinNames","SUPPORT_POOLS","SUPPORT_COLLATERALS","rules","pythClient","PythClient","assetCoinName","endpoints","PYTH_ENDPOINTS","priceUpdateData","e","updateAssetCoinNames","updateOracle","coinType","updatePrice","xOraclePackageId","xOracleId","pythPackageId","pythRegistryId","pythStateId","pythFeedObjectId","switchboardPackageId","switchboardRegistryId","switchboardAggregatorId","supraPackageId","supraRegistryId","supraHolderId","request","priceUpdateRequest","updatePythPrice","updateSwitchboardPrice","updateSupraPrice","confirmPriceUpdateRequest","packageId","validXOracleId","target","typeArgs","holderId","registryId","validHolderId","validRegistryId","aggregatorId","validAggregatorId","stateId","feedObjectId","validRequest","validStateId","validFeedObjectId","requireObligationInfo","params","txBlock","builder","obligationId","obligationKey","sender","requireSender","obligations","getObligations","generateCoreNormalMethod","coreIds","obligation","obligationHotPotato","coin","collateralCoinName","coinType","amount","poolCoinName","marketCoin","loan","generateCoreQuickMethod","normalMethod","obligationArg","suiCoin","leftCoin","takeCoin","obligationInfo","updateCoinNames","updateOracles","walletAddress","marketCoinName","assetCoinNames","import_utils","requireStakeAccountIds","params","builder","txBlock","stakeMarketCoinName","stakeAccountId","sender","requireSender","stakeAccounts","getStakeAccounts","account","requireStakeAccounts","generateSpoolNormalMethod","spoolIds","marketCoinType","stakePoolId","stakeAccount","coin","amount","rewardPoolId","rewardCoinName","spoolRewardCoins","rewardCoinType","generateSpoolQuickMethod","normalMethod","amountOrMarketCoin","stakeAccountIds","coins","takeCoin","leftCoin","remainingAmount","stakeMarketCoins","i","amountToUnstake","marketCoin","rewardCoins","accountId","rewardCoin","import_utils","generateNormalVeScaMethod","builder","txBlock","veScaIds","scaCoin","unlockAtInSecondTimestamp","veScaKey","newUnlockAtInSecondTimestamp","generateQuickVeScaMethod","normalMethod","amountOrCoin","lockPeriodInDays","autoCheck","sender","requireSender","veSca","requireVeSca","transferObjects","coins","SCA_COIN_TYPE","takeCoin","leftCoin","newUnlockAt","checkLockSca","isInitialLock","isLockExpired","unlockedSca","checkExtendLockPeriod","scaAmount","checkExtendLockAmount","scaCoins","checkRenewExpiredVeSca","checkVesca","sca","ScallopClient","params","instance","ScallopAddress","ADDRESSES_ID","ScallopQuery","ScallopUtils","ScallopBuilder","force","ownerAddress","owner","stakeMarketCoinName","walletAddress","txBlock","coreQuickMethod","generateCoreQuickMethod","sender","collateralCoinName","amount","obligationId","quickMethod","obligations","specificObligationId","obligation","obligationKey","hotPotato","collateralCoin","poolCoinName","marketCoin","coin","borrowIncentiveQuickMethod","generateBorrowIncentiveQuickMethod","availableStake","SUPPORT_BORROW_INCENTIVE_POOLS","veScaKey","marketCoinName","spoolQuickMethod","generateSpoolQuickMethod","stakeAccount","stakeAccountId","SUPPORT_SPOOLS","stakeAccounts","targetStakeAccount","account","unstakeAccount","withdrawCoins","i","wdScoin","wdCoin","marketCoins","lendingIncentive","borrowIncentiveV2","borrowIncentive","borrowIncentiveRewarad","rewardCoins","rewardCoin","rewardCoinName","obligationKeyId","isObligationLocked","isOldBorrowIncentive","lockPeriod","vescaKey","vescaQuickMethod","generateQuickVeScaMethod","coins","SCA_COIN_TYPE","takeCoin","leftCoin","newVescaKey","lockPeriodInDays","isHaveRedeem","redeem","accountPoint","poolPoint","borrowAmount","BigNumber","increasePointRate","BorrowIntention","_BorrowIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","BorrowWithBoostIntention","_BorrowWithBoostIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ClaimIncentiveRewardIntention","_ClaimIncentiveRewardIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","DepositCollateralIntention","_DepositCollateralIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ExtendPeriodAndStakeMoreIntention","_ExtendPeriodAndStakeMoreIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ExtendStakePeriodIntention","_ExtendStakePeriodIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","MigrateAndClaimIntention","_MigrateAndClaimIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","OpenObligationIntention","_OpenObligationIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","RedeemScaIntention","_RedeemScaIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","RenewExpStakePeriodIntention","_RenewExpStakePeriodIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","RepayIntention","_RepayIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","StakeScaIntention","_StakeScaIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","StakeSpoolIntention","_StakeSpoolIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","SupplyAndStakeLendingIntention","_SupplyAndStakeLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","SupplyLendingIntention","_SupplyLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","UnstakeSpoolIntention","_UnstakeSpoolIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","WithdrawAndUnstakeLendingIntention","_WithdrawAndUnstakeLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","WithdrawCollateralIntention","_WithdrawCollateralIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","WithdrawLendingIntention","_WithdrawLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","WithdrawStakedScaIntention","_WithdrawStakedScaIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ScallopAppHelper","input","builder","ScallopBuilder","transactionBlock","result","Decoder","suiClient","account","network","intention","SupplyLendingIntention","WithdrawLendingIntention","BorrowIntention","RepayIntention","DepositCollateralIntention","WithdrawCollateralIntention","OpenObligationIntention","StakeSpoolIntention","UnstakeSpoolIntention","ClaimIncentiveRewardIntention","BorrowWithBoostIntention","StakeScaIntention","ExtendStakePeriodIntention","ExtendPeriodAndStakeMoreIntention","RenewExpStakePeriodIntention","WithdrawStakedScaIntention","SupplyAndStakeLendingIntention","WithdrawAndUnstakeLendingIntention","RedeemScaIntention","MigrateAndClaimIntention","import_sui3_utils","import_turbos_clmm_sdk","import_sui3_utils","import_bcs","import_utils","prixConfig","deepbookConfig","import_turbos_clmm_sdk","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","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","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","import_turbos_clmm_sdk","BurnIntention","_BurnIntention","CoreBaseIntention","data","input","turbosSdk","pool","nft","txb","import_turbos_clmm_sdk","CollectFeeIntention","_CollectFeeIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","import_turbos_clmm_sdk","CollectRewardIntention","_CollectRewardIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","nft","rewardAmounts","deadline","txb","import_turbos_clmm_sdk","CreatePoolIntention","_CreatePoolIntention","CoreBaseIntention","data","input","turbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","import_turbos_clmm_sdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","import_turbos_clmm_sdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","import_transactions","import_utils","PrixClaimIntention","_PrixClaimIntention","CoreBaseIntention","data","input","txb","prixConfig","import_transactions","PrixJoinIntention","_PrixJoinIntention","CoreBaseIntention","data","input","txb","prixConfig","import_transactions","import_turbos_clmm_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","txb","import_turbos_clmm_sdk","SwapIntention","_SwapIntention","CoreBaseIntention","data","input","turbosSdk","routes","coinTypeA","coinTypeB","address","amountA","amountB","slippage","amountSpecifiedIsInput","deadline","txb","import_turbos_clmm_sdk","import_utils","import_transactions","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","CoreBaseIntention","data","input","turbosSdk","swap_exact_base_for_quote","import_turbos_clmm_sdk","SwapExactQuoteForBaseIntention","_SwapExactQuoteForBaseIntention","CoreBaseIntention","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","CoreBaseIntention","data","input","tx","ticketId","config_default","import_transactions","StakeIntention","_StakeIntention","CoreBaseIntention","data","input","tx","amount","coin","config_default","import_transactions","UnStakeIntention","_UnStakeIntention","CoreBaseIntention","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_sui3_utils","import_bcs","import_utils","config","Rpc","Decoder","txb","config","objectId","tokenXType","tokenYType","amountX","amountY","minAddAmountX","minAddAmountY","coinX","coinY","inputCoinType","inputCoinAmount","inputCoin","amount","kriyaLpToken","positionObjectId","lpObject","lockTime","target","trans","moveCall","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","import_kriya_dex_sdk","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","amountX","amountY","minAddAmountX","minAddAmountY","coinX","coinY","txb","isStable","import_transactions","import_kriya_dex_sdk","AddLiquiditySingleSideIntention","_AddLiquiditySingleSideIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","inputCoinType","inputCoinAmount","inputCoin","txb","isStable","import_transactions","import_kriya_dex_sdk","ClaimRewardsIntention","_ClaimRewardsIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","objectId","tokenXType","tokenYType","positionObjectId","farm","txb","import_transactions","import_kriya_dex_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","amount","kriyaLpToken","txb","isStable","pool","import_transactions","import_kriya_dex_sdk","StakeLiquidityIntention","_StakeLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","lpObject","lockTime","objectId","tokenXType","tokenYType","farm","txb","import_transactions","import_kriya_dex_sdk","UnstakeLiquidityIntention","_UnstakeLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","objectId","tokenXType","tokenYType","positionObjectId","farm","txb","KRIYAAppHelper","input","transactionBlock","result","Decoder","suiClient","account","network","intention","AddLiquidityIntention","AddLiquiditySingleSideIntention","RemoveLiquidityIntention","ClaimRewardsIntention","StakeLiquidityIntention","UnstakeLiquidityIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper","KRIYAAppHelper","ScallopAppHelper","VoloAppHelper"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/apps/cetus/helper.ts","../src/apps/cetus/intentions/add-liquidity.ts","../src/apps/msafe-core/intention.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/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/kriya/helper.ts","../src/apps/kriya/decoder.ts","../src/apps/kriya/config.ts","../src/apps/kriya/types.ts","../src/apps/kriya/intentions/add-liquidity.ts","../src/apps/kriya/intentions/add-liquiditySingleSided.ts","../src/apps/kriya/intentions/claim-rewards.ts","../src/apps/kriya/intentions/remove-liquidity.ts","../src/apps/kriya/intentions/stake-liquidity.ts","../src/apps/kriya/intentions/unstake-liquidity.ts","../src/apps/mpay/cancel-stream.ts","../src/apps/mpay/config/dev.json","../src/apps/mpay/config/prod.json","../src/apps/mpay/common/env.ts","../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/error/SanityError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.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/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/stream/helper.ts","../src/apps/mpay/error/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/interface.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/msafe-core/plain-payload.ts","../src/apps/navi/helper.ts","../src/apps/navi/config.ts","../src/apps/navi/decoder.ts","../src/apps/navi/intentions/claim-reward.ts","../src/apps/navi/api/incentiveV2.ts","../src/apps/navi/intentions/entry-borrow.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/plain-transaction/helper.ts","../src/apps/registry.ts","../src/apps/scallop/helper.ts","../src/apps/scallop/decoder.ts","../src/apps/scallop/constants/common.ts","../src/apps/scallop/constants/enum.ts","../src/apps/scallop/models/scallopClient.ts","../src/apps/scallop/config.ts","../src/apps/scallop/models/scallopAddress.ts","../src/apps/scallop/models/scallopBuilder.ts","../src/apps/scallop/models/scallopUtils.ts","../src/apps/scallop/utils/builder.ts","../src/apps/scallop/utils/query.ts","../src/apps/scallop/utils/util.ts","../src/apps/scallop/queries/coreQuery.ts","../src/apps/scallop/queries/spoolQuery.ts","../src/apps/scallop/queries/borrowIncentiveQuery.ts","../src/apps/scallop/queries/priceQuery.ts","../src/apps/scallop/queries/vescaQuery.ts","../src/apps/scallop/models/scallopQuery.ts","../src/apps/scallop/builders/borrowIncentiveBuilder.ts","../src/apps/scallop/builders/coreBuilder.ts","../src/apps/scallop/builders/oracle.ts","../src/apps/scallop/constants/pyth.ts","../src/apps/scallop/models/pythClient.ts","../src/apps/scallop/builders/spoolBuilder.ts","../src/apps/scallop/builders/vescaBuilder.ts","../src/apps/scallop/intentions/borrow.ts","../src/apps/scallop/intentions/borrow-with-boost.ts","../src/apps/scallop/intentions/claim-incentive-reward.ts","../src/apps/scallop/intentions/deposit-collateral.ts","../src/apps/scallop/intentions/extend-period-and-stake-more.ts","../src/apps/scallop/intentions/extend-stake-period.ts","../src/apps/scallop/intentions/migrate-and-claim.ts","../src/apps/scallop/intentions/open-obligation.ts","../src/apps/scallop/intentions/redeem-sca.ts","../src/apps/scallop/intentions/renew-exp-stake-period.ts","../src/apps/scallop/intentions/repay.ts","../src/apps/scallop/intentions/stake-sca.ts","../src/apps/scallop/intentions/stake-spool.ts","../src/apps/scallop/intentions/supply-and-stake-lending.ts","../src/apps/scallop/intentions/supply-lending.ts","../src/apps/scallop/intentions/unstake-spool.ts","../src/apps/scallop/intentions/withdraw-and-unstake-lending.ts","../src/apps/scallop/intentions/withdraw-collateral.ts","../src/apps/scallop/intentions/withdraw-lending.ts","../src/apps/scallop/intentions/withdraw-staked-sca.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"],"sourcesContent":["import { CetusHelper } from '@/apps/cetus/helper';\nimport { KRIYAAppHelper } from '@/apps/kriya/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 { TURBOSAppHelper } from '@/apps/turbos/helper';\nimport { VoloAppHelper } from '@/apps/volo/helper';\n\nexport const appHelpers = new MSafeApps([\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]);\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 { MSafeAppHelper } from '@/apps/interface';\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 { 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\nexport class CetusHelper implements MSafeAppHelper<CetusIntentionData> {\n application = 'cetus';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount } & {\n action?: string;\n txbParams?: any;\n },\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<TransactionBlock> {\n const { suiClient, account, network } = input;\n console.log('helper build input: ', input);\n console.log('helper build input.intentionData: ', input.intentionData);\n console.log('helper build input.intentionData JSON: ', JSON.stringify(input.intentionData));\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 default:\n throw new Error('not implemented');\n }\n console.log('helper build intention: ', intention);\n console.log('helper build account: ', account);\n console.log('helper build network: ', network);\n return intention.build({ suiClient, account, network });\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getAddLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { 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 sortKeys from 'sort-keys-recursive';\n\nimport { TransactionIntention } from '@/apps/interface';\nimport { SuiNetworks } from '@/types';\n\nexport abstract class CoreBaseIntention<D> implements TransactionIntention<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 abstract build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock>;\n}\n","import { CetusPeripherySDK, SdkOptions as PeripherySdkOptions } from '@cetusprotocol/cetus-periphery-sdk';\nimport { CetusClmmSDK, SdkOptions } from '@cetusprotocol/cetus-sui-clmm-sdk';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '../types';\n\nexport const clmmConfig: SdkOptions = {\n fullRpcUrl: 'https://fullnode.mainnet.sui.io/',\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: '0xc33c3e937e5aa2009cc0c3fdb3f345a0c3193d4ee663ffc601fe8b894fbc4ba6',\n version: 4,\n config: {\n pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n },\n },\n integrate: {\n package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n published_at: '0xd43348b8879c1457f882b02555ba862f2bc87bcc31b16294ca14a82f608875d2',\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: '0xcec352932edc6663a118e8d64ed54da6b8107e8719603bf728f80717592cd9e8',\n version: 3,\n config: {\n dividend_manager_id: '0x721c990bfc031d074341c6059a113a59c1febfbd2faeb62d49dcead8408fa6b5',\n dividend_admin_id: '',\n dividend_settle_id: '',\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: '0xd3453d9be7e35efe222f78a810bb3af1859fd1600926afced8b4936d825c9a05',\n version: 1,\n config: {\n admin_cap_id: '0x78a42978709c4032fab7b33b782b5bcef64c1c6603250bf23644650b72144375',\n vaults_manager_id: '0x25b82dd2f5ee486ed1c8af144b89a8931cd9c29dee3a86a1bfe194fdea9d04a6',\n vaults_pool_handle: '0x9036bcc5aa7fd2cceec1659a6a1082871f45bc400c743f50063363457d1738bd',\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: '0x11ea791d82b5742cc8cab0bf7946035c97d9001d7c3803a93f119753da66f526',\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 haedal: {\n package_id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n published_at: '0x1d56b8ec33c3fae897eb7bb1acb79914e8152faed614868928e684c25c8b198d',\n version: 1,\n config: {\n support_stakings: [\n {\n staking_id: '0x47b224762220393057ebf4f70501b6e657c3e56684737568439a04f80849b2ca',\n from_coin_type: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n to_coin_type: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI',\n },\n ],\n },\n },\n};\n\nexport const clmmConfigTestnet: SdkOptions = {\n fullRpcUrl: 'https://fullnode.testnet.sui.io/',\n simulationAccount: {\n address: '0xcd0247d0b67e53dde69b285e7a748e3dc390e8a5244eb9dd9c5c53d95e4cf0aa',\n },\n cetus_config: {\n package_id: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n published_at: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n config: {\n coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n admin_cap_id: '0x1a496f6c67668eb2c27c99e07e1d61754715c1acf86dac45020c886ac601edb8',\n global_config_id: '0xe1f3db327e75f7ec30585fa52241edf66f7e359ef550b533f89aa1528dd1be52',\n coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n },\n },\n clmm_pool: {\n package_id: '0x0868b71c0cba55bf0faf6c40df8c179c67a4d0ba0e79965b68b3d72d7dfbf666',\n published_at: '0x1c29d658882c40eeb39a8bb8fe58f71a216a918acb3e3eb3b47d24efd07257f2',\n config: {\n pools_id: '0xc090b101978bd6370def2666b7a31d7d07704f84e833e108a969eda86150e8cf',\n global_config_id: '0x6f4149091a5aea0e818e7243a13adcfb403842d670b9a2089de058512620687a',\n global_vault_id: '0xf3114a74d54cbe56b3e68f9306661c043ede8c6615f0351b0c3a93ce895e1699',\n admin_cap_id: '',\n },\n },\n integrate: {\n package_id: '0x8627c5cdcd8b63bc3daa09a6ab7ed81a829a90cafce6003ae13372d611fbb1a9',\n published_at: '0xf1a5d0c5b0593e41d13f9684ca91365bdfe54a98836c1d33c90e361a031fac74',\n version: 6,\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0xa34ffca2c6540e1ca9e53963ab43e7b1eed7b82e37696c743bb7c6179c15dfa6',\n published_at: '0xa34ffca2c6540e1ca9e53963ab43e7b1eed7b82e37696c743bb7c6179c15dfa6',\n },\n aggregatorUrl: 'https://api-sui.devcetus.com/router',\n swapCountUrl: 'https://api-sui.devcetus.com/v2/sui/swap/count',\n};\n\nexport const peripheryConfigTestnet: PeripherySdkOptions = {\n launchpad: {\n package_id: '0x3beee8416089a5cbff9cfd5c0a2ce2937b0452dc7e2a3ab4dc431c7be05c2335',\n published_at: '0x3beee8416089a5cbff9cfd5c0a2ce2937b0452dc7e2a3ab4dc431c7be05c2335',\n config: {\n pools_id: '0xccc10403ab3da4ae943847908e0e674fe1fdab81c6383e4c6dcd0eea0edade3d',\n admin_cap_id: '0x8a72713049dbcfc40902ff209dc5e6066fe455d152baa235957c84d7a3b875ed',\n config_cap_id: '0x16492b4252b01debb60f8a825334020d7fdb9d895b52f8139c98618de30817fc',\n },\n },\n ido: {\n package_id: '0x1352bf18ef20458f7cc773852d4a90b240015a6a54479dda3a1debfc500bf044',\n published_at: '0xbd09a0889ea9970b821512428bab3e2fd01e16809a90a325cd3b3d3573eab6a4',\n config: {\n pools_id: '0x346bee25ab4d15bcfa9484ef5ebd4d7c94eb665ebaa745ff4094936a7f59a8b1',\n admin_cap_id: '0xc1bb19a24d3bb65dfd4f3835637b63347c223c67cde4b0888f1a857974f33cbb',\n package_version_id: '0x3ccf1b38e3259e638b980d4e6b49eac8c5aa94d3cb2ace5e75f0a551c8e67e5e',\n },\n },\n xcetus: {\n package_id: '0xdebaab6b851fd3414c0a62dbdf8eb752d6b0d31f5cfce5e38541bc6c6daa8966',\n published_at: '0xdebaab6b851fd3414c0a62dbdf8eb752d6b0d31f5cfce5e38541bc6c6daa8966',\n config: {\n xcetus_manager_id: '0x3be34cbad122c8b100ed7157d762b9610e68b3c65734e08bc3c3baf857da807d',\n lock_manager_id: '0x7c67e805182e3fecd098bd68a6b06c317f28f8c6249bd771e07904a10b424e60',\n lock_handle_id: '0xc5f3bbfefe9a45c13da7a34bc72cac122ee45d633690476a8ac56bd2c4e78c86',\n },\n },\n xcetus_dividends: {\n package_id: '0x20d948d640edd0c749f533d41efc5f843f212d441220324ad7959c6e1d281828',\n published_at: '0x20d948d640edd0c749f533d41efc5f843f212d441220324ad7959c6e1d281828',\n config: {\n dividend_manager_id: '0x13b7facb704fae1d199ff0038b8acabc253415a77d142b39189dee97d457e442',\n dividend_admin_id: '0x5eb78463007422d4130b21f61c180bcd190819b7792f56e00a61df3b8fb928ef',\n dividend_settle_id: '0x495095e13a170ff494d242ae44ac2c7453011ca6c33cff27498010105e10e4b4',\n },\n },\n cetus_faucet: {\n package_id: '0x1a69aee6be709054750949959a67aedbb4200583b39586d5e3eabe57f40012c7',\n published_at: '0x1a69aee6be709054750949959a67aedbb4200583b39586d5e3eabe57f40012c7',\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: '0x25cff94bdb454bae6a5565d09047bfe2b230025ef3bd2199622ec48d854b86b9',\n published_at: '0x25cff94bdb454bae6a5565d09047bfe2b230025ef3bd2199622ec48d854b86b9',\n config: {\n admin_cap_id: '0x9b2d6f5be2650d16d27cd630c4539a76d7793970343ed3cbb023e13f1637c07c',\n vaults_manager_id: '0xc0a1a937df08880e395d85014ff40c74f13abe7a53abdbffea36f51adaaaf79e',\n vaults_pool_handle: '0x3ab02203de753de9c8198cc0ce7594dc960878f2c34c5c5a4b7742082241860a',\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: '0xfa0d98e99c1dbdbea1b0fe089fa93ebab40a7719ae4160c42cc78ebfe029fda0',\n published_at: '0xfa0d98e99c1dbdbea1b0fe089fa93ebab40a7719ae4160c42cc78ebfe029fda0',\n config: {\n global_config_id: '0x5082c7a5ee9a758025d7b0a5e8aa08b56625c7cd535b8909d2b7993991e229cc',\n rewarder_manager_id: '0xe789e092dbd9dceadbe89350c4761a6f2e11647aab97f09746a01b151926cc0e',\n rewarder_manager_handle: '0x7e7dd42392b5d82564dc9ad5093a111c5f0598cc9f806cff257d7dacb71f7837',\n admin_cap_id: '0x4ec248bca2d1fc05f39fd7491ab490464a46d128624caa4d3c2a66d957ef40b0',\n },\n },\n haedal: {\n package_id: '0xac2afb455cbcdc2ff1a2e9bbb8aa4ccb4506a544b08c740886892a5cdf92f472',\n published_at: '0x9dac9c5770e5f930d2223ff68782958701acfaee9337e8d8363978ce7670dffb',\n config: {\n support_stakings: [\n {\n staking_id: '0x6e384d2da5b040b27f973155e25bbe4beb0ad5ca8ee0a36e20dff356094c9fc0',\n from_coin_type: '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n to_coin_type: '0xac2afb455cbcdc2ff1a2e9bbb8aa4ccb4506a544b08c740886892a5cdf92f472::hasui::HASUI',\n },\n ],\n },\n },\n};\n\nexport const getClmmSdk = (network: SuiNetworks, account: WalletAccount) => {\n const config = network === 'sui:mainnet' ? clmmConfig : clmmConfigTestnet;\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 = network === 'sui:mainnet' ? peripheryConfig : peripheryConfigTestnet;\n const peripherySdk = new CetusPeripherySDK(config, clmmSdk);\n return peripherySdk;\n};\n","import { TransactionBlock } from '@mysten/sui.js/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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const clmmSdk = getClmmSdk(network, account);\n const txb: TransactionBlock = await clmmSdk.Rewarder.collectRewarderTransactionPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getClaimFeeAndMiningTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class ClaimFeeAndMiningIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getDecreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class DecreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingAddLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingAddLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { TransactionBlock } from '@mysten/sui.js/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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n console.log('getFarmingHarvest txbParams: ', txbParams);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const params: any = Object.values(txbParams);\n console.log('getFarmingBatchHarvest params: ', params);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = 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<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.Farms.withdrawPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingBatchHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingBatchHarvestIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingClaimFeeAndRewardTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingClaimFeeAndRewardIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingDecreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingDecreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingHarvest } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingHarvestIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingIncreaseLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingIncreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingRemoveLiquidityTxb } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingRemoveLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingStake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingStakeIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getFarmingUnstake } from '../api/farming';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class FarmingUnstakeIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getIncreaseLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class IncreaseLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getRemoveLiquidityTxb } from '../api/position';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusCancelRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusCancelIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { getPeripherySdk } from './config';\n\nexport const getXcetusConvertTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.convertPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemLockTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemLockPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusClaimingStakeRewardsTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemDividendV2Payload(\n txbParams.venft_id,\n txbParams.bonus_types,\n txbParams.xTokenType,\n );\n return txb;\n};\n\nexport const getXcetusCancelRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.cancelRedeemPayload(txbParams);\n return txb;\n};\n\nexport const getXcetusRedeemTxb = async (\n txbParams: any,\n account: WalletAccount,\n network: SuiNetworks,\n): Promise<TransactionBlock> => {\n const peripherySdk = getPeripherySdk(network, account);\n const txb: TransactionBlock = await peripherySdk.XCetusModule.redeemPayload(txbParams);\n return txb;\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusClaimingStakeRewardsTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusClaimingStakeRewardsIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusConvertTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusConvertIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusRedeemTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusRedeemIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { getXcetusRedeemLockTxb } from '../api/xcetus';\nimport { CetusIntentionData, TransactionSubType, SuiNetworks } from '../types';\n\nexport class XcetusRedeemLockIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\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 { 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 { MSafeAppHelper } from '../interface';\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention, AddLiquidityIntentionData } from './intentions/add-liquidity';\nimport { AddLiquiditySingleSideIntention, AddLiquiditySingleSidedIntentionData } from './intentions/add-liquiditySingleSided';\nimport { ClaimRewardsIntention, ClaimRewardsIntentionData } from './intentions/claim-rewards';\nimport { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\nimport { StakeLiquidityIntention, StakeLiquidityIntentionData } from './intentions/stake-liquidity';\nimport { UnstakeLiquidityIntention, UnstakeLiquidityIntentionData } from './intentions/unstake-liquidity';\nimport { TransactionSubType } from './types';\nimport { SuiNetworks } from '@/types';\n\nexport type KRIYAIntention =\n | AddLiquidityIntention\n | AddLiquiditySingleSideIntention\n | ClaimRewardsIntention\n | RemoveLiquidityIntention\n | StakeLiquidityIntention\n | UnstakeLiquidityIntention;\n\nexport type KRIYAIntentionData =\n | AddLiquidityIntentionData\n | AddLiquiditySingleSidedIntentionData\n | ClaimRewardsIntentionData\n | RemoveLiquidityIntentionData\n | StakeLiquidityIntentionData\n | UnstakeLiquidityIntentionData\n\nexport class KRIYAAppHelper implements MSafeAppHelper<KRIYAIntentionData> {\n application = 'kriya';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: KRIYAIntentionData;\n }> {\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: KRIYAIntentionData;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n\n }): Promise<TransactionBlock> {\n const { suiClient, account, network } = input;\n let intention: KRIYAIntention;\n switch (input.txSubType) {\n case TransactionSubType.AddLiquidity:\n intention = AddLiquidityIntention.fromData(input.intentionData as AddLiquidityIntentionData);\n break;\n case TransactionSubType.AddLiquiditySingleSided:\n intention = AddLiquiditySingleSideIntention.fromData(input.intentionData as AddLiquiditySingleSidedIntentionData);\n break;\n case TransactionSubType.RemoveLiquidity:\n intention = RemoveLiquidityIntention.fromData(input.intentionData as RemoveLiquidityIntentionData);\n break;\n case TransactionSubType.ClaimRewards:\n intention = ClaimRewardsIntention.fromData(input.intentionData as ClaimRewardsIntentionData);\n break;\n case TransactionSubType.StakeLiquidity:\n intention = StakeLiquidityIntention.fromData(input.intentionData as StakeLiquidityIntentionData);\n break;\n case TransactionSubType.UnstakeLiquidity:\n intention = UnstakeLiquidityIntention.fromData(input.intentionData as UnstakeLiquidityIntentionData);\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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\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\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) { }\n\n decode() {\n console.log('txb', this.txb);\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n if (this.isAddLiquiditySingleSidedTransaction()) {\n return this.decodeAddLiquiditySingleSided();\n }\n if (this.isClaimRewardsTransaction()) {\n return this.decodeClaimRewards();\n }\n if (this.isRemoveLiquidityTransaction()) {\n return this.decodeRemoveLiquidity();\n }\n if (this.isStakeLiquidityTransaction()) {\n return this.decodeStakeLiquidity();\n }\n if (this.isUnstakeLiquidityTransaction()) {\n return this.decodeUnstakeLiquidity();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::add_liquidity`);\n }\n\n private isAddLiquiditySingleSidedTransaction() {\n return (!!this.getMoveCallTransaction(`${config.packageId}::spot_dex::add_liquidity`) &&\n (!!this.getMoveCallTransaction(`${config.packageId}::spot_dex::${config.functions.swapX}`) || !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::${config.functions.swapY}`)));\n }\n\n private isClaimRewardsTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::claim`);\n }\n\n private isRemoveLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.packageId}::spot_dex::remove_liquidity`);\n }\n\n private isStakeLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::stake`);\n }\n\n private isUnstakeLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.farmPackageId}::farm::unstake`);\n }\n\n private decodeAddLiquidity(): DecodeResult {\n const objectId = this.helperLiquidityDex.getInputParam(0).value as string;\n const tokenXType = this.helperLiquidityDex.typeArg(0);\n const tokenYType = this.helperLiquidityDex.typeArg(1);\n const amountX = this.helperLiquidityDex.decodeInputU64String(4);\n const amountY = this.helperLiquidityDex.decodeInputU64String(3);\n const minAddAmountX = this.helperLiquidityDex.decodeInputU64String(6);\n const minAddAmountY = this.helperLiquidityDex.decodeInputU64String(5);\n const coinX = this.helperLiquidityDex.getInputParam(2).value as string;\n const coinY = this.helperLiquidityDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n amountX,\n amountY,\n minAddAmountX,\n minAddAmountY,\n coinX,\n coinY,\n },\n };\n }\n\n private decodeAddLiquiditySingleSided(): DecodeResult {\n const objectId = this.helperLiquidityDex.getInputParam(0).value as string;\n const tokenXType = this.helperLiquidityDex.typeArg(0);\n const tokenYType = this.helperLiquidityDex.typeArg(1);\n const inputCoinType = this.helperSwapDex.moveCall.target === `${config.packageId}::spot_dex::${config.functions.swapX}` ? tokenXType : tokenYType;\n const inputCoinAmount = this.helperSwapDex.decodeInputU64String(2);\n const inputCoin = this.helperSwapDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n inputCoinType,\n inputCoinAmount,\n inputCoin\n },\n };\n }\n\n private decodeRemoveLiquidity(): DecodeResult {\n const objectId = this.helperRemoveLiqDex.getInputParam(0).value as string;\n const tokenXType = this.helperRemoveLiqDex.typeArg(0);\n const tokenYType = this.helperRemoveLiqDex.typeArg(1);\n const amount = this.helperRemoveLiqDex.decodeInputU64String(2);\n const kriyaLpToken = this.helperRemoveLiqDex.getInputParam(1).value as string;\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.RemoveLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n amount,\n kriyaLpToken\n },\n };\n }\n\n private decodeClaimRewards(): DecodeResult {\n const objectId = this.helperFarmClaim.getInputParam(1).value as string;\n const positionObjectId = this.helperFarmClaim.getInputParam(2).value as string;\n const tokenXType = this.helperFarmClaim.typeArg(0);\n const tokenYType = this.helperFarmClaim.typeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimRewards,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n positionObjectId\n },\n };\n }\n\n private decodeStakeLiquidity(): DecodeResult {\n const objectId = this.helperFarmStake.getInputParam(1).value as string;\n const tokenXType = this.helperFarmStake.typeArg(0);\n const tokenYType = this.helperFarmStake.typeArg(1);\n const lpObject = this.helperFarmStake.getInputParam(2).value as string;\n const lockTime = this.helperFarmStake.decodeInputU64String(3);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.StakeLiquidity,\n intentionData: {\n lpObject,\n lockTime,\n objectId,\n tokenXType,\n tokenYType\n },\n };\n }\n\n private decodeUnstakeLiquidity(): DecodeResult {\n const objectId = this.helperFarmUnstake.getInputParam(1).value as string;\n const positionObjectId = this.helperFarmUnstake.getInputParam(2).value as string;\n const tokenXType = this.helperFarmUnstake.typeArg(0);\n const tokenYType = this.helperFarmUnstake.typeArg(1);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.UnstakeLiquidity,\n intentionData: {\n objectId,\n tokenXType,\n tokenYType,\n positionObjectId\n },\n };\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 get helperRemoveLiqDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.packageId}::spot_dex::remove_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperLiquidityDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.packageId}::spot_dex::add_liquidity`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperSwapDex() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' &&\n ((trans.target === `${config.packageId}::spot_dex::${config.functions.swapX}`) || (trans.target === `${config.packageId}::spot_dex::${config.functions.swapY}`)),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperFarmClaim() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::claim`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n private get helperFarmStake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::stake`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n private get helperFarmUnstake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.farmPackageId}::farm::unstake`,\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\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 decodeInputU64String(argIndex: number) {\n const strVal = this.decodePureArg<string>(argIndex, 'u64');\n return 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","\nexport const config = {\n packageId: \"0xa0eba10b173538c8fecca1dff298e488402cc9ff374f8a12ca7758eebe830b66\",\n farmPackageId: \"0x88701243d0445aa38c0a13f02a9af49a58092dfadb93af9754edb41c52f40085\",\n functions: {\n swapX: \"swap_token_x\",\n swapY: \"swap_token_y\",\n }\n}","\nexport enum TransactionSubType {\n AddLiquidity = 'AddLiquidity',\n AddLiquiditySingleSided = 'AddLiquiditySingleSided',\n RemoveLiquidity = 'RemoveLiquidity',\n ClaimRewards = 'ClaimRewards',\n StakeLiquidity = 'StakeLiquidity',\n UnstakeLiquidity = 'UnstakeLiquidity'\n }\n \n export const Rpc =\"https://fullnode.mainnet.sui.io/\";","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk';\nimport { SuiNetworks } from '@/types';\n\nexport interface AddLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n amountX: string,\n amountY: string,\n minAddAmountX: string,\n minAddAmountY: string,\n coinX: string,\n coinY: string,\n}\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, amountX, amountY, minAddAmountX, minAddAmountY, coinX, coinY } = this.data;\n\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n dexSdk.addLiquidity(\n {\n objectId,\n tokenXType,\n tokenYType,\n isStable\n },\n BigInt(amountX),\n BigInt(amountY),\n BigInt(minAddAmountX),\n BigInt(minAddAmountY),\n coinX,\n coinY,\n // @ts-ignore\n txb,\n address\n ); \n\n return txb;\n }\n\n static fromData(data: AddLiquidityIntentionData) {\n return new AddLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk';\nimport { SuiNetworks } from '@/types';\n\n\nexport interface AddLiquiditySingleSidedIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string\n inputCoinType: string,\n inputCoinAmount: string,\n inputCoin: string,\n}\n\nexport class AddLiquiditySingleSideIntention extends CoreBaseIntention<AddLiquiditySingleSidedIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.AddLiquiditySingleSided;\n\n constructor(public override readonly data: AddLiquiditySingleSidedIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, inputCoinType, inputCoinAmount, inputCoin } = this.data;\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n dexSdk.addLiquiditySingleSided({\n objectId,\n tokenXType,\n tokenYType,\n isStable\n },\n inputCoinType,\n BigInt(inputCoinAmount),\n inputCoin,\n 1,\n // @ts-ignore\n txb,\n address,\n );\n return txb;\n }\n\n static fromData(data: AddLiquiditySingleSidedIntentionData) {\n return new AddLiquiditySingleSideIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface ClaimRewardsIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string\n positionObjectId: string\n}\n\nexport class ClaimRewardsIntention extends CoreBaseIntention<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(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { objectId, tokenXType, tokenYType, positionObjectId } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.claimTx(\n // @ts-ignore\n txb,\n farm,\n positionObjectId,\n address\n );\n\n return txb;\n }\n\n static fromData(data: ClaimRewardsIntentionData) {\n return new ClaimRewardsIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\nimport { SuiNetworks } from '@/types';\n\nexport interface RemoveLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n amount: string,\n kriyaLpToken: string,\n}\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const dexSdk = new KriyaSDK.Dex(Rpc);\n const { objectId, tokenXType, tokenYType, amount, kriyaLpToken } = this.data;\n const txb = new TransactionBlock();\n const res = await suiClient.getObject(\n {\n id: objectId,\n options: {\n showContent: true,\n },\n });\n const isStable: boolean = (res.data.content as { fields: any })?.fields!.is_stable;\n const pool = { objectId, tokenXType, tokenYType, isStable}\n dexSdk.removeLiquidity(\n pool,\n BigInt(amount),\n kriyaLpToken,\n // @ts-ignore\n txb,\n address\n );\n\n return txb;\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface StakeLiquidityIntentionData {\n lpObject: any,\n lockTime: string,\n objectId: string,\n tokenXType: string,\n tokenYType: string\n}\n\nexport class StakeLiquidityIntention extends CoreBaseIntention<StakeLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.StakeLiquidity;\n\n constructor(public override readonly data: StakeLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { lpObject, lockTime, objectId, tokenXType, tokenYType } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.stakeTx(\n // @ts-ignore\n txb,\n lpObject,\n Number(lockTime),\n farm,\n address\n );\n\n return txb;\n }\n\n static fromData(data: StakeLiquidityIntentionData) {\n return new StakeLiquidityIntention(data);\n }\n}\n","import { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Rpc, TransactionSubType } from '../types';\nimport { SuiNetworks } from '@/types';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { KriyaSDK } from 'kriya-dex-sdk'\n\nexport interface UnstakeLiquidityIntentionData {\n objectId: string,\n tokenXType: string,\n tokenYType: string,\n positionObjectId: string,\n}\n\nexport class UnstakeLiquidityIntention extends CoreBaseIntention<UnstakeLiquidityIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.UnstakeLiquidity;\n\n constructor(public override readonly data: UnstakeLiquidityIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount; network: SuiNetworks; }): Promise<TransactionBlock> {\n const { suiClient, account } = input;\n const address = account.address;\n const isMainnet: boolean = input.network === 'sui:mainnet';\n const farmSdk = new KriyaSDK.StakingFarm(Rpc, isMainnet);\n const { objectId, tokenXType, tokenYType, positionObjectId } = this.data;\n const farm = { objectId, tokenXType, tokenYType }\n const txb = new TransactionBlock();\n\n farmSdk.withdrawTx(\n // @ts-ignore\n txb,\n farm,\n positionObjectId,\n address\n );\n\n return txb;\n }\n\n static fromData(data: UnstakeLiquidityIntentionData) {\n return new UnstakeLiquidityIntention(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 txType: TransactionType;\n txSubType: string;\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","{\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 * 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 = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const STG_RPC_ENDPOINT = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const PREV_RPC_ENDPOINT = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\nexport const PROD_RPC_ENDPOINT = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\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","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 { 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';\nimport { Stream } from './Stream';\nimport { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\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 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 { 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 { 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 { 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 { 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, 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 {\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 { 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 { 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 { 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 MSafeAppHelper<T> {\n application: string;\n deserialize(\n input: SuiSignTransactionBlockInput & {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n },\n ): Promise<{\n txType: TransactionType;\n txSubType: string;\n intentionData: T;\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 TransactionIntention<D> {\n txType: TransactionType;\n txSubType: string;\n data: D;\n serialize(): string;\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: {\n network: SuiNetworks;\n txType: TransactionType;\n txSubType: string;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock>;\n\n serialize() {\n return JSON.stringify(sortKeys(this.data));\n }\n}\n","import { WalletAccount } from '@mysten/wallet-standard';\n\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { BaseIntention } from '../interface';\n\nexport abstract class StreamIntention<T> extends BaseIntention<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 txType: TransactionType;\n txSubType: string;\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 txType: TransactionType;\n txSubType: string;\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 txType: TransactionType;\n txSubType: string;\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/builder';\nimport { TransactionBlockInput, TransactionBlock } 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/builder';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { MoveCallHelper } from './moveCall';\nimport { CreateStreamHelper } from '../builder/CreateStreamHelper';\nimport { Globals } from '../common';\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/src/builder/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 StreamDecodedTransaction,\n DecodedCreateStream,\n DecodedSetAutoClaim,\n StreamTransactionType,\n DecodedClaimStream,\n DecodedClaimByProxy,\n DecodedCancelStream,\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 txType: TransactionType;\n txSubType: string;\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 { MSafeAppHelper } from '@/apps/interface';\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 MSafeAppHelper<MPayIntentionData> {\n application = 'mpay';\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 { MSafeAppHelper } from '@/apps/interface';\nimport { CoinTransferIntention, CoinTransferIntentionData } from '@/apps/msafe-core/coin-transfer';\n\nimport { ObjectTransferIntention, ObjectTransferIntentionData } from './object-transfer';\nimport { PlainPayloadIntention, PlainPayloadIntentionData } from './plain-payload';\n\nexport type CoreIntention = CoinTransferIntention | ObjectTransferIntention | PlainPayloadIntention;\n\nexport type CoreIntentionData = CoinTransferIntentionData | ObjectTransferIntentionData | PlainPayloadIntentionData;\n\nexport class CoreHelper implements MSafeAppHelper<CoreIntentionData> {\n application: string;\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 case TransactionSubTypes.others.plain:\n intention = PlainPayloadIntention.fromData(input.intentionData as PlainPayloadIntentionData);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface CoinTransferIntentionData {\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport class CoinTransferIntention extends CoreBaseIntention<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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface ObjectTransferIntentionData {\n receiver: string;\n objectType: string;\n objectId: string;\n}\n\nexport class ObjectTransferIntention extends CoreBaseIntention<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, isSameAddress } 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface PlainPayloadIntentionData {\n content: string;\n}\n\nexport class PlainPayloadIntention extends CoreBaseIntention<PlainPayloadIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: 'PlainPayload';\n\n constructor(public readonly data: PlainPayloadIntentionData) {\n super(data);\n }\n\n async build(input: { suiClient: SuiClient; account: WalletAccount }): Promise<TransactionBlock> {\n const { account } = input;\n const tb = TransactionBlock.from(this.data.content);\n\n if (!isSameAddress(tb.blockData.sender, account.address)) {\n throw new Error('Invalid sender address');\n }\n\n return tb;\n }\n\n static fromData(data: PlainPayloadIntentionData) {\n return new PlainPayloadIntention(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 { MSafeAppHelper } from '@/apps/interface';\nimport { SuiNetworks } from '@/types';\n\nimport { updatePackageId } from './config';\nimport { Decoder } from './decoder';\nimport { ClaimRewardIntention, ClaimRewardIntentionData } from './intentions/claim-reward';\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 { TransactionSubType } from './types';\n\nexport type NAVIIntention =\n | EntryDepositIntention\n | EntryBorrowIntention\n | EntryRepayIntention\n | EntryWithdrawIntention\n | ClaimRewardIntention;\n\nexport type NAVIIntentionData =\n | EntryDepositIntentionData\n | EntryBorrowIntentionData\n | EntryRepayIntentionData\n | EntryWithdrawIntentionData\n | ClaimRewardIntentionData;\n\nexport class NAVIAppHelper implements MSafeAppHelper<NAVIIntentionData> {\n application = 'navi';\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.ClaimReward:\n intention = ClaimRewardIntention.fromData(input.intentionData as ClaimRewardIntentionData);\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: '0xc6374c7da60746002bfee93014aeb607e023b2d6b25c9e55a152b826dbc8c1ce',\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 usdc: {\n name: 'USDC',\n assetId: 1,\n coinType: CoinType.usdc,\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 } as Pool,\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/package').then((res) => res.json());\n const { packageId } = data;\n config.ProtocolPackage = packageId;\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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport config from './config';\nimport { CoinType, 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.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 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 return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::claim_reward`);\n }\n\n private isEntryBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_borrow`);\n }\n\n private isEntryDepositTransaction() {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_deposit`);\n }\n\n private isEntryRepayTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_repay`);\n }\n\n private isEntryWithdrawTransaction(): boolean {\n return !!this.getMoveCallTransaction(`${config.ProtocolPackage}::incentive_v2::entry_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 decodeClaimReward(): DecodeResult {\n const claims = [] as {\n coinType: CoinType;\n option: number;\n poolId: string;\n assetId: number;\n typeArguments: string[];\n }[];\n this.transactions.forEach((trans) => {\n if (trans.kind === 'MoveCall' && trans.target === `${config.ProtocolPackage}::incentive_v2::claim_reward`) {\n const helper = new MoveCallHelper(trans, this.txb);\n const assetId = helper.decodeInputU8(4);\n const optionId = helper.decodeInputU8(5);\n const poolId = helper.decodeSharedObjectId(2);\n const pool = this.findPoolByAssetId(assetId);\n const typeArguments = [...trans.typeArguments];\n claims.push({\n coinType: pool.coinType,\n option: optionId,\n typeArguments,\n assetId,\n poolId,\n });\n }\n });\n console.log('decode claims', claims);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.ClaimReward,\n intentionData: {\n claims,\n },\n };\n }\n\n private decodeEntryBorrow(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryBorrow,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryDeposit(): DecodeResult {\n const assetId = this.helper.decodeInputU8(3);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryDeposit,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryRepay(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(6);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryRepay,\n intentionData: {\n amount,\n coinType: pool.coinType,\n },\n };\n }\n\n private decodeEntryWithdraw(): DecodeResult {\n const assetId = this.helper.decodeInputU8(4);\n const amount = this.helper.decodeInputU64(5);\n const pool = this.findPoolByAssetId(assetId);\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.EntryWithdraw,\n intentionData: {\n amount,\n coinType: pool.coinType,\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 { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { claimReward } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType, OptionType } from '../types';\n\nexport interface ClaimRewardIntentionData {\n claims: {\n coinType: CoinType;\n option: OptionType;\n poolId: string;\n assetId: number;\n typeArguments: string[];\n }[];\n}\n\nexport class ClaimRewardIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { claims } = this.data;\n const tx = new TransactionBlock();\n\n claims.forEach((claim) => {\n const { assetId, poolId, option, typeArguments } = claim;\n\n claimReward(tx, assetId, poolId, option, typeArguments);\n });\n\n tx.setGasBudget(config.gasBudget);\n\n return tx;\n }\n\n static fromData(data: ClaimRewardIntentionData) {\n return new ClaimRewardIntention(data);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport config from '../config';\nimport { OptionType, PoolConfig } from '../types';\n\nexport function depositToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_deposit`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n coinObject,\n txb.pure(amount),\n txb.object(config.Incentive),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function withdrawToken(txb: TransactionBlock, pool: PoolConfig, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_withdraw`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n txb.pure(amount),\n txb.object(config.Incentive),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function borrowToken(txb: TransactionBlock, pool: PoolConfig, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_borrow`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n txb.pure(amount),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function repayToken(txb: TransactionBlock, pool: PoolConfig, coinObject: any, amount: number) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::entry_repay`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.PriceOracle),\n txb.object(config.StorageId),\n txb.object(pool.poolId),\n txb.pure(pool.assetId),\n coinObject,\n txb.pure(amount),\n txb.object(config.IncentiveV2),\n ],\n typeArguments: [pool.type],\n });\n return txb;\n}\n\nexport function claimReward(\n txb: TransactionBlock,\n assetId: number,\n poolId: string,\n option: OptionType,\n typeArguments: string[],\n) {\n txb.moveCall({\n target: `${config.ProtocolPackage}::incentive_v2::claim_reward`,\n arguments: [\n txb.object('0x06'),\n txb.object(config.IncentiveV2),\n txb.object(poolId),\n txb.object(config.StorageId),\n txb.pure(assetId),\n txb.pure(option),\n ],\n typeArguments,\n });\n return txb;\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { borrowToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\n\nexport interface EntryBorrowIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryBorrowIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\n }\n\n return borrowToken(tx, pool, amount);\n }\n\n static fromData(data: EntryBorrowIntentionData) {\n return new EntryBorrowIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { depositToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\n\nexport interface EntryDepositIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryDepositIntention extends CoreBaseIntention<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 { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n if (coinType === 'sui') {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return depositToken(tx, config.pool.sui, toDeposit, amount);\n }\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\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 depositToken(tx, pool, tx.object(coinObj), amount);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { repayToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\nimport { getTokenObjs } from '../utils/token';\n\nexport interface EntryRepayIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryRepayIntention extends CoreBaseIntention<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 { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n tx.setGasBudget(config.gasBudget);\n console.log('build', this.data);\n\n if (coinType === 'sui') {\n const [toDeposit] = tx.splitCoins(tx.gas, [amount]);\n return repayToken(tx, config.pool.sui, toDeposit, amount);\n }\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\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';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { withdrawToken } from '../api/incentiveV2';\nimport config from '../config';\nimport { CoinType, TransactionSubType } from '../types';\n\nexport interface EntryWithdrawIntentionData {\n amount: number;\n coinType: CoinType;\n}\n\nexport class EntryWithdrawIntention extends CoreBaseIntention<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(): Promise<TransactionBlock> {\n const { coinType, amount } = this.data;\n const tx = new TransactionBlock();\n console.log('build', this.data);\n tx.setGasBudget(config.gasBudget);\n\n const pool = config.pool[coinType];\n\n if (!pool) {\n throw new Error(`${coinType} not support, please use ${Object.keys(config.pool).join(', ')}.`);\n }\n\n return withdrawToken(tx, pool, amount);\n }\n\n static fromData(data: EntryWithdrawIntentionData) {\n return new EntryWithdrawIntention(data);\n }\n}\n","import { TransactionSubTypes, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, toHEX } from '@mysten/sui.js/utils';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { MSafeAppHelper, TransactionIntention } from '@/apps/interface';\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}\nexport class PlainTransactionHelper implements MSafeAppHelper<PlainTransactionData> {\n application: string;\n\n constructor() {\n this.application = PlainTransactionApplication;\n }\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {\n const { transactionBlock, suiClient } = input;\n\n const content = await transactionBlock.build({ client: suiClient });\n\n return {\n txType: TransactionType.Other,\n txSubType: PlainTransactionType,\n intentionData: { content: toHEX(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<TransactionBlock> {\n const { suiClient, account } = input;\n const txb = TransactionBlock.from(fromHEX(input.intentionData.content));\n\n const inspectResult = await suiClient.devInspectTransactionBlock({\n transactionBlock: txb,\n sender: account.address,\n });\n const success = inspectResult.effects.status.status === 'success';\n if (!success) {\n throw new Error(inspectResult.effects.status.error);\n }\n\n return txb;\n }\n}\n","import { MSafeAppHelper } from '@/apps/interface';\n\nexport class MSafeApps {\n apps: Map<string, MSafeAppHelper<any>>;\n\n constructor(apps: MSafeAppHelper<any>[]) {\n this.apps = new Map(apps.map((app) => [app.application, app]));\n }\n\n getAppHelper(appName: string): MSafeAppHelper<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","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 { Decoder } from './decoder';\nimport { BorrowIntention, BorrowIntentionData } from './intentions/borrow';\nimport { BorrowWithBoostIntention, BorrowWithBoostIntentionData } from './intentions/borrow-with-boost';\nimport { ClaimIncentiveRewardIntention, ClaimIncentiveRewardIntentionData } from './intentions/claim-incentive-reward';\nimport { DepositCollateralIntention, DepositCollateralIntentionData } from './intentions/deposit-collateral';\nimport {\n ExtendPeriodAndStakeMoreIntention,\n ExtendPeriodAndStakeMoreIntentionData,\n} from './intentions/extend-period-and-stake-more';\nimport { ExtendStakePeriodIntention, ExtendStakePeriodIntentionData } from './intentions/extend-stake-period';\nimport { MigrateAndClaimIntention, MigrateAndClaimIntentionData } from './intentions/migrate-and-claim';\nimport { OpenObligationIntention, OpenObligationIntentionData } from './intentions/open-obligation';\nimport { RedeemScaIntention, RedeemScaIntentionData } from './intentions/redeem-sca';\nimport { RenewExpStakePeriodIntention, RenewExpStakePeriodIntentionData } from './intentions/renew-exp-stake-period';\nimport { RepayIntention, RepayIntentionData } from './intentions/repay';\nimport { StakeScaIntention, StakeScaIntentionData } from './intentions/stake-sca';\nimport { StakeSpoolIntention, StakeSpoolIntentionData } from './intentions/stake-spool';\nimport {\n SupplyAndStakeLendingIntention,\n SupplyAndStakeLendingIntentionData,\n} from './intentions/supply-and-stake-lending';\nimport { SupplyLendingIntention, SupplyLendingIntentionData } from './intentions/supply-lending';\nimport { UnstakeSpoolIntention, UnstakeSpoolIntentionData } from './intentions/unstake-spool';\nimport {\n WithdrawAndUnstakeLendingIntention,\n WithdrawAndUnstakeLendingIntentionData,\n} from './intentions/withdraw-and-unstake-lending';\nimport { WithdrawCollateralIntention, WithdrawCollateralIntentionData } from './intentions/withdraw-collateral';\nimport { WithdrawLendingIntention, WithdrawLendingIntentionData } from './intentions/withdraw-lending';\nimport { WithdrawStakedScaIntention, WithdrawStakedScaIntentionData } from './intentions/withdraw-staked-sca';\nimport { ScallopBuilder } from './models';\nimport { SuiNetworks } from './types';\nimport { TransactionSubType } from './types/utils';\nimport { MSafeAppHelper } from '../interface';\n\nexport type ScallopIntention =\n | SupplyLendingIntention\n | WithdrawLendingIntention\n | BorrowIntention\n | RepayIntention\n | DepositCollateralIntention\n | WithdrawCollateralIntention\n | OpenObligationIntention\n | StakeSpoolIntention\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\nexport type ScallopIntentionData =\n | SupplyLendingIntentionData\n | WithdrawLendingIntentionData\n | BorrowIntentionData\n | RepayIntentionData\n | DepositCollateralIntentionData\n | WithdrawCollateralIntentionData\n | OpenObligationIntentionData\n | StakeSpoolIntentionData\n | UnstakeSpoolIntentionData\n | ClaimIncentiveRewardIntentionData\n | BorrowWithBoostIntentionData\n | StakeScaIntentionData\n | ExtendStakePeriodIntentionData\n | ExtendPeriodAndStakeMoreIntentionData\n | RenewExpStakePeriodIntentionData\n | WithdrawStakedScaIntentionData\n | SupplyAndStakeLendingIntentionData\n | WithdrawAndUnstakeLendingIntentionData\n | RedeemScaIntentionData\n | MigrateAndClaimIntentionData;\n\nexport class ScallopAppHelper implements MSafeAppHelper<ScallopIntentionData> {\n application = 'scallop';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: ScallopIntentionData;\n }> {\n const builder = new ScallopBuilder({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await builder.init();\n const { transactionBlock } = input;\n const decoder = new Decoder(transactionBlock, builder);\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: ScallopIntentionData;\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: ScallopIntention;\n switch (input.txSubType) {\n case TransactionSubType.SupplyLending:\n intention = SupplyLendingIntention.fromData(input.intentionData as SupplyLendingIntentionData);\n break;\n case TransactionSubType.WithdrawLending:\n intention = WithdrawLendingIntention.fromData(input.intentionData as WithdrawLendingIntentionData);\n break;\n case TransactionSubType.Borrow:\n intention = BorrowIntention.fromData(input.intentionData as BorrowIntentionData);\n break;\n case TransactionSubType.Repay:\n intention = RepayIntention.fromData(input.intentionData as RepayIntentionData);\n break;\n case TransactionSubType.DepositCollateral:\n intention = DepositCollateralIntention.fromData(input.intentionData as DepositCollateralIntentionData);\n break;\n case TransactionSubType.WithdrawCollateral:\n intention = WithdrawCollateralIntention.fromData(input.intentionData as WithdrawCollateralIntentionData);\n break;\n case TransactionSubType.OpenObligation:\n intention = OpenObligationIntention.fromData(input.intentionData as OpenObligationIntentionData);\n break;\n case TransactionSubType.StakeSpool:\n intention = StakeSpoolIntention.fromData(input.intentionData as StakeSpoolIntentionData);\n break;\n case TransactionSubType.UnstakeSpool:\n intention = UnstakeSpoolIntention.fromData(input.intentionData as UnstakeSpoolIntentionData);\n break;\n case TransactionSubType.ClaimIncentiveReward:\n intention = ClaimIncentiveRewardIntention.fromData(input.intentionData as ClaimIncentiveRewardIntentionData);\n break;\n case TransactionSubType.BorrowWithBoost:\n intention = BorrowWithBoostIntention.fromData(input.intentionData as BorrowWithBoostIntentionData);\n break;\n case TransactionSubType.StakeSca:\n intention = StakeScaIntention.fromData(input.intentionData as StakeScaIntentionData);\n break;\n case TransactionSubType.ExtendStakePeriod:\n intention = ExtendStakePeriodIntention.fromData(input.intentionData as ExtendStakePeriodIntentionData);\n break;\n case TransactionSubType.ExtendPeriodAndStakeMore:\n intention = ExtendPeriodAndStakeMoreIntention.fromData(\n input.intentionData as ExtendPeriodAndStakeMoreIntentionData,\n );\n break;\n case TransactionSubType.RenewExpStakePeriod:\n intention = RenewExpStakePeriodIntention.fromData(input.intentionData as RenewExpStakePeriodIntentionData);\n break;\n case TransactionSubType.WithdrawStakedSca:\n intention = WithdrawStakedScaIntention.fromData(input.intentionData as WithdrawStakedScaIntentionData);\n break;\n case TransactionSubType.SupplyAndStakeLending:\n intention = SupplyAndStakeLendingIntention.fromData(input.intentionData as SupplyAndStakeLendingIntentionData);\n break;\n case TransactionSubType.WithdrawAndUnstakeLending:\n intention = WithdrawAndUnstakeLendingIntention.fromData(\n input.intentionData as WithdrawAndUnstakeLendingIntentionData,\n );\n break;\n case TransactionSubType.RedeemSca:\n intention = RedeemScaIntention.fromData(input.intentionData as RedeemScaIntentionData);\n break;\n case TransactionSubType.MigrateAndClaim:\n intention = MigrateAndClaimIntention.fromData(input.intentionData as MigrateAndClaimIntentionData);\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, SplitCoinsTransaction } from '@mysten/sui.js/dist/cjs/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from './constants';\nimport { ScallopBuilder } from './models';\nimport { SupportBorrowIncentiveRewardCoins, SupportStakeMarketCoins } from './types';\nimport { TransactionSubType } from './types/utils';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: any;\n};\n\nexport class Decoder {\n private _builder: ScallopBuilder;\n\n constructor(\n public readonly txb: TransactionBlock,\n builder: ScallopBuilder,\n ) {\n this._builder = builder;\n }\n\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.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.isWithdrawLendingTransaction()) {\n return this.decodeWithdrawLending();\n }\n if (this.isSupplyLendingTransaction()) {\n return this.decodeSupplyLending();\n }\n if (this.isBorrowWithBoostTransaction()) {\n return this.decodeBorrowWithBoost();\n }\n if (this.isBorrowTransaction()) {\n return this.decodeBorrow();\n }\n if (this.isRepayTransaction()) {\n return this.decodeRepay();\n }\n if (this.isUnstakeSpoolTransaction()) {\n return this.decodeUnstakeSpool();\n }\n if (this.isClaimRewardTransaction()) {\n return this.decodeClaimReward();\n }\n if (this.isRenewExpiredVeSca()) {\n return this.decodeRenewExpiredVeSca();\n }\n if (this.isExtendPeriod()) {\n return this.decodeExtendStakePeriod();\n }\n if (this.isOpenObligationTransaction()) {\n return this.decodeOpenObligation();\n }\n if (this.isRedeemSca()) {\n return this.decodeRedeemSca();\n }\n if (this.isMigrateAndClaim()) {\n return this.decodeMigrateAndClaim();\n }\n throw new Error(`Unknown transaction type`);\n }\n\n private get coreId() {\n return {\n protocolPkg: this._builder.address.get('core.packages.protocol.id'),\n market: this._builder.address.get('core.market'),\n version: this._builder.address.get('core.version'),\n coinDecimalsRegistry: this._builder.address.get('core.coinDecimalsRegistry'),\n xOracle: this._builder.address.get('core.oracles.xOracle'),\n spoolPkg: this._builder.address.get('spool.id'),\n borrowIncentivePkg: this._builder.address.get('borrowIncentive.id'),\n veScaPkgId: this._builder.address.get('vesca.id'),\n };\n }\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n private get inputTransaction() {\n return this.txb.blockData.inputs;\n }\n\n private getMoveCallTransaction(target: string) {\n return this.transactions.find((trans) => trans.kind === 'MoveCall' && trans.target === target);\n }\n\n private isSupplyLendingTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::mint::mint`);\n }\n\n private isSupplyWithStakeSpoolTransaction() {\n const supplyMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::mint::mint`);\n const stakeMoveCall = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::stake`);\n return !!supplyMoveCall && !!stakeMoveCall;\n }\n\n private isUnstakeAndWithdrawTransaction() {\n const unstakeMoveCall = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::unstake`);\n const withdrawMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::redeem::redeem`);\n return !!unstakeMoveCall && !!withdrawMoveCall;\n }\n\n private isStakeSpoolTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::stake`);\n }\n\n private isWithdrawLendingTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::redeem::redeem`);\n }\n\n private isDepositCollateralTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`);\n }\n\n private isWithdrawCollateralTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`);\n }\n\n private isBorrowTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::borrow::borrow`);\n }\n\n private isBorrowWithBoostTransaction() {\n const borrowMoveCall = this.getMoveCallTransaction(`${this.coreId.protocolPkg}::borrow::borrow`);\n const stakeMoveCall = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return !!borrowMoveCall && !!stakeMoveCall;\n }\n\n private isRepayTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::repay::repay`);\n }\n\n private isUnstakeSpoolTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::unstake`);\n }\n\n private isCreateStakeAccountTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::new_spool_account`);\n }\n\n private isClaimRewardTransaction() {\n const lendingIncentive = this.getMoveCallTransaction(`${this.coreId.spoolPkg}::user::redeem_rewards`);\n const borrowIncentiveV2 = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`);\n return !!lendingIncentive || !!borrowIncentiveV2;\n }\n\n private isStakeScaFirsTime() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`);\n }\n\n private isExtendPeriodAndStakeMoreSca() {\n const extendPeriod = this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n const stakeMoreSca = this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n return !!extendPeriod && !!stakeMoreSca;\n }\n\n private isRedeemSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::redeem`);\n }\n\n private isStakeMoreSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`);\n }\n\n private isExtendPeriod() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`);\n }\n\n private isRenewExpiredVeSca() {\n return !!this.getMoveCallTransaction(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`);\n }\n\n private isOpenObligationTransaction() {\n return !!this.getMoveCallTransaction(`${this.coreId.protocolPkg}::open_obligation::open_obligation_entry`);\n }\n\n private isMigrateAndClaim() {\n const oldBorrowIncentive = this.getMoveCallTransaction(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`);\n const stakeWithVeSca = this.getMoveCallTransaction(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`);\n return !!oldBorrowIncentive && !!stakeWithVeSca;\n }\n\n private decodeMigrateAndClaim(): DecodeResult {\n const veScaKey = this.helperStakeObligationWithVeSca.decodeOwnedObjectId(9);\n const obligationKey = this.helperClaimBorrowReward[0].decodeSharedObjectId(2);\n const obligationId = this.helperClaimBorrowReward[0].decodeOwnedObjectId(3);\n const rewardCoinName = this._builder.utils.parseCoinNameFromType(\n this.helperClaimBorrowReward[0].typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.MigrateAndClaim,\n intentionData: {\n veScaKey,\n obligationKey,\n obligationId,\n rewardCoinName,\n },\n };\n }\n\n private decodeOpenObligation(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.OpenObligation,\n intentionData: {},\n };\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<SplitCoinsTransaction>(4);\n const unlockTime = this.helperRenewExpired.decodeInputU64(5);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(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 lockPeriodInDays: 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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(3), // Obligation key\n this.helperUnstakeObligation.decodeSharedObjectId(4), // Obligation Id\n ];\n }\n if (this.helperStakeObligationWithVeSca.moveCall) {\n stakeObligation = [\n this.helperStakeObligationWithVeSca.decodeSharedObjectId(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 lockPeriodInDays: 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<SplitCoinsTransaction>(4);\n const unlockTime = this.helperExtendStakePeriod.decodeInputU64(4);\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(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.decodeSharedObjectId(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 lockPeriodInDays: 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<SplitCoinsTransaction>(3);\n unlockTime = this.helperStakeSca.decodeInputU64(4);\n } else {\n lockSca = this.helperStakeMoreSca.getNestedInputParam<SplitCoinsTransaction>(4);\n console.log(lockSca);\n }\n const amountFromSplitCoin = new SplitCoinHelper(lockSca, this.txb).getAmountInput().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.decodeSharedObjectId(2), // Obligation key\n this.helperOldUnstakeObligation.decodeSharedObjectId(3), // Obligation Id\n ];\n }\n if (this.helperUnstakeObligation.moveCall) {\n unstakeObligation = [\n this.helperUnstakeObligation.decodeSharedObjectId(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.decodeSharedObjectId(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 lockPeriodInDays: unlockTime,\n obligationId,\n obligationKey,\n veScaKey,\n isObligationLocked,\n isOldBorrowIncentive,\n },\n };\n }\n\n private decodeSupplyLending(): DecodeResult {\n const coinName = this._builder.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperRedeem.typeArg(0));\n const amount = this.helperRedeem.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperDepositCollateral.typeArg(0));\n const amount = this.helperDepositCollateral.getNestedInputParam<SplitCoinsTransaction>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.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._builder.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._builder.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 decodeRepay(): DecodeResult {\n const coinName = this._builder.utils.parseCoinNameFromType(this.helperRepay.typeArg(0));\n const amount = this.helperRepay.getNestedInputParam<SplitCoinsTransaction>(3);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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 decodeStakeSpool(): DecodeResult {\n let stakeSpoolAccount;\n if (!this.isCreateStakeAccountTransaction()) {\n stakeSpoolAccount = this.helperStake.decodeOwnedObjectId(1);\n }\n const amount = this.helperStake.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().reduce((a, b) => a + b, 0);\n const coinType = this.helperStake.typeArg(0);\n const coinName = this._builder.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._builder.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._builder.utils.parseCoinNameFromType(this.helperMint.typeArg(0));\n const amount = this.helperMint.getNestedInputParam<SplitCoinsTransaction>(2);\n const amountFromSplitCoin = new SplitCoinHelper(amount, this.txb).getAmountInput().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._builder.utils.parseCoinNameFromType(this.helperRedeems[0].typeArg(0));\n const findWithdrawWithNested = this.helperRedeems.find((tx) => tx.isHaveNestedInput(2));\n let amount;\n if (findWithdrawWithNested) {\n amount = new SplitCoinHelper(findWithdrawWithNested.getNestedInputParam<SplitCoinsTransaction>(2), this.txb)\n .getAmountInput()\n .reduce((a, b) => a + b, 0);\n }\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.WithdrawAndUnstakeLending,\n intentionData: {\n amount,\n coinName,\n stakeAccountId: stakeAccountWithAmount,\n },\n };\n }\n\n private decodeClaimReward(): DecodeResult {\n const lendingReward: {\n stakeMarketCoinName: SupportStakeMarketCoins;\n stakeAccountId: string;\n }[] = [];\n const borrowRewardV2: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n }[] = [];\n\n const borrowReward: {\n obligationId: string;\n obligationKey: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n }[] = [];\n\n this.helperClaimLendingReward.forEach((tx) => {\n const stakeAccountId = tx.decodeOwnedObjectId(2);\n const stakeMarketCoinName = tx.typeArg(0);\n const coinName = this._builder.utils.parseCoinNameFromType(stakeMarketCoinName);\n lendingReward.push({ stakeMarketCoinName: coinName as SupportStakeMarketCoins, stakeAccountId });\n });\n\n this.helperClaimBorrowV2Reward.forEach((tx) => {\n const obligationKey = tx.decodeSharedObjectId(3);\n const obligationId = tx.decodeOwnedObjectId(4);\n const rewardCoinName = this._builder.utils.parseCoinNameFromType(\n tx.typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\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._builder.utils.parseCoinNameFromType(\n tx.typeArg(0),\n ) as SupportBorrowIncentiveRewardCoins;\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 private get helperClaimLendingReward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperClaimBorrowV2Reward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperStakeMoreSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::lock_more_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStakeSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::mint_ve_sca_key`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperExtendStakePeriod() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::extend_lock_period`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRedeemSca() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::redeem`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRenewExpired() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.veScaPkgId}::ve_sca::renew_expired_ve_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperOldUnstakeObligation() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstakeObligation() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStakeObligationWithVeSca() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.borrowIncentivePkg}::user::stake_with_ve_sca`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperClaimBorrowReward() {\n const moveCalls = this.transactions\n .filter(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::redeem_rewards`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperMint() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::mint::mint`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstakes() {\n const moveCalls = this.transactions\n .filter((trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::unstake`))\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperRedeems() {\n const moveCalls = this.transactions\n .filter(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::redeem::redeem`),\n )\n .map((trans) => new MoveCallHelper(trans as MoveCallTransaction, this.txb));\n return moveCalls;\n }\n\n private get helperRedeem() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::redeem::redeem`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperStake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::stake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperUnstake() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.spoolPkg}::user::unstake`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperDepositCollateral() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.protocolPkg}::deposit_collateral::deposit_collateral`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperWithdrawCollateral() {\n const moveCall = this.transactions.find(\n (trans) =>\n trans.kind === 'MoveCall' &&\n trans.target.startsWith(`${this.coreId.protocolPkg}::withdraw_collateral::withdraw_collateral`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperBorrow() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::borrow::borrow`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get helperRepay() {\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target.startsWith(`${this.coreId.protocolPkg}::repay::repay`),\n ) as MoveCallTransaction;\n return new MoveCallHelper(moveCall, this.txb);\n }\n}\n\nexport class SplitCoinHelper {\n constructor(\n public readonly splitCoin: SplitCoinsTransaction,\n public readonly txb: TransactionBlock,\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 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\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 getNestedInputParam<T>(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n if (arg.kind !== 'NestedResult') {\n throw new Error('not input type');\n }\n return this.txb.blockData.transactions[arg.index] as T;\n }\n\n isHaveNestedInput(argIndex: number) {\n const arg = this.moveCall.arguments[argIndex];\n return arg.kind === 'NestedResult';\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","export const API_BASE_URL = 'https://sui.api.scallop.io';\nexport const SDK_API_BASE_URL = 'https://sdk.api.scallop.io';\n\nexport const ADDRESSES_ID = '6601955b8b0024600a917079';\n\nexport const PROTOCOL_OBJECT_ID = '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf';\n\nexport const BORROW_FEE_PROTOCOL_ID = '0xc38f849e81cfe46d4e4320f508ea7dda42934a329d5a6571bb4c3cb6ea63f5da';\n\nexport const OLD_BORROW_INCENTIVE_PROTOCOL_ID =\n '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410' as const;\n\nexport const SCA_COIN_TYPE = '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA' as const;\n\nexport const SUPPORT_POOLS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n] as const;\n\nexport const SUPPORT_COLLATERALS = [\n 'eth',\n 'btc',\n 'usdc',\n 'usdt',\n 'sui',\n 'apt',\n 'sol',\n 'cetus',\n 'afsui',\n 'hasui',\n 'vsui',\n 'sca',\n] as const;\n\nexport const SUPPORT_SPOOLS = ['seth', 'ssui', 'susdc', 'susdt', 'scetus', 'safsui', 'shasui', 'svsui'] as const;\n\nexport const SUPPORT_SPOOLS_REWARDS = ['sui'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_POOLS = ['sui', 'usdc', 'usdt'] as const;\n\nexport const SUPPORT_BORROW_INCENTIVE_REWARDS = ['sui', 'sca'] as const;\nexport const SUPPORT_ORACLES = ['supra', 'switchboard', 'pyth'] as const;\n\nexport const SUPPORT_PACKAGES = [\n 'coinDecimalsRegistry',\n 'math',\n 'whitelist',\n 'x',\n 'protocol',\n 'protocolWhitelist',\n 'query',\n 'supra',\n 'pyth',\n 'switchboard',\n 'xOracle',\n 'testCoin',\n] as const;\n","import type {\n SupportCoinDecimals,\n AssetCoins,\n MarketCoins,\n StakeMarketCoins,\n StakeRewardCoins,\n BorrowIncentiveRewardCoins,\n AssetCoinIds,\n WormholeCoinIds,\n VoloCoinIds,\n} from '../types';\n\nexport const coinDecimals: SupportCoinDecimals = {\n eth: 8,\n btc: 8,\n usdc: 6,\n usdt: 6,\n sui: 9,\n apt: 8,\n sol: 8,\n sca: 9,\n cetus: 9,\n afsui: 9,\n hasui: 9,\n vsui: 9,\n seth: 8,\n sbtc: 8,\n susdc: 6,\n susdt: 6,\n ssui: 9,\n sapt: 8,\n ssol: 8,\n scetus: 9,\n safsui: 9,\n shasui: 9,\n svsui: 9,\n ssca: 9,\n};\n\nexport const assetCoins: AssetCoins = {\n eth: 'eth',\n btc: 'btc',\n usdc: 'usdc',\n usdt: 'usdt',\n sui: 'sui',\n apt: 'apt',\n sol: 'sol',\n cetus: 'cetus',\n afsui: 'afsui',\n hasui: 'hasui',\n vsui: 'vsui',\n sca: 'sca',\n};\n\nexport const marketCoins: MarketCoins = {\n seth: 'seth',\n sbtc: 'sbtc',\n susdc: 'susdc',\n susdt: 'susdt',\n ssui: 'ssui',\n sapt: 'sapt',\n ssol: 'ssol',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n ssca: 'ssca',\n};\n\nexport const stakeMarketCoins: StakeMarketCoins = {\n seth: 'seth',\n ssui: 'ssui',\n susdc: 'susdc',\n susdt: 'susdt',\n scetus: 'scetus',\n safsui: 'safsui',\n shasui: 'shasui',\n svsui: 'svsui',\n};\n\nexport const spoolRewardCoins: StakeRewardCoins = {\n seth: 'sui',\n ssui: 'sui',\n susdc: 'sui',\n susdt: 'sui',\n scetus: 'sui',\n safsui: 'sui',\n shasui: 'sui',\n svsui: 'sui',\n};\n\nexport const borrowIncentiveRewardCoins: BorrowIncentiveRewardCoins = {\n sui: ['sui', 'sca'],\n usdc: ['sui', 'sca'],\n usdt: ['sui', 'sca'],\n};\n\nexport const coinIds: AssetCoinIds = {\n sui: '0x0000000000000000000000000000000000000000000000000000000000000002',\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n cetus: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n afsui: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n hasui: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n sca: '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n};\n\nexport const wormholeCoinIds: WormholeCoinIds = {\n eth: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n btc: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n usdc: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n usdt: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n apt: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n sol: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n};\n\nexport const voloCoinIds: VoloCoinIds = {\n vsui: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n};\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock, TransactionResult } from '@mysten/sui.js/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport BigNumber from 'bignumber.js';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopBuilder } from './scallopBuilder';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { generateBorrowIncentiveQuickMethod } from '../builders/borrowIncentiveBuilder';\nimport { generateCoreQuickMethod } from '../builders/coreBuilder';\nimport { generateSpoolQuickMethod } from '../builders/spoolBuilder';\nimport { generateQuickVeScaMethod } from '../builders/vescaBuilder';\nimport { ADDRESSES_ID, SCA_COIN_TYPE, SUPPORT_BORROW_INCENTIVE_POOLS, SUPPORT_SPOOLS } from '../constants';\nimport type {\n ScallopInstanceParams,\n ScallopClientParams,\n SupportPoolCoins,\n SupportCollateralCoins,\n SupportStakeMarketCoins,\n BorrowIncentiveParams,\n SpoolIncentiveParams,\n SupportBorrowIncentiveRewardCoins,\n} from '../types';\n\n/**\n * @description\n * It provides contract interaction operations for general users.\n *\n * @example\n * ```typescript\n * const scallopClient = new ScallopClient(<parameters>);\n * await scallopClient.init();\n * scallopClient.<client functions>();\n * await scallopClient.<client async functions>();\n * ```\n */\nexport class ScallopClient {\n public readonly params: ScallopClientParams;\n\n public client: SuiClient;\n\n public address: ScallopAddress;\n\n public builder: ScallopBuilder;\n\n public query: ScallopQuery;\n\n public utils: ScallopUtils;\n\n public walletAddress: string;\n\n public constructor(params: ScallopClientParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.client = params.client;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(params, {\n address: this.address,\n query: this.query,\n });\n this.builder =\n instance?.builder ??\n new ScallopBuilder(params, {\n address: this.address,\n query: this.query,\n utils: this.utils,\n });\n this.walletAddress = normalizeSuiAddress(params.walletAddress);\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n */\n public init(force = false) {\n if (force || !this.address.getAddresses()) {\n this.address.read();\n }\n\n this.builder.init(force, this.address);\n this.query.init(force, this.address);\n this.utils.init(force, this.address);\n }\n\n /* ==================== Query Method ==================== */\n\n /**\n * Get obligations data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getObligations(owner);\n }\n\n /**\n * Query all stake accounts data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param ownerAddress - The owner address.\n * @return All stake accounts data.\n */\n async getAllStakeAccounts(ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getAllStakeAccounts(owner);\n }\n\n /**\n * Query stake account data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n async getStakeAccounts(stakeMarketCoinName: SupportStakeMarketCoins, ownerAddress?: string) {\n const owner = ownerAddress || this.walletAddress;\n return this.query.getStakeAccounts(stakeMarketCoinName, owner);\n }\n\n /**\n * Query stake pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Stake pool data.\n */\n async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return this.query.getStakePool(stakeMarketCoinName);\n }\n\n /**\n * Query reward pool data.\n *\n * @description\n * This method might be @deprecated in the future, please use the {@link ScallopQuery} query instance instead.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Reward pool data.\n */\n async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return this.query.getStakeRewardPool(stakeMarketCoinName);\n }\n\n /* ==================== Core Method ==================== */\n\n /**\n * Open obligation.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @return Transaction block response or transaction block.\n */\n public async openObligation(walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const coreQuickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n coreQuickMethod.normalMethod.openObligationEntry();\n return txBlock;\n }\n\n /**\n * Deposit collateral into the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async depositCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n obligationId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n\n const obligations = await this.query.getObligations(sender);\n const specificObligationId = obligationId || obligations?.[0]?.id;\n if (specificObligationId) {\n await quickMethod.addCollateralQuick(amount, collateralCoinName, specificObligationId);\n } else {\n const [obligation, obligationKey, hotPotato] = quickMethod.normalMethod.openObligation();\n await quickMethod.addCollateralQuick(amount, collateralCoinName, obligation);\n quickMethod.normalMethod.returnObligation(obligation, hotPotato);\n txBlock.transferObjects([obligationKey], sender);\n }\n return txBlock;\n }\n\n /**\n * Withdraw collateral from the specific pool.\n *\n * @param collateralCoinName - Types of collateral coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdrawCollateral(\n collateralCoinName: SupportCollateralCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const collateralCoin = await quickMethod.takeCollateralQuick(\n amount,\n collateralCoinName,\n obligationId,\n obligationKey,\n );\n txBlock.transferObjects([collateralCoin], sender);\n return txBlock;\n }\n\n /**\n * Deposit asset into the specific pool.\n *\n * @param poolCoinName - Types of pool coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async deposit(\n poolCoinName: SupportPoolCoins,\n amount: number,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await quickMethod.depositQuick(amount, poolCoinName, walletAddress);\n txBlock.transferObjects([marketCoin], sender);\n return txBlock;\n }\n\n /**\n * Withdraw asset from the specific pool, must return market coin.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would withdraw.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async withdraw(\n poolCoinName: SupportPoolCoins,\n amount: number,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const sender = walletAddress || this.walletAddress;\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n txBlock.setSender(sender);\n\n const coin = await quickMethod.withdrawQuick(amount, poolCoinName);\n txBlock.transferObjects([coin], sender);\n return txBlock;\n }\n\n /**\n * Borrow asset from the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrow(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n const coin = await quickMethod.borrowQuick(amount, poolCoinName, obligationId, obligationKey);\n txBlock.transferObjects([coin], sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKey);\n }\n return txBlock;\n }\n\n /**\n * Borrow asset from the specific pool with boost from SCA stake.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would borrow.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param obligationKey - The obligation key object to verifying obligation authority.\n * @param veScaKey - The vesca key object to verifying sca staker.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async borrowWithBoost(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n veScaKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n const coin = await quickMethod.borrowQuick(amount, poolCoinName, obligationId, obligationKey);\n txBlock.transferObjects([coin], sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n }\n return txBlock;\n }\n\n /**\n * Repay asset into the specific pool.\n *\n * @param poolCoinName - Specific support pool coin name.\n * @param amount - The amount of coins would repay.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param obligationId - The obligation object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async repay(\n poolCoinName: SupportPoolCoins,\n amount: number,\n obligationId: string,\n obligationKey: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const availableStake = (SUPPORT_BORROW_INCENTIVE_POOLS as readonly SupportPoolCoins[]).includes(poolCoinName);\n if (availableStake) {\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKey);\n }\n await quickMethod.repayQuick(amount, poolCoinName, obligationId, sender);\n if (availableStake) {\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKey);\n }\n return txBlock;\n }\n\n /* ==================== Spool Method ==================== */\n\n /**\n * Create stake account.\n *\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async createStakeAccount(\n marketCoinName: SupportStakeMarketCoins,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccount = spoolQuickMethod.normalMethod.createStakeAccount(marketCoinName);\n txBlock.transferObjects([stakeAccount], sender);\n return txBlock;\n }\n\n public async supplyAndStake(\n poolCoinName: SupportPoolCoins,\n amount: number,\n stakeAccountId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoin = await quickMethod.depositQuick(amount, poolCoinName, walletAddress);\n const stakeMarketCoinName = this.utils.parseMarketCoinName(poolCoinName);\n if (!SUPPORT_SPOOLS.find((coin) => coin === stakeMarketCoinName)) {\n return txBlock;\n }\n const stakeAccounts = await this.query.getStakeAccounts(stakeMarketCoinName as SupportStakeMarketCoins, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await spoolQuickMethod.stakeQuick(marketCoin, stakeMarketCoinName as SupportStakeMarketCoins, targetStakeAccount);\n } else {\n const account = spoolQuickMethod.normalMethod.createStakeAccount(stakeMarketCoinName as SupportStakeMarketCoins);\n await spoolQuickMethod.stakeQuick(marketCoin, stakeMarketCoinName as SupportStakeMarketCoins, account);\n txBlock.transferObjects([account], sender);\n }\n return txBlock;\n }\n\n public async unstakeAndWithdraw(\n poolCoinName: SupportPoolCoins,\n amount: number,\n unstakeAccount: { id: string; coin: number }[],\n ) {\n const txBlock = new TransactionBlock();\n const quickMethod = generateCoreQuickMethod({\n builder: this.builder,\n txBlock,\n });\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n const withdrawCoins = [];\n txBlock.setSender(sender);\n const stakeMarketCoinName = this.utils.parseMarketCoinName(poolCoinName) as SupportStakeMarketCoins;\n for (let i = 0; i < unstakeAccount.length; i++) {\n const account = unstakeAccount[i];\n const [marketCoin] = await spoolQuickMethod.unstakeQuick(account.coin, stakeMarketCoinName, account.id);\n if (marketCoin) {\n const wdScoin = quickMethod.normalMethod.withdraw(marketCoin, poolCoinName);\n withdrawCoins.push(wdScoin);\n }\n }\n if (amount > 0) {\n const wdCoin = await quickMethod.withdrawQuick(amount, poolCoinName);\n withdrawCoins.push(wdCoin);\n }\n txBlock.transferObjects(withdrawCoins, sender);\n return txBlock;\n }\n\n /**\n * Stake market coin into the specific spool.\n *\n * @param marketCoinName - Types of market coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param stakeAccountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n stakeAccountId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const stakeAccounts = await this.query.getStakeAccounts(stakeMarketCoinName, sender);\n const targetStakeAccount = stakeAccountId || (stakeAccounts.length > 0 ? stakeAccounts[0].id : undefined);\n if (targetStakeAccount) {\n await spoolQuickMethod.stakeQuick(amount, stakeMarketCoinName, targetStakeAccount);\n } else {\n const account = spoolQuickMethod.normalMethod.createStakeAccount(stakeMarketCoinName);\n await spoolQuickMethod.stakeQuick(amount, stakeMarketCoinName, account);\n txBlock.transferObjects([account], sender);\n }\n return txBlock;\n }\n\n /**\n * Unstake market coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async unstake(\n stakeMarketCoinName: SupportStakeMarketCoins,\n amount: number,\n stakeAccountId?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const marketCoins = await spoolQuickMethod.unstakeQuick(amount, stakeMarketCoinName, stakeAccountId);\n txBlock.transferObjects(marketCoins, sender);\n return txBlock;\n }\n\n /**\n * Claim reward coin from the specific spool.\n *\n * @param stakeMarketCoinName - Types of mak coin.\n * @param amount - The amount of coins would deposit.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param accountId - The stake account object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async claim(\n lendingIncentive: SpoolIncentiveParams[],\n borrowIncentiveV2: BorrowIncentiveParams[],\n borrowIncentive: BorrowIncentiveParams[],\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const spoolQuickMethod = generateSpoolQuickMethod({ builder: this.builder, txBlock });\n const borrowIncentiveRewarad = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoins: { sui: TransactionResult[]; sca: TransactionResult[] } = {\n sui: [],\n sca: [],\n };\n\n for (let i = 0; i < lendingIncentive.length; i++) {\n const { stakeMarketCoinName, stakeAccountId } = lendingIncentive[i];\n const rewardCoin = spoolQuickMethod.normalMethod.claim(stakeAccountId, stakeMarketCoinName);\n rewardCoins.sui.push(rewardCoin);\n }\n\n for (let i = 0; i < borrowIncentiveV2.length; i++) {\n const { obligationId, obligationKey, rewardCoinName } = borrowIncentiveV2[i];\n const rewardCoin = borrowIncentiveRewarad.normalMethod.claimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n rewardCoins[rewardCoinName].push(rewardCoin);\n }\n\n for (let i = 0; i < borrowIncentive.length; i++) {\n const { obligationId, obligationKey, rewardCoinName } = borrowIncentive[i];\n const rewardCoin = borrowIncentiveRewarad.normalMethod.oldClaimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n rewardCoins[rewardCoinName].push(rewardCoin);\n }\n\n if (rewardCoins.sui.length > 0) {\n if (rewardCoins.sui.length > 1) {\n txBlock.mergeCoins(rewardCoins.sui[0], rewardCoins.sui.slice(1));\n }\n txBlock.transferObjects([rewardCoins.sui[0]], txBlock.pure(sender));\n }\n\n if (rewardCoins.sca.length > 0) {\n if (rewardCoins.sca.length > 1) {\n txBlock.mergeCoins(rewardCoins.sca[0], rewardCoins.sca.slice(1));\n }\n txBlock.transferObjects([rewardCoins.sca[0]], txBlock.pure(sender));\n }\n return txBlock;\n }\n\n /* ==================== Borrow Incentive Method ==================== */\n\n /**\n * stake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async stakeObligation(\n obligationId: string,\n obligationKeyId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = this.builder.createTxBlock();\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await borrowIncentiveQuickMethod.stakeObligationQuick(obligationId, obligationKeyId);\n return txBlock;\n }\n\n /**\n * unstake obligaion.\n *\n * @param obligationId - The obligation account object.\n * @param obligationKeyId - The obligation key account object.\n * @param sign - Decide to directly sign the transaction or return the transaction block.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block\n */\n public async unstakeObligation(\n obligationId: string,\n obligationKeyId: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = this.builder.createTxBlock();\n const borrowIncentiveQuickMethod = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await borrowIncentiveQuickMethod.unstakeObligationQuick(obligationId, obligationKeyId);\n return txBlock;\n }\n\n /**\n * Stake SCA.\n *\n * @param amount - Types of mak coin.\n * @param lockPeriod - The amount of coins would deposit.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stakeSca(\n amount: number,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n obligationId?: string,\n obligationKey?: string,\n lockPeriod?: number,\n vescaKey?: string,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n\n let newVescaKey;\n if (!vescaKey) {\n newVescaKey = vescaQuickMethod.normalMethod.lockSca(takeCoin, lockPeriod);\n } else {\n vescaQuickMethod.normalMethod.extendLockAmount(vescaKey, takeCoin);\n }\n\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligationId, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligationId, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligationId, obligationKey, vescaKey || newVescaKey);\n }\n\n if (!vescaKey) {\n txBlock.transferObjects([newVescaKey, leftCoin], sender);\n }\n\n return txBlock;\n }\n\n /**\n * Stake more SCA.\n *\n * @param amount - Types of mak coin.\n * @param vescaKey - The vesca key object.\n * @param walletAddress - The wallet address of the owner.\n * @return Transaction block response or transaction block.\n */\n public async stakeMoreSca(amount: number, vescaKey?: string, walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n // const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // await vescaQuickMethod.extendLockAmountQuick(amount, vescaKey);\n return txBlock;\n }\n\n /**\n * Extend stake lock period.\n *\n * @param lockPeriodInDays\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async extendStakeScaLockPeriod(\n lockPeriodInDays: number,\n vescaKey: string,\n obligationId?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n vescaQuickMethod.normalMethod.extendLockPeriod(vescaKey, lockPeriodInDays);\n if (obligationId && obligationKey) {\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligationId, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligationId, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligationId, obligationKey, vescaKey);\n }\n return txBlock;\n }\n\n public async extendPeriodAndStakeMoreSca(\n amount: number,\n vescaKey: string,\n lockPeriodInDays: number,\n obligation?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n vescaQuickMethod.normalMethod.extendLockPeriod(vescaKey, lockPeriodInDays);\n vescaQuickMethod.normalMethod.extendLockAmount(vescaKey, takeCoin);\n txBlock.transferObjects([leftCoin], sender);\n if (!obligation || !obligationKey) {\n return txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligation, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligation, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return txBlock;\n }\n\n /**\n * Renew expired stake SCA.\n *\n * @param amount\n * @param lockPeriodInDays\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async renewExpiredStakeSca(\n amount: number,\n lockPeriodInDays: number,\n vescaKey: string,\n isHaveRedeem = false,\n obligation?: string,\n obligationKey?: string,\n isObligationLocked = false,\n isOldBorrowIncentive = false,\n walletAddress?: string,\n ): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n if (isHaveRedeem) {\n const redeem = vescaQuickMethod.normalMethod.redeemSca(vescaKey);\n txBlock.transferObjects([redeem], sender);\n }\n\n // Get all SCA and merge them into one.\n const coins = await this.builder.utils.selectCoinIds(amount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = this.builder.utils.takeAmountFromCoins(txBlock, coins, amount);\n txBlock.transferObjects([leftCoin], sender);\n // renew veSCA\n vescaQuickMethod.normalMethod.renewExpiredVeSca(vescaKey, takeCoin, lockPeriodInDays);\n if (!obligation || !obligationKey) {\n return txBlock;\n }\n if (isObligationLocked) {\n if (isOldBorrowIncentive) {\n borrowIncentive.normalMethod.oldUnstakeObligation(obligation, obligationKey);\n } else {\n borrowIncentive.normalMethod.unstakeObligation(obligation, obligationKey);\n }\n }\n borrowIncentive.normalMethod.stakeObligationWithVesca(obligation, obligationKey, vescaKey);\n return txBlock;\n }\n\n public async redeemSca(veScaKey: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n txBlock.setSender(sender);\n\n await vescaQuickMethod.redeemScaQuick(veScaKey);\n return txBlock;\n }\n\n public async migrateAndClaim(\n veScaKey: string,\n obligationKey: string,\n obligationId: string,\n rewardCoinName: SupportBorrowIncentiveRewardCoins,\n ) {\n const txBlock = new TransactionBlock();\n const borrowIncentive = generateBorrowIncentiveQuickMethod({ builder: this.builder, txBlock });\n const sender = this.walletAddress;\n txBlock.setSender(sender);\n\n const rewardCoin = borrowIncentive.normalMethod.oldClaimBorrowIncentive(\n obligationId,\n obligationKey,\n rewardCoinName,\n );\n txBlock.transferObjects([rewardCoin], sender);\n borrowIncentive.stakeObligationWithVeScaQuick(obligationId, obligationKey, veScaKey);\n return txBlock;\n }\n\n /**\n * Withdraw unlocked SCA.\n *\n * @param vescaKey\n * @param walletAddress\n * @returns Transaction block response or transaction block.\n */\n public async withdrawUnlockedSca(vescaKey?: string, walletAddress?: string): Promise<TransactionBlock> {\n const txBlock = new TransactionBlock();\n const vescaQuickMethod = generateQuickVeScaMethod({ builder: this.builder, txBlock });\n const sender = walletAddress || this.walletAddress;\n txBlock.setSender(sender);\n\n await vescaQuickMethod.redeemScaQuick(vescaKey);\n return txBlock;\n }\n\n private calculateAvailableClaimCoin(accountPoint: any, poolPoint: any): BigNumber {\n const borrowAmount = new BigNumber(accountPoint.weightedAmount);\n const baseIndexRate = 1e9;\n const increasePointRate = poolPoint.currentPointIndex\n ? BigNumber(poolPoint.currentPointIndex - accountPoint.index).dividedBy(baseIndexRate)\n : 1;\n return borrowAmount\n .multipliedBy(increasePointRate)\n .plus(accountPoint.points)\n .shiftedBy(-1 * poolPoint.coinDecimal);\n }\n}\n","export const config = {\n mainnet: {\n core: {\n version: '0x07871c4b3c847a0f674510d4978d5cf6f960452795e8ff6f189fd2088a3f6ac7',\n versionCap: '0x590a4011cb649b3878f3ea14b3a78674642a9548d79b7e091ef679574b158a07',\n object: '0xefe8b36d5b2e43728cc323298626b83177803521d195cfb11e15b910e892fddf',\n market: '0xa757975255146dc9686aa823b7838b507f315d704f428cbadad2f4ea061939d9',\n adminCap: '0x09689d018e71c337d9db6d67cbca06b74ed92196103624028ccc3ecea411777c',\n coinDecimalsRegistry: '0x200abe9bf19751cc566ae35aa58e2b7e4ff688fc1130f8d8909ea09bc137d668',\n obligationAccessStore: '0x733e30b7c94d619d78cb8f5bc4bfbb759ced9a531239028caabb2474e5be59c9',\n coins: {\n cetus: {\n id: '0x06864a6f921804860930db6ddbe2e16acdf8504495ea7481637a1c8b9a8fe54b',\n metaData: '0x4c0dce55eff2db5419bbd2d239d1aa22b4a400c01bbb648b058a9883989025da',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'e5b274b2611143df055d6e7cd8d93fe1961716bcd4dca1cad87a83bc1e78c1ef',\n feedObject: '0x24c0247fb22457a719efac7f670cdc79be321b521460bd6bd2ccfa9f80713b14',\n },\n },\n },\n apt: {\n id: '0x3a5143bb1196e3bcdfab6203d1683ae29edd26294fc8bfeafe4aaa9d2704df37',\n metaData: '0xc969c5251f372c0f34c32759f1d315cf1ea0ee5e4454b52aea08778eacfdd0a8',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '03ae4db29ed4ae33d323568895aa00337e658e348b37509f5372ae51f0af00d5',\n feedObject: '0x7c5b7837c44a69b469325463ac0673ac1aa8435ff44ddb4191c9ae380463647f',\n },\n },\n },\n sol: {\n id: '0xb7844e289a8410e50fb3ca48d69eb9cf29e27d223ef90353fe1bd8e27ff8f3f8',\n metaData: '0x4d2c39082b4477e3e79dc4562d939147ab90c42fc5f3e4acf03b94383cd69b6e',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',\n feedObject: '0x9d0d275efbd37d8a8855f6f2c761fa5983293dd8ce202ee5196626de8fcd4469',\n },\n },\n },\n btc: {\n id: '0x027792d9fed7f9844eb4839566001bb6f6cb4804f66aa2da6fe1ee242d896881',\n metaData: '0x5d3c6e60eeff8a05b693b481539e7847dfe33013e7070cdcb387f5c0cac05dfd',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',\n feedObject: '0x9a62b4863bdeaabdc9500fce769cf7e72d5585eeb28a6d26e4cafadc13f76ab2',\n },\n },\n },\n eth: {\n id: '0xaf8cd5edc19c4512f4259f0bee101a40d41ebed738ade5874359610ef8eeced5',\n metaData: '0x8900e4ceede3363bef086d6b50ca89d816d0e90bf6bc46efefe1f8455e08f50f',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace',\n feedObject: '0x9193fd47f9a0ab99b6e365a464c8a9ae30e6150fc37ed2a89c1586631f6fc4ab',\n },\n },\n },\n usdc: {\n id: '0x5d4b302506645c37ff133b98c4b50a5ae14841659738d6d733d59d0d217a93bf',\n metaData: '0x4fbf84f3029bd0c0b77164b587963be957f853eccf834a67bb9ecba6ec80f189',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',\n feedObject: '0x5dec622733a204ca27f5a90d8c2fad453cc6665186fd5dff13a83d0b6c9027ab',\n },\n },\n },\n usdt: {\n id: '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c',\n metaData: '0xfb0e3eb97dd158a5ae979dddfa24348063843c5b20eb8381dd5fa7c93699e45c',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b',\n feedObject: '0x985e3db9f93f76ee8bace7c3dd5cc676a096accd5d9e09e9ae0fb6e492b14572',\n },\n },\n },\n sui: {\n id: '0x0000000000000000000000000000000000000000000000000000000000000002',\n metaData: '0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '0xbca474133638352ba83ccf7b5c931d50f764b09550e16612c9f70f1e21f3f594',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n afsui: {\n id: '0xf325ce1300e8dac124071d3152c5c5ee6174914f8bc2161e88329cf579246efc',\n metaData: '0x2f9217f533e51334873a39b8026a4aa6919497b47f49d0986a4f1aec66f8a34d',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n hasui: {\n id: '0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d',\n metaData: '0x2c5f33af93f6511df699aaaa5822d823aac6ed99d4a0de2a4a50b3afa0172e24',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n vsui: {\n id: '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55',\n metaData: '0xabd84a23467b33854ab25cf862006fd97479f8f6f53e50fe732c43a274d939bd',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744',\n feedObject: '0x801dbc2f0053d34734814b2d6df491ce7807a725fe9a01ad74a07e9c51396c37',\n },\n },\n },\n sca: {\n id: '0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6',\n metaData: '0x5d26a1e9a55c88147ac870bfa31b729d7f49f8804b8b3adfdf3582d301cca844',\n treasury: '',\n oracle: {\n supra: '',\n switchboard: '',\n pyth: {\n feed: '7e17f0ac105abe9214deb9944c30264f5986bf292869c6bd8e8da3ccd92d79bc',\n feedObject: '0xf6de1d3279a269a597d813cbaca59aa906543ab9a8c64e84a4722f1a20863985',\n },\n },\n },\n },\n oracles: {\n xOracle: '0x93d5bf0936b71eb27255941e532fac33b5a5c7759e377b4923af0a1359ad494f',\n xOracleCap: '0x1edeae568fde99e090dbdec4bcdbd33a15f53a1ce1f87aeef1a560dedf4b4a90',\n supra: {\n registry: '',\n registryCap: '',\n holder: '',\n },\n switchboard: {\n registry: '',\n registryCap: '',\n },\n pyth: {\n registry: '0xedc293f9413a5a7a5d53bdba1fd889d0a4030894469228f0acdae4aa3c55a213',\n registryCap: '0xbcb07141eb1f7e01fbda4130ecf5f5adaeabb77f5d9c32158b7532bcd2197acd',\n state: '0x1f9310238ee9298fb703c3419030b35b22bb1cc37113e3bb5007c99aec79e5b8',\n wormhole: '0x5306f64e312b581766351c07af79c72fcb1cd25147157fdc2f8ad76de9a3fb6a',\n wormholeState: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c',\n },\n },\n packages: {\n coinDecimalsRegistry: {\n id: '0xca5a5a62f01c79a104bf4d31669e29daa387f325c241de4edbe30986a9bc8b0d',\n upgradeCap: '0x34e76a945d29f195bc53ca704fa70877d1cf3a5d7bbfdda1b13e633fff13c0f6',\n },\n math: {\n id: '0xad013d5fde39e15eabda32b3dbdafd67dac32b798ce63237c27a8f73339b9b6f',\n upgradeCap: '0x3a329598231de02e6135c62284b66005b41cad1d9ab7ca2dc79c08293aba2ec6',\n },\n whitelist: {\n id: '0x1318fdc90319ec9c24df1456d960a447521b0a658316155895014a6e39b5482f',\n upgradeCap: '0xf5a22aea23db664f7b69855b6a546747f17c1ec4230319cfc17225e462b05761',\n },\n x: {\n id: '0x779b5c547976899f5474f3a5bc0db36ddf4697ad7e5a901db0415c2281d28162',\n upgradeCap: '0x3f203f6fff6a69d151e4f1cd931f22b68c489ef2759765662fc7baf673943c9e',\n },\n protocol: {\n id: '0x38fe42a5a69f7eb3635404389e8003be9457b1a5c873f133184648c7e9bd47b7',\n upgradeCap: '0x38527d154618d1fd5a644b90717fe07cf0e9f26b46b63e9568e611a3f86d5c1a',\n },\n protocolWhitelist: {\n id: '0x4c262d9343dac53ecb28f482a2a3f62c73d0ebac5b5f03d57383d56ff219acdf',\n upgradeCap: '0x4a5e88a75039b00988f633f811f58117f31b8627a46bf822aa114d9010049449',\n },\n query: {\n id: '0xb8d603a39114a5efef3dd0bf84df0bed1be1fbd39b78b7dd6e8a61ccc5e6006f',\n upgradeCap: '0x0d535c35f608b9b01b7ccce11acf43b1dd80c1b72bf8b541744a6e28e8d2745f',\n },\n supra: {\n id: '',\n upgradeCap: '',\n },\n pyth: {\n id: '0x910f30cbc7f601f75a5141a01265cd47c62d468707c5e1aecb32a18f448cb25a',\n upgradeCap: '0xdf0ffbae1ea5bb25fbca5efba433dcf00c7cced65679af2f04728901275c6157',\n },\n switchboard: {\n id: '',\n upgradeCap: '',\n },\n xOracle: {\n id: '0x1478a432123e4b3d61878b629f2c692969fdb375644f1251cd278a4b1e7d7cd6',\n upgradeCap: '0x0f928a6b2e26b73330fecaf9b44acfc9800a4a9794d6415c2a3153bc70e3c1f0',\n },\n testCoin: {\n id: '',\n upgradeCap: '',\n },\n },\n },\n spool: {\n id: '0xec1ac7f4d01c5bf178ff4e62e523e7df7721453d81d4904a42a0ffc2686c843d',\n adminCap: '0xdd8a047cbbf802bfcde5288b8ef1910965d789cc614da11d39af05fca0bd020a',\n object: '0xe87f1b2d498106a2c61421cec75b7b5c5e348512b0dc263949a0e7a3c256571a',\n pools: {\n seth: {\n id: '0xeec40beccb07c575bebd842eeaabb835f77cd3dab73add433477e57f583a6787',\n rewardPoolId: '0x957de68a18d87817de8309b30c1ec269a4d87ae513abbeed86b5619cb9ce1077',\n },\n ssui: {\n id: '0x4f0ba970d3c11db05c8f40c64a15b6a33322db3702d634ced6536960ab6f3ee4',\n rewardPoolId: '0x162250ef72393a4ad3d46294c4e1bdfcb03f04c869d390e7efbfc995353a7ee9',\n },\n susdc: {\n id: '0x4ace6648ddc64e646ba47a957c562c32c9599b3bba8f5ac1aadb2ae23a2f8ca0',\n rewardPoolId: '0xf4268cc9b9413b9bfe09e8966b8de650494c9e5784bf0930759cfef4904daff8',\n },\n susdt: {\n id: '0xcb328f7ffa7f9342ed85af3fdb2f22919e1a06dfb2f713c04c73543870d7548f',\n rewardPoolId: '0x2c9f934d67a5baa586ceec2cc24163a2f049a6af3d5ba36b84d8ac40f25c4080',\n },\n scetus: {\n id: '0xac1bb13bf4472a637c18c2415fb0e3c1227ea2bcf35242e50563c98215bd298e',\n rewardPoolId: '0x6835c1224126a45086fc6406adc249e3f30df18d779ca4f4e570e38716a17f3f',\n },\n safsui: {\n id: '0xeedf438abcaa6ce4d9625ffca110920592d5867e4c5637d84ad9f466c4feb800',\n rewardPoolId: '0x89255a2f86ed7fbfef35ab8b7be48cc7667015975be2685dd9a55a9a64baf76e',\n },\n shasui: {\n id: '0xa6148bc1b623e936d39a952ceb5bea79e8b37228a8f595067bf1852efd3c34aa',\n rewardPoolId: '0x6f3563644d3e2ef13176dbf9d865bd93479df60ccbe07b7e66db57f6309f5a66',\n },\n svsui: {\n id: '0x69ce8e537e750a95381e6040794afa5ab1758353a1a2e1de7760391b01f91670',\n rewardPoolId: '0xbca914adce058ad0902c7f3cfcd698392a475f00dcfdc3f76001d0370b98777a',\n },\n },\n version: '',\n versionCap: '',\n },\n borrowIncentive: {\n id: '0x874f1d43d81e2256e120bab2485938fe07ba0cc21d87129a99a1db11cacb382d',\n adminCap: '0xc486afa253646f4d381e81d7f1df8aa4723b845a6bb356f69bad635ffefffe2c',\n object: '0x002875153e09f8145ab63527bc85c00f2bd102e12f9573c47f8cdf1a1cb62934',\n query: '0x529edc54a3dce2207703ceebbccb0ac14133f7825c1f528775ba0d85a4063489',\n incentivePools: '0x6547e143d406b5ccd5f46aae482497de279cc1a68c406f701df70a05f9212ab4',\n incentiveAccounts: '0xc4701fdbc1c92f9a636d334d66012b3027659e9fb8aff27279a82edfb6b77d02',\n config: '0xdf5d04b4691cc67e82fd4db8394d89ff44823a9de29716c924f74bb4f11cc1f7',\n version: '',\n versionCap: '',\n },\n vesca: {\n id: '0xcfe2d87aa5712b67cad2732edb6a2201bfdf592377e5c0968b7cb02099bd8e21',\n adminCap: '0x4d105b16467acca81d18c132cdd1a3cee159920a86c1ef4bdbf2e8d7878500c5',\n tableId: '0x0a0b7f749baeb61e3dfee2b42245e32d0e6b484063f0a536b33e771d573d7246',\n table: '0xd3a4632b1080f7d96e1c2487d4dabf2c1196916937c505a69954ac9f393be8d0',\n treasury: '0xafa4b6231e49c15a22d641ce33fda761baaf650fa21899dfa2eb1716146e7306',\n config: '0x7cbcb0a342179577a117dfdff974cf1ab765d3b571067bf22ddf5f9e3a667922',\n },\n },\n};\n","import { config } from '../config';\nimport type { ScallopAddressParams, AddressesInterface, AddressStringPath, NetworkType } from '../types';\n\n/**\n * @description\n * It provides methods for managing addresses.\n *\n * @example\n * ```typescript\n * const scallopAddress = new ScallopAddress(<parameters>);\n * scallopAddress.<address functions>();\n * await scallopAddress.<address async functions>();\n * ```\n */\nexport class ScallopAddress {\n private readonly _auth?: string;\n\n private _id?: string;\n\n private _network: NetworkType;\n\n private _currentAddresses?: AddressesInterface;\n\n private _addressesMap: Map<NetworkType, AddressesInterface>;\n\n public constructor(params: ScallopAddressParams) {\n const { id, auth, network } = params;\n\n if (auth) {\n this._auth = auth;\n }\n this._id = id;\n this._network = network || 'mainnet';\n this._addressesMap = new Map();\n }\n\n /**\n * Get addresses API id.\n *\n * @return The addresses API id.\n */\n public getId() {\n return this._id || undefined;\n }\n\n /**\n * Get the address at the provided path.\n *\n * @param path - The path of the address to get.\n * @return The address at the provided path.\n */\n public get(path: AddressStringPath) {\n if (this._currentAddresses) {\n const value = path\n .split('.')\n .reduce(\n (nestedAddressObj: any, key: string) =>\n typeof nestedAddressObj === 'object' ? nestedAddressObj[key] : nestedAddressObj,\n this._currentAddresses,\n );\n return value || undefined;\n }\n return undefined;\n }\n\n /**\n * Sets the address for the specified path, it does not interact with the API.\n *\n * @param path - The path of the address to set.\n * @param address - The address be setted to the tartget path.\n * @return The addresses.\n */\n public set(path: AddressStringPath, address: string) {\n if (this._currentAddresses) {\n const keys = path.split('.');\n keys.reduce((nestedAddressObj: any, key: string, index) => {\n if (index === keys.length - 1) {\n const updatedAddressObj = nestedAddressObj;\n updatedAddressObj[key] = address;\n }\n return nestedAddressObj[key];\n }, this._currentAddresses);\n }\n return this._currentAddresses;\n }\n\n /**\n * Synchronize the specified network addresses from the addresses map to the\n * current addresses and change the default network to specified network.\n *\n * @param network - Specifies which network's addresses you want to get.\n * @return Current addresses.\n */\n public switchCurrentAddresses(network: NetworkType) {\n if (this._addressesMap.has(network)) {\n this._currentAddresses = this._addressesMap.get(network);\n this._network = network;\n }\n return this._currentAddresses;\n }\n\n /**\n * Get the addresses, If `network` is not provided, returns the current\n * addresses or the default network addresses in the addresses map.\n *\n * @param network - Specifies which network's addresses you want to get.\n */\n public getAddresses(network?: NetworkType) {\n if (network) {\n return this._addressesMap.get(network);\n }\n return this._currentAddresses ?? this._addressesMap.get(this._network);\n }\n\n /**\n * Set the addresses into addresses map. If the specified network is the same\n * as the current network, the current addresses will be updated at the same time.\n *\n * @param addresses - The addresses be setted to the tartget network.\n * @param network - Specifies which network's addresses you want to set.\n * @return The addresses.\n */\n public setAddresses(addresses: AddressesInterface, network?: NetworkType) {\n const targetNetwork = network || this._network;\n if (targetNetwork === this._network) {\n this._currentAddresses = addresses;\n }\n this._addressesMap.set(targetNetwork, addresses);\n }\n\n /**\n * Get all addresses.\n *\n * @return All addresses.\n */\n public getAllAddresses() {\n return Object.fromEntries(this._addressesMap);\n }\n\n public read() {\n Object.entries<AddressesInterface>(config).forEach(([network, addresses]) => {\n if (['localnet', 'devnet', 'testnet', 'mainnet'].includes(network)) {\n if (network === this._network) {\n this._currentAddresses = addresses;\n }\n this._addressesMap.set(network as NetworkType, addresses);\n }\n });\n return this.getAllAddresses();\n }\n}\n","import type { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopQuery } from './scallopQuery';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID } from '../constants';\nimport type {\n ScallopInstanceParams,\n ScallopBuilderParams,\n ScallopTxBlock,\n SupportMarketCoins,\n SupportAssetCoins,\n} from '../types';\n\n/**\n * @description\n * It provides methods for operating the transaction block, making it more convenient to organize transaction combinations.\n *\n * @example\n * ```typescript\n * const scallopBuilder = new ScallopBuilder(<parameters>);\n * await scallopBuilder.init();\n * const txBlock = scallopBuilder.<builder functions>();\n * ```\n */\nexport class ScallopBuilder {\n public readonly params: ScallopBuilderParams;\n\n public readonly isTestnet: boolean;\n\n public address: ScallopAddress;\n\n public query: ScallopQuery;\n\n public utils: ScallopUtils;\n\n public client: SuiClient;\n\n public walletAddress: string;\n\n public constructor(params: ScallopBuilderParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.query =\n instance?.query ??\n new ScallopQuery(params, {\n address: this.address,\n });\n this.utils =\n instance?.utils ??\n new ScallopUtils(this.params, {\n address: this.address,\n query: this.query,\n });\n this.client = params.client;\n this.walletAddress = normalizeSuiAddress(params.walletAddress);\n this.isTestnet = params.networkType ? params.networkType === 'testnet' : false;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public async init(force = false, address?: ScallopAddress) {\n if (force || !this.address.getAddresses() || !address?.getAddresses()) {\n this.address.read();\n } else {\n this.address = address;\n }\n this.query.init(force, this.address);\n this.utils.init(force, this.address);\n }\n\n /**\n * Create a scallop txBlock instance that enhances transaction block.\n *\n * @param txBlock - Scallop txBlock, txBlock created by SuiKit, or original transaction block.\n * @return Scallop txBlock.\n */\n public createTxBlock(txBlock?: ScallopTxBlock | TransactionBlock) {\n return new TransactionBlock(txBlock);\n }\n\n /**\n * Specifying the sender's amount of coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param assetCoinName - Specific support asset coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectCoin(txBlock: ScallopTxBlock, assetCoinName: SupportAssetCoins, amount: number, sender: string) {\n const coinType = this.utils.parseCoinType(assetCoinName);\n const coins = await this.utils.selectCoinIds(amount, coinType, sender);\n const [takeCoin, leftCoin] = this.utils.takeAmountFromCoins(txBlock, coins, amount);\n return { takeCoin, leftCoin };\n }\n\n /**\n * Specifying the sender's amount of market coins to get coins args from transaction result.\n *\n * @param txBlock - Scallop txBlock or txBlock created by SuiKit .\n * @param marketCoinName - Specific support market coin name.\n * @param amount - Amount of coins to be selected.\n * @param sender - Sender address.\n * @return Take coin and left coin.\n */\n public async selectMarketCoin(\n txBlock: TransactionBlock,\n marketCoinName: SupportMarketCoins,\n amount: number,\n sender: string,\n ) {\n const marketCoinType = this.utils.parseMarketCoinType(marketCoinName);\n const coins = await this.utils.selectCoinIds(amount, marketCoinType, sender);\n const [takeCoin, leftCoin] = this.utils.takeAmountFromCoins(txBlock, coins, amount);\n return { takeCoin, leftCoin };\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_TYPE_ARG, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { ScallopAddress } from './scallopAddress';\nimport {\n ADDRESSES_ID,\n PROTOCOL_OBJECT_ID,\n spoolRewardCoins,\n borrowIncentiveRewardCoins,\n coinDecimals,\n wormholeCoinIds,\n voloCoinIds,\n coinIds,\n UNLOCK_ROUND_DURATION,\n MAX_LOCK_DURATION,\n} from '../constants';\nimport type {\n ScallopUtilsParams,\n ScallopInstanceParams,\n SupportCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n SupportStakeMarketCoins,\n SupportBorrowIncentiveCoins,\n CoinWrappedType,\n SupportPoolCoins,\n SuiTxArg,\n} from '../types';\nimport { findClosestUnlockRound, isMarketCoin, parseAssetSymbol } from '../utils';\n\n/**\n * @description\n * Integrates some helper functions frequently used in interactions with the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopUtils = new ScallopUtils(<parameters>);\n * await scallopUtils.init();\n * scallopUtils.<utils functions>();\n * await scallopUtils.<utils functions>();\n * ```\n */\nexport class ScallopUtils {\n public readonly params: ScallopUtilsParams;\n\n public readonly isTestnet: boolean;\n\n private _address: ScallopAddress;\n\n public client: SuiClient;\n\n public constructor(params: ScallopUtilsParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this._address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.isTestnet = params.networkType ? params.networkType === 'testnet' : false;\n this.client = params.client;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public init(force = false, address?: ScallopAddress) {\n if (force || !this._address.getAddresses() || !address?.getAddresses()) {\n this._address.read();\n } else {\n this._address = address;\n }\n }\n\n /**\n * Convert coin name to symbol.\n *\n * @param coinName - Specific support coin name.\n * @return Symbol string.\n */\n public parseSymbol(coinName: SupportCoins) {\n if (isMarketCoin(coinName)) {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return coinName.slice(0, 1).toLowerCase() + parseAssetSymbol(assetCoinName);\n }\n return parseAssetSymbol(coinName);\n }\n\n /**\n * Convert coin name to coin type.\n *\n * @description\n * The Coin type of wormhole is fixed `coin:Coin`. Here using package id\n * to determine and return the type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Coin type.\n */\n public parseCoinType(coinName: SupportCoins) {\n const validCoinName = isMarketCoin(coinName) ? this.parseCoinName(coinName) : coinName;\n const coinPackageId =\n this._address.get(`core.coins.${validCoinName as SupportPoolCoins}.id`) ||\n coinIds[coinName as SupportPoolCoins] ||\n undefined;\n if (!coinPackageId) {\n throw Error(`Coin ${coinName} is not supported`);\n }\n if (coinName === 'sui') {\n return normalizeStructTag(`${coinPackageId}::sui::SUI`);\n }\n const wormHolePckageIds = [\n this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc,\n this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt,\n this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth,\n this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc,\n this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol,\n this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt,\n ];\n const voloPckageIds = [this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui];\n if (wormHolePckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::coin::COIN`;\n }\n if (voloPckageIds.includes(coinPackageId)) {\n return `${coinPackageId}::cert::CERT`;\n }\n return `${coinPackageId}::${validCoinName}::${validCoinName.toUpperCase()}`;\n }\n\n /**\n * Convert coin name to market coin type.\n *\n * @param coinPackageId - Package id of coin.\n * @param coinName - Specific support coin name.\n * @return Market coin type.\n */\n public parseMarketCoinType(coinName: SupportCoins) {\n const protocolObjectId = this._address.get('core.object') || PROTOCOL_OBJECT_ID;\n const coinType = this.parseCoinType(coinName);\n return `${protocolObjectId}::reserve::MarketCoin<${coinType}>`;\n }\n\n /**\n * Convert coin type to coin name.\n *\n * @description\n * The coin name cannot be obtained directly from the wormhole type. Here\n * the package id is used to determine and return a specific name.\n *\n * @param coinType - Specific support coin type.\n * @return Coin Name.\n */\n public parseCoinNameFromType<T extends SupportAssetCoins>(\n coinType: string,\n ): T extends SupportAssetCoins ? T : SupportAssetCoins;\n public parseCoinNameFromType<T extends SupportMarketCoins>(\n coinType: string,\n ): T extends SupportMarketCoins ? T : SupportMarketCoins;\n public parseCoinNameFromType<T extends SupportCoins>(coinType: string): T extends SupportCoins ? T : SupportCoins;\n public parseCoinNameFromType(coinType: string) {\n let type = normalizeStructTag(coinType);\n const coinTypeRegex = /((0x[^:]+::[^:]+::[^<>]+))(?![^<>]*<)/;\n const coinTypeMatch = coinType.match(coinTypeRegex);\n const isMarketCoinType = coinType.includes('reserve::MarketCoin');\n type = coinTypeMatch?.[1] || coinType;\n\n const wormHoleCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${this._address.get('core.coins.usdc.id') ?? wormholeCoinIds.usdc}::coin::COIN`]: 'usdc',\n [`${this._address.get('core.coins.usdt.id') ?? wormholeCoinIds.usdt}::coin::COIN`]: 'usdt',\n [`${this._address.get('core.coins.eth.id') ?? wormholeCoinIds.eth}::coin::COIN`]: 'eth',\n [`${this._address.get('core.coins.btc.id') ?? wormholeCoinIds.btc}::coin::COIN`]: 'btc',\n [`${this._address.get('core.coins.sol.id') ?? wormholeCoinIds.sol}::coin::COIN`]: 'sol',\n [`${this._address.get('core.coins.apt.id') ?? wormholeCoinIds.apt}::coin::COIN`]: 'apt',\n };\n const voloCoinTypeMap: Record<string, SupportAssetCoins> = {\n [`${this._address.get('core.coins.vsui.id') ?? voloCoinIds.vsui}::cert::CERT`]: 'vsui',\n };\n\n const assetCoinName =\n wormHoleCoinTypeMap[type] || voloCoinTypeMap[type] || (type.split('::')[2].toLowerCase() as SupportAssetCoins);\n\n return isMarketCoinType ? this.parseMarketCoinName(assetCoinName) : assetCoinName;\n }\n\n /**\n * Convert marke coin name to coin name.\n *\n * @param marketCoinName - Specific support market coin name.\n * @return Coin Name.\n */\n public parseCoinName<T extends SupportAssetCoins>(marketCoinName: string) {\n return marketCoinName.slice(1) as T;\n }\n\n /**\n * Convert coin name to market coin name.\n *\n * @param coinName - Specific support coin name.\n * @return Market coin name.\n */\n public parseMarketCoinName<T extends SupportMarketCoins>(coinName: SupportCoins) {\n return `s${coinName}` as T;\n }\n\n /**\n * Get reward type of spool.\n *\n * @param stakeMarketCoinName - Support stake market coin.\n * @return Spool reward coin name.\n */\n public getSpoolRewardCoinName = (stakeMarketCoinName: SupportStakeMarketCoins) =>\n spoolRewardCoins[stakeMarketCoinName];\n\n /**\n * Get reward type of borrow incentive pool.\n *\n * @param borrowIncentiveCoinName - Support borrow incentive coin.\n * @return Borrow incentive reward coin name.\n */\n public getBorrowIncentiveRewardCoinName = (borrowIncentiveCoinName: SupportBorrowIncentiveCoins) =>\n borrowIncentiveRewardCoins[borrowIncentiveCoinName];\n\n /**\n * Get coin decimal.\n *\n * return Coin decimal.\n */\n public getCoinDecimal(coinName: SupportCoins) {\n return coinDecimals[coinName];\n }\n\n /**\n * Get coin wrapped type.\n *\n * return Coin wrapped type.\n */\n public getCoinWrappedType(assetCoinName: SupportAssetCoins): CoinWrappedType {\n return assetCoinName === 'usdc' ||\n assetCoinName === 'usdt' ||\n assetCoinName === 'eth' ||\n assetCoinName === 'btc' ||\n assetCoinName === 'apt' ||\n assetCoinName === 'sol'\n ? {\n from: 'Wormhole',\n type: 'Portal from Ethereum',\n }\n : undefined;\n }\n\n /**\n * Select coin id that add up to the given amount as transaction arguments.\n *\n * @param ownerAddress - The address of the owner.\n * @param amount - The amount that including coin decimals.\n * @param coinType - The coin type, default is 0x2::SUI::SUI.\n * @return The selected transaction coin arguments.\n */\n public async selectCoinIds(amount: number, coinType: string = SUI_TYPE_ARG, ownerAddress?: string) {\n const address = ownerAddress;\n\n const selectedCoins: {\n objectId: string;\n digest: string;\n version: string;\n }[] = [];\n let totalAmount = 0;\n let hasNext = true;\n let nextCursor: string | null | undefined = null;\n while (hasNext && totalAmount < amount) {\n const coins = await this.client.getCoins({\n owner: address,\n coinType,\n cursor: nextCursor,\n });\n // Sort the coins by balance in descending order\n coins.data.sort((a, b) => parseInt(b.balance, 10) - parseInt(a.balance, 10));\n for (let i = 0; i < coins.data.length; i++) {\n selectedCoins.push({\n objectId: coins.data[i].coinObjectId,\n digest: coins.data[i].digest,\n version: coins.data[i].version,\n });\n totalAmount += parseInt(coins.data[i].balance, 10);\n if (totalAmount >= amount) {\n break;\n }\n }\n nextCursor = coins.nextCursor;\n hasNext = coins.hasNextPage;\n }\n\n if (!selectedCoins.length) {\n throw new Error('No valid coins found for the transaction.');\n }\n return selectedCoins.map((coin) => coin.objectId);\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The annual percentage rate (APR).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage yield (APY) for the given APR and compounding frequency.\n */\n public parseAprToApy(apr: number, compoundFrequency = 365) {\n return (1 + apr / compoundFrequency) ** compoundFrequency - 1;\n }\n\n /**\n * Convert apr to apy.\n *\n * @param apr The equivalent annual percentage yield (APY).\n * @param compoundFrequency How often interest is compounded per year. Default is daily (365 times a year).\n * @return The equivalent annual percentage rate (APR) for the given APY and compounding frequency.\n */\n public parseApyToApr(apy: number, compoundFrequency = 365) {\n return ((1 + apy) ** (1 / compoundFrequency) - 1) * compoundFrequency;\n }\n\n public takeAmountFromCoins(txBlock: TransactionBlock, coinObjectId: string[], amount: SuiTxArg) {\n const coinObjects = coinObjectId.map((objectId) => txBlock.object(objectId));\n const mergedCoin = coinObjects[0];\n if (coinObjects.length > 1) {\n txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = txBlock.splitCoins(mergedCoin, [txBlock.pure(amount)]);\n return [sendCoin, mergedCoin];\n }\n\n /**\n * Give extend lock period to get unlock at in seconds timestamp.\n *\n * @description\n * - When the user without remaining unlock period, If the extended unlock day is not specified,\n * the unlock period will be increased by one day by default.\n * - When the given extended day plus the user's remaining unlock period exceeds the maximum\n * unlock period, the maximum unlock period is used as unlock period.\n *\n * @param extendLockPeriodInDay The extend lock period in day.\n * @param unlockAtInSecondTimestamp The unlock timestamp from veSca object.\n * @return New unlock at in seconds timestamp.\n */\n public getUnlockAt(extendLockPeriodInDay?: number, unlockAtInSecondTimestamp?: number) {\n const now = Math.floor(new Date().getTime() / 1000);\n const remainingLockPeriod = unlockAtInSecondTimestamp ? Math.max(unlockAtInSecondTimestamp - now, 0) : 0;\n\n let newUnlockAtInSecondTimestamp = 0;\n\n if (remainingLockPeriod === 0) {\n const lockPeriod = (extendLockPeriodInDay ?? 1) * UNLOCK_ROUND_DURATION;\n newUnlockAtInSecondTimestamp = Math.min(now + lockPeriod, now + MAX_LOCK_DURATION);\n } else {\n const lockPeriod = Math.min(\n extendLockPeriodInDay\n ? extendLockPeriodInDay * UNLOCK_ROUND_DURATION + remainingLockPeriod\n : remainingLockPeriod,\n MAX_LOCK_DURATION,\n );\n newUnlockAtInSecondTimestamp = now + lockPeriod;\n }\n return findClosestUnlockRound(newUnlockAtInSecondTimestamp);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport {\n MAX_LOCK_DURATION,\n MAX_LOCK_ROUNDS,\n MIN_INITIAL_LOCK_AMOUNT,\n MIN_TOP_UP_AMOUNT,\n UNLOCK_ROUND_DURATION,\n} from '../constants';\nimport { SuiObjectArg } from '../types';\n\n/**\n * Check and get the sender from the transaction block.\n *\n * @param txBlock - TxBlock created by SuiKit.\n * @return Sender of transaction.\n */\nexport const requireSender = (txBlock: TransactionBlock) => {\n const { sender } = txBlock.blockData;\n if (!sender) {\n throw new Error('Sender is required');\n }\n return sender;\n};\n\nexport const checkLockSca = (\n scaAmountOrCoin?: number | SuiObjectArg | undefined,\n lockPeriodInDays?: number,\n newUnlockAtInSecondTimestamp?: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isInitialLock || isLockExpired) {\n if (scaAmountOrCoin !== undefined && lockPeriodInDays !== undefined) {\n if (lockPeriodInDays <= 0) {\n throw new Error('Lock period must be greater than 0');\n }\n if (typeof scaAmountOrCoin === 'number' && scaAmountOrCoin < MIN_INITIAL_LOCK_AMOUNT) {\n throw new Error(\n `Minimum lock amount for ${isLockExpired ? 'renewing expired veSca' : 'initial lock'} is 10 SCA`,\n );\n }\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond > MAX_LOCK_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS} days)`);\n }\n } else {\n throw new Error(\n `SCA amount and lock period is required for ${isLockExpired ? 'renewing expired veSca' : 'initial lock'}`,\n );\n }\n } else {\n checkVesca(prevUnlockAtInSecondTimestamp);\n if (typeof scaAmountOrCoin === 'number' && scaAmountOrCoin < MIN_TOP_UP_AMOUNT) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n if (!!newUnlockAtInSecondTimestamp && !!prevUnlockAtInSecondTimestamp) {\n const totalLockDuration = newUnlockAtInSecondTimestamp - prevUnlockAtInSecondTimestamp;\n if (totalLockDuration > MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n }\n }\n};\n\nexport const checkExtendLockPeriod = (\n lockPeriodInDays: number,\n newUnlockAtInSecondTimestamp: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (lockPeriodInDays <= 0) {\n throw new Error('Lock period must be greater than 0');\n }\n\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isLockExpired) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n\n if (prevUnlockAtInSecondTimestamp) {\n const totalLockDuration = newUnlockAtInSecondTimestamp - (prevUnlockAtInSecondTimestamp ?? 0);\n if (totalLockDuration > MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n }\n};\n\nexport const checkExtendLockAmount = (scaAmount: number, prevUnlockAtInSecondTimestamp?: number) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (scaAmount < MIN_TOP_UP_AMOUNT) {\n throw new Error('Minimum top up amount is 1 SCA');\n }\n\n const isInitialLock = !prevUnlockAtInSecondTimestamp;\n const isLockExpired = !isInitialLock && prevUnlockAtInSecondTimestamp * 1000 <= new Date().getTime();\n if (isLockExpired) {\n throw new Error('veSca is expired, use renewExpiredVeScaQuick instead');\n }\n};\n\nexport const checkRenewExpiredVeSca = (\n scaAmount: number,\n lockPeriodInDays: number,\n prevUnlockAtInSecondTimestamp?: number,\n) => {\n checkVesca(prevUnlockAtInSecondTimestamp);\n\n if (scaAmount < MIN_INITIAL_LOCK_AMOUNT) {\n throw new Error('Minimum lock amount for renewing expired vesca 10 SCA');\n }\n\n const extendLockPeriodInSecond = lockPeriodInDays * UNLOCK_ROUND_DURATION;\n if (extendLockPeriodInSecond >= MAX_LOCK_DURATION - UNLOCK_ROUND_DURATION) {\n throw new Error(`Maximum lock period is ~4 years (${MAX_LOCK_ROUNDS - 1} days)`);\n }\n};\n\nexport const checkVesca = (prevUnlockAtInSecondTimestamp?: number) => {\n if (prevUnlockAtInSecondTimestamp === undefined) {\n throw new Error('veSca not found');\n }\n};\n","import { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport BigNumber from 'bignumber.js';\n\nimport type { ScallopUtils } from '../models';\nimport type {\n OriginMarketPoolData,\n ParsedMarketPoolData,\n CalculatedMarketPoolData,\n OriginMarketCollateralData,\n ParsedMarketCollateralData,\n CalculatedMarketCollateralData,\n OriginSpoolData,\n ParsedSpoolData,\n CalculatedSpoolData,\n OriginSpoolRewardPoolData,\n ParsedSpoolRewardPoolData,\n CalculatedSpoolRewardPoolData,\n OriginBorrowIncentivePoolData,\n ParsedBorrowIncentivePoolData,\n OriginBorrowIncentiveAccountData,\n ParsedBorrowIncentiveAccountData,\n SupportPoolCoins,\n SupportCollateralCoins,\n OriginBorrowIncentiveAccountPoolData,\n ParsedBorrowIncentiveAccountPoolData,\n SupportBorrowIncentiveRewardCoins,\n ParsedBorrowIncentivePoolPointData,\n OriginBorrowIncentivePoolPointData,\n} from '../types';\n\n/**\n * Parse origin market pool data to a more readable format.\n *\n * @param originMarketPoolData - Origin market pool data\n * @return Parsed market pool data\n */\nexport const parseOriginMarketPoolData = (originMarketPoolData: OriginMarketPoolData): ParsedMarketPoolData => ({\n coinType: normalizeStructTag(originMarketPoolData.type.name),\n // Parse origin data required for basic calculations.\n maxBorrowRate: Number(originMarketPoolData.maxBorrowRate.value) / 2 ** 32,\n borrowRate: Number(originMarketPoolData.interestRate.value) / 2 ** 32,\n borrowRateScale: Number(originMarketPoolData.interestRateScale),\n borrowIndex: Number(originMarketPoolData.borrowIndex),\n lastUpdated: Number(originMarketPoolData.lastUpdated),\n cashAmount: Number(originMarketPoolData.cash),\n debtAmount: Number(originMarketPoolData.debt),\n marketCoinSupplyAmount: Number(originMarketPoolData.marketCoinSupply),\n reserveAmount: Number(originMarketPoolData.reserve),\n reserveFactor: Number(originMarketPoolData.reserveFactor.value) / 2 ** 32,\n borrowWeight: Number(originMarketPoolData.borrowWeight.value) / 2 ** 32,\n borrowFee: Number(originMarketPoolData.borrowFeeRate.value) / 2 ** 32,\n // Parse origin data required for additional display.\n baseBorrowRate: Number(originMarketPoolData.baseBorrowRatePerSec.value) / 2 ** 32,\n borrowRateOnHighKink: Number(originMarketPoolData.borrowRateOnHighKink.value) / 2 ** 32,\n borrowRateOnMidKink: Number(originMarketPoolData.borrowRateOnMidKink.value) / 2 ** 32,\n highKink: Number(originMarketPoolData.highKink.value) / 2 ** 32,\n midKink: Number(originMarketPoolData.midKink.value) / 2 ** 32,\n minBorrowAmount: Number(originMarketPoolData.minBorrowAmount),\n});\n\nexport const calculateMarketPoolData = (\n utils: ScallopUtils,\n parsedMarketPoolData: ParsedMarketPoolData,\n): CalculatedMarketPoolData => {\n const poolCoinName = utils.parseCoinNameFromType<SupportPoolCoins>(parsedMarketPoolData.coinType);\n const coinDecimal = utils.getCoinDecimal(poolCoinName);\n\n const borrowYearFactor = 24 * 365 * 3600;\n\n const baseBorrowApr = (parsedMarketPoolData.baseBorrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowAprOnHighKink =\n (parsedMarketPoolData.borrowRateOnHighKink * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowAprOnMidKink =\n (parsedMarketPoolData.borrowRateOnMidKink * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const maxBorrowApr = (parsedMarketPoolData.maxBorrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n const borrowApr = (parsedMarketPoolData.borrowRate * borrowYearFactor) / parsedMarketPoolData.borrowRateScale;\n\n const timeDelta = Math.floor(new Date().getTime() / 1000) - parsedMarketPoolData.lastUpdated;\n const borrowIndexDelta = BigNumber(parsedMarketPoolData.borrowIndex)\n .multipliedBy(BigNumber(timeDelta).multipliedBy(parsedMarketPoolData.borrowRate))\n .dividedBy(parsedMarketPoolData.borrowRateScale);\n const currentBorrowIndex = BigNumber(parsedMarketPoolData.borrowIndex).plus(borrowIndexDelta);\n // How much accumulated interest since `lastUpdate`.\n const growthInterest = BigNumber(currentBorrowIndex).dividedBy(parsedMarketPoolData.borrowIndex).minus(1);\n const increasedDebtAmount = BigNumber(parsedMarketPoolData.debtAmount).multipliedBy(growthInterest);\n const borrowAmount = increasedDebtAmount.plus(parsedMarketPoolData.debtAmount);\n const borrowCoin = borrowAmount.shiftedBy(-1 * coinDecimal);\n const reserveAmount = BigNumber(parsedMarketPoolData.reserveAmount).plus(\n increasedDebtAmount.multipliedBy(parsedMarketPoolData.reserveFactor),\n );\n const reserveCoin = reserveAmount.shiftedBy(-1 * coinDecimal);\n const supplyAmount = BigNumber(borrowAmount).plus(\n Math.max(parsedMarketPoolData.cashAmount - reserveAmount.toNumber(), 0),\n );\n const supplyCoin = supplyAmount.shiftedBy(-1 * coinDecimal);\n let utilizationRate = BigNumber(borrowAmount).dividedBy(supplyAmount);\n utilizationRate = utilizationRate.isFinite() ? utilizationRate : BigNumber(0);\n let supplyApr = BigNumber(borrowApr)\n .multipliedBy(utilizationRate)\n .multipliedBy(1 - parsedMarketPoolData.reserveFactor);\n supplyApr = supplyApr.isFinite() ? supplyApr : BigNumber(0);\n let conversionRate = supplyAmount.dividedBy(parsedMarketPoolData.marketCoinSupplyAmount);\n conversionRate = conversionRate.isFinite() && !conversionRate.isNaN() ? conversionRate : BigNumber(1);\n\n return {\n baseBorrowApr,\n baseBorrowApy: utils.parseAprToApy(baseBorrowApr),\n borrowAprOnHighKink,\n borrowApyOnHighKink: utils.parseAprToApy(borrowAprOnHighKink),\n borrowAprOnMidKink,\n borrowApyOnMidKink: utils.parseAprToApy(borrowAprOnMidKink),\n maxBorrowApr,\n maxBorrowApy: utils.parseAprToApy(maxBorrowApr),\n borrowApr: Math.min(borrowApr, maxBorrowApr),\n borrowApy: Math.min(utils.parseAprToApy(borrowApr), utils.parseAprToApy(maxBorrowApr)),\n borrowIndex: currentBorrowIndex.toNumber(),\n growthInterest: growthInterest.toNumber(),\n supplyAmount: supplyAmount.toNumber(),\n supplyCoin: supplyCoin.toNumber(),\n borrowAmount: borrowAmount.toNumber(),\n borrowCoin: borrowCoin.toNumber(),\n reserveAmount: reserveAmount.toNumber(),\n reserveCoin: reserveCoin.toNumber(),\n utilizationRate: utilizationRate.toNumber(),\n supplyApr: supplyApr.toNumber(),\n supplyApy: utils.parseAprToApy(supplyApr.toNumber()),\n conversionRate: conversionRate.toNumber(),\n };\n};\n\n/**\n * Parse origin market collateral data to a more readable format.\n *\n * @param originMarketCollateralData - Origin market collateral data\n * @return Parsed market collateral data\n */\nexport const parseOriginMarketCollateralData = (\n originMarketCollateralData: OriginMarketCollateralData,\n): ParsedMarketCollateralData => ({\n coinType: normalizeStructTag(originMarketCollateralData.type.name),\n collateralFactor: Number(originMarketCollateralData.collateralFactor.value) / 2 ** 32,\n liquidationFactor: Number(originMarketCollateralData.liquidationFactor.value) / 2 ** 32,\n liquidationDiscount: Number(originMarketCollateralData.liquidationDiscount.value) / 2 ** 32,\n liquidationPanelty: Number(originMarketCollateralData.liquidationPanelty.value) / 2 ** 32,\n liquidationReserveFactor: Number(originMarketCollateralData.liquidationReserveFactor.value) / 2 ** 32,\n maxCollateralAmount: Number(originMarketCollateralData.maxCollateralAmount),\n totalCollateralAmount: Number(originMarketCollateralData.totalCollateralAmount),\n});\n\nexport const calculateMarketCollateralData = (\n utils: ScallopUtils,\n parsedMarketCollateralData: ParsedMarketCollateralData,\n): CalculatedMarketCollateralData => {\n const collateralCoinName = utils.parseCoinNameFromType<SupportCollateralCoins>(parsedMarketCollateralData.coinType);\n const coinDecimal = utils.getCoinDecimal(collateralCoinName);\n\n const maxCollateralCoin = BigNumber(parsedMarketCollateralData.maxCollateralAmount).shiftedBy(-1 * coinDecimal);\n const depositCoin = BigNumber(parsedMarketCollateralData.totalCollateralAmount).shiftedBy(-1 * coinDecimal);\n\n return {\n maxDepositAmount: parsedMarketCollateralData.maxCollateralAmount,\n maxDepositCoin: maxCollateralCoin.toNumber(),\n depositAmount: parsedMarketCollateralData.totalCollateralAmount,\n depositCoin: depositCoin.toNumber(),\n };\n};\n\n/**\n * Parse origin spool data to a more readable format.\n *\n * @param originSpoolData - Origin spool data\n * @return Parsed spool data\n */\nexport const parseOriginSpoolData = (originSpoolData: OriginSpoolData): ParsedSpoolData => ({\n stakeType: normalizeStructTag(originSpoolData.stakeType.fields.name),\n maxPoint: Number(originSpoolData.maxDistributedPoint),\n distributedPoint: Number(originSpoolData.distributedPoint),\n pointPerPeriod: Number(originSpoolData.distributedPointPerPeriod),\n period: Number(originSpoolData.pointDistributionTime),\n maxStake: Number(originSpoolData.maxStake),\n staked: Number(originSpoolData.stakes),\n index: Number(originSpoolData.index),\n createdAt: Number(originSpoolData.createdAt),\n lastUpdate: Number(originSpoolData.lastUpdate),\n});\n\nexport const calculateSpoolData = (\n parsedSpoolData: ParsedSpoolData,\n stakeMarketCoinPrice: number,\n stakeMarketCoinDecimal: number,\n): CalculatedSpoolData => {\n const baseIndexRate = 1_000_000_000;\n\n const distributedPointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(parsedSpoolData.period);\n\n const pointPerSec = BigNumber(parsedSpoolData.pointPerPeriod).dividedBy(parsedSpoolData.period);\n const remainingPeriod = BigNumber(parsedSpoolData.maxPoint)\n .minus(parsedSpoolData.distributedPoint)\n .dividedBy(pointPerSec);\n const startDate = parsedSpoolData.createdAt;\n const endDate = remainingPeriod.plus(parsedSpoolData.lastUpdate).integerValue().toNumber();\n\n const timeDelta = BigNumber(Math.floor(new Date().getTime() / 1000) - parsedSpoolData.lastUpdate)\n .dividedBy(parsedSpoolData.period)\n .toFixed(0);\n const remainingPoints = BigNumber(parsedSpoolData.maxPoint).minus(parsedSpoolData.distributedPoint);\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(parsedSpoolData.pointPerPeriod),\n remainingPoints,\n );\n\n const currentPointIndex = BigNumber(parsedSpoolData.index).plus(\n accumulatedPoints.dividedBy(parsedSpoolData.staked).isFinite()\n ? BigNumber(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(parsedSpoolData.staked)\n : 0,\n );\n const currentTotalDistributedPoint = BigNumber(parsedSpoolData.distributedPoint).plus(accumulatedPoints);\n\n const stakedAmount = BigNumber(parsedSpoolData.staked);\n const stakedCoin = stakedAmount.shiftedBy(-1 * stakeMarketCoinDecimal);\n const stakedValue = stakedCoin.multipliedBy(stakeMarketCoinPrice);\n\n return {\n distributedPointPerSec: distributedPointPerSec.toNumber(),\n accumulatedPoints: accumulatedPoints.toNumber(),\n currentPointIndex: currentPointIndex.toNumber(),\n currentTotalDistributedPoint: currentTotalDistributedPoint.toNumber(),\n startDate: new Date(startDate * 1000),\n endDate: new Date(endDate * 1000),\n stakedAmount: stakedAmount.toNumber(),\n stakedCoin: stakedCoin.toNumber(),\n stakedValue: stakedValue.toNumber(),\n };\n};\n\n/**\n * Parse origin spool reward pool data to a more readable format.\n *\n * @param originRewardPoolData - Origin reward pool data\n * @return Parsed spool reward pool data\n */\nexport const parseOriginSpoolRewardPoolData = (\n originSpoolRewardPoolData: OriginSpoolRewardPoolData,\n): ParsedSpoolRewardPoolData => ({\n claimedRewards: Number(originSpoolRewardPoolData.claimed_rewards),\n exchangeRateDenominator: Number(originSpoolRewardPoolData.exchange_rate_denominator),\n exchangeRateNumerator: Number(originSpoolRewardPoolData.exchange_rate_numerator),\n rewards: Number(originSpoolRewardPoolData.rewards),\n spoolId: String(originSpoolRewardPoolData.spool_id),\n});\n\nexport const calculateSpoolRewardPoolData = (\n parsedSpoolData: ParsedSpoolData,\n parsedSpoolRewardPoolData: ParsedSpoolRewardPoolData,\n calculatedSpoolData: CalculatedSpoolData,\n rewardCoinPrice: number,\n rewardCoinDecimal: number,\n): CalculatedSpoolRewardPoolData => {\n const rateYearFactor = 365 * 24 * 60 * 60;\n\n const rewardPerSec = BigNumber(calculatedSpoolData.distributedPointPerSec)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardAmount = BigNumber(parsedSpoolData.maxPoint)\n .multipliedBy(parsedSpoolRewardPoolData.exchangeRateNumerator)\n .dividedBy(parsedSpoolRewardPoolData.exchangeRateDenominator);\n const totalRewardCoin = totalRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const totalRewardValue = totalRewardCoin.multipliedBy(rewardCoinPrice);\n const remaindRewardAmount = BigNumber(parsedSpoolRewardPoolData.rewards);\n const remaindRewardCoin = remaindRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const remaindRewardValue = remaindRewardCoin.multipliedBy(rewardCoinPrice);\n const claimedRewardAmount = BigNumber(parsedSpoolRewardPoolData.claimedRewards);\n const claimedRewardCoin = claimedRewardAmount.shiftedBy(-1 * rewardCoinDecimal);\n const claimedRewardValue = claimedRewardCoin.multipliedBy(rewardCoinPrice);\n\n const rewardValueForYear = BigNumber(rewardPerSec)\n .shiftedBy(-1 * rewardCoinDecimal)\n .multipliedBy(rateYearFactor)\n .multipliedBy(rewardCoinPrice);\n\n let rewardRate = rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).isFinite()\n ? rewardValueForYear.dividedBy(calculatedSpoolData.stakedValue).toNumber()\n : Infinity;\n\n if (parsedSpoolData.maxPoint === parsedSpoolData.distributedPoint) {\n rewardRate = Infinity;\n }\n\n return {\n rewardApr: rewardRate,\n totalRewardAmount: totalRewardAmount.toNumber(),\n totalRewardCoin: totalRewardCoin.toNumber(),\n totalRewardValue: totalRewardValue.toNumber(),\n remaindRewardAmount: remaindRewardAmount.toNumber(),\n remaindRewardCoin: remaindRewardCoin.toNumber(),\n remaindRewardValue: remaindRewardValue.toNumber(),\n claimedRewardAmount: claimedRewardAmount.toNumber(),\n claimedRewardCoin: claimedRewardCoin.toNumber(),\n claimedRewardValue: claimedRewardValue.toNumber(),\n rewardPerSec: rewardPerSec.toNumber(),\n };\n};\n\n/**\n * Parse origin borrow incentive pool data to a more readable format.\n *\n * @param originBorrowIncentivePoolData - Origin borrow incentive pool data\n * @return Parsed borrow incentive pool data\n */\nexport const parseOriginBorrowIncentivesPoolPointData = (\n originBorrowIncentivePoolPointData: OriginBorrowIncentivePoolPointData,\n): ParsedBorrowIncentivePoolPointData => ({\n pointType: normalizeStructTag(originBorrowIncentivePoolPointData.point_type.name),\n distributedPointPerPeriod: Number(originBorrowIncentivePoolPointData.distributed_point_per_period),\n period: Number(originBorrowIncentivePoolPointData.point_distribution_time),\n distributedPoint: Number(originBorrowIncentivePoolPointData.distributed_point),\n points: Number(originBorrowIncentivePoolPointData.points),\n index: Number(originBorrowIncentivePoolPointData.index),\n baseWeight: Number(originBorrowIncentivePoolPointData.base_weight),\n weightedAmount: Number(originBorrowIncentivePoolPointData.weighted_amount),\n lastUpdate: Number(originBorrowIncentivePoolPointData.last_update),\n});\nexport const parseOriginBorrowIncentivePoolData = (\n originBorrowIncentivePoolData: OriginBorrowIncentivePoolData,\n): ParsedBorrowIncentivePoolData => ({\n poolType: normalizeStructTag(originBorrowIncentivePoolData.pool_type.name),\n minStakes: Number(originBorrowIncentivePoolData.min_stakes),\n maxStakes: Number(originBorrowIncentivePoolData.max_stakes),\n staked: Number(originBorrowIncentivePoolData.stakes),\n createdAt: Number(originBorrowIncentivePoolData.created_at),\n poolPoints: originBorrowIncentivePoolData.points.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentivesPoolPointData(point);\n const name = parseStructTag(parsed.pointType).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;\n acc[name] = parsed;\n return acc;\n },\n {} as Record<SupportBorrowIncentiveRewardCoins, ParsedBorrowIncentivePoolPointData>,\n ),\n});\n\n/**\n * Parse origin borrow incentive reward pool data to a more readable format.\n *\n * @param originBorrowIncentiveRewardPoolData - Origin borrow incentive reward pool data\n * @return Parsed borrow incentive reward pool data\n */\n\nexport const minBigNumber = (...args: BigNumber.Value[]) =>\n BigNumber(args.reduce((min, current) => (new BigNumber(current).lt(min) ? current : min)));\n\nexport const maxBigNumber = (...args: BigNumber.Value[]) =>\n BigNumber(args.reduce((max, current) => (new BigNumber(current).gt(max) ? current : max)));\n\n/**\n * Dynamically adjust the decrease or increase ratio according to the amout\n * @param amount - The amount required to calculate factor.\n * @param scaleStep - The scale step required to determine the factor..\n * @param type - The type of the calculation.\n * @return The estimated factor\n * */\nexport const estimatedFactor = (amount: number, scaleStep: number, type: 'increase' | 'decrease') => {\n const amountOfDigits = Math.max(1, Math.floor(Math.log10(Math.abs(amount)) + 1));\n\n const adjustScale = Math.max(Math.floor((amountOfDigits - 1) / scaleStep), 1) + 1;\n\n let adjustFactor = 10 ** -adjustScale;\n adjustFactor = type === 'increase' ? 1 - adjustFactor : 1 + adjustFactor;\n\n return adjustFactor;\n};\n\nexport const parseOriginBorrowIncentiveAccountPoolPointData = (\n originBorrowIncentiveAccountPoolPointData: OriginBorrowIncentiveAccountPoolData,\n): ParsedBorrowIncentiveAccountPoolData => ({\n pointType: normalizeStructTag(originBorrowIncentiveAccountPoolPointData.point_type.name),\n weightedAmount: Number(originBorrowIncentiveAccountPoolPointData.weighted_amount),\n points: Number(originBorrowIncentiveAccountPoolPointData.points),\n totalPoints: Number(originBorrowIncentiveAccountPoolPointData.total_points),\n index: Number(originBorrowIncentiveAccountPoolPointData.index),\n});\n\n/**\n * Parse origin borrow incentive account data to a more readable format.\n *\n * @param originBorrowIncentiveAccountData - Origin borrow incentive account data\n * @return Parsed borrow incentive account data\n */\nexport const parseOriginBorrowIncentiveAccountData = (\n originBorrowIncentiveAccountData: OriginBorrowIncentiveAccountData,\n): ParsedBorrowIncentiveAccountData => ({\n poolType: normalizeStructTag(originBorrowIncentiveAccountData.pool_type.name),\n debtAmount: Number(originBorrowIncentiveAccountData.debt_amount),\n pointList: originBorrowIncentiveAccountData.points_list.reduce(\n (acc, point) => {\n const parsed = parseOriginBorrowIncentiveAccountPoolPointData(point);\n const name = parseStructTag(parsed.pointType).name.toLowerCase() as SupportBorrowIncentiveRewardCoins;\n acc[name] = parsed;\n return acc;\n },\n {} as Record<SupportBorrowIncentiveRewardCoins, ParsedBorrowIncentiveAccountPoolData>,\n ),\n});\n","import { SUPPORT_POOLS, SUPPORT_COLLATERALS, SUPPORT_SPOOLS_REWARDS, MAX_LOCK_DURATION } from '../constants';\nimport type { ScallopAddress } from '../models';\nimport type { SupportAssetCoins, SupportCoins, SupportMarketCoins } from '../types';\n\nexport const isMarketCoin = (coinName: SupportCoins): coinName is SupportMarketCoins => {\n const assetCoinName = coinName.slice(1).toLowerCase() as SupportAssetCoins;\n return (\n coinName.charAt(0).toLowerCase() === 's' &&\n [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS, ...SUPPORT_SPOOLS_REWARDS])].includes(assetCoinName)\n );\n};\n\nexport const parseAssetSymbol = (coinName: SupportAssetCoins): string => {\n switch (coinName) {\n case 'afsui':\n return 'afSUI';\n case 'hasui':\n return 'haSUI';\n case 'vsui':\n return 'vSUI';\n default:\n return coinName.toUpperCase();\n }\n};\n\n/**\n * Parse price from pyth price feed.\n *\n * @param feed - Price feed object from pyth.\n * @param address - Scallop address instance.\n * @return Price Data inclue coin name, price, and publish time.\n */\nexport const parseDataFromPythPriceFeed = (feed: any, address: ScallopAddress) => {\n const assetCoinNames = [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS])] as SupportAssetCoins[];\n const listAssetCoinName = assetCoinNames.find(\n (assetCoinName) => address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`) === feed.id,\n );\n if (listAssetCoinName) {\n const price = feed.price.price * 10 ** feed.price.expo;\n\n return {\n coinName: listAssetCoinName,\n price,\n publishTime: Number(feed.price.publishTime) * 10 ** 3,\n };\n }\n throw new Error('Invalid feed id');\n};\n\n/**\n * Find the closest unlock round timestamp (12AM) to the given unlock at timestamp in seconds.\n *\n * @param unlockAtInSecondTimestamp - Unlock at in seconds timestamp to find the closest round.\n * @returns Closest round (12AM) in seconds timestamp.\n */\nexport const findClosestUnlockRound = (unlockAtInSecondTimestamp: number) => {\n const unlockDate = new Date(unlockAtInSecondTimestamp * 1000);\n const closestTwelveAM = new Date(unlockAtInSecondTimestamp * 1000);\n\n closestTwelveAM.setUTCHours(0, 0, 0, 0); // Set the time to the next 12 AM UTC\n\n // If the current time is past 12 AM, set the date to the next day\n if (unlockDate.getUTCHours() >= 0) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() + 1);\n }\n\n const now = new Date().getTime();\n // check if unlock period > 4 years\n if (closestTwelveAM.getTime() - now > MAX_LOCK_DURATION * 1000) {\n closestTwelveAM.setUTCDate(closestTwelveAM.getUTCDate() - 1);\n }\n return Math.floor(closestTwelveAM.getTime() / 1000);\n};\n","import type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport BigNumber from 'bignumber.js';\n\nimport { SUPPORT_POOLS, PROTOCOL_OBJECT_ID } from '../constants';\nimport type { ScallopQuery } from '../models';\nimport {\n SupportAssetCoins,\n SupportPoolCoins,\n Obligation,\n CoinAmounts,\n MarketCoinAmounts,\n SupportMarketCoins,\n SuiAddressArg,\n ObligationQueryInterface,\n} from '../types';\n\n/**\n * Query all owned obligations.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned obligations.\n */\nexport const getObligations = async (query: ScallopQuery, ownerAddress: string) => {\n const owner = ownerAddress;\n const protocolObjectId = query.address.get('core.object') || PROTOCOL_OBJECT_ID;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedKeyObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n StructType: `${protocolObjectId}::obligation::ObligationKey`,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (paginatedKeyObjectsResponse.hasNextPage && paginatedKeyObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjectIds: string[] = keyObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const keyObjects = await query.client.multiGetObjects({\n ids: keyObjectIds,\n options: { showContent: true, showType: true },\n });\n const obligations: Obligation[] = [];\n for (let i = 0; i < keyObjects.length; i++) {\n const keyId = keyObjects[i].data.objectId;\n const { content } = keyObjects[i].data;\n if (content && 'fields' in content) {\n const fields = content.fields as any;\n const obligationId = String(fields.ownership.fields.of);\n const locked = await getObligationLocked(query, obligationId);\n obligations.push({ id: obligationId, keyId, locked });\n }\n }\n return obligations;\n};\n\n/**\n * Query obligation locked status.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation locked status.\n */\nexport const getObligationLocked = async (query: ScallopQuery, obligationId: string) => {\n const obligationObjectResponse = await query.client.getObject({\n id: obligationId,\n options: {\n showContent: true,\n },\n });\n let obligationLocked = false;\n if (\n obligationObjectResponse.data &&\n obligationObjectResponse?.data?.content?.dataType === 'moveObject' &&\n 'lock_key' in obligationObjectResponse.data.content.fields\n ) {\n obligationLocked = Boolean(obligationObjectResponse.data.content.fields.lock_key);\n }\n\n return obligationLocked;\n};\n\n/**\n * Query all owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All owned coin amounts.\n */\nexport const getCoinAmounts = async (\n query: ScallopQuery,\n ownerAddress: string,\n assetCoinNames?: SupportAssetCoins[],\n) => {\n const updatedAssetCoinNames = assetCoinNames || [...SUPPORT_POOLS];\n const owner = ownerAddress;\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n MatchAny: updatedAssetCoinNames.map((assetCoinName) => {\n const coinType = query.utils.parseCoinType(assetCoinName);\n return { StructType: `0x2::coin::Coin<${coinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const coinAmounts: CoinAmounts = {};\n const coinObjects = coinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n coinObjects.forEach((coinObject) => {\n const type = coinObject.type as string;\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n const poolCoinName = query.utils.parseCoinNameFromType<SupportPoolCoins>(type);\n if (poolCoinName) {\n coinAmounts[poolCoinName as SupportPoolCoins] = BigNumber(coinAmounts[poolCoinName as SupportPoolCoins] ?? 0)\n .plus(fields.balance)\n .toNumber();\n }\n }\n });\n return coinAmounts;\n};\n\n/**\n * Query owned coin amount.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Owned coin amount.\n */\nexport const getCoinAmount = async (query: ScallopQuery, assetCoinName: SupportAssetCoins, ownerAddress?: string) => {\n const owner = ownerAddress;\n const coinType = query.utils.parseCoinType(assetCoinName);\n const coinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${coinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n coinObjectsResponse.push(...paginatedCoinObjectsResponse.data);\n if (paginatedCoinObjectsResponse.hasNextPage && paginatedCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n let coinAmount = 0;\n const coinObjects = coinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n coinObjects.forEach((coinObject) => {\n if (coinObject.content && 'fields' in coinObject.content) {\n const fields = coinObject.content.fields as any;\n coinAmount = BigNumber(coinAmount).plus(fields.balance).toNumber();\n }\n });\n return coinAmount;\n};\n\n/**\n * Query all owned market coins (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All owned market coins amount.\n */\nexport const getMarketCoinAmounts = async (\n query: ScallopQuery,\n ownerAddress: string,\n marketCoinNames?: SupportMarketCoins[],\n) => {\n const updatedMarketCoinNames =\n marketCoinNames || [...SUPPORT_POOLS].map((poolCoinName) => query.utils.parseMarketCoinName(poolCoinName));\n const owner = ownerAddress;\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n MatchAny: updatedMarketCoinNames.map((marketCoinName) => {\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n return { StructType: `0x2::coin::Coin<${marketCoinType}>` };\n }),\n },\n options: {\n showType: true,\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const marketCoinAmounts: MarketCoinAmounts = {};\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n marketCoinObjects.forEach((marketCoinObject) => {\n const type = marketCoinObject.type as string;\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n const marketCoinName = query.utils.parseCoinNameFromType<SupportMarketCoins>(type);\n if (marketCoinName) {\n marketCoinAmounts[marketCoinName as SupportMarketCoins] = BigNumber(\n marketCoinAmounts[marketCoinName as SupportMarketCoins] ?? 0,\n )\n .plus(fields.balance)\n .toNumber();\n }\n }\n });\n return marketCoinAmounts;\n};\n\n/**\n * Query owned market coin (sCoin) amount.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Owned market coin amount.\n */\nexport const getMarketCoinAmount = async (\n query: ScallopQuery,\n marketCoinName: SupportMarketCoins,\n ownerAddress: string,\n) => {\n const owner = ownerAddress;\n const marketCoinType = query.utils.parseMarketCoinType(marketCoinName);\n const marketCoinObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedMarketCoinObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: `0x2::coin::Coin<${marketCoinType}>` },\n options: {\n showContent: true,\n },\n cursor: nextCursor,\n });\n\n marketCoinObjectsResponse.push(...paginatedMarketCoinObjectsResponse.data);\n if (paginatedMarketCoinObjectsResponse.hasNextPage && paginatedMarketCoinObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedMarketCoinObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n let marketCoinAmount = 0;\n const marketCoinObjects = marketCoinObjectsResponse\n .map((response) => response.data)\n .filter((object: any) => object !== undefined && object !== null) as SuiObjectData[];\n marketCoinObjects.forEach((marketCoinObject) => {\n if (marketCoinObject.content && 'fields' in marketCoinObject.content) {\n const fields = marketCoinObject.content.fields as any;\n marketCoinAmount = BigNumber(marketCoinAmount).plus(fields.balance).toNumber();\n }\n });\n return marketCoinAmount;\n};\n\n/**\n * Query obligation data.\n *\n * @description\n * Use inspectTxn call to obtain the data provided in the scallop contract query module.\n *\n * @param query - The Scallop query instance.\n * @param obligationId - The obligation id.\n * @return Obligation data.\n */\nexport const queryObligation = async (query: ScallopQuery, obligationId: SuiAddressArg) => {\n const packageId = query.address.get('core.packages.query.id');\n const queryTarget = `${packageId}::obligation_query::obligation_data` as `${string}::${string}::${string}`;\n const txBlock = new TransactionBlock();\n txBlock.moveCall({\n target: queryTarget,\n arguments: [txBlock.object(obligationId as string)],\n });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: query.walletAddress,\n });\n return queryResult.events[0].parsedJson as ObligationQueryInterface;\n};\n","import type { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport type { ScallopQuery } from '../models';\nimport type { StakePool, StakeRewardPool, StakeAccounts, SupportStakeMarketCoins, SupportStakeCoins } from '../types';\n\n/**\n * Get all stake accounts of the owner.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - Owner address.\n * @return Stake accounts.\n */\nexport const getStakeAccounts = async (query: ScallopQuery, ownerAddress: string) => {\n const owner = ownerAddress;\n const spoolObjectId = query.address.get('spool.object');\n const stakeAccountType = `${spoolObjectId}::spool_account::SpoolAccount`;\n const stakeObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null = null;\n do {\n const paginatedStakeObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: { StructType: stakeAccountType },\n options: {\n showContent: true,\n showType: true,\n },\n cursor: nextCursor,\n });\n stakeObjectsResponse.push(...paginatedStakeObjectsResponse.data);\n if (paginatedStakeObjectsResponse.hasNextPage && paginatedStakeObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedStakeObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const stakeAccounts: StakeAccounts = {\n seth: [],\n ssui: [],\n susdc: [],\n susdt: [],\n scetus: [],\n safsui: [],\n shasui: [],\n svsui: [],\n };\n\n const stakeMarketCoinTypes: Record<SupportStakeMarketCoins, string> = Object.keys(stakeAccounts).reduce(\n (types, stakeMarketCoinName) => {\n const stakeCoinName = query.utils.parseCoinName<SupportStakeCoins>(stakeMarketCoinName);\n const marketCoinType = query.utils.parseMarketCoinType(stakeCoinName);\n\n const updateTypes = { ...types };\n const newType = `${spoolObjectId}::spool_account::SpoolAccount<${marketCoinType}>`;\n updateTypes[stakeMarketCoinName as SupportStakeMarketCoins] = newType;\n return updateTypes;\n },\n {} as Record<SupportStakeMarketCoins, string>,\n );\n\n const stakeObjectIds: string[] = stakeObjectsResponse\n .map((ref: any) => ref?.data?.objectId)\n .filter((id: any) => id !== undefined);\n const stakeObjects = await query.client.multiGetObjects({\n ids: stakeObjectIds,\n options: { showContent: true, showType: true },\n });\n stakeObjects.forEach((stakeObject) => {\n const id = stakeObject.data.objectId;\n const type = stakeObject.data.type!;\n if (stakeObject.data.content && 'fields' in stakeObject.data.content) {\n const fields = stakeObject.data.content.fields as any;\n const stakePoolId = String(fields.spool_id);\n const stakeType = String(fields.stake_type.fields.name);\n const staked = Number(fields.stakes);\n const index = Number(fields.index);\n const points = Number(fields.points);\n const totalPoints = Number(fields.total_points);\n if (normalizeStructTag(type) === stakeMarketCoinTypes.seth) {\n stakeAccounts.seth.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.ssui) {\n stakeAccounts.ssui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdc) {\n stakeAccounts.susdc.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.susdt) {\n stakeAccounts.susdt.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.scetus) {\n stakeAccounts.scetus.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.safsui) {\n stakeAccounts.safsui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.shasui) {\n stakeAccounts.shasui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n } else if (normalizeStructTag(type) === stakeMarketCoinTypes.svsui) {\n stakeAccounts.svsui.push({\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n stakeType: normalizeStructTag(stakeType),\n staked,\n index,\n points,\n totalPoints,\n });\n }\n }\n });\n return stakeAccounts;\n};\n\n/**\n * Get stake pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get stake pool info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\nexport const getStakePool = async (query: ScallopQuery, marketCoinName: SupportStakeMarketCoins) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.id`);\n let stakePool: StakePool | undefined;\n const stakePoolObjectResponse = await query.client.getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakePoolObjectResponse.data) {\n const stakePoolObject = stakePoolObjectResponse.data;\n const id = stakePoolObject.objectId;\n const type = stakePoolObject.type!;\n if (stakePoolObject.content && 'fields' in stakePoolObject.content) {\n const fields = stakePoolObject.content.fields as any;\n const maxPoint = Number(fields.max_distributed_point);\n const distributedPoint = Number(fields.distributed_point);\n const pointPerPeriod = Number(fields.distributed_point_per_period);\n const period = Number(fields.point_distribution_time);\n const maxStake = Number(fields.max_stakes);\n const stakeType = String(fields.stake_type.fields.name);\n const totalStaked = Number(fields.stakes);\n const index = Number(fields.index);\n const createdAt = Number(fields.created_at);\n const lastUpdate = Number(fields.last_update);\n stakePool = {\n id,\n type: normalizeStructTag(type),\n maxPoint,\n distributedPoint,\n pointPerPeriod,\n period,\n maxStake,\n stakeType: normalizeStructTag(stakeType),\n totalStaked,\n index,\n createdAt,\n lastUpdate,\n };\n }\n }\n return stakePool;\n};\n\n/**\n * Get stake reward pool of the owner.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get reward info in spool data.\n *\n * @param query - The Scallop query instance.\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool.\n */\nexport const getStakeRewardPool = async (query: ScallopQuery, marketCoinName: SupportStakeMarketCoins) => {\n const poolId = query.address.get(`spool.pools.${marketCoinName}.rewardPoolId`);\n let stakeRewardPool: StakeRewardPool | undefined;\n const stakeRewardPoolObjectResponse = await query.client.getObject({\n id: poolId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n if (stakeRewardPoolObjectResponse.data) {\n const stakeRewardPoolObject = stakeRewardPoolObjectResponse.data;\n const id = stakeRewardPoolObject.objectId;\n const type = stakeRewardPoolObject.type!;\n if (stakeRewardPoolObject.content && 'fields' in stakeRewardPoolObject.content) {\n const rewardPoolFields = stakeRewardPoolObject.content.fields as any;\n const stakePoolId = String(rewardPoolFields.spool_id);\n const ratioNumerator = Number(rewardPoolFields.exchange_rate_numerator);\n const ratioDenominator = Number(rewardPoolFields.exchange_rate_denominator);\n const rewards = Number(rewardPoolFields.rewards);\n const claimedRewards = Number(rewardPoolFields.claimed_rewards);\n\n stakeRewardPool = {\n id,\n type: normalizeStructTag(type),\n stakePoolId,\n ratioNumerator,\n ratioDenominator,\n rewards,\n claimedRewards,\n };\n }\n }\n return stakeRewardPool;\n};\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\nimport BigNumber from 'bignumber.js';\n\nimport { SUPPORT_BORROW_INCENTIVE_POOLS } from '../constants';\nimport type { ScallopQuery } from '../models';\nimport type {\n BorrowIncentiveAccountsQueryInterface,\n BorrowIncentiveAccounts,\n SupportBorrowIncentiveCoins,\n BorrowIncentivePoolsQueryInterface,\n BorrowIncentivePools,\n OptionalKeys,\n BorrowIncentivePoolPoints,\n SupportBorrowIncentiveRewardCoins,\n} from '../types';\nimport { parseOriginBorrowIncentiveAccountData, parseOriginBorrowIncentivePoolData } from '../utils';\n\n/**\n * Query borrow incentive accounts data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @return Borrow incentive accounts data.\n */\nexport const queryBorrowIncentiveAccounts = async (\n query: ScallopQuery,\n obligationId: string,\n sender: string,\n borrowIncentiveCoinNames?: SupportBorrowIncentiveCoins[],\n) => {\n const coinName = borrowIncentiveCoinNames || [...SUPPORT_BORROW_INCENTIVE_POOLS];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentiveAccountsId = query.address.get('borrowIncentive.incentiveAccounts');\n const queryTarget =\n `${queryPkgId}::incentive_account_query::incentive_account_data` as `${string}::${string}::${string}`;\n const txBlock = new TransactionBlock();\n txBlock.moveCall({\n target: queryTarget,\n arguments: [txBlock.object(incentiveAccountsId), txBlock.object(obligationId)],\n });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender,\n });\n const borrowIncentiveAccountsQueryData = queryResult.events[0].parsedJson as BorrowIncentiveAccountsQueryInterface;\n\n const borrowIncentiveAccounts: BorrowIncentiveAccounts = {};\n\n borrowIncentiveAccountsQueryData.pool_records.forEach((accountData) => {\n const parsedBorrowIncentiveAccount = parseOriginBorrowIncentiveAccountData(accountData);\n const { poolType } = parsedBorrowIncentiveAccount;\n const parsedCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolType);\n if (coinName.length >= 1 && coinName.includes(parsedCoinName)) {\n borrowIncentiveAccounts[parsedCoinName] = parsedBorrowIncentiveAccount;\n }\n }, {} as BorrowIncentiveAccounts);\n return borrowIncentiveAccounts;\n};\n\n/**\n * Query borrow incentive pools data.\n *\n * @param query - The Scallop query instance.\n * @param borrowIncentiveCoinNames - Specific an array of support borrow incentive coin name.\n * @param indexer - Whether to use indexer.\n * @return Borrow incentive pools data.\n */\nexport const queryBorrowIncentivePools = async (query: ScallopQuery, coinNames?: SupportBorrowIncentiveCoins[]) => {\n const borrowIncentiveCoinNames = coinNames || [...SUPPORT_BORROW_INCENTIVE_POOLS];\n const queryPkgId = query.address.get('borrowIncentive.query');\n const incentivePoolsId = query.address.get('borrowIncentive.incentivePools');\n\n const txBlock = new TransactionBlock();\n const queryTarget = `${queryPkgId}::incentive_pools_query::incentive_pools_data` as `${string}::${string}::${string}`;\n txBlock.moveCall({ target: queryTarget, arguments: [txBlock.object(incentivePoolsId)] });\n const queryResult = await query.client.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: query.walletAddress,\n });\n const borrowIncentivePoolsQueryData = queryResult.events[0].parsedJson as BorrowIncentivePoolsQueryInterface;\n\n const borrowIncentivePools: BorrowIncentivePools = {};\n\n for (let i = 0; i < borrowIncentivePoolsQueryData.incentive_pools.length; i++) {\n const pool = borrowIncentivePoolsQueryData.incentive_pools[i];\n const borrowIncentivePoolPoints: OptionalKeys<Record<'sui' | 'sca', BorrowIncentivePoolPoints>> = {};\n const parsedBorrowIncentivePoolData = parseOriginBorrowIncentivePoolData(pool);\n const poolCoinType = normalizeStructTag(pool.pool_type.name);\n const poolCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveCoins>(poolCoinType);\n\n // Filter pools not yet supported by the SDK.\n if (!borrowIncentiveCoinNames.includes(poolCoinName)) {\n continue;\n }\n // pool points for borrow incentive reward ('sui' and 'sca')\n\n Object.entries(parsedBorrowIncentivePoolData.poolPoints).forEach(([coinName, poolPoint]) => {\n const baseIndexRate = 1_000_000_000;\n const rewardCoinType = normalizeStructTag(poolPoint.pointType);\n const rewardCoinName = query.utils.parseCoinNameFromType<SupportBorrowIncentiveRewardCoins>(rewardCoinType);\n const timeDelta = BigNumber(Math.floor(new Date().getTime() / 1000) - poolPoint.lastUpdate)\n .dividedBy(poolPoint.period)\n .toFixed(0);\n\n const accumulatedPoints = BigNumber.minimum(\n BigNumber(timeDelta).multipliedBy(poolPoint.distributedPointPerPeriod),\n BigNumber(poolPoint.points),\n );\n\n const currentPointIndex = BigNumber(poolPoint.index).plus(\n accumulatedPoints.dividedBy(poolPoint.weightedAmount).isFinite()\n ? BigNumber(baseIndexRate).multipliedBy(accumulatedPoints).dividedBy(poolPoint.weightedAmount)\n : 0,\n );\n borrowIncentivePoolPoints[coinName as SupportBorrowIncentiveRewardCoins] = {\n points: poolPoint.points,\n coinDecimal: query.utils.getCoinDecimal(rewardCoinName),\n distributedPoint: poolPoint.distributedPoint,\n weightedAmount: poolPoint.weightedAmount,\n currentPointIndex: currentPointIndex.toNumber(),\n };\n });\n\n borrowIncentivePools[poolCoinName] = {\n coinName: poolCoinName,\n symbol: query.utils.parseSymbol(poolCoinName),\n coinType: poolCoinType,\n points: borrowIncentivePoolPoints,\n };\n }\n\n return borrowIncentivePools;\n};\n","import type { ScallopQuery } from '../models';\nimport type { SupportAssetCoins } from '../types';\n\n/**\n * Get price from pyth fee object.\n *\n * @param query - The Scallop query instance.\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\nexport const getPythPrice = async (query: ScallopQuery, assetCoinName: SupportAssetCoins) => {\n const pythFeedObjectId = query.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`);\n const priceFeedObjectResponse = await query.client.getObject({\n id: pythFeedObjectId,\n options: {\n showContent: true,\n },\n });\n\n if (priceFeedObjectResponse.data) {\n const priceFeedPoolObject = priceFeedObjectResponse.data;\n if (priceFeedPoolObject.content && 'fields' in priceFeedPoolObject.content) {\n const fields = priceFeedPoolObject.content.fields as any;\n const expoMagnitude = Number(fields.price_info.fields.price_feed.fields.price.fields.expo.fields.magnitude);\n const expoNegative = Number(fields.price_info.fields.price_feed.fields.price.fields.expo.fields.negative);\n const priceMagnitude = Number(fields.price_info.fields.price_feed.fields.price.fields.price.fields.magnitude);\n const priceNegative = Number(fields.price_info.fields.price_feed.fields.price.fields.price.fields.negative);\n\n return priceMagnitude * 10 ** ((expoNegative ? -1 : 1) * expoMagnitude) * (priceNegative ? -1 : 1);\n }\n }\n\n return 0;\n};\n","import type { SuiObjectResponse, SuiObjectData } from '@mysten/sui.js/client';\nimport BigNumber from 'bignumber.js';\n\nimport type { ScallopQuery } from '../models';\nimport { Vesca } from '../types';\n\n/**\n * Query all owned veSca key.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veSca key.\n */\nexport const getVescaKeys = async (query: ScallopQuery, ownerAddress?: string) => {\n const owner = ownerAddress;\n const veScaPkgId = query.address.get('vesca.id');\n const veScaKeyType = `${veScaPkgId}::ve_sca::VeScaKey`;\n const keyObjectsResponse: SuiObjectResponse[] = [];\n let hasNextPage = false;\n let nextCursor: string | null | undefined = null;\n do {\n const paginatedKeyObjectsResponse = await query.client.getOwnedObjects({\n owner,\n filter: {\n StructType: veScaKeyType,\n },\n cursor: nextCursor,\n });\n keyObjectsResponse.push(...paginatedKeyObjectsResponse.data);\n if (paginatedKeyObjectsResponse.hasNextPage && paginatedKeyObjectsResponse.nextCursor) {\n hasNextPage = true;\n nextCursor = paginatedKeyObjectsResponse.nextCursor;\n } else {\n hasNextPage = false;\n }\n } while (hasNextPage);\n\n const keyObjectDatas = keyObjectsResponse\n .map((objResponse) => objResponse.data)\n .filter((data) => !!data) as SuiObjectData[];\n return keyObjectDatas;\n};\n\n/**\n * Query all owned veSca.\n *\n * @param query - The Scallop query instance.\n * @param ownerAddress - The owner address.\n * @return Owned veScas.\n */\nexport const getVeScas = async (query: ScallopQuery, ownerAddress?: string) => {\n const keyObjectDatas = await getVescaKeys(query, ownerAddress);\n const keyObjectId: string[] = keyObjectDatas.map((data) => data.objectId);\n\n const veScas: Vesca[] = [];\n for (let i = 0; i < keyObjectId.length; i++) {\n const veSca = await getVeSca(query, keyObjectId[i]);\n if (veSca) {\n veScas.push(veSca);\n }\n }\n return veScas;\n};\n\n/**\n * Get veSca data.\n *\n * @param query - The Scallop query instance.\n * @param veScaKeyId - The vesca key id.\n * @param ownerAddress - The owner address.\n * @returns Vesca data.\n */\nexport const getVeSca = async (query: ScallopQuery, veScaKeyId?: string, ownerAddress?: string) => {\n const tableId = query.address.get(`vesca.tableId`);\n const veScaKeyIdValue = veScaKeyId || (await getVescaKeys(query, ownerAddress))[0].objectId;\n\n let vesca: Vesca | undefined;\n\n const veScaDynamicFieldObjectResponse = await query.client.getDynamicFieldObject({\n parentId: tableId,\n name: {\n type: '0x2::object::ID',\n value: veScaKeyIdValue,\n },\n });\n const veScaDynamicFieldObject = veScaDynamicFieldObjectResponse.data;\n if (\n veScaDynamicFieldObject &&\n veScaDynamicFieldObject.content &&\n veScaDynamicFieldObject.content.dataType === 'moveObject' &&\n 'fields' in veScaDynamicFieldObject.content\n ) {\n const dynamicFields = (veScaDynamicFieldObject.content.fields as any).value.fields;\n vesca = {\n id: veScaDynamicFieldObject.objectId,\n keyId: veScaKeyIdValue,\n lockedScaAmount: BigNumber(dynamicFields.locked_sca_amount).toNumber(),\n lockedScaCoin: BigNumber(dynamicFields.locked_sca_amount).shiftedBy(-9).toNumber(),\n unlockAt: BigNumber(dynamicFields.unlock_at).toNumber(),\n } as Vesca;\n }\n\n return vesca;\n};\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { ScallopAddress } from './scallopAddress';\nimport { ScallopUtils } from './scallopUtils';\nimport { ADDRESSES_ID, SUPPORT_SPOOLS } from '../constants';\nimport {\n getObligations,\n getStakeAccounts,\n getStakePool,\n getStakeRewardPool,\n getPythPrice,\n queryBorrowIncentiveAccounts,\n getCoinAmounts,\n getCoinAmount,\n getMarketCoinAmounts,\n getMarketCoinAmount,\n queryObligation,\n} from '../queries';\nimport {\n ScallopQueryParams,\n ScallopInstanceParams,\n SupportStakeMarketCoins,\n SupportAssetCoins,\n SupportMarketCoins,\n StakePools,\n StakeRewardPools,\n SupportBorrowIncentiveCoins,\n SuiAddressArg,\n} from '../types';\n\n/**\n * @description\n * It provides methods for getting on-chain data from the Scallop contract.\n *\n * @example\n * ```typescript\n * const scallopQuery = new ScallopQuery(<parameters>);\n * await scallopQuery.init();\n * scallopQuery.<query functions>();\n * await scallopQuery.<query functions>();\n * ```\n */\nexport class ScallopQuery {\n public readonly params: ScallopQueryParams;\n\n public address: ScallopAddress;\n\n public client: SuiClient;\n\n public utils: ScallopUtils;\n\n public walletAddress: string;\n\n public constructor(params: ScallopQueryParams, instance?: ScallopInstanceParams) {\n this.params = params;\n this.address =\n instance?.address ??\n new ScallopAddress({\n id: params?.addressesId || ADDRESSES_ID,\n network: params?.networkType,\n });\n this.client = params.client;\n this.utils = instance?.utils ?? new ScallopUtils(this.params, { address: this.address });\n this.walletAddress = params.walletAddress;\n }\n\n /**\n * Request the scallop API to initialize data.\n *\n * @param force - Whether to force initialization.\n * @param address - ScallopAddress instance.\n */\n public init(force = false, address?: ScallopAddress) {\n if (force || !this.address.getAddresses() || !address?.getAddresses()) {\n this.address.read();\n } else {\n this.address = address;\n }\n }\n\n /* ==================== Core Query Methods ==================== */\n\n /**\n * Get obligations data.\n *\n * @param ownerAddress - The owner address.\n * @return Obligations data.\n */\n public async getObligations(ownerAddress?: string) {\n return getObligations(this, ownerAddress);\n }\n\n /**\n * Get all asset coin amounts.\n *\n * @param assetCoinNames - Specific an array of support asset coin name.\n * @param ownerAddress - The owner address.\n * @return All coin amounts.\n */\n public async getCoinAmounts(ownerAddress: string, assetCoinNames?: SupportAssetCoins[]) {\n return getCoinAmounts(this, ownerAddress, assetCoinNames);\n }\n\n /**\n * Get asset coin amount.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @param ownerAddress - The owner address.\n * @return Coin amount.\n */\n public async getCoinAmount(assetCoinName: SupportAssetCoins, ownerAddress?: string) {\n return getCoinAmount(this, assetCoinName, ownerAddress);\n }\n\n /**\n * Get all market coin amounts.\n *\n * @param coinNames - Specific an array of support market coin name.\n * @param ownerAddress - The owner address.\n * @return All market market coin amounts.\n */\n public async getMarketCoinAmounts(ownerAddress: string, marketCoinNames?: SupportMarketCoins[]) {\n return getMarketCoinAmounts(this, ownerAddress, marketCoinNames);\n }\n\n /**\n * Get market coin amount.\n *\n * @param coinNames - Specific support market coin name.\n * @param ownerAddress - The owner address.\n * @return Market market coin amount.\n */\n public async getMarketCoinAmount(marketCoinName: SupportMarketCoins, ownerAddress?: string) {\n return getMarketCoinAmount(this, marketCoinName, ownerAddress);\n }\n\n /**\n * Get price from pyth fee object.\n *\n * @param assetCoinName - Specific support asset coin name.\n * @return Asset coin price.\n */\n public async getPriceFromPyth(assetCoinName: SupportAssetCoins) {\n return getPythPrice(this, assetCoinName);\n }\n\n /* ==================== Spool Query Methods ==================== */\n\n /**\n * Get stake accounts data for all stake pools (spools).\n *\n * @param ownerAddress - The owner address.\n * @return All Stake accounts data.\n */\n public async getAllStakeAccounts(ownerAddress?: string) {\n return getStakeAccounts(this, ownerAddress);\n }\n\n /**\n * Get stake accounts data for specific stake pool (spool).\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @param ownerAddress - The owner address.\n * @return Stake accounts data.\n */\n public async getStakeAccounts(stakeMarketCoinName: SupportStakeMarketCoins, ownerAddress?: string) {\n const allStakeAccount = await this.getAllStakeAccounts(ownerAddress);\n return allStakeAccount[stakeMarketCoinName] ?? [];\n }\n\n /**\n * Get stake pools (spools) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of support stake market coin name.\n * @return Stake pools data.\n */\n public async getStakePools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n const marketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakePools: StakePools = {};\n for (let i = 0; i < marketCoinNames.length; i++) {\n const stakeMarketCoinName = marketCoinNames[i];\n const stakePool = await getStakePool(this, stakeMarketCoinName);\n\n if (stakePool) {\n stakePools[stakeMarketCoinName] = stakePool;\n }\n }\n return stakePools;\n }\n\n /**\n * Get stake pool (spool) data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get all spool data.\n *\n * @param stakeMarketCoinName - Specific support stake market coin name.\n * @return Stake pool data.\n */\n public async getStakePool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return getStakePool(this, stakeMarketCoinName);\n }\n\n /**\n * Get stake reward pools data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpools` method\n * to get all spools data.\n *\n * @param stakeMarketCoinNames - Specific an array of stake market coin name.\n * @return Stake reward pools data.\n */\n public async getStakeRewardPools(stakeMarketCoinNames?: SupportStakeMarketCoins[]) {\n const marketCoinNames = stakeMarketCoinNames ?? [...SUPPORT_SPOOLS];\n const stakeRewardPools: StakeRewardPools = {};\n for (let i = 0; i < marketCoinNames.length; i++) {\n const stakeRewardPool = await getStakeRewardPool(this, marketCoinNames[i]);\n\n if (stakeRewardPool) {\n stakeRewardPools[marketCoinNames[i]] = stakeRewardPool;\n }\n }\n return stakeRewardPools;\n }\n\n /**\n * Get stake reward pool data.\n *\n * @description\n * For backward compatible, it is recommended to use `getSpool` method\n * to get spool data.\n *\n * @param marketCoinName - Specific support stake market coin name.\n * @return Stake reward pool data.\n */\n public async getStakeRewardPool(stakeMarketCoinName: SupportStakeMarketCoins) {\n return getStakeRewardPool(this, stakeMarketCoinName);\n }\n\n /**\n * Get borrow incentive accounts data.\n *\n * @param coinNames - Specific support borrow incentive coin name.\n * @param ownerAddress - The owner address.\n * @return Borrow incentive accounts data.\n */\n public async getBorrowIncentiveAccounts(\n obligationId: string,\n walletAddress: string,\n coinNames?: SupportBorrowIncentiveCoins[],\n ) {\n return queryBorrowIncentiveAccounts(this, obligationId, walletAddress || this.walletAddress, coinNames);\n }\n\n /**\n * Get all asset coin names in the obligation record by obligation id.\n *\n * @description\n * This can often be used to determine which assets in an obligation require\n * price updates before interacting with specific instructions of the Scallop contract.\n *\n * @param obligationId - The obligation id.\n * @return Asset coin Names.\n */\n public async getObligationCoinNames(obligationId: SuiAddressArg) {\n const obligation = await queryObligation(this, obligationId);\n const collateralCoinTypes = obligation.collaterals.map((collateral) => `0x${collateral.type.name}`);\n const debtCoinTypes = obligation.debts.map((debt) => `0x${debt.type.name}`);\n const obligationCoinTypes = [...new Set([...collateralCoinTypes, ...debtCoinTypes])];\n const obligationCoinNames = obligationCoinTypes.map((coinType) => this.utils.parseCoinNameFromType(coinType));\n return obligationCoinNames;\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\n\nimport { OLD_BORROW_INCENTIVE_PROTOCOL_ID } from '../constants';\nimport type { ScallopBuilder } from '../models';\nimport { getObligations, getObligationLocked, getVeSca, getVeScas } from '../queries';\nimport type {\n BorrowIncentiveIds,\n GenerateBorrowIncentiveNormalMethod,\n GenerateBorrowIncentiveQuickMethod,\n VescaIds,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get veSCA data from transaction block.\n *\n * @description\n * If the veScaKey id is provided, directly return it.\n * Otherwise, automatically get veScaKey from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param veScaKey - veSCA key.\n * @return veSCA key, ID, locked amount and unlock at timestamp.\n */\n\nexport const requireVeSca = async (\n ...params: [builder: ScallopBuilder, SuiTxBlock: TransactionBlock, veScaKey?: SuiAddressArg]\n) => {\n const [builder, txBlock, veScaKey] = params;\n if (params.length === 3 && veScaKey && typeof veScaKey === 'string') {\n const veSca = await getVeSca(builder.query, veScaKey);\n\n if (!veSca) {\n return undefined;\n }\n\n return veSca;\n }\n\n const sender = requireSender(txBlock);\n const veScas = await getVeScas(builder.query, sender);\n if (veScas.length === 0) {\n return undefined;\n }\n\n return veScas[0];\n};\n\n/**\n * Check veSca bind status\n * @param query\n * @param veScaKey\n * @returns\n */\nexport const getBindedObligationId = async (builder: ScallopBuilder, veScaKey: string) => {\n const borrowIncentiveObjId = builder.address.get('borrowIncentive.object');\n const incentivePoolsId = builder.address.get('borrowIncentive.incentivePools');\n const veScaPkgId = builder.address.get('vesca.id');\n\n const { client } = builder;\n\n // get incentive pools\n const incentivePoolsResponse = await client.getObject({\n id: incentivePoolsId,\n options: {\n showContent: true,\n },\n });\n\n if (incentivePoolsResponse.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const incentivePoolFields = incentivePoolsResponse.data.content.fields as any;\n const veScaBindTableId = incentivePoolFields.ve_sca_bind.fields.id.id as string;\n\n // check if veSca is inside the bind table\n const keyType = `${borrowIncentiveObjId}::typed_id::TypedID<${veScaPkgId}::ve_sca::VeScaKey>`;\n const veScaBindTableResponse = await client.getDynamicFieldObject({\n parentId: veScaBindTableId,\n name: {\n type: keyType,\n value: veScaKey,\n },\n });\n\n if (veScaBindTableResponse.data?.content?.dataType !== 'moveObject') {\n return false;\n }\n const veScaBindTableFields = veScaBindTableResponse.data.content.fields as any;\n // get obligationId pair\n const obligationId = veScaBindTableFields.value.fields.id as string;\n\n return obligationId;\n};\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [builder: ScallopBuilder, txBlock: TransactionBlock, obligationId?: string, obligationKey?: string]\n) => {\n const [builder, txBlock, obligationId, obligationKey] = params;\n if (params.length === 4 && obligationId && obligationKey && typeof obligationId === 'string') {\n const obligationLocked = await getObligationLocked(builder.query, obligationId);\n return { obligationId, obligationKey, obligationLocked };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n obligationLocked: obligations[0].locked,\n };\n};\n\n/**\n * Generate borrow incentive normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Borrow incentive normal methods.\n */\nexport const generateBorrowIncentiveNormalMethod: GenerateBorrowIncentiveNormalMethod = ({ builder, txBlock }) => {\n const borrowIncentiveIds: BorrowIncentiveIds = {\n borrowIncentivePkg: builder.address.get('borrowIncentive.id'),\n query: builder.address.get('borrowIncentive.query'),\n incentivePools: builder.address.get('borrowIncentive.incentivePools'),\n incentiveAccounts: builder.address.get('borrowIncentive.incentiveAccounts'),\n obligationAccessStore: builder.address.get('core.obligationAccessStore'),\n config: builder.address.get('borrowIncentive.config'),\n };\n const OldBorrowIncentiveContract = {\n id: '0xc63072e7f5f4983a2efaf5bdba1480d5e7d74d57948e1c7cc436f8e22cbeb410',\n incentivePools: '0x64972b713ccec45ec3964809e477cea6f97350c0c50ca3aec85bb631639266ec',\n incentiveAccounts: '0x3c0b707068bdcea8bb859d751ad3e2149a9f83c13fcf4054ef91372a00bccdd3',\n };\n const veScaIds: Omit<VescaIds, 'pkgId'> = {\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n return {\n stakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::stake`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(borrowIncentiveIds.obligationAccessStore),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n stakeObligationWithVesca: (obligationId, obligationKey, veScaKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::stake_with_ve_sca`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(borrowIncentiveIds.obligationAccessStore),\n txBlock.object(veScaIds.config),\n txBlock.object(veScaIds.treasury),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaKey as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n unstakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n oldUnstakeObligation: (obligationId, obligationKey) => {\n txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::unstake`,\n arguments: [\n txBlock.object(OldBorrowIncentiveContract.incentivePools),\n txBlock.object(OldBorrowIncentiveContract.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [SUI_TYPE_ARG],\n });\n },\n claimBorrowIncentive: (obligationId, obligationKey, rewardCoinName) => {\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${borrowIncentiveIds.borrowIncentivePkg}::user::redeem_rewards`,\n arguments: [\n txBlock.object(borrowIncentiveIds.config),\n txBlock.object(borrowIncentiveIds.incentivePools),\n txBlock.object(borrowIncentiveIds.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [rewardType],\n });\n },\n oldClaimBorrowIncentive(obligationId, obligationKey, rewardCoinName) {\n const rewardType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${OldBorrowIncentiveContract.id}::user::redeem_rewards`,\n arguments: [\n txBlock.object(OldBorrowIncentiveContract.incentivePools),\n txBlock.object(OldBorrowIncentiveContract.incentiveAccounts),\n txBlock.object(obligationKey as string),\n txBlock.object(obligationId as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [rewardType],\n });\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nexport const generateBorrowIncentiveQuickMethod: GenerateBorrowIncentiveQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateBorrowIncentiveNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n stakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n const unstakeObligationBeforeStake = !!txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' && txn.target === `${builder.address.get('borrowIncentive.id')}::user::unstake`,\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n },\n unstakeObligationQuick: async (obligation, obligationKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n if (obligationLocked) {\n normalMethod.unstakeObligation(obligationArg, obligationtKeyArg);\n }\n },\n stakeObligationWithVeScaQuick: async (obligation, obligationKey, veScaKey) => {\n const {\n obligationId: obligationArg,\n obligationKey: obligationtKeyArg,\n obligationLocked,\n } = await requireObligationInfo(builder, txBlock, obligation as string, obligationKey as string);\n\n const unstakeObligationBeforeStake = !!txBlock.blockData.transactions.find(\n (txn) =>\n txn.kind === 'MoveCall' &&\n (txn.target === `${OLD_BORROW_INCENTIVE_PROTOCOL_ID}::user::unstake` ||\n txn.target === `${builder.address.get('borrowIncentive.id')}::user::unstake`),\n );\n\n if (!obligationLocked || unstakeObligationBeforeStake) {\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n if (veSca) {\n const bindedObligationId = await getBindedObligationId(builder, veSca.keyId);\n // if bindedObligationId is equal to obligationId, then use it again\n if (!bindedObligationId || bindedObligationId === obligationArg) {\n normalMethod.stakeObligationWithVesca(obligationArg, obligationtKeyArg, veSca.keyId);\n } else {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n } else {\n normalMethod.stakeObligation(obligationArg, obligationtKeyArg);\n }\n }\n },\n claimBorrowIncentiveQuick: (rewardCoinName, obligation, obligationKey) =>\n normalMethod.claimBorrowIncentive(obligation, obligationKey, rewardCoinName),\n };\n};\n","import { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { updateOracles } from './oracle';\nimport type { ScallopBuilder } from '../models';\nimport { getObligations } from '../queries';\nimport type {\n CoreIds,\n GenerateCoreNormalMethod,\n ScallopTxBlock,\n GenerateCoreQuickMethod,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get Obligation information from transaction block.\n *\n * @description\n * If the obligation id is provided, direactly return it.\n * If both obligation id and key is provided, direactly return them.\n * Otherwise, automatically get obligation id and key from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param obligationId - Obligation id.\n * @param obligationKey - Obligation key.\n * @return Obligation id and key.\n */\nconst requireObligationInfo = async (\n ...params: [\n txBlock: TransactionBlock,\n builder: ScallopBuilder,\n obligationId?: SuiAddressArg,\n obligationKey?: SuiAddressArg,\n ]\n) => {\n const [txBlock, builder, obligationId, obligationKey] = params;\n if (params.length === 3 && obligationId) {\n return { obligationId };\n }\n if (params.length === 4 && obligationId && obligationKey) {\n return { obligationId, obligationKey };\n }\n const sender = requireSender(txBlock);\n const obligations = await getObligations(builder.query, sender);\n if (obligations.length === 0) {\n throw new Error(`No obligation found for sender ${sender}`);\n }\n return {\n obligationId: obligations[0].id,\n obligationKey: obligations[0].keyId,\n };\n};\n\n/**\n * Generate core normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core normal methods.\n */\nexport const generateCoreNormalMethod: GenerateCoreNormalMethod = ({ builder, txBlock }) => {\n const coreIds: CoreIds = {\n protocolPkg: builder.address.get('core.packages.protocol.id'),\n market: builder.address.get('core.market'),\n version: builder.address.get('core.version'),\n coinDecimalsRegistry: builder.address.get('core.coinDecimalsRegistry'),\n xOracle: builder.address.get('core.oracles.xOracle'),\n };\n return {\n openObligation: () =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::open_obligation`,\n arguments: [txBlock.pure(coreIds.version)],\n }),\n returnObligation: (obligation, obligationHotPotato) =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::return_obligation`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationHotPotato as string),\n ],\n }),\n openObligationEntry: () =>\n txBlock.moveCall({\n target: `${coreIds.protocolPkg}::open_obligation::open_obligation_entry`,\n arguments: [txBlock.object(coreIds.version)],\n }),\n addCollateral: (obligation, coin, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::deposit_collateral::deposit_collateral`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n ],\n typeArguments: [coinType],\n });\n },\n takeCollateral: (obligation, obligationKey, amount, collateralCoinName) => {\n const coinType = builder.utils.parseCoinType(collateralCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::withdraw_collateral::withdraw_collateral`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n deposit: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::mint::mint`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n depositEntry: (coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::mint::mint_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n withdraw: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::redeem::redeem`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof marketCoin !== 'string' ? (marketCoin as TransactionArgument) : txBlock.pure(marketCoin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n withdrawEntry: (marketCoin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::redeem::redeem_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n typeof marketCoin !== 'string' ? (marketCoin as TransactionArgument) : txBlock.pure(marketCoin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrow: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::borrow::borrow`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrowEntry: (obligation, obligationKey, amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::borrow::borrow_entry`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(obligationKey as string),\n txBlock.object(coreIds.market),\n txBlock.object(coreIds.coinDecimalsRegistry),\n txBlock.pure(amount),\n txBlock.object(coreIds.xOracle),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n repay: (obligation, coin, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::repay::repay`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(obligation as string),\n txBlock.object(coreIds.market),\n typeof coin !== 'string' ? (coin as TransactionArgument) : txBlock.pure(coin),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [coinType],\n });\n },\n borrowFlashLoan: (amount, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::flash_loan::borrow_flash_loan`,\n arguments: [txBlock.object(coreIds.version), txBlock.object(coreIds.market), txBlock.pure(amount)],\n typeArguments: [coinType],\n });\n },\n repayFlashLoan: (coin, loan, poolCoinName) => {\n const coinType = builder.utils.parseCoinType(poolCoinName);\n return txBlock.moveCall({\n target: `${coreIds.protocolPkg}::flash_loan::repay_flash_loan`,\n arguments: [\n txBlock.object(coreIds.version),\n txBlock.object(coreIds.market),\n txBlock.pure(coin),\n txBlock.object(loan as string),\n ],\n typeArguments: [coinType],\n });\n },\n };\n};\n\n/**\n * Generate core quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include query obligation info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @return Core quick methods.\n */\nexport const generateCoreQuickMethod: GenerateCoreQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateCoreNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n addCollateralQuick: async (amount, collateralCoinName, obligationId) => {\n const sender = requireSender(txBlock);\n const { obligationId: obligationArg } = await requireObligationInfo(txBlock, builder, obligationId);\n\n if (collateralCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n normalMethod.addCollateral(obligationArg, suiCoin, collateralCoinName);\n } else {\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n collateralCoinName,\n amount,\n sender,\n );\n normalMethod.addCollateral(obligationArg, takeCoin, collateralCoinName);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n takeCollateralQuick: async (amount, collateralCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId, obligationKey);\n const updateCoinNames = await builder.query.getObligationCoinNames(obligationInfo.obligationId);\n await updateOracles(builder, txBlock, updateCoinNames);\n return normalMethod.takeCollateral(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n collateralCoinName,\n );\n },\n depositQuick: async (amount, poolCoinName, walletAddress) => {\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n return normalMethod.deposit(suiCoin, poolCoinName);\n }\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n poolCoinName,\n amount,\n walletAddress as string,\n );\n txBlock.transferObjects([leftCoin], walletAddress as string);\n return normalMethod.deposit(takeCoin, poolCoinName);\n },\n withdrawQuick: async (amount, poolCoinName) => {\n const sender = requireSender(txBlock);\n const marketCoinName = builder.utils.parseMarketCoinName(poolCoinName);\n const { leftCoin, takeCoin } = await builder.selectMarketCoin(txBlock, marketCoinName, amount, sender);\n txBlock.transferObjects([leftCoin], sender);\n return normalMethod.withdraw(takeCoin, poolCoinName);\n },\n borrowQuick: async (amount, poolCoinName, obligationId, obligationKey) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId, obligationKey);\n const obligationCoinNames = await builder.query.getObligationCoinNames(obligationInfo.obligationId);\n const updateCoinNames = [...obligationCoinNames, poolCoinName];\n await updateOracles(builder, txBlock, updateCoinNames);\n return normalMethod.borrow(\n obligationInfo.obligationId,\n obligationInfo.obligationKey as SuiAddressArg,\n amount,\n poolCoinName,\n );\n },\n repayQuick: async (amount, poolCoinName, obligationId, walletAddress) => {\n const obligationInfo = await requireObligationInfo(txBlock, builder, obligationId);\n\n if (poolCoinName === 'sui') {\n const [suiCoin] = txBlock.splitCoins(txBlock.gas, [amount]);\n return normalMethod.repay(obligationInfo.obligationId, suiCoin, poolCoinName);\n }\n const { leftCoin, takeCoin } = await builder.selectCoin(\n txBlock as ScallopTxBlock,\n poolCoinName,\n amount,\n walletAddress as string,\n );\n txBlock.transferObjects([leftCoin], walletAddress as string);\n return normalMethod.repay(obligationInfo.obligationId, takeCoin, poolCoinName);\n },\n updateAssetPricesQuick: async (assetCoinNames) => updateOracles(builder, txBlock, assetCoinNames),\n };\n};\n","import type { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport axios from 'axios';\n\nimport { SUPPORT_COLLATERALS, SUPPORT_POOLS } from '../constants';\nimport { PYTH_ENDPOINTS } from '../constants/pyth';\nimport type { ScallopBuilder } from '../models';\nimport { PythClient } from '../models/pythClient';\nimport type { SupportAssetCoins, SupportOracleType } from '../types';\n\nexport const getLatestVaas = async (endpoint: string, priceIds: string[]) => {\n const response = await axios.get(`${endpoint}/api/latest_vaas`, {\n params: {\n ids: priceIds,\n },\n });\n const latestVaas = response.data;\n return latestVaas.map((vaa: string) => Buffer.from(vaa, 'base64'));\n};\n\n/**\n * Update the price of the oracle for multiple coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinNames - Specific an array of support asset coin name.\n */\nexport const updateOracles = async (\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n assetCoinNames?: SupportAssetCoins[],\n) => {\n const coinNames = assetCoinNames ?? [...new Set([...SUPPORT_POOLS, ...SUPPORT_COLLATERALS])];\n const rules: SupportOracleType[] = builder.isTestnet ? ['pyth'] : ['pyth'];\n if (rules.includes('pyth')) {\n const pythClient = new PythClient(\n builder.client as any,\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get('core.oracles.pyth.wormholeState'),\n );\n const priceIds = coinNames.map((assetCoinName) =>\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feed`),\n );\n\n // iterate through the endpoints\n const endpoints = builder.params.pythEndpoints ?? PYTH_ENDPOINTS[builder.isTestnet ? 'testnet' : 'mainnet'];\n try {\n const priceUpdateData = await getLatestVaas(endpoints[0], priceIds);\n await pythClient.updatePriceFeeds(txBlock as any, priceUpdateData, priceIds);\n } catch (e) {\n console.warn(`Failed to update price feeds with endpoint ${endpoints[0]}: ${e}`);\n }\n }\n\n // Remove duplicate coin names.\n const updateAssetCoinNames = [...new Set(coinNames)];\n for (let i = 0; i < updateAssetCoinNames.length; i++) {\n await updateOracle(builder, txBlock, updateAssetCoinNames[i], rules);\n }\n};\n\n/**\n * Update the price of the oracle for specific coin.\n *\n * @param builder - The scallop builder.\n * @param txBlock - TxBlock created by SuiKit.\n * @param assetCoinName - Specific support asset coin name.\n */\nconst updateOracle = async (\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n assetCoinName: SupportAssetCoins,\n rules: SupportOracleType[],\n) => {\n const coinType = builder.utils.parseCoinType(assetCoinName);\n\n updatePrice(\n txBlock,\n rules,\n builder.address.get('core.packages.xOracle.id'),\n builder.address.get('core.oracles.xOracle'),\n builder.address.get('core.packages.pyth.id'),\n builder.address.get('core.oracles.pyth.registry'),\n builder.address.get('core.oracles.pyth.state'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.pyth.feedObject`),\n builder.address.get('core.packages.switchboard.id'),\n builder.address.get('core.oracles.switchboard.registry'),\n builder.address.get(`core.coins.${assetCoinName}.oracle.switchboard`),\n builder.address.get('core.packages.supra.id'),\n builder.address.get('core.oracles.supra.registry'),\n builder.address.get(`core.oracles.supra.holder`),\n coinType,\n );\n};\n\n/**\n * Construct a transaction block for update the price.\n *\n * @param txBlock - The transaction block.\n * @param rules - The oracle rules.\n * @param xOraclePackageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param pythPackageId - The pyth package id.\n * @param pythRegistryId - The registry id from pyth package.\n * @param pythStateId - The price state id from pyth package.\n * @param pythFeedObjectId - The feed object id from pyth package.\n * @param switchboardPackageId - The switchboard package id.\n * @param switchboardRegistryId - The registry id from switchboard package.\n * @param switchboardAggregatorId - The aggregator id from switchboard package.\n * @param supraPackageId - The supra package id.\n * @param supraRegistryId - The registry id from supra package.\n * @param supraHolderId - The holder id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePrice = (\n txBlock: TransactionBlock,\n rules: SupportOracleType[],\n xOraclePackageId: string,\n xOracleId: TransactionArgument | string,\n pythPackageId: string,\n pythRegistryId: TransactionArgument | string,\n pythStateId: TransactionArgument | string,\n pythFeedObjectId: TransactionArgument | string,\n switchboardPackageId: string,\n switchboardRegistryId: TransactionArgument | string,\n switchboardAggregatorId: TransactionArgument | string,\n supraPackageId: string,\n supraRegistryId: TransactionArgument | string,\n supraHolderId: TransactionArgument | string,\n coinType: string,\n) => {\n const request = priceUpdateRequest(txBlock, xOraclePackageId, xOracleId, coinType);\n if (rules.includes('pyth')) {\n updatePythPrice(txBlock, pythPackageId, request, pythStateId, pythFeedObjectId, pythRegistryId, coinType);\n }\n if (rules.includes('switchboard')) {\n updateSwitchboardPrice(\n txBlock,\n switchboardPackageId,\n request,\n switchboardAggregatorId,\n switchboardRegistryId,\n coinType,\n );\n }\n if (rules.includes('supra')) {\n updateSupraPrice(txBlock, supraPackageId, request, supraHolderId, supraRegistryId, coinType);\n }\n confirmPriceUpdateRequest(txBlock, xOraclePackageId, xOracleId, request, coinType);\n return txBlock;\n};\n\n/**\n * Construct a transaction block for request price update.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst priceUpdateRequest = (\n txBlock: TransactionBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n coinType: string,\n) => {\n const validXOracleId = typeof xOracleId === 'string' ? txBlock.object(xOracleId) : xOracleId;\n const target = `${packageId}::x_oracle::price_update_request` as `${string}::${string}::${string}`;\n const typeArgs = [coinType];\n return txBlock.moveCall({ target, arguments: [validXOracleId], typeArguments: typeArgs });\n};\n\n/**\n * Construct a transaction block for confirm price update request.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The xOracle package id.\n * @param xOracleId - The xOracle Id from xOracle package.\n * @param request - The result of the request.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst confirmPriceUpdateRequest = (\n txBlock: TransactionBlock,\n packageId: string,\n xOracleId: TransactionArgument | string,\n request: TransactionArgument,\n coinType: string,\n) => {\n const target = `${packageId}::x_oracle::confirm_price_update_request` as `${string}::${string}::${string}`;\n const typeArgs = [coinType];\n const validXOracleId = typeof xOracleId === 'string' ? txBlock.object(xOracleId) : xOracleId;\n txBlock.moveCall({\n target,\n arguments: [validXOracleId, request, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: typeArgs,\n });\n return txBlock;\n};\n\n/**\n * Construct a transaction block for update supra price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The supra package id.\n * @param request - The result of the request.\n * @param holderId - The holder id from supra package.\n * @param registryId - The registry id from supra package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSupraPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument,\n holderId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validHolderId = typeof holderId === 'string' ? txBlock.object(holderId) : holderId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [request, validHolderId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n\n/**\n * Construct a transaction block for update switchboard price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The switchboard package id.\n * @param request - The result of the request.\n * @param aggregatorId - The aggregator id from switchboard package.\n * @param registryId - The registry id from switchboard package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updateSwitchboardPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument,\n aggregatorId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validAggregatorId = typeof aggregatorId === 'string' ? txBlock.object(aggregatorId) : aggregatorId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [request, validAggregatorId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n\n/**\n * Construct a transaction block for update pyth price.\n *\n * @param txBlock - The transaction block.\n * @param packageId - The pyth package id.\n * @param request - The result of the request.\n * @param stateId - The price state id from pyth package.\n * @param wormholeStateId - The whormhole state id from pyth package.\n * @param feedObjectId - The feed object id from pyth package.\n * @param vaaFromFeeId - The vaa from pyth api with feed id.\n * @param registryId - The registry id from pyth package.\n * @param coinType - The type of coin.\n * @return TxBlock created by SuiKit.\n */\nconst updatePythPrice = (\n txBlock: TransactionBlock,\n packageId: string,\n request: TransactionArgument | string,\n stateId: TransactionArgument | string,\n feedObjectId: TransactionArgument | string,\n registryId: TransactionArgument | string,\n coinType: string,\n) => {\n const validRequest = typeof request === 'string' ? txBlock.object(request) : request;\n const validStateId = typeof stateId === 'string' ? txBlock.object(stateId) : stateId;\n const validFeedObjectId = typeof feedObjectId === 'string' ? txBlock.object(feedObjectId) : feedObjectId;\n const validRegistryId = typeof registryId === 'string' ? txBlock.object(registryId) : registryId;\n\n txBlock.moveCall({\n target: `${packageId}::rule::set_price`,\n arguments: [validRequest, validStateId, validFeedObjectId, validRegistryId, txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [coinType],\n });\n};\n","export const PYTH_ENDPOINTS: {\n [k in 'mainnet' | 'testnet']: Readonly<string[]>;\n} = {\n testnet: ['https://hermes-beta.pyth.network'],\n mainnet: ['https://hermes.pyth.network', 'https://scallop.rpc.p2p.world'],\n} as const;\n","import { bcs } from '@mysten/sui.js/bcs';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nconst MAX_ARGUMENT_SIZE = 16 * 1024;\n\nexport class PythClient {\n provider: SuiClient;\n\n pythStateId: string;\n\n wormholeStateId: string;\n\n private pythPackageId: any;\n\n private wormholePackageId: any;\n\n private priceTableInfo: { id: string; fieldType: string };\n\n private priceFeedObjectIdCache: Map<string, string> = new Map();\n\n private baseUpdateFee: any;\n\n constructor(provider: SuiClient, pythStateId: string, wormholeStateId: string) {\n this.provider = provider;\n this.pythStateId = pythStateId;\n this.wormholeStateId = wormholeStateId;\n this.pythPackageId = undefined;\n this.wormholePackageId = undefined;\n }\n\n async getBaseUpdateFee() {\n if (this.baseUpdateFee === undefined) {\n const result = await this.provider.getObject({\n id: this.pythStateId,\n options: { showContent: true },\n });\n if (!result.data || !result.data.content || result.data.content.dataType !== 'moveObject') {\n throw new Error('Unable to fetch pyth state object');\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.baseUpdateFee = result.data.content.fields.base_update_fee;\n }\n return this.baseUpdateFee;\n }\n\n /**\n * getPackageId returns the latest package id that the object belongs to. Use this to\n * fetch the latest package id for a given object id and handle package upgrades automatically.\n * @param objectId\n * @returns package id\n */\n async getPackageId(objectId: string) {\n const state = await this.provider\n .getObject({\n id: objectId,\n options: {\n showContent: true,\n },\n })\n .then((result) => {\n if (result.data?.content?.dataType === 'moveObject') {\n return result.data.content.fields;\n }\n console.log(result.data?.content);\n throw new Error(`Cannot fetch package id for object ${objectId}`);\n });\n if ('upgrade_cap' in state) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return state.upgrade_cap.fields.package;\n }\n throw new Error('upgrade_cap not found');\n }\n\n /**\n * Adds the commands for calling wormhole and verifying the vaas and returns the verified vaas.\n * @param vaas array of vaas to verify\n * @param tx transaction block to add commands to\n */\n async verifyVaas(vaas: Buffer[], tx: TransactionBlock) {\n const wormholePackageId = await this.getWormholePackageId();\n const verifiedVaas: {\n index: number;\n resultIndex: number;\n kind: 'NestedResult';\n }[] = [];\n vaas.forEach((vaa) => {\n const [verifiedVaa] = tx.moveCall({\n target: `${wormholePackageId}::vaa::parse_and_verify`,\n arguments: [\n tx.object(this.wormholeStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(vaa), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n verifiedVaas.push(verifiedVaa);\n });\n return verifiedVaas;\n }\n\n /**\n * Adds the necessary commands for updating the pyth price feeds to the transaction block.\n * @param tx transaction block to add commands to\n * @param updates array of price feed updates received from the price service\n * @param feedIds array of feed ids to update (in hex format)\n */\n async updatePriceFeeds(tx: TransactionBlock, updates: Buffer[], feedIds: string[]) {\n const packageId = await this.getPythPackageId();\n let priceUpdatesHotPotato;\n if (updates.length > 1) {\n throw new Error('SDK does not support sending multiple accumulator messages in a single transaction');\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::create_authenticated_price_infos_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n verifiedVaas[0],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n const priceInfoObjects = [];\n const baseUpdateFee = await this.getBaseUpdateFee();\n const coins = tx.splitCoins(\n tx.gas,\n feedIds.map(() => tx.pure(baseUpdateFee)),\n );\n let coinId = 0;\n for (let i = 0; i < feedIds.length; i++) {\n const priceInfoObjectId = await this.getPriceFeedObjectId(feedIds[i]);\n if (!priceInfoObjectId) {\n throw new Error(`Price feed ${feedIds[0]} not found, please create it first`);\n }\n priceInfoObjects.push(priceInfoObjectId);\n [priceUpdatesHotPotato] = tx.moveCall({\n target: `${packageId}::pyth::update_single_price_feed`,\n arguments: [\n tx.object(this.pythStateId),\n priceUpdatesHotPotato,\n tx.object(priceInfoObjectId),\n coins[coinId],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n coinId++;\n }\n tx.moveCall({\n target: `${packageId}::hot_potato_vector::destroy`,\n arguments: [priceUpdatesHotPotato],\n typeArguments: [`${packageId}::price_info::PriceInfo`],\n });\n return priceInfoObjects;\n }\n\n async createPriceFeed(tx: TransactionBlock, updates: Buffer[]) {\n const packageId = await this.getPythPackageId();\n if (updates.length > 1) {\n throw new Error('SDK does not support sending multiple accumulator messages in a single transaction');\n }\n const vaa = this.extractVaaBytesFromAccumulatorMessage(updates[0]);\n const verifiedVaas = await this.verifyVaas([vaa], tx);\n tx.moveCall({\n target: `${packageId}::pyth::create_price_feeds_using_accumulator`,\n arguments: [\n tx.object(this.pythStateId),\n tx.pure(\n bcs\n .ser('vector<u8>', Array.from(updates[0]), {\n maxSize: MAX_ARGUMENT_SIZE,\n })\n .toBytes(),\n ),\n verifiedVaas[0],\n tx.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n }\n\n /**\n * Get the packageId for the wormhole package if not already cached\n */\n async getWormholePackageId() {\n if (!this.wormholePackageId) {\n this.wormholePackageId = await this.getPackageId(this.wormholeStateId);\n }\n return this.wormholePackageId;\n }\n\n /**\n * Get the packageId for the pyth package if not already cached\n */\n async getPythPackageId() {\n if (!this.pythPackageId) {\n this.pythPackageId = await this.getPackageId(this.pythStateId);\n }\n return this.pythPackageId;\n }\n\n /**\n * Get the priceFeedObjectId for a given feedId if not already cached\n * @param feedId\n */\n async getPriceFeedObjectId(feedId: string) {\n const normalizedFeedId = feedId.replace('0x', '');\n if (!this.priceFeedObjectIdCache.has(normalizedFeedId)) {\n const { id: tableId, fieldType } = await this.getPriceTableInfo();\n const result = await this.provider.getDynamicFieldObject({\n parentId: tableId,\n name: {\n type: `${fieldType}::price_identifier::PriceIdentifier`,\n value: {\n bytes: Array.from(Buffer.from(normalizedFeedId, 'hex')),\n },\n },\n });\n if (!result.data || !result.data.content) {\n return undefined;\n }\n if (result.data.content.dataType !== 'moveObject') {\n throw new Error('Price feed type mismatch');\n }\n this.priceFeedObjectIdCache.set(\n normalizedFeedId,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n result.data.content.fields.value,\n );\n }\n return this.priceFeedObjectIdCache.get(normalizedFeedId);\n }\n\n /**\n * Fetches the price table object id for the current state id if not cached\n * @returns price table object id\n */\n async getPriceTableInfo() {\n if (this.priceTableInfo === undefined) {\n const result = await this.provider.getDynamicFieldObject({\n parentId: this.pythStateId,\n name: {\n type: 'vector<u8>',\n value: 'price_info',\n },\n });\n if (!result.data || !result.data.type) {\n throw new Error('Price Table not found, contract may not be initialized');\n }\n let type = result.data.type.replace('0x2::table::Table<', '');\n type = type.replace('::price_identifier::PriceIdentifier, 0x2::object::ID>', '');\n this.priceTableInfo = { id: result.data.objectId, fieldType: type };\n }\n return this.priceTableInfo;\n }\n\n /**\n * Obtains the vaa bytes embedded in an accumulator message.\n * @param accumulatorMessage - the accumulator price update message\n * @returns vaa bytes as a uint8 array\n */\n extractVaaBytesFromAccumulatorMessage(accumulatorMessage: Buffer): Buffer {\n // the first 6 bytes in the accumulator message encode the header, major, and minor bytes\n // we ignore them, since we are only interested in the VAA bytes\n const trailingPayloadSize = accumulatorMessage.readUint8(6);\n const vaaSizeOffset =\n 7 + // header bytes (header(4) + major(1) + minor(1) + trailing payload size(1))\n trailingPayloadSize + // trailing payload (variable number of bytes)\n 1; // proof_type (1 byte)\n const vaaSize = accumulatorMessage.readUint16BE(vaaSizeOffset);\n const vaaOffset = vaaSizeOffset + 2;\n return accumulatorMessage.subarray(vaaOffset, vaaOffset + vaaSize);\n }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport type { TransactionArgument, TransactionResult } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { spoolRewardCoins } from '../constants/enum';\nimport type { ScallopBuilder } from '../models';\nimport { getStakeAccounts } from '../queries/spoolQuery';\nimport type {\n SpoolIds,\n GenerateSpoolNormalMethod,\n GenerateSpoolQuickMethod,\n SupportStakeMarketCoins,\n SuiAddressArg,\n} from '../types';\nimport { requireSender } from '../utils';\n\n/**\n * Check and get stake account id from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return it.\n * Otherwise, automatically get all stake account id from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake account ids.\n */\nconst requireStakeAccountIds = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n if (params.length === 4 && stakeAccountId) {\n return [stakeAccountId];\n }\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account id found for sender ${sender}`);\n }\n return stakeAccounts[stakeMarketCoinName].map((account) => account.id);\n};\n\n/**\n * Check and get stake accounts information from transaction block.\n *\n * @description\n * If the stake account id is provided, directly return its account.\n * Otherwise, automatically get all stake account from the sender.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit.\n * @param stakeMarketCoinName - The name of the market coin supported for staking.\n * @param stakeAccountId - Stake account id.\n * @return Stake accounts.\n */\nconst requireStakeAccounts = async (\n ...params: [\n builder: ScallopBuilder,\n txBlock: TransactionBlock,\n stakeMarketCoinName: SupportStakeMarketCoins,\n stakeAccountId?: SuiAddressArg,\n ]\n) => {\n const [builder, txBlock, stakeMarketCoinName, stakeAccountId] = params;\n const sender = requireSender(txBlock);\n const stakeAccounts = await getStakeAccounts(builder.query, sender);\n if (stakeAccounts[stakeMarketCoinName].length === 0) {\n throw new Error(`No stake account found for sender ${sender}`);\n }\n\n const specificStakeAccounts = stakeAccountId\n ? stakeAccounts[stakeMarketCoinName].filter((account) => account.id === stakeAccountId)\n : stakeAccounts[stakeMarketCoinName];\n\n return specificStakeAccounts;\n};\n\n/**\n * Generate spool normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool normal methods.\n */\nexport const generateSpoolNormalMethod: GenerateSpoolNormalMethod = ({ builder, txBlock }) => {\n const spoolIds: SpoolIds = {\n spoolPkg: builder.address.get('spool.id'),\n };\n return {\n createStakeAccount: (stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::new_spool_account`,\n arguments: [txBlock.object(stakePoolId), txBlock.object(SUI_CLOCK_OBJECT_ID)],\n typeArguments: [marketCoinType],\n });\n },\n stake: (stakeAccount, coin, stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::stake`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(stakeAccount as string),\n typeof coin === 'string' ? txBlock.pure(coin) : (coin as TransactionArgument),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType],\n });\n },\n unstake: (stakeAccount, amount, stakeMarketCoinName) => {\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::unstake`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(stakeAccount as string),\n txBlock.pure(amount),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType],\n });\n },\n claim: (stakeAccount, stakeMarketCoinName) => {\n const stakePoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.id`);\n const rewardPoolId = builder.address.get(`spool.pools.${stakeMarketCoinName}.rewardPoolId`);\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n const rewardCoinName = spoolRewardCoins[stakeMarketCoinName];\n const rewardCoinType = builder.utils.parseCoinType(rewardCoinName);\n return txBlock.moveCall({\n target: `${spoolIds.spoolPkg}::user::redeem_rewards`,\n arguments: [\n txBlock.object(stakePoolId),\n txBlock.object(rewardPoolId),\n txBlock.object(stakeAccount as string),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n typeArguments: [marketCoinType, rewardCoinType],\n });\n },\n };\n};\n\n/**\n * Generate spool quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get stake account info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return Spool quick methods.\n */\nexport const generateSpoolQuickMethod: GenerateSpoolQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateSpoolNormalMethod({ builder, txBlock });\n return {\n normalMethod,\n stakeQuick: async (amountOrMarketCoin, stakeMarketCoinName, stakeAccountId) => {\n const sender = requireSender(txBlock);\n const stakeAccountIds = await requireStakeAccountIds(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n\n const marketCoinType = builder.utils.parseMarketCoinType(stakeMarketCoinName);\n if (typeof amountOrMarketCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(amountOrMarketCoin, marketCoinType, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, coins, amountOrMarketCoin);\n normalMethod.stake(stakeAccountIds[0], takeCoin, stakeMarketCoinName);\n txBlock.transferObjects([leftCoin], sender);\n } else {\n normalMethod.stake(stakeAccountIds[0], amountOrMarketCoin, stakeMarketCoinName);\n }\n },\n unstakeQuick: async (amount, stakeMarketCoinName, stakeAccountId) => {\n let remainingAmount = amount;\n const stakeAccounts = await requireStakeAccounts(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n const stakeMarketCoins: TransactionResult[] = [];\n for (let i = 0; i < stakeAccounts.length; i++) {\n if (stakeAccounts[i].staked === 0) {\n continue;\n }\n const amountToUnstake = Math.min(remainingAmount, stakeAccounts[i].staked);\n const marketCoin = normalMethod.unstake(stakeAccounts[i].id, amountToUnstake, stakeMarketCoinName);\n stakeMarketCoins.push(marketCoin);\n remainingAmount -= amountToUnstake;\n if (remainingAmount === 0) {\n break;\n }\n }\n return stakeMarketCoins;\n },\n claimQuick: async (stakeMarketCoinName, stakeAccountId) => {\n const stakeAccountIds = await requireStakeAccountIds(builder, txBlock, stakeMarketCoinName, stakeAccountId);\n const rewardCoins: TransactionResult[] = [];\n stakeAccountIds.forEach((accountId) => {\n const rewardCoin = normalMethod.claim(accountId, stakeMarketCoinName);\n rewardCoins.push(rewardCoin);\n });\n return rewardCoins;\n },\n };\n};\n","import { TransactionArgument, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nimport { requireVeSca } from './borrowIncentiveBuilder';\nimport { SCA_COIN_TYPE } from '../constants';\nimport { GenerateVeScaNormalMethod, GenerateVeScaQuickMethod, SuiAddressArg, SuiObjectArg, VescaIds } from '../types';\nimport {\n requireSender,\n checkLockSca,\n checkExtendLockPeriod,\n checkExtendLockAmount,\n checkRenewExpiredVeSca,\n checkVesca,\n} from '../utils';\n\n/**\n * Generate veSCA normal methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA normal methods.\n */\nconst generateNormalVeScaMethod: GenerateVeScaNormalMethod = ({ builder, txBlock }) => {\n const veScaIds: VescaIds = {\n pkgId: builder.address.get('vesca.id'),\n table: builder.address.get('vesca.table'),\n treasury: builder.address.get('vesca.treasury'),\n config: builder.address.get('vesca.config'),\n };\n\n return {\n lockSca: (scaCoin, unlockAtInSecondTimestamp) =>\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::mint_ve_sca_key`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.pure(unlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n }),\n extendLockPeriod: (veScaKey, newUnlockAtInSecondTimestamp) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::extend_lock_period`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n txBlock.pure(newUnlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n extendLockAmount: (veScaKey, scaCoin) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::lock_more_sca`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n renewExpiredVeSca: (veScaKey, scaCoin, newUnlockAtInSecondTimestamp) => {\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::renew_expired_ve_sca`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n typeof scaCoin === 'string' ? txBlock.pure(scaCoin) : (scaCoin as TransactionArgument),\n txBlock.pure(newUnlockAtInSecondTimestamp),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n });\n },\n redeemSca: (veScaKey) =>\n txBlock.moveCall({\n target: `${veScaIds.pkgId}::ve_sca::redeem`,\n arguments: [\n txBlock.object(veScaIds.config),\n txBlock.object(veScaKey as string),\n txBlock.object(veScaIds.table),\n txBlock.object(veScaIds.treasury),\n txBlock.object(SUI_CLOCK_OBJECT_ID),\n ],\n }),\n };\n};\n\n/**\n * Generate veSCA quick methods.\n *\n * @description\n * The quick methods are the same as the normal methods, but they will automatically\n * help users organize transaction blocks, include get veSca info, and transfer\n * coins to the sender. So, they are all asynchronous methods.\n *\n * @param builder - Scallop builder instance.\n * @param txBlock - TxBlock created by SuiKit .\n * @return veSCA quick methods.\n */\nexport const generateQuickVeScaMethod: GenerateVeScaQuickMethod = ({ builder, txBlock }) => {\n const normalMethod = generateNormalVeScaMethod({ builder, txBlock });\n return {\n normalMethod,\n lockScaQuick: async (amountOrCoin, lockPeriodInDays, autoCheck = true) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock);\n\n let scaCoin: TransactionObjectArgument | SuiObjectArg | undefined;\n const transferObjects = [];\n if (amountOrCoin !== undefined && typeof amountOrCoin === 'number') {\n const coins = await builder.utils.selectCoinIds(amountOrCoin, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, coins, amountOrCoin);\n scaCoin = takeCoin;\n transferObjects.push(leftCoin);\n } else {\n // With amountOrCoin is SuiObjectArg, we cannot validate the minimum sca amount for locking and topup\n scaCoin = amountOrCoin as SuiObjectArg;\n }\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays, veSca?.unlockAt);\n if (autoCheck) {\n checkLockSca(amountOrCoin, lockPeriodInDays, newUnlockAt, veSca?.unlockAt);\n }\n console.log(\n new Date(newUnlockAt * 1000).toLocaleString('en-CA', {\n hour12: true,\n }),\n );\n\n const isInitialLock = !veSca?.unlockAt;\n const isLockExpired = !isInitialLock && veSca.unlockAt * 1000 <= new Date().getTime();\n if (isInitialLock || isLockExpired) {\n if (scaCoin) {\n if (isInitialLock) {\n const veScaKey = normalMethod.lockSca(scaCoin, newUnlockAt);\n transferObjects.push(veScaKey);\n } else {\n // user must withdraw current unlocked SCA first if any\n if (veSca.lockedScaAmount !== 0) {\n const unlockedSca = normalMethod.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n // enforce renew on expired\n normalMethod.renewExpiredVeSca(veSca.keyId, scaCoin, newUnlockAt);\n }\n }\n } else if (!!scaCoin && !!lockPeriodInDays) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n normalMethod.extendLockAmount(veSca.keyId, scaCoin);\n } else if (lockPeriodInDays) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n } else if (scaCoin) {\n normalMethod.extendLockAmount(veSca.keyId, scaCoin);\n }\n\n if (transferObjects.length > 0) {\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n extendLockPeriodQuick: async (lockPeriodInDays: number, veScaKey?: SuiAddressArg, autoCheck = true) => {\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays);\n if (autoCheck) {\n checkExtendLockPeriod(lockPeriodInDays, newUnlockAt, veSca?.unlockAt);\n }\n\n if (veSca) {\n normalMethod.extendLockPeriod(veSca.keyId, newUnlockAt);\n }\n },\n extendLockAmountQuick: async (scaAmount: number, veScaKey?: SuiAddressArg, autoCheck = true) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n if (autoCheck) {\n checkExtendLockAmount(scaAmount, veSca?.unlockAt);\n }\n\n if (veSca) {\n const scaCoins = await builder.utils.selectCoinIds(scaAmount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, scaCoins, scaAmount);\n\n normalMethod.extendLockAmount(veSca.keyId, takeCoin);\n txBlock.transferObjects([leftCoin], sender);\n }\n },\n renewExpiredVeScaQuick: async (\n scaAmount: number,\n lockPeriodInDays: number,\n veScaKey?: SuiAddressArg,\n autoCheck = true,\n ) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n const newUnlockAt = builder.utils.getUnlockAt(lockPeriodInDays, veSca?.unlockAt);\n if (autoCheck) {\n checkRenewExpiredVeSca(scaAmount, lockPeriodInDays, veSca?.unlockAt);\n }\n\n if (veSca) {\n const transferObjects = [];\n if (veSca.lockedScaAmount !== 0) {\n const unlockedSca = normalMethod.redeemSca(veSca.keyId);\n transferObjects.push(unlockedSca);\n }\n const scaCoins = await builder.utils.selectCoinIds(scaAmount, SCA_COIN_TYPE, sender);\n const [takeCoin, leftCoin] = builder.utils.takeAmountFromCoins(txBlock, scaCoins, scaAmount);\n transferObjects.push(leftCoin);\n\n normalMethod.renewExpiredVeSca(veSca.keyId, takeCoin, newUnlockAt);\n txBlock.transferObjects(transferObjects, sender);\n }\n },\n redeemScaQuick: async (veScaKey?: SuiAddressArg) => {\n const sender = requireSender(txBlock);\n const veSca = await requireVeSca(builder, txBlock, veScaKey);\n\n checkVesca(veSca?.unlockAt);\n\n if (veSca) {\n const sca = normalMethod.redeemSca(veSca.keyId);\n txBlock.transferObjects([sca], sender);\n }\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';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface BorrowIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class BorrowIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.borrow(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface BorrowWithBoostIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n veScaKey: string;\n}\n\nexport class BorrowWithBoostIntention extends CoreBaseIntention<BorrowWithBoostIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.Borrow;\n\n constructor(public readonly data: BorrowWithBoostIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await scallopClient.init();\n return scallopClient.borrowWithBoost(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n this.data.veScaKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { BorrowIncentiveParams, SpoolIncentiveParams } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ClaimIncentiveRewardIntentionData {\n lendingIncentive: SpoolIncentiveParams[];\n borrowIncentiveV2: BorrowIncentiveParams[];\n borrowIncentive: BorrowIncentiveParams[];\n}\n\nexport class ClaimIncentiveRewardIntention extends CoreBaseIntention<ClaimIncentiveRewardIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ClaimIncentiveReward;\n\n constructor(public readonly data: ClaimIncentiveRewardIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.claim(\n this.data.lendingIncentive,\n this.data.borrowIncentiveV2,\n this.data.borrowIncentive,\n input.account.address,\n );\n }\n\n static fromData(data: ClaimIncentiveRewardIntentionData): ClaimIncentiveRewardIntention {\n return new ClaimIncentiveRewardIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportCollateralCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface DepositCollateralIntentionData {\n collateralCoinName: SupportCollateralCoins;\n amount: number | string;\n obligationId: string;\n}\n\nexport class DepositCollateralIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.depositCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\n this.data.obligationId,\n input.account.address,\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ExtendPeriodAndStakeMoreIntentionData {\n amount: number;\n veScaKey: string;\n lockPeriodInDays: number;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n isOldBorrowIncentive: boolean;\n isObligationLocked: boolean;\n}\n\nexport class ExtendPeriodAndStakeMoreIntention extends CoreBaseIntention<ExtendPeriodAndStakeMoreIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendPeriodAndStakeMore;\n\n constructor(public readonly data: ExtendPeriodAndStakeMoreIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.extendPeriodAndStakeMoreSca(\n this.data.amount,\n this.data.veScaKey,\n this.data.lockPeriodInDays,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface ExtendStakePeriodIntentionData {\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n lockPeriodInDays: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class ExtendStakePeriodIntention extends CoreBaseIntention<ExtendStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.ExtendStakePeriod;\n\n constructor(public readonly data: ExtendStakePeriodIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.extendStakeScaLockPeriod(\n this.data.lockPeriodInDays,\n this.data.veScaKey,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportBorrowIncentiveRewardCoins, TransactionSubType } from '../types';\n\nexport interface MigrateAndClaimIntentionData {\n veScaKey: string;\n obligationKey: string;\n obligationId: string;\n rewardCoinName: SupportBorrowIncentiveRewardCoins;\n}\n\nexport class MigrateAndClaimIntention extends CoreBaseIntention<MigrateAndClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.MigrateAndClaim;\n\n constructor(public readonly data: MigrateAndClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n await scallopClient.init();\n return scallopClient.migrateAndClaim(\n this.data.veScaKey,\n this.data.obligationKey,\n this.data.obligationId,\n this.data.rewardCoinName,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface OpenObligationIntentionData {}\n\nexport class OpenObligationIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.openObligation();\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, TransactionSubType } from '../types';\n\nexport interface RedeemScaIntentionData {\n veScaKey: string;\n}\n\nexport class RedeemScaIntention extends CoreBaseIntention<RedeemScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RedeemSca;\n\n constructor(public readonly data: RedeemScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.redeemSca(this.data.veScaKey);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface RenewExpStakePeriodIntentionData {\n amount: number;\n lockPeriodInDays: 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 CoreBaseIntention<RenewExpStakePeriodIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.RenewExpStakePeriod;\n\n constructor(public readonly data: RenewExpStakePeriodIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.renewExpiredStakeSca(\n this.data.amount,\n this.data.lockPeriodInDays,\n this.data.vescaKey,\n this.data.isHaveRedeem,\n this.data.obligation,\n this.data.obligationKey,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportPoolCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface RepayIntentionData {\n coinName: SupportPoolCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class RepayIntention extends CoreBaseIntention<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: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.repay(\n this.data.coinName,\n Number(this.data.amount),\n this.data.obligationId,\n this.data.obligationKey,\n input.account.address,\n );\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface StakeScaIntentionData {\n amount: number;\n isObligationLocked: boolean;\n isOldBorrowIncentive: boolean;\n obligationId: string | undefined;\n obligationKey: string | undefined;\n lockPeriodInDays: number | undefined;\n veScaKey: string | undefined;\n}\n\nexport class StakeScaIntention extends CoreBaseIntention<StakeScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSca;\n\n constructor(public readonly data: StakeScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.stakeSca(\n this.data.amount,\n this.data.isObligationLocked,\n this.data.isOldBorrowIncentive,\n this.data.obligationId,\n this.data.obligationKey,\n this.data.lockPeriodInDays,\n this.data.veScaKey,\n input.account.address,\n );\n }\n\n static fromData(data: StakeScaIntentionData): StakeScaIntention {\n return new StakeScaIntention(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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportStakeMarketCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface StakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: SupportStakeMarketCoins;\n stakeAccountId?: string | null;\n}\n\nexport class StakeSpoolIntention extends CoreBaseIntention<StakeSpoolIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.StakeSpool;\n\n constructor(public readonly data: StakeSpoolIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.stake(this.data.marketCoinName, Number(this.data.amount), undefined, input.account.address);\n }\n\n static fromData(data: StakeSpoolIntentionData): StakeSpoolIntention {\n return new StakeSpoolIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface SupplyAndStakeLendingIntentionData {\n amount: number | string;\n coinName: SupportAssetCoins;\n stakeAccountId?: string | null;\n}\n\nexport class SupplyAndStakeLendingIntention extends CoreBaseIntention<SupplyAndStakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.SupplyAndStakeLending;\n\n constructor(public readonly data: SupplyAndStakeLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.supplyAndStake(\n this.data.coinName,\n Number(this.data.amount),\n this.data.stakeAccountId,\n input.account.address,\n );\n }\n\n static fromData(data: SupplyAndStakeLendingIntentionData): SupplyAndStakeLendingIntention {\n return new SupplyAndStakeLendingIntention(data);\n }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\nimport { 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface SupplyLendingIntentionData {\n amount: number | string;\n coinName: SupportAssetCoins;\n}\n\nexport class SupplyLendingIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.deposit(this.data.coinName, Number(this.data.amount), 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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportStakeMarketCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface UnstakeSpoolIntentionData {\n amount: number | string;\n marketCoinName: SupportStakeMarketCoins;\n stakeAccountId: string | null;\n}\n\nexport class UnstakeSpoolIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.unstake(this.data.marketCoinName, Number(this.data.amount), undefined, input.account.address);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins, TransactionSubType } from '../types';\n\nexport interface WithdrawAndUnstakeLendingIntentionData {\n amount: number | undefined;\n coinName: SupportAssetCoins;\n stakeAccountId: { id: string; coin: number }[];\n}\n\nexport class WithdrawAndUnstakeLendingIntention extends CoreBaseIntention<WithdrawAndUnstakeLendingIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawAndUnstakeLending;\n\n constructor(public readonly data: WithdrawAndUnstakeLendingIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.unstakeAndWithdraw(this.data.coinName, Number(this.data.amount), this.data.stakeAccountId);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { SupportCollateralCoins } from '../types';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface WithdrawCollateralIntentionData {\n collateralCoinName: SupportCollateralCoins;\n amount: number | string;\n obligationId: string;\n obligationKey: string;\n}\n\nexport class WithdrawCollateralIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.withdrawCollateral(\n this.data.collateralCoinName,\n Number(this.data.amount),\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { NetworkType, SupportAssetCoins } from '../types';\nimport { SuiNetworks, TransactionSubType } from '../types/utils';\n\nexport interface WithdrawLendingIntentionData {\n amount: string | number;\n coinName: SupportAssetCoins;\n}\n\nexport class WithdrawLendingIntention extends CoreBaseIntention<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 }): Promise<TransactionBlock> {\n const network = input.network.split(':')[1] as NetworkType;\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: network,\n });\n scallopClient.init();\n return scallopClient.withdraw(this.data.coinName, Number(this.data.amount), 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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { ScallopClient } from '../models/scallopClient';\nimport { TransactionSubType } from '../types/utils';\n\nexport interface WithdrawStakedScaIntentionData {\n vescaKey?: string;\n}\n\nexport class WithdrawStakedScaIntention extends CoreBaseIntention<WithdrawStakedScaIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: TransactionSubType.WithdrawStakedSca;\n\n constructor(public readonly data: WithdrawStakedScaIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const scallopClient = new ScallopClient({\n client: input.suiClient,\n walletAddress: input.account.address,\n networkType: input.network.split(':')[1] as any,\n });\n scallopClient.init();\n return scallopClient.withdrawUnlockedSca(this.data.vescaKey, input.account.address);\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.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\nimport { Network, TurbosSdk } from 'turbos-clmm-sdk';\nimport { MSafeAppHelper } from '../interface';\nimport { Decoder } from './decoder';\nimport { AddLiquidityIntention, AddLiquidityIntentionData } from './intentions/add-liquidity';\nimport { BurnIntention, BurnIntentionData } from './intentions/burn';\nimport { CollectFeeIntention, CollectFeeIntentionData } from './intentions/collect-fee';\nimport { CollectRewardIntention, CollectRewardIntentionData } from './intentions/collect-reward';\nimport { CreatePoolIntention, CreatePoolIntentionData } from './intentions/create-pool';\nimport { DecreaseLiquidityIntention, DecreaseLiquidityIntentionData } from './intentions/decrease-liquidity';\nimport { IncreaseLiquidityIntention, IncreaseLiquidityIntentionData } from './intentions/increase-liquidity';\nimport { PrixClaimIntention, PrixClaimIntentionData } from './intentions/prix-claim';\nimport { PrixJoinIntention, PrixJoinIntentionData } from './intentions/prix-join';\nimport { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\nimport { SwapIntention, SwapIntentionData } from './intentions/swap';\nimport {\n SwapExactBaseForQuoteIntention,\n SwapExactBaseForQuoteIntentionData,\n} from './intentions/swap-exact-base-for-quote';\nimport {\n SwapExactQuoteForBaseIntention,\n SwapExactQuoteForBaseIntentionData,\n} from './intentions/swap-exact-quote-for-base';\nimport { SuiNetworks, TransactionSubType } 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 type TURBOSIntentionData =\n | CreatePoolIntentionData\n | AddLiquidityIntentionData\n | IncreaseLiquidityIntentionData\n | DecreaseLiquidityIntentionData\n | CollectFeeIntentionData\n | CollectRewardIntentionData\n | RemoveLiquidityIntentionData\n | BurnIntentionData\n | SwapIntentionData\n | PrixJoinIntentionData\n | PrixClaimIntentionData\n | SwapExactQuoteForBaseIntentionData\n | SwapExactBaseForQuoteIntentionData;\n\nexport class TURBOSAppHelper implements MSafeAppHelper<TURBOSIntentionData> {\n application = 'turbos';\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 = 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/builder';\nimport { TransactionBlockInput, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { deepbookConfig, prixConfig } from './config';\nimport { TURBOSIntentionData } from './helper';\nimport { TransactionSubType } from './types';\nimport { BN, Contract, TurbosSdk } from 'turbos-clmm-sdk';\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 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 return 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 decodeSwap(): 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: nextTickIndex,\n };\n });\n\n const coinTypeA = atob[0]\n ? moveCall.typeArguments[0]\n : layer === 1\n ? moveCall.typeArguments[0]\n : moveCall.typeArguments[1];\n const coinTypeB =\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 return {\n txType: TransactionType.Other,\n type: TransactionSubType.Swap,\n intentionData: {\n routes: 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 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 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 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 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 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 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 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 private decodePrixClaim(): DecodeResult {\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.PrixClaim,\n intentionData: {},\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) => trans.kind === 'MoveCall' && trans.target !== '0x2::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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiNetworks, TransactionSubType } from '../types';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\n\nexport interface AddLiquidityIntentionData extends Pool.AddLiquidityOptions {}\n\nexport class AddLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { NFT } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface BurnIntentionData extends NFT.BurnOptions {}\n\nexport class BurnIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CollectFeeIntentionData = Pool.CollectFeeOptions;\n\nexport class CollectFeeIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CollectRewardIntentionData = Pool.CollectRewardOptions;\n\nexport class CollectRewardIntention extends CoreBaseIntention<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, Pool, TurbosSdk } from 'turbos-clmm-sdk';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport { SuiNetworks, TransactionSubType } from '../types';\n\nexport type CreatePoolIntentionData = Pool.CreatePoolOptions;\n\nexport class CreatePoolIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface DecreaseLiquidityIntentionData extends Pool.DecreaseLiquidityOptions {}\n\nexport class DecreaseLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface IncreaseLiquidityIntentionData extends Pool.IncreaseLiquidityOptions {}\n\nexport class IncreaseLiquidityIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { prixConfig } from '../config';\nimport { SUI_CLOCK_OBJECT_ID } from '@mysten/sui.js/utils';\n\nexport interface PrixClaimIntentionData {}\n\nexport class PrixClaimIntention extends CoreBaseIntention<PrixClaimIntentionData> {\n txType!: TransactionType.Other;\n\n txSubType!: TransactionSubType.PrixClaim;\n\n constructor(public override readonly data: PrixClaimIntentionData) {\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::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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { prixConfig } from '../config';\n\nexport interface PrixJoinIntentionData {}\n\nexport class PrixJoinIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { Pool } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nexport interface RemoveLiquidityIntentionData extends Pool.RemoveLiquidityOptions {}\n\nexport class RemoveLiquidityIntention extends CoreBaseIntention<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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiNetworks, TransactionSubType } from '../types';\nimport { Pool, Trade } from 'turbos-clmm-sdk';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\n\nexport interface SwapIntentionData extends Trade.SwapOptions {}\n\nexport class SwapIntention extends CoreBaseIntention<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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network, Account } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { swap_exact_base_for_quote } from '../api/deepbook';\n\nexport interface SwapExactBaseForQuoteIntentionData {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n}\n\nexport class SwapExactBaseForQuoteIntention extends CoreBaseIntention<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 { normalizeSuiObjectId } from '@mysten/sui.js/utils';\nimport { TransactionBlock, TransactionObjectArgument } from '@mysten/sui.js/transactions';\nimport { deepbookConfig } from '../config';\nimport { TurbosSdk } from 'turbos-clmm-sdk';\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 let 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 let 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';\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 } else {\n currentBalance += Number(object.balance);\n resultCoinObjects.push(object);\n return false;\n }\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 let [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 { SuiNetworks, TransactionSubType } from '../types';\nimport { TransactionType } from '@msafe/sui3-utils';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { WalletAccount } from '@mysten/wallet-standard';\nimport { TurbosSdk, Network } from 'turbos-clmm-sdk';\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { swap_exact_quote_for_base } from '../api/deepbook';\n\nexport interface SwapExactQuoteForBaseIntentionData {\n token1: string;\n token2: string;\n poolId: string;\n amountIn: number;\n}\n\nexport class SwapExactQuoteForBaseIntention extends CoreBaseIntention<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 { MSafeAppHelper } from '@/apps/interface';\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 MSafeAppHelper<VoloIntentionData> {\n application = 'volo';\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/builder';\nimport { TransactionBlockInput, TransactionBlock } 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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface ClaimTicketIntentionData {\n ticketId: string;\n}\n\nexport class ClaimTicketIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface StakeIntentionData {\n amount: number;\n}\n\nexport class StakeIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\n\nimport config from '../config';\nimport { TransactionSubType } from '../types';\n\nexport interface UnStakeIntentionData {\n amount: number;\n}\n\nexport class UnStakeIntention extends CoreBaseIntention<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 tx.setGasBudget(config.gasBudget);\n return tx;\n }\n\n static fromData(data: UnStakeIntentionData) {\n return new UnStakeIntention(data);\n }\n}\n"],"mappings":"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","names":["src_exports","__export","appHelpers","__toCommonJS","import_sui3_utils","import_sui3_utils","import_sort_keys_recursive","CoreBaseIntention","data","sortKeys","import_cetus_periphery_sdk","import_cetus_sui_clmm_sdk","clmmConfig","peripheryConfig","clmmConfigTestnet","peripheryConfigTestnet","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getAddLiquidityTxb","import_sui3_utils","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","CoreBaseIntention","data","input","account","network","txbParams","getClaimFeeAndMiningTxb","import_sui3_utils","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getDecreaseLiquidityTxb","import_sui3_utils","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","peripherySdk","getFarmingBatchHarvest","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingAddLiquidityTxb","import_sui3_utils","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingBatchHarvest","import_sui3_utils","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","import_sui3_utils","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","import_sui3_utils","FarmingHarvestIntention","_FarmingHarvestIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingHarvest","import_sui3_utils","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","import_sui3_utils","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","import_sui3_utils","FarmingStakeIntention","_FarmingStakeIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingStake","import_sui3_utils","FarmingUnstakeIntention","_FarmingUnstakeIntention","CoreBaseIntention","data","input","account","network","txbParams","getFarmingUnstake","import_sui3_utils","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getIncreaseLiquidityTxb","import_sui3_utils","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","account","network","txbParams","getRemoveLiquidityTxb","import_sui3_utils","getXcetusConvertTxb","txbParams","account","network","getPeripherySdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusCancelRedeemTxb","import_sui3_utils","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","import_sui3_utils","XcetusConvertIntention","_XcetusConvertIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusConvertTxb","import_sui3_utils","XcetusRedeemIntention","_XcetusRedeemIntention","CoreBaseIntention","data","input","account","network","txbParams","getXcetusRedeemTxb","import_sui3_utils","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","CoreBaseIntention","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","import_sui3_utils","import_sui3_utils","import_bcs","import_utils","config","Rpc","Decoder","txb","config","objectId","tokenXType","tokenYType","amountX","amountY","minAddAmountX","minAddAmountY","coinX","coinY","inputCoinType","inputCoinAmount","inputCoin","amount","kriyaLpToken","positionObjectId","lpObject","lockTime","target","trans","moveCall","MoveCallHelper","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","import_kriya_dex_sdk","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","amountX","amountY","minAddAmountX","minAddAmountY","coinX","coinY","txb","isStable","import_transactions","import_kriya_dex_sdk","AddLiquiditySingleSideIntention","_AddLiquiditySingleSideIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","inputCoinType","inputCoinAmount","inputCoin","txb","isStable","import_transactions","import_kriya_dex_sdk","ClaimRewardsIntention","_ClaimRewardsIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","objectId","tokenXType","tokenYType","positionObjectId","farm","txb","import_transactions","import_kriya_dex_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","dexSdk","Rpc","objectId","tokenXType","tokenYType","amount","kriyaLpToken","txb","isStable","pool","import_transactions","import_kriya_dex_sdk","StakeLiquidityIntention","_StakeLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","lpObject","lockTime","objectId","tokenXType","tokenYType","farm","txb","import_transactions","import_kriya_dex_sdk","UnstakeLiquidityIntention","_UnstakeLiquidityIntention","CoreBaseIntention","data","input","suiClient","account","address","isMainnet","farmSdk","Rpc","objectId","tokenXType","tokenYType","positionObjectId","farm","txb","KRIYAAppHelper","input","transactionBlock","result","Decoder","suiClient","account","network","intention","AddLiquidityIntention","AddLiquiditySingleSideIntention","RemoveLiquidityIntention","ClaimRewardsIntention","StakeLiquidityIntention","UnstakeLiquidityIntention","import_sui3_utils","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","SanityError","MPayError","msg","options","getAllFromIterator","it","res","val","PagedIterator","requester","EntryIterator","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","import_transactions","import_utils","import_luxon","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","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","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","InvalidStreamGroupError","MPayError","msg","context","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","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","import_sort_keys_recursive","BaseIntention","data","sortKeys","StreamIntention","BaseIntention","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","CoreBaseIntention","data","input","suiClient","account","import_sui3_utils","ObjectTransferIntention","_ObjectTransferIntention","CoreBaseIntention","data","input","suiClient","account","import_sui3_utils","import_transactions","PlainPayloadIntention","_PlainPayloadIntention","CoreBaseIntention","data","input","account","tb","CoreHelper","input","suiClient","account","intention","CoinTransferIntention","ObjectTransferIntention","PlainPayloadIntention","import_sui3_utils","updated","config","updatePackageId","data","res","packageId","e","config_default","import_sui3_utils","import_bcs","import_utils","Decoder","txb","target","trans","config_default","assetId","findPool","pool","claims","helper","MoveCallHelper","optionId","poolId","typeArguments","amount","moveCall","_MoveCallHelper","argIndex","input","strVal","bcsType","arg","bcsNums","bcsVal","index","import_transactions","depositToken","txb","pool","coinObject","amount","config_default","withdrawToken","borrowToken","repayToken","claimReward","assetId","poolId","option","typeArguments","ClaimRewardIntention","_ClaimRewardIntention","CoreBaseIntention","data","claims","tx","claim","assetId","poolId","option","typeArguments","claimReward","config_default","import_transactions","EntryBorrowIntention","_EntryBorrowIntention","CoreBaseIntention","data","coinType","amount","tx","config_default","pool","borrowToken","import_transactions","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","config_default","toDeposit","depositToken","pool","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryRepayIntention","_EntryRepayIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","config_default","toDeposit","repayToken","pool","tokenInfo","getTokenObjs","coinObj","i","import_transactions","EntryWithdrawIntention","_EntryWithdrawIntention","CoreBaseIntention","data","coinType","amount","tx","config_default","pool","withdrawToken","NAVIAppHelper","input","updatePackageId","transactionBlock","result","Decoder","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","ClaimRewardIntention","import_sui3_utils","import_transactions","import_utils","import_sort_keys_recursive","PlainTransactionApplication","PlainTransactionType","PlainTransactionHelper","PlainTransactionApplication","input","transactionBlock","suiClient","content","PlainTransactionType","account","txb","inspectResult","MSafeApps","apps","app","appName","import_sui3_utils","import_sui3_utils","import_bcs","import_utils","ADDRESSES_ID","PROTOCOL_OBJECT_ID","OLD_BORROW_INCENTIVE_PROTOCOL_ID","SCA_COIN_TYPE","SUPPORT_POOLS","SUPPORT_COLLATERALS","SUPPORT_SPOOLS","SUPPORT_SPOOLS_REWARDS","SUPPORT_BORROW_INCENTIVE_POOLS","coinDecimals","spoolRewardCoins","borrowIncentiveRewardCoins","coinIds","wormholeCoinIds","voloCoinIds","Decoder","txb","builder","target","trans","supplyMoveCall","stakeMoveCall","unstakeMoveCall","withdrawMoveCall","borrowMoveCall","lendingIncentive","borrowIncentiveV2","extendPeriod","stakeMoreSca","oldBorrowIncentive","OLD_BORROW_INCENTIVE_PROTOCOL_ID","stakeWithVeSca","veScaKey","obligationKey","obligationId","rewardCoinName","lockSca","unlockTime","amountFromSplitCoin","SplitCoinHelper","a","b","isHaveRedeem","oldUnstakeObligation","unstakeObligation","stakeObligation","isObligationLocked","isOldBorrowIncentive","operations","i","coinName","amount","stakeSpoolAccount","coinType","stakeAccountWithAmount","tx","stakeAccountId","findWithdrawWithNested","lendingReward","borrowRewardV2","borrowReward","stakeMarketCoinName","MoveCallHelper","moveCall","splitCoin","input","bcsType","bcsNums","_MoveCallHelper","argIndex","strVal","arg","bcsVal","index","import_transactions","import_utils","import_bignumber","config","ScallopAddress","params","id","auth","network","path","nestedAddressObj","key","address","keys","index","updatedAddressObj","addresses","targetNetwork","config","import_transactions","import_utils","import_utils","requireSender","txBlock","sender","checkLockSca","scaAmountOrCoin","lockPeriodInDays","newUnlockAtInSecondTimestamp","prevUnlockAtInSecondTimestamp","isInitialLock","isLockExpired","checkVesca","checkExtendLockPeriod","checkExtendLockAmount","scaAmount","checkRenewExpiredVeSca","import_utils","import_bignumber","parseOriginBorrowIncentiveAccountPoolPointData","originBorrowIncentiveAccountPoolPointData","parseOriginBorrowIncentiveAccountData","originBorrowIncentiveAccountData","acc","point","parsed","name","isMarketCoin","coinName","assetCoinName","SUPPORT_POOLS","SUPPORT_COLLATERALS","SUPPORT_SPOOLS_REWARDS","parseAssetSymbol","findClosestUnlockRound","unlockAtInSecondTimestamp","unlockDate","closestTwelveAM","now","ScallopUtils","params","instance","ScallopAddress","ADDRESSES_ID","force","address","coinName","isMarketCoin","assetCoinName","parseAssetSymbol","validCoinName","coinPackageId","coinIds","wormHolePckageIds","wormholeCoinIds","voloPckageIds","voloCoinIds","protocolObjectId","PROTOCOL_OBJECT_ID","coinType","type","coinTypeRegex","coinTypeMatch","isMarketCoinType","wormHoleCoinTypeMap","voloCoinTypeMap","marketCoinName","stakeMarketCoinName","spoolRewardCoins","borrowIncentiveCoinName","borrowIncentiveRewardCoins","coinDecimals","amount","ownerAddress","selectedCoins","totalAmount","hasNext","nextCursor","coins","a","b","i","coin","apr","compoundFrequency","apy","txBlock","coinObjectId","coinObjects","objectId","mergedCoin","sendCoin","extendLockPeriodInDay","unlockAtInSecondTimestamp","now","remainingLockPeriod","newUnlockAtInSecondTimestamp","lockPeriod","findClosestUnlockRound","import_transactions","import_bignumber","getObligations","query","ownerAddress","owner","protocolObjectId","PROTOCOL_OBJECT_ID","keyObjectsResponse","hasNextPage","nextCursor","paginatedKeyObjectsResponse","keyObjectIds","ref","id","keyObjects","obligations","i","keyId","content","fields","obligationId","locked","getObligationLocked","obligationObjectResponse","obligationLocked","getCoinAmounts","assetCoinNames","updatedAssetCoinNames","SUPPORT_POOLS","coinObjectsResponse","paginatedCoinObjectsResponse","assetCoinName","coinAmounts","response","object","coinObject","type","poolCoinName","BigNumber","getCoinAmount","coinType","coinAmount","getMarketCoinAmounts","marketCoinNames","updatedMarketCoinNames","marketCoinObjectsResponse","paginatedMarketCoinObjectsResponse","marketCoinName","marketCoinAmounts","marketCoinObject","getMarketCoinAmount","marketCoinType","marketCoinAmount","queryObligation","queryTarget","txBlock","import_utils","getStakeAccounts","query","ownerAddress","owner","spoolObjectId","stakeAccountType","stakeObjectsResponse","hasNextPage","nextCursor","paginatedStakeObjectsResponse","stakeAccounts","stakeMarketCoinTypes","types","stakeMarketCoinName","stakeCoinName","marketCoinType","updateTypes","newType","stakeObjectIds","ref","id","stakeObject","type","fields","stakePoolId","stakeType","staked","index","points","totalPoints","getStakePool","marketCoinName","poolId","stakePool","stakePoolObjectResponse","stakePoolObject","maxPoint","distributedPoint","pointPerPeriod","period","maxStake","totalStaked","createdAt","lastUpdate","getStakeRewardPool","stakeRewardPool","stakeRewardPoolObjectResponse","stakeRewardPoolObject","rewardPoolFields","ratioNumerator","ratioDenominator","rewards","claimedRewards","import_transactions","import_utils","import_bignumber","queryBorrowIncentiveAccounts","query","obligationId","sender","borrowIncentiveCoinNames","coinName","SUPPORT_BORROW_INCENTIVE_POOLS","queryPkgId","incentiveAccountsId","queryTarget","txBlock","borrowIncentiveAccountsQueryData","borrowIncentiveAccounts","accountData","parsedBorrowIncentiveAccount","parseOriginBorrowIncentiveAccountData","poolType","parsedCoinName","getPythPrice","query","assetCoinName","pythFeedObjectId","priceFeedObjectResponse","priceFeedPoolObject","fields","expoMagnitude","expoNegative","priceMagnitude","priceNegative","import_bignumber","getVescaKeys","query","ownerAddress","owner","veScaKeyType","keyObjectsResponse","hasNextPage","nextCursor","paginatedKeyObjectsResponse","objResponse","data","getVeScas","keyObjectId","veScas","i","veSca","getVeSca","veScaKeyId","tableId","veScaKeyIdValue","vesca","veScaDynamicFieldObject","dynamicFields","BigNumber","ScallopQuery","params","instance","ScallopAddress","ADDRESSES_ID","ScallopUtils","force","address","ownerAddress","getObligations","assetCoinNames","getCoinAmounts","assetCoinName","getCoinAmount","marketCoinNames","getMarketCoinAmounts","marketCoinName","getMarketCoinAmount","getPythPrice","getStakeAccounts","stakeMarketCoinName","stakeMarketCoinNames","SUPPORT_SPOOLS","stakePools","i","stakePool","getStakePool","stakeRewardPools","stakeRewardPool","getStakeRewardPool","obligationId","walletAddress","coinNames","queryBorrowIncentiveAccounts","obligation","queryObligation","collateralCoinTypes","collateral","debtCoinTypes","debt","coinType","ScallopBuilder","params","instance","ScallopAddress","ADDRESSES_ID","ScallopQuery","ScallopUtils","force","address","txBlock","assetCoinName","amount","sender","coinType","coins","takeCoin","leftCoin","marketCoinName","marketCoinType","import_utils","requireVeSca","params","builder","txBlock","veScaKey","veSca","getVeSca","sender","requireSender","veScas","getVeScas","getBindedObligationId","borrowIncentiveObjId","incentivePoolsId","veScaPkgId","client","incentivePoolsResponse","veScaBindTableId","keyType","veScaBindTableResponse","requireObligationInfo","obligationId","obligationKey","obligationLocked","getObligationLocked","obligations","getObligations","generateBorrowIncentiveNormalMethod","borrowIncentiveIds","OldBorrowIncentiveContract","veScaIds","rewardCoinName","rewardType","generateBorrowIncentiveQuickMethod","normalMethod","obligation","obligationArg","obligationtKeyArg","unstakeObligationBeforeStake","txn","OLD_BORROW_INCENTIVE_PROTOCOL_ID","bindedObligationId","import_utils","import_utils","import_axios","PYTH_ENDPOINTS","import_bcs","import_utils","MAX_ARGUMENT_SIZE","PythClient","provider","pythStateId","wormholeStateId","result","objectId","state","vaas","tx","wormholePackageId","verifiedVaas","vaa","verifiedVaa","updates","feedIds","packageId","priceUpdatesHotPotato","priceInfoObjects","baseUpdateFee","coins","coinId","i","priceInfoObjectId","feedId","normalizedFeedId","tableId","fieldType","type","accumulatorMessage","vaaSizeOffset","vaaSize","vaaOffset","getLatestVaas","endpoint","priceIds","axios","vaa","updateOracles","builder","txBlock","assetCoinNames","coinNames","SUPPORT_POOLS","SUPPORT_COLLATERALS","rules","pythClient","PythClient","assetCoinName","endpoints","PYTH_ENDPOINTS","priceUpdateData","e","updateAssetCoinNames","updateOracle","coinType","updatePrice","xOraclePackageId","xOracleId","pythPackageId","pythRegistryId","pythStateId","pythFeedObjectId","switchboardPackageId","switchboardRegistryId","switchboardAggregatorId","supraPackageId","supraRegistryId","supraHolderId","request","priceUpdateRequest","updatePythPrice","updateSwitchboardPrice","updateSupraPrice","confirmPriceUpdateRequest","packageId","validXOracleId","target","typeArgs","holderId","registryId","validHolderId","validRegistryId","aggregatorId","validAggregatorId","stateId","feedObjectId","validRequest","validStateId","validFeedObjectId","requireObligationInfo","params","txBlock","builder","obligationId","obligationKey","sender","requireSender","obligations","getObligations","generateCoreNormalMethod","coreIds","obligation","obligationHotPotato","coin","collateralCoinName","coinType","amount","poolCoinName","marketCoin","loan","generateCoreQuickMethod","normalMethod","obligationArg","suiCoin","leftCoin","takeCoin","obligationInfo","updateCoinNames","updateOracles","walletAddress","marketCoinName","assetCoinNames","import_utils","requireStakeAccountIds","params","builder","txBlock","stakeMarketCoinName","stakeAccountId","sender","requireSender","stakeAccounts","getStakeAccounts","account","requireStakeAccounts","generateSpoolNormalMethod","spoolIds","marketCoinType","stakePoolId","stakeAccount","coin","amount","rewardPoolId","rewardCoinName","spoolRewardCoins","rewardCoinType","generateSpoolQuickMethod","normalMethod","amountOrMarketCoin","stakeAccountIds","coins","takeCoin","leftCoin","remainingAmount","stakeMarketCoins","i","amountToUnstake","marketCoin","rewardCoins","accountId","rewardCoin","import_utils","generateNormalVeScaMethod","builder","txBlock","veScaIds","scaCoin","unlockAtInSecondTimestamp","veScaKey","newUnlockAtInSecondTimestamp","generateQuickVeScaMethod","normalMethod","amountOrCoin","lockPeriodInDays","autoCheck","sender","requireSender","veSca","requireVeSca","transferObjects","coins","SCA_COIN_TYPE","takeCoin","leftCoin","newUnlockAt","checkLockSca","isInitialLock","isLockExpired","unlockedSca","checkExtendLockPeriod","scaAmount","checkExtendLockAmount","scaCoins","checkRenewExpiredVeSca","checkVesca","sca","ScallopClient","params","instance","ScallopAddress","ADDRESSES_ID","ScallopQuery","ScallopUtils","ScallopBuilder","force","ownerAddress","owner","stakeMarketCoinName","walletAddress","txBlock","coreQuickMethod","generateCoreQuickMethod","sender","collateralCoinName","amount","obligationId","quickMethod","obligations","specificObligationId","obligation","obligationKey","hotPotato","collateralCoin","poolCoinName","marketCoin","coin","borrowIncentiveQuickMethod","generateBorrowIncentiveQuickMethod","availableStake","SUPPORT_BORROW_INCENTIVE_POOLS","veScaKey","marketCoinName","spoolQuickMethod","generateSpoolQuickMethod","stakeAccount","stakeAccountId","SUPPORT_SPOOLS","stakeAccounts","targetStakeAccount","account","unstakeAccount","withdrawCoins","i","wdScoin","wdCoin","marketCoins","lendingIncentive","borrowIncentiveV2","borrowIncentive","borrowIncentiveRewarad","rewardCoins","rewardCoin","rewardCoinName","obligationKeyId","isObligationLocked","isOldBorrowIncentive","lockPeriod","vescaKey","vescaQuickMethod","generateQuickVeScaMethod","coins","SCA_COIN_TYPE","takeCoin","leftCoin","newVescaKey","lockPeriodInDays","isHaveRedeem","redeem","accountPoint","poolPoint","borrowAmount","BigNumber","increasePointRate","BorrowIntention","_BorrowIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","BorrowWithBoostIntention","_BorrowWithBoostIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ClaimIncentiveRewardIntention","_ClaimIncentiveRewardIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","DepositCollateralIntention","_DepositCollateralIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ExtendPeriodAndStakeMoreIntention","_ExtendPeriodAndStakeMoreIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ExtendStakePeriodIntention","_ExtendStakePeriodIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","MigrateAndClaimIntention","_MigrateAndClaimIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","OpenObligationIntention","_OpenObligationIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","RedeemScaIntention","_RedeemScaIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","RenewExpStakePeriodIntention","_RenewExpStakePeriodIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","RepayIntention","_RepayIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","StakeScaIntention","_StakeScaIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","StakeSpoolIntention","_StakeSpoolIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","SupplyAndStakeLendingIntention","_SupplyAndStakeLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","SupplyLendingIntention","_SupplyLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","UnstakeSpoolIntention","_UnstakeSpoolIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","WithdrawAndUnstakeLendingIntention","_WithdrawAndUnstakeLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","WithdrawCollateralIntention","_WithdrawCollateralIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","WithdrawLendingIntention","_WithdrawLendingIntention","CoreBaseIntention","data","input","network","scallopClient","ScallopClient","WithdrawStakedScaIntention","_WithdrawStakedScaIntention","CoreBaseIntention","data","input","scallopClient","ScallopClient","ScallopAppHelper","input","builder","ScallopBuilder","transactionBlock","result","Decoder","suiClient","account","network","intention","SupplyLendingIntention","WithdrawLendingIntention","BorrowIntention","RepayIntention","DepositCollateralIntention","WithdrawCollateralIntention","OpenObligationIntention","StakeSpoolIntention","UnstakeSpoolIntention","ClaimIncentiveRewardIntention","BorrowWithBoostIntention","StakeScaIntention","ExtendStakePeriodIntention","ExtendPeriodAndStakeMoreIntention","RenewExpStakePeriodIntention","WithdrawStakedScaIntention","SupplyAndStakeLendingIntention","WithdrawAndUnstakeLendingIntention","RedeemScaIntention","MigrateAndClaimIntention","import_sui3_utils","import_turbos_clmm_sdk","import_sui3_utils","import_bcs","import_utils","prixConfig","deepbookConfig","import_turbos_clmm_sdk","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","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","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","import_turbos_clmm_sdk","BurnIntention","_BurnIntention","CoreBaseIntention","data","input","turbosSdk","pool","nft","txb","import_turbos_clmm_sdk","CollectFeeIntention","_CollectFeeIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","import_turbos_clmm_sdk","CollectRewardIntention","_CollectRewardIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","nft","rewardAmounts","deadline","txb","import_turbos_clmm_sdk","CreatePoolIntention","_CreatePoolIntention","CoreBaseIntention","data","input","turbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","import_turbos_clmm_sdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","import_turbos_clmm_sdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","import_transactions","import_utils","PrixClaimIntention","_PrixClaimIntention","CoreBaseIntention","data","input","txb","prixConfig","import_transactions","PrixJoinIntention","_PrixJoinIntention","CoreBaseIntention","data","input","txb","prixConfig","import_transactions","import_turbos_clmm_sdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","txb","import_turbos_clmm_sdk","SwapIntention","_SwapIntention","CoreBaseIntention","data","input","turbosSdk","routes","coinTypeA","coinTypeB","address","amountA","amountB","slippage","amountSpecifiedIsInput","deadline","txb","import_turbos_clmm_sdk","import_utils","import_transactions","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","CoreBaseIntention","data","input","turbosSdk","swap_exact_base_for_quote","import_turbos_clmm_sdk","SwapExactQuoteForBaseIntention","_SwapExactQuoteForBaseIntention","CoreBaseIntention","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","CoreBaseIntention","data","input","tx","ticketId","config_default","import_transactions","StakeIntention","_StakeIntention","CoreBaseIntention","data","input","tx","amount","coin","config_default","import_transactions","UnStakeIntention","_UnStakeIntention","CoreBaseIntention","data","input","tx","amount","coins","primaryCoin","mergeCoins","coin","config_default","primaryCoinInput","VoloAppHelper","input","transactionBlock","result","Decoder","suiClient","account","intention","StakeIntention","UnStakeIntention","ClaimTicketIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper","KRIYAAppHelper","ScallopAppHelper","VoloAppHelper"]}