{"version":3,"sources":["../src/types/data.ts","../src/types/stream.ts","../src/types/wallet.ts","../src/types/decode.ts","../src/stream/client.ts","../src/common/globals.ts","../src/error/base.ts","../src/error/SanityError.ts","../config/dev.json","../config/prod.json","../src/common/env.ts","../src/error/NoBackendError.ts","../src/error/WalletNotConnectedError.ts","../src/stream/backend.ts","../src/utils/utils.ts","../src/utils/backend.ts","../src/error/BackendError.ts","../src/stream/helper.ts","../src/error/InvalidInputError.ts","../src/error/TransactionFailedError.ts","../src/transaction/builder/MPayBuilder.ts","../src/transaction/builder/CreateStreamHelper.ts","../src/stream/metadata.ts","../src/sui/utils.ts","../src/transaction/builder/const.ts","../src/transaction/contracts/common.ts","../src/transaction/contracts/InspectViewer.ts","../src/error/InvalidRpcResultError.ts","../src/utils/random.ts","../src/transaction/contracts/BaseContract.ts","../src/transaction/contracts/const.ts","../src/transaction/contracts/FeeContract.ts","../src/transaction/contracts/StreamContract.ts","../src/stream/query.ts","../src/stream/Stream.ts","../src/error/NotCreatorError.ts","../src/error/NotRecipientError.ts","../src/error/RpcError.ts","../src/error/StreamNotFoundError.ts","../src/error/InvalidStreamGroupError.ts","../src/sui/iterator/iterator.ts","../src/sui/iterator/object.ts","../src/stream/StreamGroup.ts","../src/wallet/MSafeAccountAdapter.ts","../src/wallet/SingleWalletAdapter.ts","../src/error/NotEnoughBalanceError.ts","../src/sui/iterator/coin.ts","../src/transaction/decoder/create.ts","../src/transaction/decoder/moveCall.ts","../src/transaction/decoder/decoder.ts","../src/transaction/contracts/index.ts","../src/transaction/contracts/RoleContract.ts","../src/transaction/contracts/VaultContract.ts"],"sourcesContent":["// This file is only for SDK internal use. Do no export this file.\n\nexport enum RawStreamStatusEnum {\n  OPEN = 0,\n  COMPLETED = 1,\n  CANCELED = 16,\n  CANCELED_COMPLETED = 17,\n}\n\nexport type RawStreamData = {\n  coinType: string;\n  balance: bigint;\n  autoClaim: boolean;\n  config: RawStreamConfig;\n  status: RawStreamStatus;\n};\n\n/// StreamConfig is the configuration of a streaming payment\n/// It is immutable once created\nexport interface RawStreamConfig {\n  amountPerEpoch: bigint;\n  cancelable: boolean;\n  cliff: bigint;\n  creator: string;\n  epochInterval: bigint;\n  metadata: string;\n  recipient: string;\n  timeStart: bigint;\n  totalEpoch: bigint;\n}\n\n/// StreamStatus is the status of a streaming payment\n/// It will be updated when the stream is canceled or claimed\nexport interface RawStreamStatus {\n  status: RawStreamStatusEnum;\n  // number of epoch that receiver has claimed\n  epochClaimed: bigint;\n  // number of epoch happened before stream is canceled\n  epochCanceled: bigint;\n}\n","// Stream have 5 status, three status for normal status, and two status for canceled status.\n//   streaming: !canceled && streamed != 100\n//   streamed: !canceled && streamed === 100 && claimable !== 0\n//   completed: !canceled && streamed === 100 && claimable === 0\n//   canceled: canceled && claimable !== 0\n//   settled: canceled && claimable === 0\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { DateTime, Duration } from 'luxon';\n\nimport { StreamEvent } from '@/types/events';\nimport { Paginated, PaginationOptions } from '@/types/pagination';\n\nexport enum StreamStatus {\n  STREAMING = 'STREAMING',\n  COMPLETED = 'COMPLETED',\n  CANCELED = 'CANCELED',\n  SETTLED = 'SETTLED',\n}\n\nexport interface IStream {\n  streamId: string;\n  type: 'Stream';\n  groupId: string;\n  creator: string;\n  recipient: string;\n  progress: StreamProgress;\n  info: StreamInfo;\n\n  refresh(): Promise<void>;\n  historyEvents(options?: PaginationOptions): Promise<Paginated<StreamEvent>>;\n\n  // Sender\n  cancel(): Promise<TransactionBlock>;\n\n  // Recipient\n  claim(): Promise<TransactionBlock>;\n  setAutoClaim(enabled: boolean): Promise<TransactionBlock>;\n\n  // Third party\n  claimByProxy(): Promise<TransactionBlock>;\n}\n\nexport interface IStreamGroup {\n  groupId: string;\n  type: 'StreamGroup';\n  streams: IStream[];\n  creator: string;\n  info: StreamGroupInfo;\n  progress: StreamGroupProgress;\n\n  refresh(): Promise<void>;\n  historyEvents(options?: PaginationOptions): Promise<Paginated<StreamEvent>>;\n}\n\nexport type StreamInfo = StreamInfoCommon & {\n  groupId: string;\n  streamId: string;\n  recipient: string;\n  progress: StreamProgress;\n  autoClaim: boolean;\n};\n\nexport type StreamGroupInfo = StreamInfoCommon & {\n  groupId: string;\n  streamIds: string[];\n  progress: StreamGroupProgress;\n};\n\nexport interface StreamInfoCommon {\n  name: string;\n  creator: string;\n  coinType: string;\n  totalAmount: bigint;\n  start: DateTime;\n  end: DateTime;\n  cancelable: boolean;\n  cliffAmount: bigint;\n  duration: Duration;\n  interval: Duration;\n  steps: bigint;\n  nextReleaseDate: DateTime | null;\n  nextReleaseAmount: bigint | null;\n}\n\n// Common information for stream groups. Stream group requires the common info to be\n// the same for all streams of a group.\nexport interface StreamGroupCommonInfo {\n  name: string;\n  groupId: string;\n  creator: string;\n  start: DateTime;\n  interval: Duration;\n  steps: bigint;\n  cancelable: boolean;\n}\n\nexport interface StreamProgress {\n  status: StreamStatus;\n  total: bigint;\n  streamed: bigint;\n  claimed: bigint;\n  claimable: bigint;\n  canceled: bigint;\n}\n\nexport interface StreamGroupProgress {\n  total: bigint;\n  streamed: bigint;\n  claimed: bigint;\n  claimable: bigint;\n  canceled: bigint;\n}\n\nexport interface StreamMetadata {\n  groupId: string;\n  name: string;\n}\n","export enum WalletType {\n  single = 'single',\n  msafe = 'msafe',\n}\n\nexport const GAS_OBJECT_SPEC = 'txn.gas';\n\n/**\n * IWallet is the adapted interface of wallet. Supports both single wallet and msafe.\n */\nexport interface IWallet {\n  type: WalletType;\n\n  address(): Promise<string>;\n\n  requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of msafe account.\n * Need to adapt to IWallet interface\n */\nexport interface IMSafeAccount {\n  address(): Promise<string>;\n\n  // return coin objects by amount.\n  requestCoins(reqs: CoinRequest[]): Promise<CoinRequestResponse[]>;\n}\n\n/**\n * ISingleWallet is the raw interface of single signer wallet.\n * Need to adapt to IWallet interface\n */\nexport interface ISingleWallet {\n  address(): Promise<string>;\n}\n\nexport interface CoinRequest {\n  coinType: string;\n  amount: bigint;\n}\n\nexport interface CoinRequestResponse {\n  primaryCoin: string;\n  mergedCoins?: string[];\n}\n","import { CreateStreamInfo, PaymentWithFee } from '@/types/client';\n\nexport type StreamDecodedTransaction =\n  | DecodedCreateStream\n  | DecodedSetAutoClaim\n  | DecodedClaimStream\n  | DecodedCancelStream\n  | DecodedClaimByProxy\n  | undefined;\n\nexport enum StreamTransactionType {\n  CREATE_STREAM = 'CreateStream',\n  SET_AUTO_CLAIM = 'SetAutoClaim',\n  CLAIM = 'Claim',\n  CLAIM_BY_PROXY = 'ClaimByProxy',\n  CANCEL = 'Cancel',\n}\n\nexport interface DecodedCreateStream {\n  type: StreamTransactionType.CREATE_STREAM;\n\n  info: CreateStreamInfo;\n  fees: PaymentWithFee;\n  coinMerges: CoinMerge[];\n}\n\nexport interface CoinMerge {\n  coinType: string;\n  primary: string | 'GAS';\n  merged?: string[];\n}\n\nexport interface DecodedSetAutoClaim {\n  type: StreamTransactionType.SET_AUTO_CLAIM;\n\n  streamId: string;\n  enabled: boolean;\n}\n\nexport interface DecodedClaimStream {\n  type: StreamTransactionType.CLAIM;\n\n  streamId: string;\n}\n\nexport interface DecodedClaimByProxy {\n  type: StreamTransactionType.CLAIM_BY_PROXY;\n\n  streamId: string;\n}\n\nexport interface DecodedCancelStream {\n  type: StreamTransactionType.CANCEL;\n\n  streamId: string;\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { Env, EnvConfigOptions } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { MPayHelper } from '@/stream/helper';\nimport { PagedStreamListIterator } from '@/stream/query';\nimport { Stream } from '@/stream/Stream';\nimport { MPayBuilder } from '@/transaction/builder/MPayBuilder';\nimport { StreamFilterStatus } from '@/types';\nimport {\n  CreateStreamInfo,\n  IMPayClient,\n  IncomingStreamQuery,\n  IPagedStreamListIterator,\n  OutgoingStreamQuery,\n} from '@/types/client';\nimport { IMSafeAccount, ISingleWallet } from '@/types/wallet';\nimport { MSafeAccountAdapter } from '@/wallet/MSafeAccountAdapter';\nimport { SingleWalletAdapter } from '@/wallet/SingleWalletAdapter';\n\nimport { StreamGroup } from './StreamGroup';\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 getStreamGroup(streamGroupId: string) {\n    const groupInfo = await this.globals.backend.getStreamGroupByGroupId(streamGroupId);\n    const streamGroup = await StreamGroup.new(this.globals, groupInfo.streamIds);\n    return {\n      groupId: groupInfo.groupId,\n      streamGroup,\n    };\n  }\n\n  async getIncomingStreams(query?: IncomingStreamQuery, pageSize: number = 10): Promise<IPagedStreamListIterator> {\n    return PagedStreamListIterator.newIncoming({\n      globals: this.globals,\n      query,\n      pageSize,\n    });\n  }\n\n  async getOutgoingStreams(query?: OutgoingStreamQuery, pageSize: number = 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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { Env, EnvConfig, EnvConfigOptions, getConfig } from '@/common/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 { JsonObject, MPayError, MPayErrorCode } from '@/error/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","{\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 { SanityError } from '@/error/SanityError';\n\nimport * as devContractConfig from '../../config/dev.json';\nimport * as prodContractConfig from '../../config/prod.json';\n\nexport enum Env {\n  local = 'local',\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://fullnode.testnet.sui.io/';\nexport const STG_RPC_ENDPOINT = 'https://fullnode.testnet.sui.io/';\nexport const PREV_RPC_ENDPOINT = 'https://fullnode.mainnet.sui.io/';\nexport const PROD_RPC_ENDPOINT = 'https://fullnode.mainnet.sui.io/';\n\nexport const DEV_BE_API = 'https://sui-dev.m-safe.link';\nexport const STG_BE_API = 'https://sui-stage.m-safe.link';\nexport const PREV_BE_API = 'https://sui-preview.m-safe.link';\nexport const PROD_BE_API = 'https://sui.m-safe.link';\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.local,\n    {\n      env: Env.local,\n      rpc: {\n        url: DEV_RPC_ENDPOINT,\n      },\n      backend: {\n        url: 'http://localhost:3000',\n      },\n      contract: CONTRACT_DEV,\n    },\n  ],\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 SanityError(`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 { MPayError, MPayErrorCode } from '@/error/base';\n\nexport class NoBackendError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.NoBackend, 'Backend is not specified');\n  }\n}\n","import { MPayError, MPayErrorCode } from '@/error/base';\n\nexport class WalletNotConnectedError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.walletNotConnected, 'Wallet not connected');\n  }\n}\n","import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport {\n  BackendIncomingStreamFilterOptions,\n  BackendOutgoingStreamFilterOptions,\n  IBackend,\n  Paginated,\n  PaginationOptions,\n  StreamEvent,\n  StreamEventDataDto,\n  StreamEventDto,\n  StreamFilterStatus,\n  StreamRef,\n} from '@/types';\nimport { addPrefix } from '@/utils';\n\nexport class Backend implements IBackend {\n  constructor(private readonly apiUrl: string) {}\n\n  async getIncomingStreams(recipient: string, options?: BackendIncomingStreamFilterOptions): Promise<StreamRef[]> {\n    const query = {\n      recipient,\n      status: options?.status,\n      coinTypes: options?.coinType,\n      senders: options?.sender,\n    };\n    const res = await this.get('/stream/incoming', {\n      params: query,\n    });\n    return res.data;\n  }\n\n  async getOutgoingStreams(sender: string, options?: BackendOutgoingStreamFilterOptions): Promise<StreamRef[]> {\n    const query = {\n      sender,\n      status: options?.status,\n      coinTypes: options?.coinType,\n      recipients: options?.recipient,\n    };\n    const res = await this.get('/stream/outgoing', {\n      params: query,\n    });\n    return res.data;\n  }\n\n  async getAllCoinTypes(address: string): Promise<string[]> {\n    const res = await this.get('/stream/coin-types', {\n      params: { address },\n    });\n    return res.data;\n  }\n\n  async getAllRecipients(sender: string, options?: StreamFilterStatus): Promise<string[]> {\n    const res = await this.get('/stream/outgoing/recipients', {\n      params: { sender, filter: options },\n    });\n    return res.data;\n  }\n\n  async getAllSenders(recipient: string, options?: StreamFilterStatus): Promise<string[]> {\n    const res = await this.get('/stream/incoming/senders', {\n      params: { recipient, filter: options },\n    });\n    return res.data;\n  }\n\n  async getStreamGroupByGroupId(groupId: string): Promise<{\n    groupId: string;\n    streamIds: string[];\n  }> {\n    const res = await this.get('/stream/ids', {\n      params: { groupId },\n    });\n    return res.data;\n  }\n\n  async getStreamHistory(query: {\n    streamId?: string;\n    groupId?: string;\n    pagination?: PaginationOptions;\n  }): Promise<Paginated<StreamEvent>> {\n    let res: AxiosResponse<any, any>;\n    if (query.streamId) {\n      res = await this.get('/stream/event/stream', {\n        params: {\n          streamAddress: query.streamId,\n          page: query.pagination?.pageNumber,\n          limit: query.pagination?.pageSize,\n        },\n      });\n    } else if (query.groupId) {\n      res = await this.get('/stream/event/group', {\n        params: {\n          groupId: query.groupId,\n          page: query.pagination?.pageNumber,\n          limit: query.pagination?.pageSize,\n        },\n      });\n    } else {\n      throw new Error('StreamId or GroupId need to be be provided');\n    }\n    return {\n      data: res.data.data.map((dto: StreamEventDto) => this.parseEvent(dto)),\n      pageNumber: res.data.meta.page,\n      pageSize: res.data.meta.limit,\n      totalSize: res.data.meta.total,\n    };\n  }\n\n  private parseEvent(event: StreamEventDto): StreamEvent {\n    return {\n      streamId: event.streamId,\n      createdAt: event.createdAt,\n      sender: event.sender,\n      txDigest: event.txDigest,\n      data: this.parseStreamEventData(event.data),\n    };\n  }\n\n  private parseStreamEventData(dto: StreamEventDataDto) {\n    const eventType = dto.type;\n    switch (eventType) {\n      case 'create_stream':\n        return {\n          ...dto,\n          balance: BigInt(dto.balance),\n        };\n      case 'cancel_stream':\n        return {\n          ...dto,\n          withdrawAmount: BigInt(dto.withdrawAmount),\n        };\n      case 'claim':\n      case 'auto_claim':\n        return {\n          ...dto,\n          claimAmount: BigInt(dto.claimAmount),\n        };\n      case 'set_auto_claim':\n        return dto;\n      default:\n        throw new Error(`Unknown stream event type: ${eventType}`);\n    }\n  }\n\n  private async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n    const fullUrl = this.getFullUrl(url);\n    try {\n      return await axios.get<T, R, D>(fullUrl, config);\n    } catch (e: any) {\n      throw BackendError.fromError(e) ?? e;\n    }\n  }\n\n  private getFullUrl(url: string) {\n    return url.startsWith(this.apiUrl) ? url : `${this.apiUrl}${addPrefix(url, '/')}`;\n  }\n}\n\nexport class BackendError extends Error {\n  constructor(public readonly e: AxiosError) {\n    super();\n    this.name = 'Backend';\n    Error.captureStackTrace(this, this.constructor);\n  }\n\n  public readonly name: string;\n\n  static fromError(e: unknown) {\n    if (axios.isAxiosError(e) && e?.response?.data && 'message' in e.response.data) {\n      console.log(e.response.data);\n      return new BackendError(e as AxiosError);\n    }\n    return undefined;\n  }\n\n  get status() {\n    return this.e.response?.status ?? undefined;\n  }\n\n  get message(): string {\n    return `Request to ${this.endpoint} failed: ${this.status} ${this.respMessage() ?? 'Unknown resp'}`;\n  }\n\n  private respMessage() {\n    if (!this.e.response?.data) {\n      return undefined;\n    }\n    return (this.e.response?.data as any).message ?? undefined;\n  }\n\n  get endpoint() {\n    return this.e.config?.url ?? '';\n  }\n\n  toString() {\n    return this.message;\n  }\n}\n","// eslint-disable-next-line no-bitwise\nimport { DateTime, Duration } from 'luxon';\n\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\nexport function addPrefix(s: string, prefix: string) {\n  if (s.startsWith(prefix)) {\n    return s;\n  }\n  return prefix + s;\n}\n","import { AxiosError, AxiosResponse } from 'axios';\n\nimport { BackendError } from '@/error/BackendError';\n\nexport function 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","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 {\n  CoinMetadata,\n  DevInspectResults,\n  SuiClient,\n  SuiObjectChangeCreated,\n  SuiTransactionBlockResponse,\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 { Globals } from '@/common/globals';\nimport { InvalidInputError } from '@/error/InvalidInputError';\nimport { TransactionFailedError } from '@/error/TransactionFailedError';\nimport { CreateStreamHelper } from '@/transaction/builder/CreateStreamHelper';\nimport { MPayBuilder } from '@/transaction/builder/MPayBuilder';\nimport {\n  CalculatedStreamAmount,\n  CalculatedTimeline,\n  CreateStreamInfo,\n  Fraction,\n  IMPayHelper,\n  MPayFees,\n  PaymentWithFee,\n} from '@/types';\n\n// Minimum time interval is 1 second\nexport const MIN_INTERVAL_MS = 1000;\n\nexport class MPayHelper implements IMPayHelper {\n  private readonly coinMetaHelper: CoinMetaHelper;\n\n  private readonly createStreamHelper: CreateStreamHelper;\n\n  constructor(public readonly globals: Globals) {\n    this.coinMetaHelper = new CoinMetaHelper(globals.suiClient);\n    this.createStreamHelper = new MPayBuilder(globals).createStreamHelper();\n  }\n\n  getStreamIdsFromCreateStreamResponse(res: SuiTransactionBlockResponse) {\n    if (res.effects?.status.status !== 'success') {\n      throw new TransactionFailedError(res.effects?.status.status, res.effects?.status.error);\n    }\n    return res\n      .objectChanges!.filter(\n        (change) =>\n          change.type === 'created' &&\n          change.objectType.startsWith(`${this.globals.envConfig.contract.contractId}::stream::Stream`),\n      )\n      .map((change) => (change as SuiObjectChangeCreated).objectId);\n  }\n\n  calculateCreateStreamFees(info: CreateStreamInfo): PaymentWithFee {\n    return this.createStreamHelper.calculateCreateStreamFees(info);\n  }\n\n  feeParams(): MPayFees {\n    return this.createStreamHelper.feeParams();\n  }\n\n  calculateStreamAmount(input: { totalAmount: bigint; steps: bigint; cliff?: Fraction }): CalculatedStreamAmount {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const cliffFraction = input.cliff\n      ? input.cliff\n      : {\n          numerator: 0n,\n          denominator: 100n,\n        };\n    const cliffAmount = (input.totalAmount * cliffFraction.numerator) / cliffFraction.denominator;\n    const amountPerStep = (input.totalAmount - cliffAmount) / input.steps;\n    const realTotalAmount = amountPerStep * input.steps + cliffAmount;\n\n    const res = {\n      realTotalAmount,\n      cliffAmount,\n      amountPerStep,\n    };\n    this.validateStreamAmount(res, input.totalAmount);\n    return res;\n  }\n\n  calculateTimelineByInterval(input: { timeStart: DateTime; interval: Duration; steps: bigint }): CalculatedTimeline {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const timeEnd = input.timeStart.plus(input.interval.toMillis() * Number(input.steps));\n\n    const res = {\n      timeStart: input.timeStart,\n      timeEnd,\n      interval: input.interval,\n      steps: input.steps,\n    };\n    this.validateTimeline(res);\n    return res;\n  }\n\n  calculateTimelineByTotalDuration(input: { timeStart: DateTime; total: Duration; steps: bigint }): CalculatedTimeline {\n    if (input.steps === 0n) {\n      throw new InvalidInputError('Invalid stream steps: 0');\n    }\n    const intervalMilli = BigInt(input.total.toMillis()) / input.steps;\n    const timeEnd = input.timeStart.plus(Duration.fromMillis(Number(intervalMilli * input.steps)));\n    const res = {\n      timeStart: input.timeStart,\n      timeEnd,\n      interval: Duration.fromMillis(Number(intervalMilli)),\n      steps: input.steps,\n    };\n    this.validateTimeline(res);\n    return res;\n  }\n\n  async getBalance(address: string, coinType?: string | null) {\n    const balance = await this.globals.suiClient.getBalance({\n      owner: address,\n      coinType,\n    });\n    const coinMeta = await this.getCoinMeta(coinType);\n    return {\n      ...balance,\n      coinType: normalizeStructTag(balance.coinType),\n      coinMeta,\n    };\n  }\n\n  async getAllBalance(address: string) {\n    const allBalance = await this.globals.suiClient.getAllBalances({\n      owner: address,\n    });\n    const coinMetas = await Promise.all(allBalance.map((bal) => this.getCoinMeta(bal.coinType)));\n    return allBalance.map((bal, i) => ({\n      ...bal,\n      coinType: normalizeStructTag(bal.coinType),\n      coinMeta: coinMetas[i],\n    }));\n  }\n\n  async getCoinMeta(coinType: string | null | undefined) {\n    return this.coinMetaHelper.getCoinMeta(coinType);\n  }\n\n  async simulateTransactionBlock(txb: TransactionBlock): Promise<DevInspectResults> {\n    return this.globals.suiClient.devInspectTransactionBlock({\n      transactionBlock: txb,\n      sender: await this.globals.wallet.address(),\n    });\n  }\n\n  private validateStreamAmount(val: CalculatedStreamAmount, originTotalAmount: bigint) {\n    if (val.amountPerStep === 0n) {\n      throw new InvalidInputError('Stream amount too small', 'totalAmount', originTotalAmount);\n    }\n    if (val.cliffAmount > val.realTotalAmount) {\n      throw new InvalidInputError('Invalid cliff settings');\n    }\n  }\n\n  private validateTimeline(val: CalculatedTimeline) {\n    if (val.interval.toMillis() < MIN_INTERVAL_MS) {\n      throw new InvalidInputError('Interval shall be at least 1 second', 'interval', val.interval);\n    }\n  }\n}\n\nexport class CoinMetaHelper {\n  private coinMetaReg: Map<string, CoinMetadata>;\n\n  constructor(private readonly suiClient: SuiClient) {\n    this.coinMetaReg = new Map();\n  }\n\n  async getCoinMeta(coinType: string | null | undefined): Promise<CoinMetadata | undefined> {\n    const normalized = normalizeStructTag(coinType || SUI_TYPE_ARG);\n    if (this.coinMetaReg.has(normalized)) {\n      return this.coinMetaReg.get(normalized);\n    }\n    const meta = await this.queryCoinMeta(normalized);\n    if (meta) {\n      this.coinMetaReg.set(normalized, meta);\n    }\n    return meta;\n  }\n\n  private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n    const res = await this.suiClient.getCoinMetadata({ coinType });\n    return res || undefined;\n  }\n}\n","import { MPayError, MPayErrorCode } from '@/error/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 { MPayError, MPayErrorCode } from '@/error/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 { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Globals } from '@/common/globals';\nimport { CreateStreamHelper } from '@/transaction/builder/CreateStreamHelper';\nimport { FeeContract } from '@/transaction/contracts/FeeContract';\nimport { StreamContract } from '@/transaction/contracts/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 { Globals } from '@/common/globals';\nimport { encodeMetadata } from '@/stream/metadata';\nimport { isSameCoinType } from '@/sui/utils';\nimport { CLAIM_FEE_NUMERATOR, FEE_DENOMINATOR, FEE_NUMERATOR, FLAT_FEE_SUI } from '@/transaction/builder/const';\nimport { ResultRef } from '@/transaction/contracts/common';\nimport { FeeContract } from '@/transaction/contracts/FeeContract';\nimport { InspectViewer } from '@/transaction/contracts/InspectViewer';\nimport { StreamContract } from '@/transaction/contracts/StreamContract';\nimport {\n  CreateStreamInfo,\n  CreateStreamInfoInternal,\n  MPayFees,\n  PaymentWithFee,\n  RecipientInfoInternal,\n} from '@/types/client';\nimport { CoinRequest, CoinRequestResponse, GAS_OBJECT_SPEC } from '@/types/wallet';\nimport { generateGroupId } from '@/utils/random';\n\nexport class CreateStreamHelper {\n  constructor(\n    public readonly globals: Globals,\n    private readonly feeContract: FeeContract,\n    private readonly streamContract: StreamContract,\n  ) {}\n\n  static convertCreateStreamInfoToInternal(info: CreateStreamInfo): CreateStreamInfoInternal {\n    return {\n      metadata: encodeMetadata({\n        name: info.name,\n        groupId: generateGroupId(),\n      }),\n      coinType: normalizeStructTag(info.coinType),\n      recipients: info.recipients.map((recipient) => ({\n        address: recipient.address,\n        cliffAmount: recipient.cliffAmount,\n        amountPerEpoch: recipient.amountPerStep,\n      })),\n      epochInterval: info.interval,\n      numberEpoch: info.steps,\n      startTime: info.startTimeMs,\n      cancelable: info.cancelable,\n    };\n  }\n\n  async buildCreateStreamTransactionBlock(info: CreateStreamInfoInternal): Promise<TransactionBlock> {\n    const txb = new TransactionBlock();\n    const paymentWithFee = this.calculateFeesInternal(info);\n    const coinReqs = this.getCreateStreamCoinRequests(info, paymentWithFee);\n    const coinResp = await this.wallet.requestCoins(coinReqs);\n\n    const paymentMergedObject = await this.addMergeCoins(txb, coinResp[0]);\n    let flatFeeMergedObject: TransactionArgument;\n    if (coinReqs.length > 1) {\n      flatFeeMergedObject = await this.addMergeCoins(txb, coinResp[1]);\n    } else {\n      flatFeeMergedObject = paymentMergedObject;\n    }\n\n    // Create streams\n    for (let i = 0; i < info.recipients.length; i++) {\n      const recipient = info.recipients[i];\n      const paymentAmount = this.amountForRecipient(recipient, info.numberEpoch);\n      const feeAmount = this.getStreamFeeLocal(paymentAmount);\n      const [paymentCoin] = txb.splitCoins(paymentMergedObject, [txb.pure(paymentAmount + feeAmount, 'u64')]);\n      const [flatFeeCoin] = txb.splitCoins(flatFeeMergedObject, [txb.pure(this.flatSuiFee, 'u64')]);\n      this.streamContract.createStream(txb, {\n        paymentCoin: new ResultRef(paymentCoin as TransactionArgument & TransactionArgument[]),\n        flatFeeCoin: new ResultRef(flatFeeCoin as TransactionArgument & TransactionArgument[]),\n        metadata: info.metadata,\n        recipient: recipient.address,\n        timeStart: info.startTime,\n        cliff: recipient.cliffAmount,\n        epochInterval: info.epochInterval,\n        numEpoch: info.numberEpoch,\n        amountPerEpoch: recipient.amountPerEpoch,\n        cancelable: info.cancelable,\n        coinType: info.coinType,\n      });\n    }\n    return txb;\n  }\n\n  calculateCreateStreamFees(createInfo: CreateStreamInfo) {\n    const infoInternal = CreateStreamHelper.convertCreateStreamInfoToInternal(createInfo);\n    return this.calculateFeesInternal(infoInternal);\n  }\n\n  feeParams(): MPayFees {\n    return {\n      createFeePercent: {\n        numerator: FEE_NUMERATOR,\n        denominator: FEE_DENOMINATOR,\n      },\n      claimFeePercent: {\n        numerator: CLAIM_FEE_NUMERATOR,\n        denominator: FEE_DENOMINATOR,\n      },\n      flatFeePerStream: FLAT_FEE_SUI,\n    };\n  }\n\n  private async addMergeCoins(txb: TransactionBlock, coins: CoinRequestResponse): Promise<TransactionObjectArgument> {\n    let mergedCoin: TransactionObjectArgument;\n    if (coins.mergedCoins && coins.mergedCoins.length) {\n      txb.mergeCoins(\n        txb.object(coins.primaryCoin),\n        coins.mergedCoins.map((coinId) => txb.object(coinId)),\n      );\n      mergedCoin = txb.object(coins.primaryCoin);\n    } else if (coins.primaryCoin === GAS_OBJECT_SPEC) {\n      mergedCoin = txb.gas;\n    } else {\n      mergedCoin = txb.object(coins.primaryCoin);\n    }\n    return mergedCoin;\n  }\n\n  getCreateStreamCoinRequests(info: CreateStreamInfoInternal, payment: PaymentWithFee): CoinRequest[] {\n    const streamCoinType = info.coinType;\n\n    if (isSameCoinType(streamCoinType, SUI_TYPE_ARG)) {\n      return [\n        {\n          coinType: streamCoinType,\n          amount: payment.totalAmount + payment.streamFeeAmount + payment.flatFeeAmount,\n        },\n      ];\n    }\n    return [\n      {\n        coinType: streamCoinType,\n        amount: payment.totalAmount + payment.streamFeeAmount,\n      },\n      {\n        coinType: SUI_TYPE_ARG,\n        amount: payment.flatFeeAmount,\n      },\n    ];\n  }\n\n  calculateFeesInternal(info: CreateStreamInfoInternal): PaymentWithFee {\n    const streamPayment = info.recipients.reduce(\n      (sum, recipient) => {\n        const totalAmount = this.amountForRecipient(recipient, info.numberEpoch);\n        const fee = this.getStreamFeeLocal(totalAmount);\n        return {\n          totalAmount: sum.totalAmount + totalAmount,\n          streamFeeAmount: sum.streamFeeAmount + fee,\n        };\n      },\n      {\n        totalAmount: 0n,\n        streamFeeAmount: 0n,\n      },\n    );\n    const flatFeeAmount = BigInt(info.recipients.length) * this.flatSuiFee;\n    return {\n      flatFeeAmount,\n      ...streamPayment,\n    };\n  }\n\n  private amountForRecipient(recipient: RecipientInfoInternal, numEpoch: bigint) {\n    return recipient.amountPerEpoch * numEpoch + 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","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 { 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 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 { 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 { JsonObject, MPayError, MPayErrorCode } from '@/error/base';\n\nexport class InvalidRpcResultError extends MPayError {\n  constructor(msg: string, ctx?: JsonObject) {\n    super(MPayErrorCode.InvalidRpcResult, msg, { context: ctx });\n  }\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateGroupId() {\n  return nanoid();\n}\n","import { TransactionBlock, Transactions } from '@mysten/sui.js/transactions';\n\nimport { ContractConfig } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { MoveObject, ObjectId, ObjectVector, Ref, ResultRef } from '@/transaction/contracts/common';\nimport { CLOCK_ID } from '@/transaction/contracts/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 { ContractConfig } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { BaseContract } from '@/transaction/contracts/BaseContract';\nimport { MoveNumber } from '@/transaction/contracts/common';\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 { ContractConfig } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { BaseContract } from '@/transaction/contracts/BaseContract';\nimport { MoveNumber, ObjectId, Ref } from '@/transaction/contracts/common';\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 { SuiObjectResponse } from '@mysten/sui.js/client';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { DateTime } from 'luxon';\n\nimport { Globals } from '@/common/globals';\nimport { InvalidInputError } from '@/error/InvalidInputError';\nimport { SanityError } from '@/error/SanityError';\nimport { Stream } from '@/stream/Stream';\nimport { StreamGroup } from '@/stream/StreamGroup';\nimport { SuiIterator } from '@/sui/iterator/iterator';\nimport { ListOidIterator, ObjectBatchIterator } from '@/sui/iterator/object';\nimport {\n  BackendIncomingStreamFilterOptions,\n  BackendOutgoingStreamFilterOptions,\n  StreamFilterStatus,\n  StreamRef,\n} from '@/types/backend';\nimport { IncomingStreamQuery, IPagedStreamListIterator, 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) => 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 '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 { Globals } from '@/common/globals';\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 { decodeMetadata } from '@/stream/metadata';\nimport { StreamContract } from '@/transaction/contracts/StreamContract';\nimport { RawStreamData, RawStreamStatusEnum } from '@/types/data';\nimport { StreamEvent } from '@/types/events';\nimport { Paginated, PaginationOptions } from '@/types/pagination';\nimport { IStream, StreamGroupCommonInfo, StreamInfo, 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    switch (rawStatus) {\n      case RawStreamStatusEnum.CANCELED:\n        return StreamStatus.CANCELED;\n      case RawStreamStatusEnum.CANCELED_COMPLETED:\n        return StreamStatus.SETTLED;\n      case RawStreamStatusEnum.COMPLETED:\n        return StreamStatus.COMPLETED;\n      case RawStreamStatusEnum.OPEN:\n        return StreamStatus.STREAMING;\n      default:\n        throw new Error(`Unknown stream status: ${rawStatus}`);\n    }\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 '@/error/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 '@/error/base';\n\nexport class NotRecipientError extends MPayError {\n  constructor() {\n    super(MPayErrorCode.NotRecipient, 'Connected wallet is not recipient');\n  }\n}\n","import { JsonObject, MPayError, MPayErrorCode } from '@/error/base';\n\nexport class RpcError extends MPayError {\n  constructor(msg: string, context?: JsonObject) {\n    super(MPayErrorCode.RpcError, msg, {\n      context,\n    });\n  }\n}\n","import { MPayError, MPayErrorCode } from '@/error/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","import { JsonObject, MPayError, MPayErrorCode } from '@/error/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 { EntryIterator, getAllFromIterator, SuiIterator } from '@/sui/iterator/iterator';\nimport { PagedData, Requester } from '@/sui/iterator/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 { Globals } from '@/common/globals';\nimport { InvalidInputError } from '@/error/InvalidInputError';\nimport { InvalidStreamGroupError } from '@/error/InvalidStreamGroupError';\nimport { SanityError } from '@/error/SanityError';\nimport { Stream } from '@/stream/Stream';\nimport { getObjectsById } from '@/sui/iterator/object';\nimport { StreamEvent } from '@/types/events';\nimport { Paginated, PaginationOptions } from '@/types/pagination';\nimport { IStreamGroup, StreamGroupCommonInfo, StreamGroupInfo, StreamGroupProgress } 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 { CoinRequest, CoinRequestResponse, IMSafeAccount, IWallet, WalletType } 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","import { SuiClient } from '@mysten/sui.js/client';\nimport { SUI_TYPE_ARG } from '@mysten/sui.js/utils';\n\nimport { InvalidInputError } from '@/error/InvalidInputError';\nimport { SanityError } from '@/error/SanityError';\nimport { getCoinsWithAmount } from '@/sui/iterator/coin';\nimport { isSameCoinType } from '@/sui/utils';\nimport { CoinRequest, CoinRequestResponse, GAS_OBJECT_SPEC, ISingleWallet, IWallet, WalletType } from '@/types/wallet';\n\n/**\n * SingleWalletAdapter adapts ISingleWallet to IWallet\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","import { MPayError, MPayErrorCode } from '@/error/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 { CoinStruct, SuiClient } from '@mysten/sui.js/client';\n\nimport { NotEnoughBalanceError } from '@/error/NotEnoughBalanceError';\nimport { SanityError } from '@/error/SanityError';\nimport { EntryIterator, getAllFromIterator } from '@/sui/iterator/iterator';\nimport { Requester, PagedData } from '@/sui/iterator/requester';\n\nconst DEF_REQ_PAGE_SIZE = 25;\n\nexport async function getCoinsWithAmount(\n  suiClient: SuiClient,\n  owner: string,\n  requestAmount: bigint,\n  coinType: string = '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: string = '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 { 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 { Globals } from '@/common/globals';\nimport { InvalidInputError } from '@/error/InvalidInputError';\nimport { SanityError } from '@/error/SanityError';\nimport { decodeMetadata } from '@/stream/metadata';\nimport { isSameTarget } from '@/sui/utils';\nimport { CreateStreamHelper } from '@/transaction/builder/CreateStreamHelper';\nimport { FeeContract } from '@/transaction/contracts/FeeContract';\nimport { StreamContract } from '@/transaction/contracts/StreamContract';\nimport { MoveCallHelper } from '@/transaction/decoder/moveCall';\nimport { CreateStreamInfo, RecipientWithAmount } from '@/types';\nimport { CoinMerge, DecodedCreateStream, StreamTransactionType } from '@/types/decode';\n\nexport class CreateStreamDecodeHelper {\n  constructor(\n    public readonly globals: Globals,\n    public readonly txb: TransactionBlock,\n  ) {}\n\n  decode(): DecodedCreateStream {\n    const streamInfo = this.decodeCreateStreamInfo();\n    const fees = this.createStreamHelper().calculateCreateStreamFees(streamInfo);\n    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, TransactionBlockInput } from '@mysten/sui.js/dist/cjs/builder/Transactions';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nexport class MoveCallHelper {\n  constructor(\n    public readonly moveCall: MoveCallTransaction,\n    public readonly txb: TransactionBlock,\n  ) {}\n\n  decodeSharedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getSharedObjectId(input);\n  }\n\n  decodeOwnedObjectId(argIndex: number) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getOwnedObjectId(input);\n  }\n\n  decodeInputU64(argIndex: number) {\n    const strVal = this.decodePureArg<string>(argIndex, 'u64');\n    return BigInt(strVal);\n  }\n\n  decodeInputAddress(argIndex: number) {\n    const input = this.decodePureArg<string>(argIndex, 'address');\n    return normalizeSuiAddress(input);\n  }\n\n  decodeInputString(argIndex: number) {\n    return this.decodePureArg<string>(argIndex, 'string');\n  }\n\n  decodeInputBool(argIndex: number) {\n    return this.decodePureArg<boolean>(argIndex, 'bool');\n  }\n\n  decodePureArg<T>(argIndex: number, bcsType: string) {\n    const input = this.getInputParam(argIndex);\n    return MoveCallHelper.getPureInputValue<T>(input, bcsType);\n  }\n\n  getInputParam(argIndex: number) {\n    const arg = this.moveCall.arguments[argIndex];\n    if (arg.kind !== 'Input') {\n      throw new Error('not input type');\n    }\n    return this.txb.blockData.inputs[arg.index];\n  }\n\n  static getPureInputValue<T>(input: TransactionBlockInput, bcsType: string) {\n    if (input.type !== 'pure') {\n      throw new Error('not pure argument');\n    }\n    if (typeof input.value === 'object' && 'Pure' in input.value) {\n      const bcsNums = input.value.Pure;\n      return bcs.de(bcsType, new Uint8Array(bcsNums)) as T;\n    }\n    return input.value as T;\n  }\n\n  static getOwnedObjectId(input: TransactionBlockInput) {\n    if (input.type !== 'object') {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    if (typeof input.value === 'object') {\n      if (!('Object' in input.value) || !('ImmOrOwned' in input.value.Object)) {\n        throw new Error('not ImmOrOwned');\n      }\n      return normalizeSuiAddress(input.value.Object.ImmOrOwned.objectId as string);\n    }\n    return normalizeSuiAddress(input.value as string);\n  }\n\n  static getSharedObjectId(input: TransactionBlockInput) {\n    if (input.type !== 'object') {\n      throw new Error(`not object argument: ${JSON.stringify(input)}`);\n    }\n    if (typeof input.value !== 'object') {\n      return normalizeSuiAddress(input.value as string);\n    }\n    if (!('Object' in input.value) || !('Shared' in input.value.Object)) {\n      throw new Error('not Shared');\n    }\n    return normalizeSuiAddress(input.value.Object.Shared.objectId as string);\n  }\n\n  static getPureInput<T>(input: TransactionBlockInput, bcsType: string) {\n    if (input.type !== 'pure') {\n      throw new Error('not pure argument');\n    }\n    if (typeof input.value !== 'object') {\n      return input.value as T;\n    }\n    if (!('Pure' in input.value)) {\n      throw new Error('Pure not in value');\n    }\n    const bcsVal = input.value.Pure;\n    return bcs.de(bcsType, new Uint8Array(bcsVal)) as T;\n  }\n\n  typeArg(index: number) {\n    return normalizeStructTag(this.moveCall.typeArguments[index]);\n  }\n\n  txArg(index: number) {\n    return this.moveCall.arguments[index];\n  }\n}\n","import { MoveCallTransaction } from '@mysten/sui.js/dist/cjs/builder';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Globals } from '@/common/globals';\nimport { isSameTarget } from '@/sui/utils';\nimport { StreamContract } from '@/transaction/contracts/StreamContract';\nimport { CreateStreamDecodeHelper } from '@/transaction/decoder/create';\nimport { MoveCallHelper } from '@/transaction/decoder/moveCall';\nimport {\n  DecodedCancelStream,\n  DecodedClaimByProxy,\n  DecodedClaimStream,\n  DecodedCreateStream,\n  DecodedSetAutoClaim,\n  StreamDecodedTransaction,\n  StreamTransactionType,\n} from '@/types/decode';\n\nexport class StreamTransactionDecoder {\n  static decodeTransaction(globals: Globals, txb: TransactionBlock): StreamDecodedTransaction {\n    const helper = new DecodeHelper(globals, txb);\n    return helper.decode();\n  }\n}\n\nexport class DecodeHelper {\n  private readonly contract: StreamContract;\n\n  constructor(\n    public readonly globals: Globals,\n    public readonly txb: TransactionBlock,\n  ) {\n    this.contract = new StreamContract(globals.envConfig.contract, globals);\n  }\n\n  decode(): StreamDecodedTransaction {\n    if (this.isCreateStreamTransaction()) {\n      return this.decodeCreateStreamTransaction();\n    }\n    if (this.isClaimByProxyTransaction()) {\n      return this.decodeClaimByProxyTransaction();\n    }\n    if (this.isSetAutoClaimTransaction()) {\n      return this.decodeSetAutoClaimTransaction();\n    }\n    if (this.isCancelStreamTransaction()) {\n      return this.decodeCancelStreamTransaction();\n    }\n    if (this.isClaimStreamTransaction()) {\n      return this.decodeClaimTransaction();\n    }\n    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","export * from './common';\nexport * from './FeeContract';\nexport * from './RoleContract';\nexport * from './StreamContract';\nexport * from './VaultContract';\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { ContractConfig } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { BaseContract } from '@/transaction/contracts/BaseContract';\n\nexport class RoleContract extends BaseContract {\n  static ModuleName = 'role';\n\n  static MethodName = {\n    set_collector: 'set_collector',\n    transfer_admin: 'transfer_admin',\n    accept_admin: 'accept_admin',\n    get_collector: 'get_collector',\n    get_pending_admin: 'get_pending_admin',\n    get_admin: 'get_admin',\n  } as const;\n\n  constructor(\n    public readonly config: ContractConfig,\n    public readonly globals: Globals,\n  ) {\n    super(RoleContract.ModuleName, config, globals);\n  }\n\n  setCollector(txb: TransactionBlock, newCollector: string) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.set_collector,\n      arguments: [roleObject, newCollector],\n      typeArgs: [],\n    });\n  }\n\n  transferAdmin(txb: TransactionBlock, newAdmin: string) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.transfer_admin,\n      arguments: [roleObject, newAdmin],\n      typeArgs: [],\n    });\n  }\n\n  acceptAdmin(txb: TransactionBlock) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.accept_admin,\n      arguments: [roleObject],\n      typeArgs: [],\n    });\n  }\n\n  getCollector(txb: TransactionBlock) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.get_collector,\n      arguments: [roleObject],\n      typeArgs: [],\n    });\n  }\n\n  getPendingAdmin(txb: TransactionBlock) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.get_pending_admin,\n      arguments: [roleObject],\n      typeArgs: [],\n    });\n  }\n\n  getAdmin(txb: TransactionBlock) {\n    const roleObject = this.roleObject();\n    return this.addContractCall(txb, {\n      method: RoleContract.MethodName.get_admin,\n      arguments: [roleObject],\n      typeArgs: [],\n    });\n  }\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { ContractConfig } from '@/common/env';\nimport { Globals } from '@/common/globals';\nimport { BaseContract } from '@/transaction/contracts/BaseContract';\n\nexport class VaultContract extends BaseContract {\n  static ModuleName = 'vault';\n\n  static MethodName = {\n    withdraw_fee: 'withdraw_fee',\n    balance: 'balance',\n  } as const;\n\n  constructor(\n    public readonly config: ContractConfig,\n    public readonly globals: Globals,\n  ) {\n    super(VaultContract.ModuleName, config, globals);\n  }\n\n  withdrawFee(txb: TransactionBlock, coinType: string) {\n    const roleObject = this.roleObject();\n    const vaultObject = this.vaultObject();\n    return this.addContractCall(txb, {\n      method: VaultContract.MethodName.withdraw_fee,\n      arguments: [roleObject, vaultObject],\n      typeArgs: [coinType],\n    });\n  }\n\n  balance(txb: TransactionBlock, coinType: string) {\n    const vaultObject = this.vaultObject();\n    return this.addContractCall(txb, {\n      method: VaultContract.MethodName.balance,\n      arguments: [vaultObject],\n      typeArgs: [coinType],\n    });\n  }\n}\n"],"mappings":"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","names":["RawStreamStatusEnum","StreamStatus","WalletType","StreamTransactionType","normalizeStructTag","normalizeSuiAddress","contractId","feeObjId","roleObjId","status","transaction","upgradeCapObjId","vaultObjId","Env","BackendError","normalizeStructTag","SUI_TYPE_ARG","Duration","status","TransactionBlock","normalizeStructTag","resultIndex","normalizeStructTag","TransactionBlock","Duration","normalizeStructTag","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","DateTime","TransactionBlock","normalizeStructTag","DateTime","TransactionBlock","normalizeStructTag","DateTime","status","res","normalizeSuiAddress","DateTime","status","normalizeStructTag","SUI_TYPE_ARG","SUI_TYPE_ARG","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG","bcs","normalizeStructTag","normalizeSuiAddress","normalizeStructTag","SUI_TYPE_ARG"]}