@msafe/sui-app-store 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +16 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/mpay/helper.ts","../src/apps/msafe-core/intention.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/stream/helper.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/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/stream/Stream.ts","../src/apps/mpay/error/NotCreatorError.ts","../src/apps/mpay/error/NotRecipientError.ts","../src/apps/mpay/error/RpcError.ts","../src/apps/mpay/error/SanityError.ts","../src/apps/mpay/error/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.ts","../src/apps/mpay/cancel-stream.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/create.ts","../src/apps/mpay/decoder/moveCall.ts","../src/apps/mpay/decoder/decoder.ts","../src/apps/mpay/set-auto-claim-stream.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/registry.ts","../src/apps/plain-transaction/helper.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 { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';\n\nimport { MSafeAppHelper } from '@/apps/interface';\nimport { SuiNetworks } from '@/types';\n\nimport { CancelStreamIntention, CancelStreamIntentionData } from './cancel-stream';\nimport { ClaimByProxyStreamIntention, ClaimByProxyStreamIntentionData } from './claim-by-proxy-stream';\nimport { ClaimStreamIntention, ClaimStreamIntentionData } from './claim-stream';\nimport { Env, Globals } from './common';\nimport { CreateStreamIntention, CreateStreamIntentionData } from './create-stream';\nimport { DecodeHelper } from './decoder/decoder';\nimport { SetAutoClaimIntentionData, 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 { chain, transactionBlock } = input;\n const globals = Globals.new(chain === 'sui:mainnet' ? Env.prod : Env.dev);\n const decoder = new DecodeHelper(globals, transactionBlock);\n const result = decoder.decode();\n if (result.type === StreamTransactionType.CREATE_STREAM) {\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: result.info,\n };\n }\n if (result.type === StreamTransactionType.CLAIM) {\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n if (result.type === StreamTransactionType.CLAIM_BY_PROXY) {\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n if (result.type === StreamTransactionType.SET_AUTO_CLAIM) {\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n enabled: result.enabled,\n },\n };\n }\n if (result.type === StreamTransactionType.CANCEL) {\n return {\n txType: TransactionType.Other,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n throw new Error(`Unknown transaction type: ${result}`);\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 { network, intentionData, suiClient, account } = input;\n let intention: MPayIntention;\n switch (input.txSubType as StreamTransactionType) {\n case StreamTransactionType.CREATE_STREAM:\n intention = CreateStreamIntention.fromData(intentionData as CreateStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM:\n intention = ClaimStreamIntention.fromData(intentionData as ClaimStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = ClaimByProxyStreamIntention.fromData(intentionData as ClaimByProxyStreamIntentionData);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = SetAutoClaimStreamIntention.fromData(intentionData as SetAutoClaimIntentionData);\n break;\n case StreamTransactionType.CANCEL:\n intention = CancelStreamIntention.fromData(intentionData as CancelStreamIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ network, suiClient, account });\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","{\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/dist/cjs/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 { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\nimport { Stream } from './Stream';\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';\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 {\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 { 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 { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\n\nimport { FEE_NUMERATOR, FEE_DENOMINATOR, CLAIM_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 { CoinRequestResponse, GAS_OBJECT_SPEC, CoinRequest } 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","export function generateGroupId() {\n return crypto.randomUUID();\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, MPayErrorCode } from './base';\n\nexport class TransactionFailedError extends MPayError {\n constructor(status: string | undefined, msg: string | undefined) {\n super(MPayErrorCode.TransactionFailed, `Transaction failed: ${msg}`, {\n context: {\n status,\n msg,\n },\n });\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { DateTime } from 'luxon';\n\nimport { Stream } from './Stream';\nimport { StreamGroup } from './StreamGroup';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { SuiIterator } from '../sui/iterator/iterator';\nimport { ObjectBatchIterator, ListOidIterator } from '../sui/iterator/object';\nimport {\n StreamRef,\n BackendIncomingStreamFilterOptions,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { IPagedStreamListIterator, IncomingStreamQuery, OutgoingStreamQuery } from '../types/client';\nimport { IStream, IStreamGroup, StreamStatus } from '../types/stream';\n\nexport class PagedStreamListIterator implements IPagedStreamListIterator {\n private constructor(\n public readonly it: StreamListIterator,\n public readonly pageSize: number,\n ) {}\n\n static async newIncoming(input: {\n globals: Globals;\n query?: IncomingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newIncoming(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n static async newOutgoing(input: {\n globals: Globals;\n query?: OutgoingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newOutgoing(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n async hasNext() {\n return this.it.hasNext();\n }\n\n async next(): Promise<(IStream | IStreamGroup)[]> {\n const res: (IStream | IStreamGroup)[] = [];\n while (res.length < this.pageSize && (await this.it.hasNext())) {\n res.push(await this.it.next());\n }\n return res;\n }\n}\n\nexport class StreamListIterator implements SuiIterator<IStream | IStreamGroup> {\n cachedNext: IStream | IStreamGroup | undefined | null;\n\n private constructor(private readonly requester: StreamListRequester) {}\n\n static async newIncoming(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const requester = await StreamListRequester.newIncomingQuery(input);\n return new StreamListIterator(requester);\n }\n\n static async newOutgoing(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const requester = await StreamListRequester.newOutgoingQuery(input);\n return new StreamListIterator(requester);\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cachedNext === undefined) {\n this.cachedNext = await this.requester.doNextRequest();\n }\n return this.cachedNext !== null;\n }\n\n async next(): Promise<IStream | IStreamGroup> {\n if (this.cachedNext === undefined) {\n const res = await this.requester.doNextRequest();\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res;\n }\n const res = this.cachedNext;\n this.cachedNext = undefined;\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res as IStream | IStreamGroup;\n }\n}\n\nexport class StreamListRequester {\n public current = 0;\n\n public objectIter: ObjectBatchIterator;\n\n private constructor(\n public readonly globals: Globals,\n public readonly recipient: string,\n public readonly groupRefs: StreamRef[][],\n public readonly query?: IncomingStreamQuery | OutgoingStreamQuery,\n ) {\n this.current = 0;\n const oidIter = new ListOidIterator(groupRefs.flat().map((ref) => ref.streamId));\n this.objectIter = new ObjectBatchIterator(globals.suiClient, oidIter);\n }\n\n static async newIncomingQuery(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const backendQuery = convertToIncomingBackendQuery(input.query);\n const recipient = await input.globals.walletAddress();\n const refs = await input.globals.backend.getIncomingStreams(recipient, backendQuery);\n const filtered = refs.filter((ref: any) => normalizeSuiAddress(ref.recipient) === normalizeSuiAddress(recipient));\n const groupedRefs = groupAndSortRefs(filtered);\n\n return new StreamListRequester(input.globals, recipient, groupedRefs, input.query);\n }\n\n static async newOutgoingQuery(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const backendQuery = convertToOutgoingBackendQuery(input.query);\n const sender = await input.globals.walletAddress();\n const refs = await input.globals.backend.getOutgoingStreams(sender, backendQuery);\n const groupedRefs = groupAndSortRefs(refs);\n return new StreamListRequester(input.globals, sender, groupedRefs, input.query);\n }\n\n async doNextRequest(): Promise<IStream | IStreamGroup | null> {\n if (this.current >= this.groupRefs.length) {\n return null;\n }\n const stRefs = this.groupRefs[this.current];\n if (stRefs.length === 1) {\n const stream = await getStreamFromIterator(this.globals, stRefs[0].streamId, this.objectIter);\n this.current++;\n return isStreamOfQuery(stream, this.query) ? stream : this.doNextRequest();\n }\n if (stRefs.length > 1) {\n const sg = await getStreamGroupFromIterator(\n this.globals,\n stRefs.map((ref) => ref.streamId),\n this.objectIter,\n );\n this.current++;\n return isStreamGroupOfQuery(sg, this.query) ? sg : this.doNextRequest();\n }\n throw new SanityError('Stream group with no stream');\n }\n}\n\nexport function groupAndSortRefs(refs: StreamRef[]) {\n const m = new Map<string, StreamRef[]>();\n refs.forEach((ref) => {\n const groupList = m.get(ref.groupId);\n if (groupList) {\n groupList.push(ref);\n m.set(ref.groupId, groupList);\n } else {\n m.set(ref.groupId, [ref]);\n }\n });\n return Array.from(m.values()).sort(\n (gl1, gl2) => DateTime.fromISO(gl2[0].createDate).toMillis() - DateTime.fromISO(gl1[0].createDate).toMillis(),\n );\n}\n\nfunction isStreamOfQuery(stream: IStream, query: IncomingStreamQuery | OutgoingStreamQuery | undefined) {\n if (query === undefined) {\n return true;\n }\n const isStatus = isStreamOfStatus(stream, query.status);\n if (query && 'claimable' in query && query.claimable !== undefined) {\n const isClaimable = query.claimable ? stream.progress.claimable !== 0n : stream.progress.claimable === 0n;\n return isStatus && isClaimable;\n }\n return isStatus;\n}\n\nfunction isStreamOfStatus(stream: IStream, filter: StreamStatus | StreamStatus[] | undefined): boolean {\n if (filter === undefined) {\n return true;\n }\n if (!Array.isArray(filter)) {\n return stream.progress.status === filter;\n }\n return filter.includes(stream.progress.status);\n}\n\nfunction isStreamGroupOfQuery(sg: IStreamGroup, query: IncomingStreamQuery | OutgoingStreamQuery | undefined): boolean {\n if (!query) {\n return true;\n }\n let isStatus = false;\n sg.streams.forEach((stream) => {\n if (isStreamOfQuery(stream, query)) {\n isStatus = true;\n }\n });\n return isStatus;\n}\n\nasync function getStreamFromIterator(globals: Globals, streamId: string, it: ObjectBatchIterator) {\n const data = await getStreamObjectResponseFromIter(it, streamId);\n return Stream.fromObjectData(globals, streamId, data);\n}\n\nasync function getStreamGroupFromIterator(globals: Globals, streamIds: string[], it: ObjectBatchIterator) {\n const objResponses: SuiObjectResponse[] = [];\n while (objResponses.length < streamIds.length) {\n const data = await getStreamObjectResponseFromIter(it, streamIds[objResponses.length]);\n objResponses.push(data);\n }\n return StreamGroup.newFromObjectResponse(globals, streamIds, objResponses);\n}\n\nasync function getStreamObjectResponseFromIter(it: ObjectBatchIterator, streamId: string) {\n if (!(await it.hasNext())) {\n throw new SanityError('object iterator has been consumed');\n }\n const data = await it.next();\n if (!data || data.error || data.data === undefined || data.data === null) {\n throw new SanityError(`object iterator undefined response`, {\n cause: data?.error,\n });\n }\n if (data?.data?.objectId !== streamId) {\n throw new SanityError('stream id not aligned');\n }\n return data;\n}\n\n// Convert IncomingStreamQuery to BackendIncomingStreamFilterOptions\nfunction convertToIncomingBackendQuery(query?: IncomingStreamQuery): BackendIncomingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n sender: normalizeAddressFilter(query?.sender),\n };\n}\n\nfunction convertToOutgoingBackendQuery(query?: OutgoingStreamQuery): BackendOutgoingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n recipient: normalizeAddressFilter(query?.recipient),\n };\n}\n\nexport function convertStreamStatus(status: undefined | StreamStatus | StreamStatus[]): StreamFilterStatus {\n if (status === undefined || status.length === 0) {\n return 'all';\n }\n if (!Array.isArray(status)) {\n return convertStreamStatusSingle(status);\n }\n return status.reduce((res: StreamFilterStatus | undefined, st) => {\n const sts = convertStreamStatus(st);\n if (!res) {\n return sts;\n }\n if (res === sts) {\n return sts;\n }\n return 'all';\n }, undefined) as StreamFilterStatus;\n}\n\nfunction convertStreamStatusSingle(status: StreamStatus): StreamFilterStatus {\n switch (status) {\n case 'STREAMING':\n case 'STREAMED':\n case 'CANCELED':\n return 'active';\n case 'COMPLETED':\n case 'SETTLED':\n return 'inactive';\n default:\n throw new InvalidInputError('Unknown stream filtered status');\n }\n}\n\nfunction normalizeCoinTypeFilter(coinType: string | string[] | undefined) {\n if (!coinType) {\n return undefined;\n }\n if (!Array.isArray(coinType)) {\n return normalizeStructTag(coinType);\n }\n return coinType.length !== 0 ? coinType.map((ct) => normalizeStructTag(ct)) : undefined;\n}\n\nfunction normalizeAddressFilter(address: string | string[] | undefined) {\n if (!address) {\n return undefined;\n }\n if (!Array.isArray(address)) {\n return normalizeSuiAddress(address);\n }\n return address.length !== 0 ? address.map((addr) => normalizeSuiAddress(addr)) : undefined;\n}\n","import { SuiObjectData, SuiObjectResponse, SuiParsedData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { decodeMetadata } from './metadata';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { NotCreatorError } from '../error/NotCreatorError';\nimport { NotRecipientError } from '../error/NotRecipientError';\nimport { RpcError } from '../error/RpcError';\nimport { SanityError } from '../error/SanityError';\nimport { StreamNotFoundError } from '../error/StreamNotFoundError';\nimport { RawStreamData, RawStreamStatusEnum } from '../types/data';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStream, StreamInfo, StreamGroupCommonInfo, StreamProgress, StreamStatus } from '../types/stream';\nimport { MAX_U64, roundDateTime, roundDuration } from '../utils/utils';\n\nexport class Stream implements IStream {\n private readonly streamContract: StreamContract;\n\n public readonly type = 'Stream';\n\n constructor(\n public readonly globals: Globals,\n public readonly streamId: string,\n public rawData: RawStreamData,\n ) {\n this.streamContract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n static async new(globals: Globals, streamId: string) {\n const rawData = await Stream.fetchStreamData(globals, streamId);\n return new Stream(globals, streamId, rawData);\n }\n\n static fromObjectData(globals: Globals, streamId: string, data: SuiObjectResponse) {\n const rawData = Stream.parseRawStreamData(streamId, data);\n return new Stream(globals, streamId, rawData);\n }\n\n get info(): StreamInfo {\n return {\n name: this.name,\n creator: this.creator,\n coinType: this.coinType,\n totalAmount: this.totalAmount,\n start: this.timeStart,\n end: this.timeEnd,\n cancelable: this.cancelable,\n cliffAmount: this.cliff,\n duration: this.duration,\n interval: this.interval,\n steps: this.totalSteps,\n nextReleaseDate: this.nextReleaseDate,\n nextReleaseAmount: this.nextReleaseAmount,\n\n groupId: this.groupId,\n streamId: this.streamId,\n recipient: this.recipient,\n progress: this.progress,\n autoClaim: this.autoClaim,\n };\n }\n\n get groupCommonInfo(): StreamGroupCommonInfo {\n return {\n name: this.name,\n groupId: this.groupId,\n creator: this.creator,\n start: this.timeStart,\n interval: this.interval,\n steps: this.totalSteps,\n cancelable: this.cancelable,\n };\n }\n\n async refresh() {\n this.rawData = await Stream.fetchStreamData(this.globals, this.streamId);\n }\n\n refreshWithData(data: SuiObjectResponse) {\n if (data.data?.objectId !== this.streamId) {\n throw new SanityError('Object Id does not align');\n }\n this.rawData = Stream.parseRawStreamData(this.streamId, data);\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n streamId: this.streamId,\n pagination,\n });\n }\n\n async cancel() {\n if ((await this.globals.walletAddress()) !== this.creator) {\n throw new NotCreatorError();\n }\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async claim() {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.claimStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async setAutoClaim(enabled: boolean) {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.setAutoClaim(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n enabled,\n });\n return txb;\n }\n\n async claimByProxy() {\n const txb = new TransactionBlock();\n this.streamContract.claimStreamByProxy(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get client() {\n return this.globals.suiClient;\n }\n\n get coinType() {\n return normalizeStructTag(this.rawData.coinType);\n }\n\n get progress(): StreamProgress {\n return {\n status: this.streamStatus,\n total: this.totalAmount,\n streamed: this.streamedAmount,\n claimed: this.claimedAmount,\n claimable: this.claimable,\n canceled: this.canceledAmount,\n };\n }\n\n get balance() {\n return this.rawData.balance;\n }\n\n get autoClaim() {\n return this.rawData.autoClaim;\n }\n\n get amountPerEpoch() {\n return this.rawData.config.amountPerEpoch;\n }\n\n get cancelable() {\n return this.rawData.config.cancelable;\n }\n\n get cliff() {\n return this.rawData.config.cliff;\n }\n\n get creator() {\n return this.rawData.config.creator;\n }\n\n get interval(): Duration {\n return roundDuration(this.rawData.config.epochInterval);\n }\n\n get groupId() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.groupId;\n }\n\n get name() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.name;\n }\n\n get recipient() {\n return this.rawData.config.recipient;\n }\n\n get timeStart(): DateTime {\n return roundDateTime(this.rawData.config.timeStart);\n }\n\n get duration(): Duration {\n const rawConfig = this.rawData.config;\n const duration = rawConfig.epochInterval * rawConfig.totalEpoch;\n return roundDuration(duration);\n }\n\n get timeEnd(): DateTime {\n return this.timeStart.plus(this.duration);\n }\n\n get totalSteps(): bigint {\n return this.rawData.config.totalEpoch;\n }\n\n get claimable(): bigint {\n return this.streamedAmount - this.claimedAmount;\n }\n\n get nextReleaseDate(): DateTime | null {\n if (this.currentEpoch === -1n) {\n return this.timeStart;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return roundDateTime((this.currentEpoch + 1n) * this.rawData.config.epochInterval + this.rawData.config.timeStart);\n }\n\n get nextReleaseAmount(): bigint | null {\n if (this.currentEpoch === -1n) {\n return this.cliff;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return this.amountPerEpoch;\n }\n\n get streamStatus(): StreamStatus {\n const rawStatus = this.rawData.status.status;\n if (rawStatus === RawStreamStatusEnum.CANCELED) {\n return StreamStatus.CANCELED;\n }\n if (rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED) {\n return StreamStatus.SETTLED;\n }\n if (rawStatus === RawStreamStatusEnum.COMPLETED) {\n return StreamStatus.COMPLETED;\n }\n if (this.currentEpoch >= this.totalSteps) {\n return StreamStatus.STREAMED;\n }\n return StreamStatus.STREAMING;\n }\n\n get streamedAmount() {\n if (this.currentEpoch === -1n) {\n return 0n;\n }\n if (this.isCanceled) {\n return this.rawData.status.epochCanceled * this.amountPerEpoch + this.cliff;\n }\n return this.currentEpoch * this.amountPerEpoch + this.cliff;\n }\n\n get claimedAmount() {\n if (this.rawData.status.epochClaimed === MAX_U64) {\n return 0n;\n }\n return this.rawData.status.epochClaimed * this.amountPerEpoch + this.cliff;\n }\n\n get currentEpoch() {\n const timeNowMs = DateTime.now().toMillis();\n const timeStartMs = this.timeStart.toMillis();\n if (timeNowMs < timeStartMs) {\n return -1n;\n }\n const epoch = Math.floor((timeNowMs - timeStartMs) / Number(this.rawData.config.epochInterval));\n return BigInt(epoch) > Number(this.rawData.config.totalEpoch) ? this.rawData.config.totalEpoch : BigInt(epoch);\n }\n\n get totalAmount() {\n const rawConfig = this.rawData.config;\n return rawConfig.amountPerEpoch * rawConfig.totalEpoch + rawConfig.cliff;\n }\n\n get isCanceled() {\n const rawStatus = this.rawData.status.status;\n return rawStatus === RawStreamStatusEnum.CANCELED || rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED;\n }\n\n get canceledAmount() {\n return this.isCanceled ? this.totalAmount - this.streamedAmount : 0n;\n }\n\n private static async fetchStreamData(globals: Globals, streamId: string) {\n const res = await globals.suiClient.getObject({\n id: streamId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n return Stream.parseRawStreamData(streamId, res);\n }\n\n static parseRawStreamData(streamId: string, res: SuiObjectResponse): RawStreamData {\n if (res.error) {\n if (res.error.code === 'notExists') {\n throw new StreamNotFoundError(streamId);\n }\n throw new RpcError(`get stream data: ${res.error.code}`, {\n streamId,\n ...res.error,\n });\n }\n const content = (res.data as SuiObjectData).content as SuiParsedData;\n if (content.dataType !== 'moveObject') {\n throw new RpcError('Unexpected object type', {\n gotType: content.dataType,\n });\n }\n const { typeParams } = parseStructTag(content.type);\n const coinType = normalizeStructTag(typeParams[0]);\n\n const dataFields = content.fields as any;\n const config = dataFields.config.fields as any;\n const status = dataFields.status.fields as any;\n\n return {\n coinType,\n autoClaim: dataFields.auto_claim as boolean,\n balance: BigInt(dataFields.balance.fields.balance),\n config: {\n amountPerEpoch: BigInt(config.amount_per_epoch),\n cancelable: config.cancelable,\n cliff: BigInt(config.cliff),\n creator: config.creator,\n epochInterval: BigInt(config.epoch_interval),\n metadata: config.metadata,\n recipient: config.recipient,\n timeStart: BigInt(config.time_start),\n totalEpoch: BigInt(config.total_epoch),\n },\n status: {\n status: status.status as RawStreamStatusEnum,\n epochCanceled: BigInt(status.epoch_canceled),\n epochClaimed: BigInt(status.epoch_claimed),\n },\n };\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotCreatorError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotCreator, 'Connected wallet is not creator');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotRecipientError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class RpcError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.RpcError, msg, {\n context,\n });\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\n/**\n * SanityError is the error reported because of error in code.\n * For normal user process, the sanity error shall never be thrown.\n */\nexport class SanityError extends MPayError {\n constructor(msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n super(MPayErrorCode.sanity, msg, options);\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class StreamNotFoundError extends MPayError {\n constructor(streamId: string) {\n super(MPayErrorCode.StreamNotFound, 'Stream not found', {\n context: {\n streamId,\n },\n });\n }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\n// eslint-disable-next-line no-bitwise\nexport const MAX_U64 = (1n << 64n) - 1n;\n\nexport const TIME_ROUND_UNIT = 1000;\n\n// roundTime round date to seconds\nexport function roundDateTime(date: DateTime | number | bigint) {\n let dateMs: number;\n if (typeof date === 'number') {\n dateMs = date;\n } else if (typeof date === 'bigint') {\n dateMs = Number(date);\n } else {\n dateMs = date.toMillis();\n }\n const roundMs = Math.round(dateMs / TIME_ROUND_UNIT);\n return DateTime.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n\nexport function roundDuration(duration: Duration | number | bigint) {\n let durationMs: number;\n if (typeof duration === 'number') {\n durationMs = duration;\n } else if (typeof duration === 'bigint') {\n durationMs = Number(duration);\n } else {\n durationMs = duration.toMillis();\n }\n const roundMs = Math.round(durationMs / TIME_ROUND_UNIT);\n return Duration.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidStreamGroupError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.InvalidStreamGroup, `Invalid stream group: ${msg}`, { context });\n }\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiClient, SuiObjectDataOptions, SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { SuiIterator, getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\nexport const REQUEST_PAGE_SIZE = 25;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n suiClient: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectResponse | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(suiClient, oidIter, options);\n return (await getAllFromIterator(iter)) as SuiObjectResponse[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectResponse> {\n constructor(\n public readonly suiClient: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(suiClient, idIter, options));\n }\n}\n\n// TODO: Unit test this class\nexport class ObjectBatchRequester implements Requester<SuiObjectResponse> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly suiClient: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectResponse>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res = await this.suiClient.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { Stream } from './Stream';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { InvalidStreamGroupError } from '../error/InvalidStreamGroupError';\nimport { SanityError } from '../error/SanityError';\nimport { getObjectsById } from '../sui/iterator/object';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStreamGroup, StreamGroupInfo, StreamGroupProgress, StreamGroupCommonInfo } from '../types/stream';\n\nexport class StreamGroup implements IStreamGroup {\n public readonly type = 'StreamGroup';\n\n constructor(\n public readonly globals: Globals,\n public readonly streams: Stream[],\n ) {\n if (streams.length === 0) {\n throw new InvalidStreamGroupError('stream size 0');\n }\n const gids = streams.map((st) => st.groupId);\n const set = new Set(gids);\n if (set.size !== 1) {\n throw new InvalidInputError('Stream does not have same group ID');\n }\n }\n\n static async new(globals: Globals, ids: string[]) {\n const streamObjs = await getObjectsById(globals.suiClient, ids);\n streamObjs.forEach((obj) => {\n if (!obj) {\n throw new SanityError('stream group object data undefined');\n }\n });\n return StreamGroup.newFromObjectResponse(globals, ids, streamObjs as SuiObjectResponse[]);\n }\n\n static async newFromObjectResponse(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = await StreamGroup.parseGroupStreams(globals, ids, responses);\n return new StreamGroup(globals, streams);\n }\n\n static checkStreamGroup(streams: Stream[]) {\n const commonInfos = streams.map((stream) => stream.groupCommonInfo);\n const expInfo = commonInfos[0];\n let isEqual = true;\n commonInfos.forEach((info) => {\n if (!isEqualStreamGroupCommonInfo(expInfo, info)) {\n isEqual = false;\n }\n });\n return isEqual;\n }\n\n async refresh() {\n const streamObjs = await getObjectsById(\n this.globals.suiClient,\n this.streams.map((stream) => stream.streamId),\n );\n this.streams.forEach((stream, i) => {\n stream.refreshWithData(streamObjs[i] as SuiObjectResponse);\n });\n }\n\n get groupId() {\n return this.streams[0].groupId;\n }\n\n get creator() {\n return this.streams[0].creator;\n }\n\n get info(): StreamGroupInfo {\n return {\n groupId: this.groupId,\n streamIds: this.streams.map((st) => st.streamId),\n progress: this.progress,\n\n name: this.streams[0].name,\n creator: this.creator,\n coinType: this.streams[0].coinType,\n totalAmount: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n start: this.streams[0].timeStart,\n end: this.streams[0].timeEnd,\n cancelable: this.streams[0].cancelable,\n cliffAmount: this.streams.reduce((sum, st) => sum + st.cliff, 0n),\n duration: this.streams[0].duration,\n interval: this.streams[0].interval,\n steps: this.streams[0].totalSteps,\n nextReleaseAmount: this.streams.reduce((sum, st) => {\n if (st.nextReleaseAmount === null) {\n return sum;\n }\n return sum + st.nextReleaseAmount;\n }, 0n),\n nextReleaseDate: this.streams[0].nextReleaseDate,\n };\n }\n\n get progress(): StreamGroupProgress {\n return {\n total: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n streamed: this.streams.reduce((sum, st) => sum + st.streamedAmount, 0n),\n claimed: this.streams.reduce((sum, st) => sum + st.claimedAmount, 0n),\n claimable: this.streams.reduce((sum, st) => sum + st.claimable, 0n),\n canceled: this.streams.reduce((sum, st) => sum + st.canceledAmount, 0n),\n };\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n groupId: this.groupId,\n pagination,\n });\n }\n\n private static async parseGroupStreams(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = responses\n .map((obj, i) => Stream.fromObjectData(globals, ids[i], obj))\n .filter((stream) => !!stream) as Stream[];\n\n if (new Set(streams.map((st) => st.groupId)).size !== 1) {\n throw new InvalidStreamGroupError('Not same group ID');\n }\n if (!this.checkStreamGroup(streams)) {\n throw new InvalidStreamGroupError('Not same stream settings');\n }\n return streams;\n }\n}\n\nfunction isEqualStreamGroupCommonInfo(info1: StreamGroupCommonInfo, info2: StreamGroupCommonInfo): boolean {\n return (\n info1.name === info2.name &&\n info1.groupId === info2.groupId &&\n info1.creator === info2.creator &&\n info1.start.toMillis() === info2.start.toMillis() &&\n info1.interval.toMillis() === info2.interval.toMillis() &&\n info1.steps === info2.steps &&\n info1.cancelable === info2.cancelable\n );\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotEnoughBalanceError extends MPayError {\n constructor(\n public readonly coinType: string,\n public readonly requestAmount: bigint,\n public readonly gotAmount: bigint,\n ) {\n super(MPayErrorCode.NotEnoughBalance, `Not enough balance: ${coinType}`, {\n context: {\n coinType,\n requestAmount,\n gotAmount,\n },\n });\n }\n}\n","import { SuiClient, CoinStruct } from '@mysten/sui.js/client';\n\nimport { getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { NotEnoughBalanceError } from '../../error/NotEnoughBalanceError';\nimport { SanityError } from '../../error/SanityError';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n suiClient: SuiClient,\n owner: string,\n requestAmount: bigint,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const it = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n let totalAmount = BigInt(0);\n const res: CoinStruct[] = [];\n while ((await it.hasNext()) && totalAmount < requestAmount) {\n const val = await it.next();\n if (!val) {\n continue;\n }\n res.push(val);\n totalAmount += BigInt(val.balance);\n }\n if (totalAmount < requestAmount) {\n throw new NotEnoughBalanceError(coinType, requestAmount, totalAmount);\n }\n return res;\n}\n\nexport async function getAllOwnedCoins(\n suiClient: SuiClient,\n owner: string,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const iter = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n return (await getAllFromIterator(iter)) as CoinStruct[];\n}\n\nexport class OwnedCoinIterator extends EntryIterator<CoinStruct> {\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n super(new OwnedCoinRequester(suiClient, owner, coinType, reqPageSize));\n }\n}\n\nexport class OwnedCoinRequester implements Requester<CoinStruct> {\n nextCursor: string | null | undefined;\n\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n if (reqPageSize <= 0) {\n throw new SanityError('Invalid reqPageSize');\n }\n }\n\n async doNextRequest(): Promise<PagedData<CoinStruct>> {\n const res = await this.suiClient.getCoins({\n owner: this.owner,\n coinType: this.coinType,\n cursor: this.nextCursor,\n limit: this.reqPageSize,\n });\n this.nextCursor = res.nextCursor;\n return {\n data: res.data,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport interface CancelStreamIntentionData {\n streamId: string;\n}\n\nexport class CancelStreamIntention extends CoreBaseIntention<CancelStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CANCEL;\n\n constructor(public readonly data: CancelStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.cancel();\n\n return txb;\n }\n\n static fromData(data: CancelStreamIntentionData) {\n return new CancelStreamIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport interface ClaimByProxyStreamIntentionData {\n streamId: string;\n}\n\nexport class ClaimByProxyStreamIntention extends CoreBaseIntention<ClaimByProxyStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimByProxyStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.claimByProxy();\n\n return txb;\n }\n\n static fromData(data: ClaimByProxyStreamIntentionData) {\n return new ClaimByProxyStreamIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport interface ClaimStreamIntentionData {\n streamId: string;\n}\n\nexport class ClaimStreamIntention extends CoreBaseIntention<ClaimStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.claim();\n\n return txb;\n }\n\n static fromData(data: ClaimStreamIntentionData) {\n return new ClaimStreamIntention(data);\n }\n}\n","import { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport interface CreateStreamIntentionData {\n name: string;\n coinType: string;\n recipients: RecipientWithAmount[];\n interval: bigint;\n steps: bigint;\n startTimeMs: bigint;\n cancelable: boolean;\n}\n\nexport interface RecipientWithAmount {\n address: string;\n amountPerStep: bigint;\n cliffAmount: bigint;\n}\n\nexport class CreateStreamIntention extends CoreBaseIntention<CreateStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CREATE_STREAM;\n\n constructor(public readonly data: CreateStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const txb = await mpayClient.createStream(this.data);\n return txb;\n }\n\n static fromData(data: CreateStreamIntentionData) {\n return new CreateStreamIntention(data);\n }\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/builder';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\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 { RecipientWithAmount } from '../create-stream';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { decodeMetadata } from '../stream/metadata';\nimport { isSameTarget } from '../sui/utils';\nimport { CreateStreamInfo } from '../types/client';\nimport { DecodedCreateStream, StreamTransactionType, CoinMerge } 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 const coinMerges = this.getCoinMerges();\n return {\n type: StreamTransactionType.CREATE_STREAM,\n info: streamInfo,\n fees,\n coinMerges,\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 getCoinMerges() {\n const createStreamTx = this.createStreamTransactions()[0];\n return this.getCoinMergeForCreateStream(createStreamTx);\n }\n\n private getCoinMergeForCreateStream(moveCall: MoveCallHelper) {\n const coinType = moveCall.typeArg(0);\n\n const paymentCoin = moveCall.txArg(2);\n const paymentCoinMerge = this.getCoinMergeFromNestedResult(paymentCoin, coinType, moveCall);\n\n if (coinType === normalizeStructTag(SUI_TYPE_ARG)) {\n return [paymentCoinMerge];\n }\n const flatFeeCoin = moveCall.txArg(3);\n const flatCoinMerge = this.getCoinMergeFromNestedResult(flatFeeCoin, normalizeStructTag(SUI_TYPE_ARG), moveCall);\n return [paymentCoinMerge, flatCoinMerge];\n }\n\n private getCoinMergeFromNestedResult(\n coinArg: TransactionArgument,\n coinType: string,\n moveCall: MoveCallHelper,\n ): CoinMerge {\n if (coinArg.kind === 'GasCoin') {\n return {\n primary: 'GAS',\n coinType,\n };\n }\n if (coinArg.kind === 'Input') {\n const arg = this.getInputArg(coinArg);\n const objectId = MoveCallHelper.getOwnedObjectId(arg);\n\n const mergeTx = this.transactions.find((tx) => {\n if (tx.kind !== 'MergeCoins') {\n return false;\n }\n if (tx.destination.kind !== 'Input') {\n throw new Error('merge coin destination not Input type');\n }\n const primaryCoinInput = this.getInputArg(tx.destination);\n return MoveCallHelper.getOwnedObjectId(primaryCoinInput) === objectId;\n });\n if (!mergeTx) {\n return {\n primary: objectId,\n coinType,\n };\n }\n return {\n primary: objectId,\n merged: (mergeTx as any).sources.map((sourceArg: any) => {\n const sourceInputArg = this.getInputArg(sourceArg);\n return MoveCallHelper.getOwnedObjectId(sourceInputArg);\n }),\n coinType,\n };\n }\n if (coinArg.kind === 'NestedResult') {\n // Expect parent is split coin transaction.\n const parentTx = this.transactions[coinArg.index];\n if (parentTx.kind !== 'SplitCoins') {\n throw new InvalidInputError(`Transaction type not expected. Expect SplitCoins, got ${parentTx.kind}`);\n }\n return this.getCoinMergeFromNestedResult(parentTx.coin, coinType, moveCall);\n }\n if (coinArg.kind === 'Result') {\n throw new Error('Result type not expected for coin inputs');\n }\n throw new Error(`Unknown argument kind`);\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","// 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/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 return undefined;\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 { TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport interface SetAutoClaimIntentionData {\n streamId: string;\n enabled: boolean;\n}\n\nexport class SetAutoClaimStreamIntention extends CoreBaseIntention<SetAutoClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.SET_AUTO_CLAIM;\n\n constructor(public readonly data: SetAutoClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.setAutoClaim(true);\n\n return txb;\n }\n\n static fromData(data: SetAutoClaimIntentionData) {\n return new SetAutoClaimStreamIntention(data);\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 { 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 { 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 return TransactionBlock.from(fromHEX(input.intentionData.content));\n }\n}\n","import { MPayAppHelper } from '@/apps/mpay/helper';\nimport { CoreHelper } from '@/apps/msafe-core/helper';\nimport { MSafeApps } from '@/apps/registry';\n\nimport { PlainTransactionHelper } from './apps/plain-transaction/helper';\n\nexport const appHelpers = new MSafeApps([new CoreHelper(), new MPayAppHelper(), new PlainTransactionHelper()]);\n"],"mappings":"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","names":["contractId","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","TransactionBlock","normalizeStructTag","resultIndex","Buffer","Buffer","normalizeStructTag","TransactionBlock","status","normalizeStructTag","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","DateTime","TransactionBlock","normalizeStructTag","DateTime","DateTime","Duration","TransactionBlock","normalizeStructTag","DateTime","status","res","normalizeSuiAddress","DateTime","status","normalizeStructTag","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","bcs","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","TransactionBlock","TransactionBlock","TransactionSubTypes","TransactionType","TransactionBlock","sortKeys","TransactionType","TransactionBlock"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/mpay/helper.ts","../src/apps/msafe-core/intention.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/stream/helper.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/TransactionFailedError.ts","../src/apps/mpay/stream/query.ts","../src/apps/mpay/stream/Stream.ts","../src/apps/mpay/error/NotCreatorError.ts","../src/apps/mpay/error/NotRecipientError.ts","../src/apps/mpay/error/RpcError.ts","../src/apps/mpay/error/SanityError.ts","../src/apps/mpay/error/StreamNotFoundError.ts","../src/apps/mpay/utils/utils.ts","../src/apps/mpay/error/InvalidStreamGroupError.ts","../src/apps/mpay/sui/iterator/iterator.ts","../src/apps/mpay/sui/iterator/object.ts","../src/apps/mpay/stream/StreamGroup.ts","../src/apps/mpay/error/NotEnoughBalanceError.ts","../src/apps/mpay/sui/iterator/coin.ts","../src/apps/mpay/cancel-stream.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/create.ts","../src/apps/mpay/decoder/moveCall.ts","../src/apps/mpay/decoder/decoder.ts","../src/apps/mpay/set-auto-claim-stream.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/registry.ts","../src/apps/plain-transaction/helper.ts","../src/index.ts"],"sourcesContent":["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 { chain, transactionBlock } = input;\n const globals = Globals.new(chain === 'sui:mainnet' ? Env.prod : Env.dev);\n const decoder = new DecodeHelper(globals, transactionBlock);\n const result = decoder.decode();\n if (result.type === StreamTransactionType.CREATE_STREAM) {\n return {\n txType: TransactionType.Stream,\n txSubType: result.type,\n intentionData: result.info,\n };\n }\n if (result.type === StreamTransactionType.CLAIM) {\n return {\n txType: TransactionType.Stream,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n if (result.type === StreamTransactionType.CLAIM_BY_PROXY) {\n return {\n txType: TransactionType.Stream,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n if (result.type === StreamTransactionType.SET_AUTO_CLAIM) {\n return {\n txType: TransactionType.Stream,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n enabled: result.enabled,\n },\n };\n }\n if (result.type === StreamTransactionType.CANCEL) {\n return {\n txType: TransactionType.Stream,\n txSubType: result.type,\n intentionData: {\n streamId: result.streamId,\n },\n };\n }\n throw new Error(`Unknown transaction type: ${result}`);\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 { network, intentionData, suiClient, account } = input;\n let intention: MPayIntention;\n switch (input.txSubType as StreamTransactionType) {\n case StreamTransactionType.CREATE_STREAM:\n intention = CreateStreamIntention.fromData(intentionData as CreateStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM:\n intention = ClaimStreamIntention.fromData(intentionData as ClaimStreamIntentionData);\n break;\n case StreamTransactionType.CLAIM_BY_PROXY:\n intention = ClaimByProxyStreamIntention.fromData(intentionData as ClaimByProxyStreamIntentionData);\n break;\n case StreamTransactionType.SET_AUTO_CLAIM:\n intention = SetAutoClaimStreamIntention.fromData(intentionData as SetAutoClaimIntentionData);\n break;\n case StreamTransactionType.CANCEL:\n intention = CancelStreamIntention.fromData(intentionData as CancelStreamIntentionData);\n break;\n default:\n throw new Error('not implemented');\n }\n return intention.build({ network, suiClient, account });\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","{\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/dist/cjs/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 { MPayHelper } from './helper';\nimport { PagedStreamListIterator } from './query';\nimport { Stream } from './Stream';\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';\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 {\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 { 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 { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\n\nimport { FEE_NUMERATOR, FEE_DENOMINATOR, CLAIM_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 { CoinRequestResponse, GAS_OBJECT_SPEC, CoinRequest } 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","export function generateGroupId() {\n return crypto.randomUUID();\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, MPayErrorCode } from './base';\n\nexport class TransactionFailedError extends MPayError {\n constructor(status: string | undefined, msg: string | undefined) {\n super(MPayErrorCode.TransactionFailed, `Transaction failed: ${msg}`, {\n context: {\n status,\n msg,\n },\n });\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { DateTime } from 'luxon';\n\nimport { Stream } from './Stream';\nimport { StreamGroup } from './StreamGroup';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { SanityError } from '../error/SanityError';\nimport { SuiIterator } from '../sui/iterator/iterator';\nimport { ObjectBatchIterator, ListOidIterator } from '../sui/iterator/object';\nimport {\n StreamRef,\n BackendIncomingStreamFilterOptions,\n BackendOutgoingStreamFilterOptions,\n StreamFilterStatus,\n} from '../types/backend';\nimport { IPagedStreamListIterator, IncomingStreamQuery, OutgoingStreamQuery } from '../types/client';\nimport { IStream, IStreamGroup, StreamStatus } from '../types/stream';\n\nexport class PagedStreamListIterator implements IPagedStreamListIterator {\n private constructor(\n public readonly it: StreamListIterator,\n public readonly pageSize: number,\n ) {}\n\n static async newIncoming(input: {\n globals: Globals;\n query?: IncomingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newIncoming(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n static async newOutgoing(input: {\n globals: Globals;\n query?: OutgoingStreamQuery;\n pageSize: number;\n }): Promise<PagedStreamListIterator> {\n const it = await StreamListIterator.newOutgoing(input);\n return new PagedStreamListIterator(it, input.pageSize);\n }\n\n async hasNext() {\n return this.it.hasNext();\n }\n\n async next(): Promise<(IStream | IStreamGroup)[]> {\n const res: (IStream | IStreamGroup)[] = [];\n while (res.length < this.pageSize && (await this.it.hasNext())) {\n res.push(await this.it.next());\n }\n return res;\n }\n}\n\nexport class StreamListIterator implements SuiIterator<IStream | IStreamGroup> {\n cachedNext: IStream | IStreamGroup | undefined | null;\n\n private constructor(private readonly requester: StreamListRequester) {}\n\n static async newIncoming(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const requester = await StreamListRequester.newIncomingQuery(input);\n return new StreamListIterator(requester);\n }\n\n static async newOutgoing(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const requester = await StreamListRequester.newOutgoingQuery(input);\n return new StreamListIterator(requester);\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cachedNext === undefined) {\n this.cachedNext = await this.requester.doNextRequest();\n }\n return this.cachedNext !== null;\n }\n\n async next(): Promise<IStream | IStreamGroup> {\n if (this.cachedNext === undefined) {\n const res = await this.requester.doNextRequest();\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res;\n }\n const res = this.cachedNext;\n this.cachedNext = undefined;\n if (res === null) {\n throw new SanityError('No more results');\n }\n return res as IStream | IStreamGroup;\n }\n}\n\nexport class StreamListRequester {\n public current = 0;\n\n public objectIter: ObjectBatchIterator;\n\n private constructor(\n public readonly globals: Globals,\n public readonly recipient: string,\n public readonly groupRefs: StreamRef[][],\n public readonly query?: IncomingStreamQuery | OutgoingStreamQuery,\n ) {\n this.current = 0;\n const oidIter = new ListOidIterator(groupRefs.flat().map((ref) => ref.streamId));\n this.objectIter = new ObjectBatchIterator(globals.suiClient, oidIter);\n }\n\n static async newIncomingQuery(input: { globals: Globals; query?: IncomingStreamQuery }) {\n const backendQuery = convertToIncomingBackendQuery(input.query);\n const recipient = await input.globals.walletAddress();\n const refs = await input.globals.backend.getIncomingStreams(recipient, backendQuery);\n const filtered = refs.filter((ref: any) => normalizeSuiAddress(ref.recipient) === normalizeSuiAddress(recipient));\n const groupedRefs = groupAndSortRefs(filtered);\n\n return new StreamListRequester(input.globals, recipient, groupedRefs, input.query);\n }\n\n static async newOutgoingQuery(input: { globals: Globals; query?: OutgoingStreamQuery }) {\n const backendQuery = convertToOutgoingBackendQuery(input.query);\n const sender = await input.globals.walletAddress();\n const refs = await input.globals.backend.getOutgoingStreams(sender, backendQuery);\n const groupedRefs = groupAndSortRefs(refs);\n return new StreamListRequester(input.globals, sender, groupedRefs, input.query);\n }\n\n async doNextRequest(): Promise<IStream | IStreamGroup | null> {\n if (this.current >= this.groupRefs.length) {\n return null;\n }\n const stRefs = this.groupRefs[this.current];\n if (stRefs.length === 1) {\n const stream = await getStreamFromIterator(this.globals, stRefs[0].streamId, this.objectIter);\n this.current++;\n return isStreamOfQuery(stream, this.query) ? stream : this.doNextRequest();\n }\n if (stRefs.length > 1) {\n const sg = await getStreamGroupFromIterator(\n this.globals,\n stRefs.map((ref) => ref.streamId),\n this.objectIter,\n );\n this.current++;\n return isStreamGroupOfQuery(sg, this.query) ? sg : this.doNextRequest();\n }\n throw new SanityError('Stream group with no stream');\n }\n}\n\nexport function groupAndSortRefs(refs: StreamRef[]) {\n const m = new Map<string, StreamRef[]>();\n refs.forEach((ref) => {\n const groupList = m.get(ref.groupId);\n if (groupList) {\n groupList.push(ref);\n m.set(ref.groupId, groupList);\n } else {\n m.set(ref.groupId, [ref]);\n }\n });\n return Array.from(m.values()).sort(\n (gl1, gl2) => DateTime.fromISO(gl2[0].createDate).toMillis() - DateTime.fromISO(gl1[0].createDate).toMillis(),\n );\n}\n\nfunction isStreamOfQuery(stream: IStream, query: IncomingStreamQuery | OutgoingStreamQuery | undefined) {\n if (query === undefined) {\n return true;\n }\n const isStatus = isStreamOfStatus(stream, query.status);\n if (query && 'claimable' in query && query.claimable !== undefined) {\n const isClaimable = query.claimable ? stream.progress.claimable !== 0n : stream.progress.claimable === 0n;\n return isStatus && isClaimable;\n }\n return isStatus;\n}\n\nfunction isStreamOfStatus(stream: IStream, filter: StreamStatus | StreamStatus[] | undefined): boolean {\n if (filter === undefined) {\n return true;\n }\n if (!Array.isArray(filter)) {\n return stream.progress.status === filter;\n }\n return filter.includes(stream.progress.status);\n}\n\nfunction isStreamGroupOfQuery(sg: IStreamGroup, query: IncomingStreamQuery | OutgoingStreamQuery | undefined): boolean {\n if (!query) {\n return true;\n }\n let isStatus = false;\n sg.streams.forEach((stream) => {\n if (isStreamOfQuery(stream, query)) {\n isStatus = true;\n }\n });\n return isStatus;\n}\n\nasync function getStreamFromIterator(globals: Globals, streamId: string, it: ObjectBatchIterator) {\n const data = await getStreamObjectResponseFromIter(it, streamId);\n return Stream.fromObjectData(globals, streamId, data);\n}\n\nasync function getStreamGroupFromIterator(globals: Globals, streamIds: string[], it: ObjectBatchIterator) {\n const objResponses: SuiObjectResponse[] = [];\n while (objResponses.length < streamIds.length) {\n const data = await getStreamObjectResponseFromIter(it, streamIds[objResponses.length]);\n objResponses.push(data);\n }\n return StreamGroup.newFromObjectResponse(globals, streamIds, objResponses);\n}\n\nasync function getStreamObjectResponseFromIter(it: ObjectBatchIterator, streamId: string) {\n if (!(await it.hasNext())) {\n throw new SanityError('object iterator has been consumed');\n }\n const data = await it.next();\n if (!data || data.error || data.data === undefined || data.data === null) {\n throw new SanityError(`object iterator undefined response`, {\n cause: data?.error,\n });\n }\n if (data?.data?.objectId !== streamId) {\n throw new SanityError('stream id not aligned');\n }\n return data;\n}\n\n// Convert IncomingStreamQuery to BackendIncomingStreamFilterOptions\nfunction convertToIncomingBackendQuery(query?: IncomingStreamQuery): BackendIncomingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n sender: normalizeAddressFilter(query?.sender),\n };\n}\n\nfunction convertToOutgoingBackendQuery(query?: OutgoingStreamQuery): BackendOutgoingStreamFilterOptions {\n return {\n status: convertStreamStatus(query?.status),\n coinType: normalizeCoinTypeFilter(query?.coinType),\n recipient: normalizeAddressFilter(query?.recipient),\n };\n}\n\nexport function convertStreamStatus(status: undefined | StreamStatus | StreamStatus[]): StreamFilterStatus {\n if (status === undefined || status.length === 0) {\n return 'all';\n }\n if (!Array.isArray(status)) {\n return convertStreamStatusSingle(status);\n }\n return status.reduce((res: StreamFilterStatus | undefined, st) => {\n const sts = convertStreamStatus(st);\n if (!res) {\n return sts;\n }\n if (res === sts) {\n return sts;\n }\n return 'all';\n }, undefined) as StreamFilterStatus;\n}\n\nfunction convertStreamStatusSingle(status: StreamStatus): StreamFilterStatus {\n switch (status) {\n case 'STREAMING':\n case 'STREAMED':\n case 'CANCELED':\n return 'active';\n case 'COMPLETED':\n case 'SETTLED':\n return 'inactive';\n default:\n throw new InvalidInputError('Unknown stream filtered status');\n }\n}\n\nfunction normalizeCoinTypeFilter(coinType: string | string[] | undefined) {\n if (!coinType) {\n return undefined;\n }\n if (!Array.isArray(coinType)) {\n return normalizeStructTag(coinType);\n }\n return coinType.length !== 0 ? coinType.map((ct) => normalizeStructTag(ct)) : undefined;\n}\n\nfunction normalizeAddressFilter(address: string | string[] | undefined) {\n if (!address) {\n return undefined;\n }\n if (!Array.isArray(address)) {\n return normalizeSuiAddress(address);\n }\n return address.length !== 0 ? address.map((addr) => normalizeSuiAddress(addr)) : undefined;\n}\n","import { SuiObjectData, SuiObjectResponse, SuiParsedData } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, parseStructTag } from '@mysten/sui.js/utils';\nimport { DateTime, Duration } from 'luxon';\n\nimport { decodeMetadata } from './metadata';\nimport { Globals } from '../common';\nimport { StreamContract } from '../contract/StreamContract';\nimport { NotCreatorError } from '../error/NotCreatorError';\nimport { NotRecipientError } from '../error/NotRecipientError';\nimport { RpcError } from '../error/RpcError';\nimport { SanityError } from '../error/SanityError';\nimport { StreamNotFoundError } from '../error/StreamNotFoundError';\nimport { RawStreamData, RawStreamStatusEnum } from '../types/data';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStream, StreamInfo, StreamGroupCommonInfo, StreamProgress, StreamStatus } from '../types/stream';\nimport { MAX_U64, roundDateTime, roundDuration } from '../utils/utils';\n\nexport class Stream implements IStream {\n private readonly streamContract: StreamContract;\n\n public readonly type = 'Stream';\n\n constructor(\n public readonly globals: Globals,\n public readonly streamId: string,\n public rawData: RawStreamData,\n ) {\n this.streamContract = new StreamContract(globals.envConfig.contract, globals);\n }\n\n static async new(globals: Globals, streamId: string) {\n const rawData = await Stream.fetchStreamData(globals, streamId);\n return new Stream(globals, streamId, rawData);\n }\n\n static fromObjectData(globals: Globals, streamId: string, data: SuiObjectResponse) {\n const rawData = Stream.parseRawStreamData(streamId, data);\n return new Stream(globals, streamId, rawData);\n }\n\n get info(): StreamInfo {\n return {\n name: this.name,\n creator: this.creator,\n coinType: this.coinType,\n totalAmount: this.totalAmount,\n start: this.timeStart,\n end: this.timeEnd,\n cancelable: this.cancelable,\n cliffAmount: this.cliff,\n duration: this.duration,\n interval: this.interval,\n steps: this.totalSteps,\n nextReleaseDate: this.nextReleaseDate,\n nextReleaseAmount: this.nextReleaseAmount,\n\n groupId: this.groupId,\n streamId: this.streamId,\n recipient: this.recipient,\n progress: this.progress,\n autoClaim: this.autoClaim,\n };\n }\n\n get groupCommonInfo(): StreamGroupCommonInfo {\n return {\n name: this.name,\n groupId: this.groupId,\n creator: this.creator,\n start: this.timeStart,\n interval: this.interval,\n steps: this.totalSteps,\n cancelable: this.cancelable,\n };\n }\n\n async refresh() {\n this.rawData = await Stream.fetchStreamData(this.globals, this.streamId);\n }\n\n refreshWithData(data: SuiObjectResponse) {\n if (data.data?.objectId !== this.streamId) {\n throw new SanityError('Object Id does not align');\n }\n this.rawData = Stream.parseRawStreamData(this.streamId, data);\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n streamId: this.streamId,\n pagination,\n });\n }\n\n async cancel() {\n if ((await this.globals.walletAddress()) !== this.creator) {\n throw new NotCreatorError();\n }\n const txb = new TransactionBlock();\n this.streamContract.cancelStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async claim() {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.claimStream(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n async setAutoClaim(enabled: boolean) {\n if ((await this.globals.walletAddress()) !== this.recipient) {\n throw new NotRecipientError();\n }\n const txb = new TransactionBlock();\n this.streamContract.setAutoClaim(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n enabled,\n });\n return txb;\n }\n\n async claimByProxy() {\n const txb = new TransactionBlock();\n this.streamContract.claimStreamByProxy(txb, {\n streamId: this.streamId,\n coinType: this.coinType,\n });\n return txb;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get client() {\n return this.globals.suiClient;\n }\n\n get coinType() {\n return normalizeStructTag(this.rawData.coinType);\n }\n\n get progress(): StreamProgress {\n return {\n status: this.streamStatus,\n total: this.totalAmount,\n streamed: this.streamedAmount,\n claimed: this.claimedAmount,\n claimable: this.claimable,\n canceled: this.canceledAmount,\n };\n }\n\n get balance() {\n return this.rawData.balance;\n }\n\n get autoClaim() {\n return this.rawData.autoClaim;\n }\n\n get amountPerEpoch() {\n return this.rawData.config.amountPerEpoch;\n }\n\n get cancelable() {\n return this.rawData.config.cancelable;\n }\n\n get cliff() {\n return this.rawData.config.cliff;\n }\n\n get creator() {\n return this.rawData.config.creator;\n }\n\n get interval(): Duration {\n return roundDuration(this.rawData.config.epochInterval);\n }\n\n get groupId() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.groupId;\n }\n\n get name() {\n const { metadata } = this.rawData.config;\n const md = decodeMetadata(metadata);\n return md.name;\n }\n\n get recipient() {\n return this.rawData.config.recipient;\n }\n\n get timeStart(): DateTime {\n return roundDateTime(this.rawData.config.timeStart);\n }\n\n get duration(): Duration {\n const rawConfig = this.rawData.config;\n const duration = rawConfig.epochInterval * rawConfig.totalEpoch;\n return roundDuration(duration);\n }\n\n get timeEnd(): DateTime {\n return this.timeStart.plus(this.duration);\n }\n\n get totalSteps(): bigint {\n return this.rawData.config.totalEpoch;\n }\n\n get claimable(): bigint {\n return this.streamedAmount - this.claimedAmount;\n }\n\n get nextReleaseDate(): DateTime | null {\n if (this.currentEpoch === -1n) {\n return this.timeStart;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return roundDateTime((this.currentEpoch + 1n) * this.rawData.config.epochInterval + this.rawData.config.timeStart);\n }\n\n get nextReleaseAmount(): bigint | null {\n if (this.currentEpoch === -1n) {\n return this.cliff;\n }\n if (this.currentEpoch >= this.totalSteps || this.isCanceled) {\n return null;\n }\n return this.amountPerEpoch;\n }\n\n get streamStatus(): StreamStatus {\n const rawStatus = this.rawData.status.status;\n if (rawStatus === RawStreamStatusEnum.CANCELED) {\n return StreamStatus.CANCELED;\n }\n if (rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED) {\n return StreamStatus.SETTLED;\n }\n if (rawStatus === RawStreamStatusEnum.COMPLETED) {\n return StreamStatus.COMPLETED;\n }\n if (this.currentEpoch >= this.totalSteps) {\n return StreamStatus.STREAMED;\n }\n return StreamStatus.STREAMING;\n }\n\n get streamedAmount() {\n if (this.currentEpoch === -1n) {\n return 0n;\n }\n if (this.isCanceled) {\n return this.rawData.status.epochCanceled * this.amountPerEpoch + this.cliff;\n }\n return this.currentEpoch * this.amountPerEpoch + this.cliff;\n }\n\n get claimedAmount() {\n if (this.rawData.status.epochClaimed === MAX_U64) {\n return 0n;\n }\n return this.rawData.status.epochClaimed * this.amountPerEpoch + this.cliff;\n }\n\n get currentEpoch() {\n const timeNowMs = DateTime.now().toMillis();\n const timeStartMs = this.timeStart.toMillis();\n if (timeNowMs < timeStartMs) {\n return -1n;\n }\n const epoch = Math.floor((timeNowMs - timeStartMs) / Number(this.rawData.config.epochInterval));\n return BigInt(epoch) > Number(this.rawData.config.totalEpoch) ? this.rawData.config.totalEpoch : BigInt(epoch);\n }\n\n get totalAmount() {\n const rawConfig = this.rawData.config;\n return rawConfig.amountPerEpoch * rawConfig.totalEpoch + rawConfig.cliff;\n }\n\n get isCanceled() {\n const rawStatus = this.rawData.status.status;\n return rawStatus === RawStreamStatusEnum.CANCELED || rawStatus === RawStreamStatusEnum.CANCELED_COMPLETED;\n }\n\n get canceledAmount() {\n return this.isCanceled ? this.totalAmount - this.streamedAmount : 0n;\n }\n\n private static async fetchStreamData(globals: Globals, streamId: string) {\n const res = await globals.suiClient.getObject({\n id: streamId,\n options: {\n showContent: true,\n showType: true,\n },\n });\n return Stream.parseRawStreamData(streamId, res);\n }\n\n static parseRawStreamData(streamId: string, res: SuiObjectResponse): RawStreamData {\n if (res.error) {\n if (res.error.code === 'notExists') {\n throw new StreamNotFoundError(streamId);\n }\n throw new RpcError(`get stream data: ${res.error.code}`, {\n streamId,\n ...res.error,\n });\n }\n const content = (res.data as SuiObjectData).content as SuiParsedData;\n if (content.dataType !== 'moveObject') {\n throw new RpcError('Unexpected object type', {\n gotType: content.dataType,\n });\n }\n const { typeParams } = parseStructTag(content.type);\n const coinType = normalizeStructTag(typeParams[0]);\n\n const dataFields = content.fields as any;\n const config = dataFields.config.fields as any;\n const status = dataFields.status.fields as any;\n\n return {\n coinType,\n autoClaim: dataFields.auto_claim as boolean,\n balance: BigInt(dataFields.balance.fields.balance),\n config: {\n amountPerEpoch: BigInt(config.amount_per_epoch),\n cancelable: config.cancelable,\n cliff: BigInt(config.cliff),\n creator: config.creator,\n epochInterval: BigInt(config.epoch_interval),\n metadata: config.metadata,\n recipient: config.recipient,\n timeStart: BigInt(config.time_start),\n totalEpoch: BigInt(config.total_epoch),\n },\n status: {\n status: status.status as RawStreamStatusEnum,\n epochCanceled: BigInt(status.epoch_canceled),\n epochClaimed: BigInt(status.epoch_claimed),\n },\n };\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotCreatorError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotCreator, 'Connected wallet is not creator');\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotRecipientError extends MPayError {\n constructor() {\n super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class RpcError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.RpcError, msg, {\n context,\n });\n }\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\n/**\n * SanityError is the error reported because of error in code.\n * For normal user process, the sanity error shall never be thrown.\n */\nexport class SanityError extends MPayError {\n constructor(msg: string, options: { cause?: unknown; context?: JsonObject } = {}) {\n super(MPayErrorCode.sanity, msg, options);\n }\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class StreamNotFoundError extends MPayError {\n constructor(streamId: string) {\n super(MPayErrorCode.StreamNotFound, 'Stream not found', {\n context: {\n streamId,\n },\n });\n }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\n// eslint-disable-next-line no-bitwise\nexport const MAX_U64 = (1n << 64n) - 1n;\n\nexport const TIME_ROUND_UNIT = 1000;\n\n// roundTime round date to seconds\nexport function roundDateTime(date: DateTime | number | bigint) {\n let dateMs: number;\n if (typeof date === 'number') {\n dateMs = date;\n } else if (typeof date === 'bigint') {\n dateMs = Number(date);\n } else {\n dateMs = date.toMillis();\n }\n const roundMs = Math.round(dateMs / TIME_ROUND_UNIT);\n return DateTime.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n\nexport function roundDuration(duration: Duration | number | bigint) {\n let durationMs: number;\n if (typeof duration === 'number') {\n durationMs = duration;\n } else if (typeof duration === 'bigint') {\n durationMs = Number(duration);\n } else {\n durationMs = duration.toMillis();\n }\n const roundMs = Math.round(durationMs / TIME_ROUND_UNIT);\n return Duration.fromMillis(roundMs * TIME_ROUND_UNIT);\n}\n","import { MPayError, JsonObject, MPayErrorCode } from './base';\n\nexport class InvalidStreamGroupError extends MPayError {\n constructor(msg: string, context?: JsonObject) {\n super(MPayErrorCode.InvalidStreamGroup, `Invalid stream group: ${msg}`, { context });\n }\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiClient, SuiObjectDataOptions, SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { SuiIterator, getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\nexport const REQUEST_PAGE_SIZE = 25;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n suiClient: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectResponse | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(suiClient, oidIter, options);\n return (await getAllFromIterator(iter)) as SuiObjectResponse[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectResponse> {\n constructor(\n public readonly suiClient: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(suiClient, idIter, options));\n }\n}\n\n// TODO: Unit test this class\nexport class ObjectBatchRequester implements Requester<SuiObjectResponse> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly suiClient: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectResponse>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res = await this.suiClient.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui.js/client';\n\nimport { Stream } from './Stream';\nimport { Globals } from '../common';\nimport { InvalidInputError } from '../error/InvalidInputError';\nimport { InvalidStreamGroupError } from '../error/InvalidStreamGroupError';\nimport { SanityError } from '../error/SanityError';\nimport { getObjectsById } from '../sui/iterator/object';\nimport { StreamEvent } from '../types/events';\nimport { PaginationOptions, Paginated } from '../types/pagination';\nimport { IStreamGroup, StreamGroupInfo, StreamGroupProgress, StreamGroupCommonInfo } from '../types/stream';\n\nexport class StreamGroup implements IStreamGroup {\n public readonly type = 'StreamGroup';\n\n constructor(\n public readonly globals: Globals,\n public readonly streams: Stream[],\n ) {\n if (streams.length === 0) {\n throw new InvalidStreamGroupError('stream size 0');\n }\n const gids = streams.map((st) => st.groupId);\n const set = new Set(gids);\n if (set.size !== 1) {\n throw new InvalidInputError('Stream does not have same group ID');\n }\n }\n\n static async new(globals: Globals, ids: string[]) {\n const streamObjs = await getObjectsById(globals.suiClient, ids);\n streamObjs.forEach((obj) => {\n if (!obj) {\n throw new SanityError('stream group object data undefined');\n }\n });\n return StreamGroup.newFromObjectResponse(globals, ids, streamObjs as SuiObjectResponse[]);\n }\n\n static async newFromObjectResponse(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = await StreamGroup.parseGroupStreams(globals, ids, responses);\n return new StreamGroup(globals, streams);\n }\n\n static checkStreamGroup(streams: Stream[]) {\n const commonInfos = streams.map((stream) => stream.groupCommonInfo);\n const expInfo = commonInfos[0];\n let isEqual = true;\n commonInfos.forEach((info) => {\n if (!isEqualStreamGroupCommonInfo(expInfo, info)) {\n isEqual = false;\n }\n });\n return isEqual;\n }\n\n async refresh() {\n const streamObjs = await getObjectsById(\n this.globals.suiClient,\n this.streams.map((stream) => stream.streamId),\n );\n this.streams.forEach((stream, i) => {\n stream.refreshWithData(streamObjs[i] as SuiObjectResponse);\n });\n }\n\n get groupId() {\n return this.streams[0].groupId;\n }\n\n get creator() {\n return this.streams[0].creator;\n }\n\n get info(): StreamGroupInfo {\n return {\n groupId: this.groupId,\n streamIds: this.streams.map((st) => st.streamId),\n progress: this.progress,\n\n name: this.streams[0].name,\n creator: this.creator,\n coinType: this.streams[0].coinType,\n totalAmount: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n start: this.streams[0].timeStart,\n end: this.streams[0].timeEnd,\n cancelable: this.streams[0].cancelable,\n cliffAmount: this.streams.reduce((sum, st) => sum + st.cliff, 0n),\n duration: this.streams[0].duration,\n interval: this.streams[0].interval,\n steps: this.streams[0].totalSteps,\n nextReleaseAmount: this.streams.reduce((sum, st) => {\n if (st.nextReleaseAmount === null) {\n return sum;\n }\n return sum + st.nextReleaseAmount;\n }, 0n),\n nextReleaseDate: this.streams[0].nextReleaseDate,\n };\n }\n\n get progress(): StreamGroupProgress {\n return {\n total: this.streams.reduce((sum, st) => sum + st.totalAmount, 0n),\n streamed: this.streams.reduce((sum, st) => sum + st.streamedAmount, 0n),\n claimed: this.streams.reduce((sum, st) => sum + st.claimedAmount, 0n),\n claimable: this.streams.reduce((sum, st) => sum + st.claimable, 0n),\n canceled: this.streams.reduce((sum, st) => sum + st.canceledAmount, 0n),\n };\n }\n\n async historyEvents(pagination?: PaginationOptions): Promise<Paginated<StreamEvent>> {\n return this.globals.backend.getStreamHistory({\n groupId: this.groupId,\n pagination,\n });\n }\n\n private static async parseGroupStreams(globals: Globals, ids: string[], responses: SuiObjectResponse[]) {\n const streams = responses\n .map((obj, i) => Stream.fromObjectData(globals, ids[i], obj))\n .filter((stream) => !!stream) as Stream[];\n\n if (new Set(streams.map((st) => st.groupId)).size !== 1) {\n throw new InvalidStreamGroupError('Not same group ID');\n }\n if (!this.checkStreamGroup(streams)) {\n throw new InvalidStreamGroupError('Not same stream settings');\n }\n return streams;\n }\n}\n\nfunction isEqualStreamGroupCommonInfo(info1: StreamGroupCommonInfo, info2: StreamGroupCommonInfo): boolean {\n return (\n info1.name === info2.name &&\n info1.groupId === info2.groupId &&\n info1.creator === info2.creator &&\n info1.start.toMillis() === info2.start.toMillis() &&\n info1.interval.toMillis() === info2.interval.toMillis() &&\n info1.steps === info2.steps &&\n info1.cancelable === info2.cancelable\n );\n}\n","import { MPayError, MPayErrorCode } from './base';\n\nexport class NotEnoughBalanceError extends MPayError {\n constructor(\n public readonly coinType: string,\n public readonly requestAmount: bigint,\n public readonly gotAmount: bigint,\n ) {\n super(MPayErrorCode.NotEnoughBalance, `Not enough balance: ${coinType}`, {\n context: {\n coinType,\n requestAmount,\n gotAmount,\n },\n });\n }\n}\n","import { SuiClient, CoinStruct } from '@mysten/sui.js/client';\n\nimport { getAllFromIterator, EntryIterator } from './iterator';\nimport { Requester, PagedData } from './requester';\nimport { NotEnoughBalanceError } from '../../error/NotEnoughBalanceError';\nimport { SanityError } from '../../error/SanityError';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n suiClient: SuiClient,\n owner: string,\n requestAmount: bigint,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const it = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n let totalAmount = BigInt(0);\n const res: CoinStruct[] = [];\n while ((await it.hasNext()) && totalAmount < requestAmount) {\n const val = await it.next();\n if (!val) {\n continue;\n }\n res.push(val);\n totalAmount += BigInt(val.balance);\n }\n if (totalAmount < requestAmount) {\n throw new NotEnoughBalanceError(coinType, requestAmount, totalAmount);\n }\n return res;\n}\n\nexport async function getAllOwnedCoins(\n suiClient: SuiClient,\n owner: string,\n coinType = '0x2::sui::SUI',\n pageSize: number = DEF_REQ_PAGE_SIZE,\n) {\n const iter = new OwnedCoinIterator(suiClient, owner, coinType, pageSize);\n return (await getAllFromIterator(iter)) as CoinStruct[];\n}\n\nexport class OwnedCoinIterator extends EntryIterator<CoinStruct> {\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n super(new OwnedCoinRequester(suiClient, owner, coinType, reqPageSize));\n }\n}\n\nexport class OwnedCoinRequester implements Requester<CoinStruct> {\n nextCursor: string | null | undefined;\n\n constructor(\n private readonly suiClient: SuiClient,\n private readonly owner: string,\n private readonly coinType: string,\n private readonly reqPageSize: number,\n ) {\n if (reqPageSize <= 0) {\n throw new SanityError('Invalid reqPageSize');\n }\n }\n\n async doNextRequest(): Promise<PagedData<CoinStruct>> {\n const res = await this.suiClient.getCoins({\n owner: this.owner,\n coinType: this.coinType,\n cursor: this.nextCursor,\n limit: this.reqPageSize,\n });\n this.nextCursor = res.nextCursor;\n return {\n data: res.data,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { CancelStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CancelStreamIntention extends CoreBaseIntention<CancelStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CANCEL;\n\n constructor(public readonly data: CancelStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.cancel();\n\n return txb;\n }\n\n static fromData(data: CancelStreamIntentionData) {\n return new CancelStreamIntention(data);\n }\n}\n","import { ClaimByProxyStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimByProxyStreamIntention extends CoreBaseIntention<ClaimByProxyStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimByProxyStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.claimByProxy();\n\n return txb;\n }\n\n static fromData(data: ClaimByProxyStreamIntentionData) {\n return new ClaimByProxyStreamIntention(data);\n }\n}\n","import { ClaimStreamIntentionData, TransactionType } from '@msafe/sui3-utils';\nimport { SuiClient } from '@mysten/sui.js/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport class ClaimStreamIntention extends CoreBaseIntention<ClaimStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CLAIM;\n\n constructor(public readonly data: ClaimStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.claim();\n\n return txb;\n }\n\n static fromData(data: ClaimStreamIntentionData) {\n return new ClaimStreamIntention(data);\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 { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport class CreateStreamIntention extends CoreBaseIntention<CreateStreamIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.CREATE_STREAM;\n\n constructor(public readonly data: CreateStreamIntentionData) {\n super(data);\n }\n\n async build(input: {\n network: SuiNetworks;\n suiClient: SuiClient;\n account: WalletAccount;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const txb = await mpayClient.createStream(this.data);\n return txb;\n }\n\n static fromData(data: CreateStreamIntentionData) {\n return new CreateStreamIntention(data);\n }\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/builder';\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, SUI_TYPE_ARG } from '@mysten/sui.js/utils';\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, CoinMerge } 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 const coinMerges = this.getCoinMerges();\n return {\n type: StreamTransactionType.CREATE_STREAM,\n info: streamInfo,\n fees,\n coinMerges,\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 getCoinMerges() {\n const createStreamTx = this.createStreamTransactions()[0];\n return this.getCoinMergeForCreateStream(createStreamTx);\n }\n\n private getCoinMergeForCreateStream(moveCall: MoveCallHelper) {\n const coinType = moveCall.typeArg(0);\n\n const paymentCoin = moveCall.txArg(2);\n const paymentCoinMerge = this.getCoinMergeFromNestedResult(paymentCoin, coinType, moveCall);\n\n if (coinType === normalizeStructTag(SUI_TYPE_ARG)) {\n return [paymentCoinMerge];\n }\n const flatFeeCoin = moveCall.txArg(3);\n const flatCoinMerge = this.getCoinMergeFromNestedResult(flatFeeCoin, normalizeStructTag(SUI_TYPE_ARG), moveCall);\n return [paymentCoinMerge, flatCoinMerge];\n }\n\n private getCoinMergeFromNestedResult(\n coinArg: TransactionArgument,\n coinType: string,\n moveCall: MoveCallHelper,\n ): CoinMerge {\n if (coinArg.kind === 'GasCoin') {\n return {\n primary: 'GAS',\n coinType,\n };\n }\n if (coinArg.kind === 'Input') {\n const arg = this.getInputArg(coinArg);\n const objectId = MoveCallHelper.getOwnedObjectId(arg);\n\n const mergeTx = this.transactions.find((tx) => {\n if (tx.kind !== 'MergeCoins') {\n return false;\n }\n if (tx.destination.kind !== 'Input') {\n throw new Error('merge coin destination not Input type');\n }\n const primaryCoinInput = this.getInputArg(tx.destination);\n return MoveCallHelper.getOwnedObjectId(primaryCoinInput) === objectId;\n });\n if (!mergeTx) {\n return {\n primary: objectId,\n coinType,\n };\n }\n return {\n primary: objectId,\n merged: (mergeTx as any).sources.map((sourceArg: any) => {\n const sourceInputArg = this.getInputArg(sourceArg);\n return MoveCallHelper.getOwnedObjectId(sourceInputArg);\n }),\n coinType,\n };\n }\n if (coinArg.kind === 'NestedResult') {\n // Expect parent is split coin transaction.\n const parentTx = this.transactions[coinArg.index];\n if (parentTx.kind !== 'SplitCoins') {\n throw new InvalidInputError(`Transaction type not expected. Expect SplitCoins, got ${parentTx.kind}`);\n }\n return this.getCoinMergeFromNestedResult(parentTx.coin, coinType, moveCall);\n }\n if (coinArg.kind === 'Result') {\n throw new Error('Result type not expected for coin inputs');\n }\n throw new Error(`Unknown argument kind`);\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","// 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/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 return undefined;\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/dist/cjs/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { WalletAccount } from '@mysten/wallet-standard';\n\nimport { CoreBaseIntention } from '@/apps/msafe-core/intention';\nimport { SuiNetworks } from '@/types';\n\nimport { Env } from './common';\nimport { MPayClient, MSafeSingleWallet } from './stream/client';\nimport { StreamTransactionType } from './types/decode';\n\nexport class SetAutoClaimStreamIntention extends CoreBaseIntention<SetAutoClaimIntentionData> {\n txType: TransactionType.Other;\n\n txSubType: StreamTransactionType.SET_AUTO_CLAIM;\n\n constructor(public readonly data: SetAutoClaimIntentionData) {\n super(data);\n }\n\n async build(input: {\n suiClient: SuiClient;\n account: WalletAccount;\n network: SuiNetworks;\n }): Promise<TransactionBlock> {\n const { network, account } = input;\n\n const mpayClient = new MPayClient(network === 'sui:mainnet' ? Env.prod : Env.dev);\n mpayClient.connectSingleWallet(new MSafeSingleWallet(account));\n\n const stream = await mpayClient.getStream(this.data.streamId);\n\n const txb = await stream.setAutoClaim(true);\n\n return txb;\n }\n\n static fromData(data: SetAutoClaimIntentionData) {\n return new SetAutoClaimStreamIntention(data);\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 { 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 { 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 { MPayAppHelper } from '@/apps/mpay/helper';\nimport { CoreHelper } from '@/apps/msafe-core/helper';\nimport { MSafeApps } from '@/apps/registry';\n\nimport { PlainTransactionHelper } from './apps/plain-transaction/helper';\n\nexport const appHelpers = new MSafeApps([new CoreHelper(), new MPayAppHelper(), new PlainTransactionHelper()]);\n"],"mappings":"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","names":["contractId","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","TransactionBlock","normalizeStructTag","resultIndex","Buffer","Buffer","normalizeStructTag","TransactionBlock","status","normalizeStructTag","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","DateTime","TransactionBlock","normalizeStructTag","DateTime","DateTime","Duration","TransactionBlock","normalizeStructTag","DateTime","status","res","normalizeSuiAddress","DateTime","status","normalizeStructTag","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","bcs","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","TransactionBlock","TransactionBlock","TransactionSubTypes","TransactionType","TransactionBlock","sortKeys","TransactionType","TransactionBlock"]}
|