@msafe/sui-app-store 0.0.72 → 0.0.74

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/decoder.ts","../src/apps/navi/config.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/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/remove-liquidity.ts","../src/index.ts"],"sourcesContent":["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 { 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 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 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 { 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 { CoinType, type Pool } from './types';\n\nconst config = {\n ProtocolPackage: '0x7c9b90b3fda0fa4aa8ee88ae6c4a0b83c773f74936b5354448cb94662e94442d',\n StorageId: '0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe',\n Incentive: '0xaaf735bf83ff564e1b219a0d644de894ef5bdc4b2250b126b2a46dd002331821',\n IncentiveV2: '0xf87a8acb8b81d14307894d12595541a73f19933f88e1326d5be349c7a6f7559c', // The new incentive version: V2\n\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 default config;\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 { 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 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 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 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 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\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';\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 { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\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;\nexport type TURBOSIntentionData =\n | CreatePoolIntentionData\n | AddLiquidityIntentionData\n | IncreaseLiquidityIntentionData\n | DecreaseLiquidityIntentionData\n | CollectFeeIntentionData\n | CollectRewardIntentionData\n | RemoveLiquidityIntentionData\n | BurnIntentionData;\n\nexport class TURBOSAppHelper implements MSafeAppHelper<TURBOSIntentionData> {\n application = 'turbos';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: TURBOSIntentionData;\n }> {\n const { transactionBlock, account } = input;\n const decoder = new Decoder(transactionBlock);\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 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 { TURBOSIntentionData } from './helper';\nimport { TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: TURBOSIntentionData;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n decode(address: string) {\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n\n if (this.isIncreaseLiquidityTransaction()) {\n return this.decodeIncreaseLiquidity(address);\n }\n\n if (this.isDecreaseLiquidityTransaction()) {\n return this.decodeDecreaseLiquidity(address);\n }\n\n if (this.isCollectFeeLiquidityTransaction()) {\n return this.decodeCollectFeeLiquidity();\n }\n\n if (this.isCollectRewardLTransaction()) {\n return this.decodeCollectRewardLiquidity();\n }\n\n if (this.isBurnTransaction()) {\n return this.decodeBurnLiquidity();\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 isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::mint`);\n }\n\n private isIncreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::increase_liquidity`);\n }\n\n private isDecreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::decrease_liquidity`);\n }\n\n private isCollectFeeLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::collect`);\n }\n\n private isCollectRewardLTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::collect_reward`);\n }\n\n private isBurnTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::burn`);\n }\n\n private decodeAddLiquidity(): DecodeResult {\n console.log(this.helper, 'this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const address = this.helper.decodeInputAddress(12);\n\n const amountA = this.helper.decodeInputU64(8);\n const amountB = this.helper.decodeInputU64(9);\n const tickLower = this.helper.decodeInputU32(4);\n const tickLowerIsNeg = this.helper.decodeInputBool(5);\n const tickUpper = this.helper.decodeInputU32(6);\n const tickUpperIsNeg = this.helper.decodeInputBool(7);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n pool,\n slippage: 5,\n address,\n amountA,\n amountB,\n tickLower: tickLowerIsNeg ? -tickLower : tickLower,\n tickUpper: tickUpperIsNeg ? -tickUpper : tickUpper,\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 return {\n txType: TransactionType.Other,\n type: TransactionSubType.IncreaseLiquidity,\n intentionData: {\n pool,\n slippage: 5,\n address,\n amountA,\n amountB,\n nft,\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 return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage: 3, // DO NOT use slippage by user setting for now.\n address,\n },\n };\n }\n\n private decodeCollectFeeLiquidity(): 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 return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectFee,\n intentionData: {\n pool,\n address,\n collectAmountA,\n collectAmountB,\n nft,\n },\n };\n }\n\n private decodeCollectRewardLiquidity(): DecodeResult {\n const pool = this.helper.decodeSharedObjectId(0);\n const nft = this.helper.decodeSharedObjectId(2);\n const address = this.helper.decodeInputAddress(5);\n const rewardAmounts = this.collectRewardHelper.map((helper) => helper.decodeInputU64(5));\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.CollectReward,\n intentionData: {\n pool,\n address,\n rewardAmounts,\n nft,\n },\n };\n }\n\n private decodeBurnLiquidity(): 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 get helper() {\n console.log(this.transactions, 'this.transactions');\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target !== '0x2::coin::zero',\n ) as MoveCallTransaction;\n console.log(moveCall, this.txb, 'this.txb');\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get collectRewardHelper() {\n console.log(this.transactions, 'this.transactions');\n const moveCalls = this.transactions.filter(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.PackageId}::position_manager::collect_reward`,\n ) as MoveCallTransaction[];\n console.log(moveCalls, this.txb, 'this.txb');\n return moveCalls.map((moveCall) => 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 txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","export const config = {\n PackageId: '0x9632f61a796fc54952d9151d80b319e066cba5498a27b495c99e113db09726b1',\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 { 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 const {\n pool,\n address,\n amountA,\n amountB,\n slippage,\n nft,\n decreaseLiquidity,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n txb,\n } = this.data;\n\n return turbosSdk.pool.removeLiquidity({\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage,\n address,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n txb,\n });\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","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 { TURBOSAppHelper } from '@/apps/turbos/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 ScallopAppHelper(),\n]);\n"],"mappings":"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","names":["TransactionType","TransactionType","sortKeys","CoreBaseIntention","data","CetusPeripherySDK","CetusClmmSDK","clmmConfig","peripheryConfig","clmmConfigTestnet","peripheryConfigTestnet","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getAddLiquidityTxb","TransactionType","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getClaimFeeAndMiningTxb","TransactionType","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getDecreaseLiquidityTxb","TransactionType","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","peripherySdk","getFarmingBatchHarvest","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingAddLiquidityTxb","TransactionType","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingBatchHarvest","TransactionType","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","TransactionType","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","TransactionType","FarmingHarvestIntention","_FarmingHarvestIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingHarvest","TransactionType","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","TransactionType","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","TransactionType","FarmingStakeIntention","_FarmingStakeIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingStake","TransactionType","FarmingUnstakeIntention","_FarmingUnstakeIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingUnstake","TransactionType","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getIncreaseLiquidityTxb","TransactionType","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getRemoveLiquidityTxb","TransactionType","getXcetusConvertTxb","txbParams","account","network","getPeripherySdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusCancelRedeemTxb","TransactionType","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","TransactionType","XcetusConvertIntention","_XcetusConvertIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusConvertTxb","TransactionType","XcetusRedeemIntention","_XcetusRedeemIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusRedeemTxb","TransactionType","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusRedeemLockTxb","CetusHelper","input","txbParams","action","TransactionType","suiClient","account","network","intention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","ClaimFeeAndMiningIntention","FarmingAddLiquidityIntention","FarmingIncreaseLiquidityIntention","FarmingDecreaseLiquidityIntention","FarmingRemoveLiquidityIntention","FarmingClaimFeeAndRewardIntention","FarmingHarvestIntention","FarmingBatchHarvestIntention","FarmingStakeIntention","FarmingUnstakeIntention","XcetusConvertIntention","XcetusRedeemLockIntention","XcetusClaimingStakeRewardsIntention","XcetusCancelIntention","XcetusRedeemIntention","TransactionType","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","SuiClient","MPayError","mpayErrorCode","msg","options","cause","context","NoBackendError","MPayError","WalletNotConnectedError","MPayError","axios","AxiosError","BackendError","MPayError","msg","context","Backend","_Backend","apiURL","response","AxiosError","BackendError","recipient","options","res","axios","sender","query","paginatedData","event","formalizedEvent","address","Globals","_Globals","envConfig","SuiClient","Backend","env","options","ec","getConfig","NoBackendError","b","wallet","WalletNotConnectedError","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","TransactionBlock","TransactionBlock","SUI_TYPE_ARG","normalizeStructTag","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","MoveObject","object","txb","ObjectVector","objects","o","ResultRef","_ResultRef","result","target","property","nestedResultFor","resultIndex","Buffer","normalizeSuiAddress","InvalidRpcResultError","MPayError","msg","ctx","InspectViewer","results","index","returned","callIndex","returnIndex","callResult","value","type","InvalidRpcResultError","normalizeSuiAddress","Buffer","bcs","InvalidInputError","MPayError","msg","fieldKey","fieldValue","metadataBcsType","MAX_NAME_SIZE","encodeMetadata","metadata","validateMetadata","bcs","decodeMetadata","metaStr","isAsciiString","InvalidInputError","str","normalizeStructTag","isSameCoinType","type1","type2","isSameTarget","target1","target2","GAS_OBJECT_SPEC","nanoid","generateGroupId","CreateStreamHelper","_CreateStreamHelper","globals","feeContract","streamContract","info","encodeMetadata","generateGroupId","normalizeStructTag","recipient","txb","TransactionBlock","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","SUI_TYPE_ARG","streamPayment","sum","totalAmount","fee","numEpoch","streamAmount","res","InspectViewer","Transactions","CLOCK_ID","BaseContract","moduleName","config","globals","txb","input","target","Transactions","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","TransactionBlock","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","TransactionBlock","normalizeStructTag","parseStructTag","DateTime","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","StreamNotFoundError","MPayError","streamId","DateTime","Duration","MAX_U64","TIME_ROUND_UNIT","roundDateTime","date","dateMs","roundMs","roundDuration","duration","durationMs","Stream","_Stream","globals","streamId","rawData","StreamContract","data","SanityError","pagination","NotCreatorError","txb","TransactionBlock","NotRecipientError","enabled","normalizeStructTag","roundDuration","metadata","decodeMetadata","roundDateTime","rawConfig","duration","rawStatus","MAX_U64","timeNowMs","DateTime","timeStartMs","epoch","res","StreamNotFoundError","RpcError","content","typeParams","parseStructTag","coinType","dataFields","config","status","normalizeStructTag","SUI_TYPE_ARG","Duration","TransactionFailedError","MPayError","status","msg","MIN_INTERVAL_MS","MPayHelper","globals","CoinMetaHelper","MPayBuilder","res","TransactionFailedError","change","info","input","InvalidInputError","cliffFraction","cliffAmount","amountPerStep","timeEnd","intervalMilli","Duration","address","coinType","balance","coinMeta","normalizeStructTag","allBalance","coinMetas","bal","i","txb","val","originTotalAmount","suiClient","normalized","SUI_TYPE_ARG","meta","normalizeStructTag","normalizeSuiAddress","DateTime","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","r","StreamGroup","_StreamGroup","globals","streams","InvalidStreamGroupError","gids","st","InvalidInputError","ids","streamObjs","getObjectsById","obj","SanityError","responses","commonInfos","stream","expInfo","isEqual","info","isEqualStreamGroupCommonInfo","i","sum","pagination","Stream","info1","info2","PagedStreamListIterator","_PagedStreamListIterator","it","pageSize","input","StreamListIterator","res","_StreamListIterator","requester","StreamListRequester","SanityError","_StreamListRequester","globals","recipient","groupRefs","query","oidIter","ListOidIterator","ref","ObjectBatchIterator","backendQuery","convertToIncomingBackendQuery","filtered","normalizeSuiAddress","groupedRefs","groupAndSortRefs","convertToOutgoingBackendQuery","sender","refs","stRefs","stream","getStreamFromIterator","isStreamOfQuery","sg","getStreamGroupFromIterator","isStreamGroupOfQuery","m","groupList","gl1","gl2","DateTime","isStatus","isStreamOfStatus","isClaimable","filter","streamId","data","getStreamObjectResponseFromIter","Stream","streamIds","objResponses","StreamGroup","convertStreamStatus","normalizeCoinTypeFilter","normalizeAddressFilter","status","st","sts","convertStreamStatusSingle","InvalidInputError","coinType","ct","normalizeStructTag","address","addr","MSafeAccountAdapter","msafe","reqs","MSafeSingleWallet","account","SingleWalletAdapter","singleWallet","suiClient","req","isSameCoinType","SUI_TYPE_ARG","GAS_OBJECT_SPEC","InvalidInputError","coins","getCoinsWithAmount","SanityError","coin","MPayClient","env","options","Globals","MPayHelper","wallet","adapter","info","streamId","Stream","query","pageSize","PagedStreamListIterator","address","coinType","normalizeStructTag","recipient","normalizeSuiAddress","creator","MPayBuilder","sortKeys","BaseIntention","data","StreamIntention","BaseIntention","network","account","mpayClient","MPayClient","MSafeSingleWallet","CancelStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","ClaimByProxyStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","ClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","CreateStreamIntention","StreamIntention","data","TransactionType","input","network","account","bcs","normalizeStructTag","normalizeSuiAddress","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","TransactionType","SetAutoClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","MPayAppHelper","input","network","transactionBlock","globals","Globals","result","DecodeHelper","intention","CreateStreamIntention","SetAutoClaimStreamIntention","ClaimStreamIntention","ClaimByProxyStreamIntention","CancelStreamIntention","intentionData","TransactionDefaultApplication","TransactionSubTypes","buildCoinTransferTxb","CoinTransferIntention","_CoinTransferIntention","CoreBaseIntention","data","input","suiClient","account","buildCoinTransferTxb","buildObjectTransferTxb","ObjectTransferIntention","_ObjectTransferIntention","CoreBaseIntention","data","input","suiClient","account","buildObjectTransferTxb","isSameAddress","TransactionBlock","PlainPayloadIntention","_PlainPayloadIntention","CoreBaseIntention","data","input","account","tb","TransactionBlock","isSameAddress","CoreHelper","TransactionDefaultApplication","input","suiClient","account","intention","TransactionSubTypes","CoinTransferIntention","ObjectTransferIntention","PlainPayloadIntention","TransactionType","TransactionType","bcs","normalizeStructTag","normalizeSuiAddress","config","config_default","Decoder","txb","target","trans","config_default","assetId","findPool","pool","claims","helper","MoveCallHelper","optionId","poolId","typeArguments","TransactionType","amount","moveCall","_MoveCallHelper","argIndex","input","strVal","normalizeSuiAddress","bcsType","arg","bcsNums","bcs","bcsVal","index","normalizeStructTag","TransactionBlock","depositToken","txb","pool","coinObject","amount","config_default","withdrawToken","borrowToken","repayToken","claimReward","assetId","poolId","option","typeArguments","ClaimRewardIntention","_ClaimRewardIntention","CoreBaseIntention","data","claims","tx","TransactionBlock","claim","assetId","poolId","option","typeArguments","claimReward","TransactionBlock","EntryBorrowIntention","_EntryBorrowIntention","CoreBaseIntention","data","coinType","amount","tx","TransactionBlock","pool","config_default","borrowToken","TransactionBlock","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","TransactionBlock","toDeposit","depositToken","config_default","pool","tokenInfo","getTokenObjs","coinObj","i","TransactionBlock","EntryRepayIntention","_EntryRepayIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","TransactionBlock","toDeposit","repayToken","config_default","pool","tokenInfo","getTokenObjs","coinObj","i","TransactionBlock","EntryWithdrawIntention","_EntryWithdrawIntention","CoreBaseIntention","data","coinType","amount","tx","TransactionBlock","pool","config_default","withdrawToken","NAVIAppHelper","input","transactionBlock","result","Decoder","TransactionType","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","ClaimRewardIntention","TransactionSubTypes","TransactionType","TransactionBlock","fromHEX","toHEX","sortKeys","PlainTransactionApplication","PlainTransactionType","PlainTransactionHelper","PlainTransactionApplication","input","transactionBlock","suiClient","content","TransactionType","PlainTransactionType","toHEX","account","txb","TransactionBlock","fromHEX","inspectResult","MSafeApps","apps","app","appName","TransactionType","TransactionType","bcs","normalizeStructTag","normalizeSuiAddress","config","Decoder","txb","address","target","trans","config","pool","amountA","amountB","tickLower","tickLowerIsNeg","tickUpper","tickUpperIsNeg","TransactionType","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","helper","moveCall","MoveCallHelper","moveCalls","_MoveCallHelper","argIndex","input","strVal","normalizeSuiAddress","bcsType","arg","bcsNums","bcs","bcsVal","index","normalizeStructTag","TurbosSdk","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","TurbosSdk","BurnIntention","_BurnIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","nft","txb","TurbosSdk","CollectFeeIntention","_CollectFeeIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","TurbosSdk","CollectRewardIntention","_CollectRewardIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","nft","rewardAmounts","deadline","txb","TurbosSdk","CreatePoolIntention","_CreatePoolIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","TurbosSdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","TurbosSdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","TurbosSdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","deadline","txb","TURBOSAppHelper","input","transactionBlock","account","result","Decoder","TransactionType","suiClient","network","intention","CreatePoolIntention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","CollectFeeIntention","CollectRewardIntention","BurnIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper"]}
1
+ {"version":3,"sources":["../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/decoder.ts","../src/apps/navi/config.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/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/remove-liquidity.ts","../src/index.ts"],"sourcesContent":["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 { 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 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 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 { 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 { CoinType, type Pool } from './types';\n\nconst config = {\n ProtocolPackage: '0x7c9b90b3fda0fa4aa8ee88ae6c4a0b83c773f74936b5354448cb94662e94442d',\n StorageId: '0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe',\n Incentive: '0xaaf735bf83ff564e1b219a0d644de894ef5bdc4b2250b126b2a46dd002331821',\n IncentiveV2: '0xf87a8acb8b81d14307894d12595541a73f19933f88e1326d5be349c7a6f7559c', // The new incentive version: V2\n\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 default config;\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 { 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 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 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 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 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\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';\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 { RemoveLiquidityIntention, RemoveLiquidityIntentionData } from './intentions/remove-liquidity';\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;\nexport type TURBOSIntentionData =\n | CreatePoolIntentionData\n | AddLiquidityIntentionData\n | IncreaseLiquidityIntentionData\n | DecreaseLiquidityIntentionData\n | CollectFeeIntentionData\n | CollectRewardIntentionData\n | RemoveLiquidityIntentionData\n | BurnIntentionData;\n\nexport class TURBOSAppHelper implements MSafeAppHelper<TURBOSIntentionData> {\n application = 'turbos';\n\n async deserialize(\n input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },\n ): Promise<{\n txType: TransactionType;\n txSubType: TransactionSubType;\n intentionData: TURBOSIntentionData;\n }> {\n const { transactionBlock, account } = input;\n const decoder = new Decoder(transactionBlock);\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 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 { TURBOSIntentionData } from './helper';\nimport { TransactionSubType } from './types';\n\ntype DecodeResult = {\n txType: TransactionType;\n type: TransactionSubType;\n intentionData: TURBOSIntentionData;\n};\n\nexport class Decoder {\n constructor(public readonly txb: TransactionBlock) {}\n\n private get transactions() {\n return this.txb.blockData.transactions;\n }\n\n decode(address: string) {\n if (this.isAddLiquidityTransaction()) {\n return this.decodeAddLiquidity();\n }\n\n if (this.isIncreaseLiquidityTransaction()) {\n return this.decodeIncreaseLiquidity(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 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 isAddLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::mint`);\n }\n\n private isIncreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::increase_liquidity`);\n }\n\n private isDecreaseLiquidityTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::decrease_liquidity`);\n }\n\n private isCollectFeeTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::collect`);\n }\n\n private isCollectRewardTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::collect_reward`);\n }\n\n private isBurnTransaction() {\n return !!this.getMoveCallTransaction(`${config.PackageId}::position_manager::burn`);\n }\n\n private decodeAddLiquidity(): DecodeResult {\n console.log(this.helper, 'this.helper');\n const pool = this.helper.decodeSharedObjectId(0);\n const address = this.helper.decodeInputAddress(12);\n\n const amountA = this.helper.decodeInputU64(8);\n const amountB = this.helper.decodeInputU64(9);\n const tickLower = this.helper.decodeInputU32(4);\n const tickLowerIsNeg = this.helper.decodeInputBool(5);\n const tickUpper = this.helper.decodeInputU32(6);\n const tickUpperIsNeg = this.helper.decodeInputBool(7);\n\n const deadline = this.helper.decodeInputU64(13);\n\n return {\n txType: TransactionType.Other,\n type: TransactionSubType.AddLiquidity,\n intentionData: {\n pool,\n slippage: 5,\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: 5,\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: 3, // 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 get helper() {\n console.log(this.transactions, 'this.transactions');\n const moveCall = this.transactions.find(\n (trans) => trans.kind === 'MoveCall' && trans.target !== '0x2::coin::zero',\n ) as MoveCallTransaction;\n console.log(moveCall, this.txb, 'this.txb');\n return new MoveCallHelper(moveCall, this.txb);\n }\n\n private get collectRewardHelper() {\n console.log(this.transactions, 'this.transactions');\n const moveCalls = this.transactions.filter(\n (trans) => trans.kind === 'MoveCall' && trans.target === `${config.PackageId}::position_manager::collect_reward`,\n ) as MoveCallTransaction[];\n console.log(moveCalls, this.txb, 'this.txb');\n return moveCalls.map((moveCall) => 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 txArg(index: number) {\n return this.moveCall.arguments[index];\n }\n}\n","export const config = {\n PackageId: '0x9632f61a796fc54952d9151d80b319e066cba5498a27b495c99e113db09726b1',\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 { 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 const {\n pool,\n address,\n amountA,\n amountB,\n slippage,\n nft,\n decreaseLiquidity,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n txb,\n } = this.data;\n\n return turbosSdk.pool.removeLiquidity({\n pool,\n decreaseLiquidity,\n nft,\n amountA,\n amountB,\n slippage,\n address,\n collectAmountA,\n collectAmountB,\n rewardAmounts,\n deadline,\n txb,\n });\n }\n\n static fromData(data: RemoveLiquidityIntentionData) {\n return new RemoveLiquidityIntention(data);\n }\n}\n","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 { TURBOSAppHelper } from '@/apps/turbos/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 ScallopAppHelper(),\n]);\n"],"mappings":"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","names":["TransactionType","TransactionType","sortKeys","CoreBaseIntention","data","CetusPeripherySDK","CetusClmmSDK","clmmConfig","peripheryConfig","clmmConfigTestnet","peripheryConfigTestnet","getClmmSdk","network","account","config","clmmSdk","getPeripherySdk","getAddLiquidityTxb","txbParams","account","network","getClmmSdk","getIncreaseLiquidityTxb","getRemoveLiquidityTxb","getDecreaseLiquidityTxb","getClaimFeeAndMiningTxb","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getAddLiquidityTxb","TransactionType","ClaimFeeAndMiningIntention","_ClaimFeeAndMiningIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getClaimFeeAndMiningTxb","TransactionType","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getDecreaseLiquidityTxb","TransactionType","getFarmingAddLiquidityTxb","txbParams","account","network","getPeripherySdk","getFarmingIncreaseLiquidityTxb","getFarmingDecreaseLiquidityTxb","getFarmingRemoveLiquidityTxb","getFarmingClaimFeeAndRewardTxb","getFarmingHarvest","peripherySdk","getFarmingBatchHarvest","params","getFarmingStake","getFarmingUnstake","FarmingAddLiquidityIntention","_FarmingAddLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingAddLiquidityTxb","TransactionType","FarmingBatchHarvestIntention","_FarmingBatchHarvestIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingBatchHarvest","TransactionType","FarmingClaimFeeAndRewardIntention","_FarmingClaimFeeAndRewardIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingClaimFeeAndRewardTxb","TransactionType","FarmingDecreaseLiquidityIntention","_FarmingDecreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingDecreaseLiquidityTxb","TransactionType","FarmingHarvestIntention","_FarmingHarvestIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingHarvest","TransactionType","FarmingIncreaseLiquidityIntention","_FarmingIncreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingIncreaseLiquidityTxb","TransactionType","FarmingRemoveLiquidityIntention","_FarmingRemoveLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingRemoveLiquidityTxb","TransactionType","FarmingStakeIntention","_FarmingStakeIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingStake","TransactionType","FarmingUnstakeIntention","_FarmingUnstakeIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getFarmingUnstake","TransactionType","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getIncreaseLiquidityTxb","TransactionType","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getRemoveLiquidityTxb","TransactionType","getXcetusConvertTxb","txbParams","account","network","getPeripherySdk","getXcetusRedeemLockTxb","getXcetusClaimingStakeRewardsTxb","getXcetusCancelRedeemTxb","getXcetusRedeemTxb","XcetusCancelIntention","_XcetusCancelIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusCancelRedeemTxb","TransactionType","XcetusClaimingStakeRewardsIntention","_XcetusClaimingStakeRewardsIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusClaimingStakeRewardsTxb","TransactionType","XcetusConvertIntention","_XcetusConvertIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusConvertTxb","TransactionType","XcetusRedeemIntention","_XcetusRedeemIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusRedeemTxb","TransactionType","XcetusRedeemLockIntention","_XcetusRedeemLockIntention","CoreBaseIntention","data","TransactionType","input","account","network","txbParams","getXcetusRedeemLockTxb","CetusHelper","input","txbParams","action","TransactionType","suiClient","account","network","intention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","ClaimFeeAndMiningIntention","FarmingAddLiquidityIntention","FarmingIncreaseLiquidityIntention","FarmingDecreaseLiquidityIntention","FarmingRemoveLiquidityIntention","FarmingClaimFeeAndRewardIntention","FarmingHarvestIntention","FarmingBatchHarvestIntention","FarmingStakeIntention","FarmingUnstakeIntention","XcetusConvertIntention","XcetusRedeemLockIntention","XcetusClaimingStakeRewardsIntention","XcetusCancelIntention","XcetusRedeemIntention","TransactionType","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","SuiClient","MPayError","mpayErrorCode","msg","options","cause","context","NoBackendError","MPayError","WalletNotConnectedError","MPayError","axios","AxiosError","BackendError","MPayError","msg","context","Backend","_Backend","apiURL","response","AxiosError","BackendError","recipient","options","res","axios","sender","query","paginatedData","event","formalizedEvent","address","Globals","_Globals","envConfig","SuiClient","Backend","env","options","ec","getConfig","NoBackendError","b","wallet","WalletNotConnectedError","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","TransactionBlock","TransactionBlock","SUI_TYPE_ARG","normalizeStructTag","FEE_NUMERATOR","FEE_DENOMINATOR","CLAIM_FEE_NUMERATOR","FLAT_FEE_SUI","MoveObject","object","txb","ObjectVector","objects","o","ResultRef","_ResultRef","result","target","property","nestedResultFor","resultIndex","Buffer","normalizeSuiAddress","InvalidRpcResultError","MPayError","msg","ctx","InspectViewer","results","index","returned","callIndex","returnIndex","callResult","value","type","InvalidRpcResultError","normalizeSuiAddress","Buffer","bcs","InvalidInputError","MPayError","msg","fieldKey","fieldValue","metadataBcsType","MAX_NAME_SIZE","encodeMetadata","metadata","validateMetadata","bcs","decodeMetadata","metaStr","isAsciiString","InvalidInputError","str","normalizeStructTag","isSameCoinType","type1","type2","isSameTarget","target1","target2","GAS_OBJECT_SPEC","nanoid","generateGroupId","CreateStreamHelper","_CreateStreamHelper","globals","feeContract","streamContract","info","encodeMetadata","generateGroupId","normalizeStructTag","recipient","txb","TransactionBlock","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","SUI_TYPE_ARG","streamPayment","sum","totalAmount","fee","numEpoch","streamAmount","res","InspectViewer","Transactions","CLOCK_ID","BaseContract","moduleName","config","globals","txb","input","target","Transactions","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","TransactionBlock","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","TransactionBlock","normalizeStructTag","parseStructTag","DateTime","NotCreatorError","MPayError","NotRecipientError","MPayError","RpcError","MPayError","msg","context","StreamNotFoundError","MPayError","streamId","DateTime","Duration","MAX_U64","TIME_ROUND_UNIT","roundDateTime","date","dateMs","roundMs","roundDuration","duration","durationMs","Stream","_Stream","globals","streamId","rawData","StreamContract","data","SanityError","pagination","NotCreatorError","txb","TransactionBlock","NotRecipientError","enabled","normalizeStructTag","roundDuration","metadata","decodeMetadata","roundDateTime","rawConfig","duration","rawStatus","MAX_U64","timeNowMs","DateTime","timeStartMs","epoch","res","StreamNotFoundError","RpcError","content","typeParams","parseStructTag","coinType","dataFields","config","status","normalizeStructTag","SUI_TYPE_ARG","Duration","TransactionFailedError","MPayError","status","msg","MIN_INTERVAL_MS","MPayHelper","globals","CoinMetaHelper","MPayBuilder","res","TransactionFailedError","change","info","input","InvalidInputError","cliffFraction","cliffAmount","amountPerStep","timeEnd","intervalMilli","Duration","address","coinType","balance","coinMeta","normalizeStructTag","allBalance","coinMetas","bal","i","txb","val","originTotalAmount","suiClient","normalized","SUI_TYPE_ARG","meta","normalizeStructTag","normalizeSuiAddress","DateTime","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","r","StreamGroup","_StreamGroup","globals","streams","InvalidStreamGroupError","gids","st","InvalidInputError","ids","streamObjs","getObjectsById","obj","SanityError","responses","commonInfos","stream","expInfo","isEqual","info","isEqualStreamGroupCommonInfo","i","sum","pagination","Stream","info1","info2","PagedStreamListIterator","_PagedStreamListIterator","it","pageSize","input","StreamListIterator","res","_StreamListIterator","requester","StreamListRequester","SanityError","_StreamListRequester","globals","recipient","groupRefs","query","oidIter","ListOidIterator","ref","ObjectBatchIterator","backendQuery","convertToIncomingBackendQuery","filtered","normalizeSuiAddress","groupedRefs","groupAndSortRefs","convertToOutgoingBackendQuery","sender","refs","stRefs","stream","getStreamFromIterator","isStreamOfQuery","sg","getStreamGroupFromIterator","isStreamGroupOfQuery","m","groupList","gl1","gl2","DateTime","isStatus","isStreamOfStatus","isClaimable","filter","streamId","data","getStreamObjectResponseFromIter","Stream","streamIds","objResponses","StreamGroup","convertStreamStatus","normalizeCoinTypeFilter","normalizeAddressFilter","status","st","sts","convertStreamStatusSingle","InvalidInputError","coinType","ct","normalizeStructTag","address","addr","MSafeAccountAdapter","msafe","reqs","MSafeSingleWallet","account","SingleWalletAdapter","singleWallet","suiClient","req","isSameCoinType","SUI_TYPE_ARG","GAS_OBJECT_SPEC","InvalidInputError","coins","getCoinsWithAmount","SanityError","coin","MPayClient","env","options","Globals","MPayHelper","wallet","adapter","info","streamId","Stream","query","pageSize","PagedStreamListIterator","address","coinType","normalizeStructTag","recipient","normalizeSuiAddress","creator","MPayBuilder","sortKeys","BaseIntention","data","StreamIntention","BaseIntention","network","account","mpayClient","MPayClient","MSafeSingleWallet","CancelStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","ClaimByProxyStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","ClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","TransactionType","CreateStreamIntention","StreamIntention","data","TransactionType","input","network","account","bcs","normalizeStructTag","normalizeSuiAddress","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","TransactionType","SetAutoClaimStreamIntention","StreamIntention","data","TransactionType","input","network","account","MPayAppHelper","input","network","transactionBlock","globals","Globals","result","DecodeHelper","intention","CreateStreamIntention","SetAutoClaimStreamIntention","ClaimStreamIntention","ClaimByProxyStreamIntention","CancelStreamIntention","intentionData","TransactionDefaultApplication","TransactionSubTypes","buildCoinTransferTxb","CoinTransferIntention","_CoinTransferIntention","CoreBaseIntention","data","input","suiClient","account","buildCoinTransferTxb","buildObjectTransferTxb","ObjectTransferIntention","_ObjectTransferIntention","CoreBaseIntention","data","input","suiClient","account","buildObjectTransferTxb","isSameAddress","TransactionBlock","PlainPayloadIntention","_PlainPayloadIntention","CoreBaseIntention","data","input","account","tb","TransactionBlock","isSameAddress","CoreHelper","TransactionDefaultApplication","input","suiClient","account","intention","TransactionSubTypes","CoinTransferIntention","ObjectTransferIntention","PlainPayloadIntention","TransactionType","TransactionType","bcs","normalizeStructTag","normalizeSuiAddress","config","config_default","Decoder","txb","target","trans","config_default","assetId","findPool","pool","claims","helper","MoveCallHelper","optionId","poolId","typeArguments","TransactionType","amount","moveCall","_MoveCallHelper","argIndex","input","strVal","normalizeSuiAddress","bcsType","arg","bcsNums","bcs","bcsVal","index","normalizeStructTag","TransactionBlock","depositToken","txb","pool","coinObject","amount","config_default","withdrawToken","borrowToken","repayToken","claimReward","assetId","poolId","option","typeArguments","ClaimRewardIntention","_ClaimRewardIntention","CoreBaseIntention","data","claims","tx","TransactionBlock","claim","assetId","poolId","option","typeArguments","claimReward","TransactionBlock","EntryBorrowIntention","_EntryBorrowIntention","CoreBaseIntention","data","coinType","amount","tx","TransactionBlock","pool","config_default","borrowToken","TransactionBlock","getTokenObjs","client","sender","coinType","result","EntryDepositIntention","_EntryDepositIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","TransactionBlock","toDeposit","depositToken","config_default","pool","tokenInfo","getTokenObjs","coinObj","i","TransactionBlock","EntryRepayIntention","_EntryRepayIntention","CoreBaseIntention","data","input","suiClient","account","coinType","amount","tx","TransactionBlock","toDeposit","repayToken","config_default","pool","tokenInfo","getTokenObjs","coinObj","i","TransactionBlock","EntryWithdrawIntention","_EntryWithdrawIntention","CoreBaseIntention","data","coinType","amount","tx","TransactionBlock","pool","config_default","withdrawToken","NAVIAppHelper","input","transactionBlock","result","Decoder","TransactionType","suiClient","account","intention","EntryDepositIntention","EntryBorrowIntention","EntryRepayIntention","EntryWithdrawIntention","ClaimRewardIntention","TransactionSubTypes","TransactionType","TransactionBlock","fromHEX","toHEX","sortKeys","PlainTransactionApplication","PlainTransactionType","PlainTransactionHelper","PlainTransactionApplication","input","transactionBlock","suiClient","content","TransactionType","PlainTransactionType","toHEX","account","txb","TransactionBlock","fromHEX","inspectResult","MSafeApps","apps","app","appName","TransactionType","TransactionType","bcs","normalizeStructTag","normalizeSuiAddress","config","Decoder","txb","address","target","trans","config","pool","amountA","amountB","tickLower","tickLowerIsNeg","tickUpper","tickUpperIsNeg","deadline","TransactionType","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","helper","moveCall","MoveCallHelper","moveCalls","_MoveCallHelper","argIndex","input","strVal","normalizeSuiAddress","bcsType","arg","bcsNums","bcs","bcsVal","index","normalizeStructTag","TurbosSdk","AddLiquidityIntention","_AddLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","pool","address","amountA","amountB","slippage","tickLower","tickUpper","deadline","txb","TurbosSdk","BurnIntention","_BurnIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","nft","txb","TurbosSdk","CollectFeeIntention","_CollectFeeIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","nft","collectAmountA","collectAmountB","deadline","txb","TurbosSdk","CollectRewardIntention","_CollectRewardIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","nft","rewardAmounts","deadline","txb","TurbosSdk","CreatePoolIntention","_CreatePoolIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","fee","address","tickLower","tickUpper","sqrtPrice","slippage","coinTypeA","coinTypeB","amountA","amountB","deadline","txb","TurbosSdk","DecreaseLiquidityIntention","_DecreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","deadline","txb","TurbosSdk","IncreaseLiquidityIntention","_IncreaseLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","deadline","txb","TurbosSdk","RemoveLiquidityIntention","_RemoveLiquidityIntention","CoreBaseIntention","data","input","turbosSdk","TurbosSdk","pool","address","amountA","amountB","slippage","nft","decreaseLiquidity","collectAmountA","collectAmountB","rewardAmounts","deadline","txb","TURBOSAppHelper","input","transactionBlock","account","result","Decoder","TransactionType","suiClient","network","intention","CreatePoolIntention","AddLiquidityIntention","IncreaseLiquidityIntention","DecreaseLiquidityIntention","RemoveLiquidityIntention","CollectFeeIntention","CollectRewardIntention","BurnIntention","appHelpers","MSafeApps","CoreHelper","NAVIAppHelper","MPayAppHelper","PlainTransactionHelper","CetusHelper","TURBOSAppHelper"]}