{"version":3,"sources":["../src/account.ts","../src/constants.ts","../src/crypto.ts","../src/PublicKeySerde.ts","../src/utils.ts","../src/signature.ts","../src/transaction.ts","../src/stream/types.ts","../src/stream/event.ts","../src/stream/metadata.ts","../src/stream/helper.ts","../src/types.ts","../src/transactionResponseDecoder.ts","../src/coin.ts","../src/api/sync.ts","../src/api/transaction.ts","../src/signingMessageHelper.ts","../src/sync.ts","../src/jira.ts","../src/address-book.ts","../src/transactions/tx-parser.ts"],"sourcesContent":["import { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { AccountConfig } from '@/constants';\nimport { MultiSigConfig } from '@/types';\n\n/**\n * Represents a raw multi-signature account.\n */\nexport class MultiSigAccount {\n  public publicKey: MultiSigPublicKey;\n\n  constructor(private readonly config: MultiSigConfig) {\n    MultiSigAccount.validate(config);\n    this.publicKey = this.toMultisigPublicKey(config);\n  }\n\n  get address() {\n    return this.publicKey.toSuiAddress();\n  }\n\n  get publicKeys() {\n    return this.publicKey.getPublicKeys();\n  }\n\n  combinePartialSignatures(signatures: SerializedSignature[]): SerializedSignature {\n    return this.publicKey.combinePartialSignatures(signatures);\n  }\n\n  private toMultisigPublicKey(account: MultiSigConfig) {\n    const { ownersWithWeight, threshold, creationNonce } = account;\n\n    const publicKeys = ownersWithWeight.map((it) => ({ ...it }));\n\n    if (creationNonce !== undefined) {\n      publicKeys.push({\n        publicKey: this.makeNoncePublicKey(creationNonce),\n        weight: AccountConfig.nonce.weight,\n      });\n    }\n\n    return MultiSigPublicKey.fromPublicKeys({ threshold, publicKeys });\n  }\n\n  private makeNoncePublicKey(nonce: number) {\n    const buffer = new ArrayBuffer(Ed25519PublicKey.SIZE);\n    new TextEncoder().encodeInto(AccountConfig.nonce.prefix, new Uint8Array(buffer, 0, AccountConfig.nonce.maxSize));\n    const nonceView = new DataView(buffer, AccountConfig.nonce.maxSize, 4);\n    nonceView.setUint32(0, nonce, true);\n    return new Ed25519PublicKey(new Uint8Array(buffer));\n  }\n\n  private static validate(config: MultiSigConfig) {\n    config.ownersWithWeight.forEach((it) => {\n      const { weight } = it;\n      if (weight < AccountConfig.minWeight || weight > AccountConfig.maxWeight) {\n        throw new Error(`Invalid weight: ${weight} (1-${AccountConfig.maxWeight})`);\n      }\n    });\n\n    const totalWeight = config.ownersWithWeight.reduce((s, it) => s + it.weight, 0);\n    if (config.threshold < 1 || config.threshold > totalWeight) {\n      throw new Error(`Invalid threshold: ${config.threshold} (1-${totalWeight})`);\n    }\n\n    const maxOwner =\n      config.creationNonce === undefined ? AccountConfig.maxOwnerWithoutNonce : AccountConfig.maxOwnerWithNonce;\n    if (config.ownersWithWeight.length > maxOwner) {\n      throw new Error('Owner number bigger than upper capacity');\n    }\n\n    const addressSet = new Set(config.ownersWithWeight.map((it) => it.publicKey.toSuiAddress()));\n    if (addressSet.size !== config.ownersWithWeight.length) {\n      throw new Error('Duplicate address detected');\n    }\n  }\n}\n","export const AccountConfig = {\n  minWeight: 0,\n  maxWeight: 255,\n  maxOwnerWithNonce: 9,\n  maxOwnerWithoutNonce: 10,\n  nonce: {\n    prefix: 'maven',\n    weight: 1,\n    maxSize: 16,\n  },\n};\n\nexport const SUI_COIN = '0x2::sui::SUI';\nexport const UNKNOWN_COIN = 'UNKNOWN COIN';\n","import { PaginatedTransactionResponse, SuiClient } from '@mysten/sui.js/client';\nimport {\n  PublicKey,\n  SIGNATURE_FLAG_TO_SCHEME,\n  SerializedSignature,\n  SignatureFlag,\n  SignatureScheme,\n  parseSerializedSignature,\n} from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui.js/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui.js/keypairs/secp256r1';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/verify';\n\nimport { PublicKeySerde } from '@/PublicKeySerde';\nimport { MessageType, PublicKeyWithSchema, SuiAddress } from '@/types';\nimport { isSameAddress, stringToBuffer } from '@/utils';\n\n/**\n * Get public key from signature\n * @param message message\n * @param type message type\n * @param signature signature\n * @returns public key\n */\nexport async function getPublicKeyFromSignature(\n  message: Uint8Array,\n  type: MessageType,\n  signature: SerializedSignature,\n): Promise<PublicKey> {\n  switch (type) {\n    case 'TransactionBlock':\n      return verifyTransactionBlock(message, signature);\n    case 'Personal':\n      return verifyPersonalMessage(message, signature); // options);\n    default:\n      throw new Error('Invalid message type');\n  }\n}\n\n/**\n * Get public key from personal signature\n * @param message message\n * @param signature  signature\n * @returns public key\n */\nexport async function getPublicKeyFromPersonalSignature(\n  message: string,\n  signature: SerializedSignature,\n): Promise<PublicKey> {\n  return getPublicKeyFromSignature(stringToBuffer(message), 'Personal', signature);\n}\n\n/**\n * Verify signature\n * @param message message\n * @param type message type\n * @param signature signature\n * @param address target address\n */\nexport async function verifySignature(\n  message: Uint8Array,\n  type: MessageType,\n  signature: SerializedSignature,\n  address: SuiAddress,\n): Promise<boolean> {\n  try {\n    const publicKey = await getPublicKeyFromSignature(message, type, signature);\n    return isSameAddress(publicKey.toSuiAddress(), address);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Verify personal signature\n * @param message message\n * @param signature signatured\n * @param address target address\n * @returns\n */\nexport async function verifyPersonalSignature(\n  message: string,\n  signature: SerializedSignature,\n  address: SuiAddress,\n): Promise<boolean> {\n  return verifySignature(stringToBuffer(message), 'Personal', signature, address);\n}\n\n/**\n * Verify transaction signature\n * @param payload transaction payload\n * @param signature signature\n * @param address target address\n */\nexport async function verifyTransactionSignature(\n  payload: Uint8Array,\n  signature: SerializedSignature,\n  address: SuiAddress,\n): Promise<boolean> {\n  return verifySignature(payload, 'TransactionBlock', signature, address);\n}\n\n/**\n * Serialize public key\n * @Deprecated: Use PublicKeySerde.ser\n * @param publicKey public key object\n * @returns public key with scheme\n */\nexport function serializePublicKey(publicKey: PublicKey): PublicKeyWithSchema {\n  return {\n    publicKeyEncoded: publicKey.toBase64(),\n    schema: SIGNATURE_FLAG_TO_SCHEME[publicKey.flag() as SignatureFlag],\n  };\n}\n\n/**\n * Deserialize public key\n * @Deprecated: Use PublicKeySerde.de\n * @param publicKey public key string\n * @param scheme public key scheme\n * @returns public key object\n */\nexport function deserializePublicKey(publicKey: string | Uint8Array, scheme: SignatureScheme): PublicKey {\n  switch (scheme) {\n    case 'ED25519':\n      return new Ed25519PublicKey(publicKey);\n    case 'Secp256k1':\n      return new Secp256k1PublicKey(publicKey);\n    case 'Secp256r1':\n      return new Secp256r1PublicKey(publicKey);\n    default:\n      throw new Error('Unsupported signature scheme');\n  }\n}\n\nexport class PublicKeyManager {\n  private cachedKeys: Map<SuiAddress, PublicKey>;\n\n  constructor(private readonly client: SuiClient) {\n    this.cachedKeys = new Map<SuiAddress, PublicKey>();\n  }\n\n  /**\n   * Get address public key from cache or from chain\n   * @param address target address\n   */\n  async getPublicKey(address: SuiAddress) {\n    const cachedKey = this.cachedKeys.get(address);\n\n    if (cachedKey) {\n      return cachedKey;\n    }\n\n    const publicKey = await this.fetchPublicKey(address);\n    if (publicKey) {\n      this.cachedKeys.set(address, publicKey);\n    }\n    return publicKey;\n  }\n\n  /**\n   * Batch get public keys from addresses\n   * @param addresses addresses\n   */\n  async getPublicKeys(addresses: SuiAddress[]) {\n    const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n    for (let index = 0; index < addresses.length; index++) {\n      const address = addresses[index];\n      results[index] = this.cachedKeys.get(address);\n    }\n\n    for (let index = 0; index < results.length; index++) {\n      const result = results[index];\n      if (result === undefined) {\n        results[index] = await this.fetchPublicKey(addresses[index]);\n      }\n    }\n\n    for (let index = 0; index < addresses.length; index++) {\n      const address = addresses[index];\n      if (results[index]) {\n        this.cachedKeys.set(address, results[index] as PublicKey);\n      }\n    }\n\n    return results;\n  }\n\n  private async fetchPublicKey(address: SuiAddress) {\n    const publicKeyFromChain = await this.fetchPublicKeyFromChain(address);\n    if (publicKeyFromChain) {\n      return publicKeyFromChain;\n    }\n    return undefined;\n  }\n\n  private async fetchPublicKeyFromChain(address: SerializedSignature) {\n    let txs: PaginatedTransactionResponse;\n    try {\n      txs = await this.client.queryTransactionBlocks({\n        filter: { FromAddress: address },\n        options: { showInput: true },\n        limit: 2,\n      });\n    } catch {\n      return undefined;\n    }\n\n    if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n      return undefined;\n    }\n\n    const tx = txs.data[0];\n\n    if (!tx.transaction) {\n      return undefined;\n    }\n\n    const signatures = tx.transaction.txSignatures as string[];\n\n    for (let index = 0; index < signatures.length; index++) {\n      const signature = signatures[index];\n      const publicKey = this.getAddressFromSignature(signature, address);\n      if (!publicKey) {\n        continue;\n      }\n      return publicKey;\n    }\n    return undefined;\n  }\n\n  private getAddressFromSignature(signature: SerializedSignature, address: SuiAddress) {\n    const parsedSignature = parseSerializedSignature(signature);\n\n    switch (parsedSignature.signatureScheme) {\n      case 'MultiSig': {\n        const multisigAddress = new MultiSigPublicKey(parsedSignature.multisig.multisig_pk).toSuiAddress();\n        if (isSameAddress(multisigAddress, address)) {\n          throw new Error('multisig wallet cannot be owner');\n        }\n        return undefined;\n      }\n      case 'ZkLogin':\n        if (isSameAddress(parsedSignature.zkLogin.address, address)) {\n          throw new Error('ZkLogin wallet cannot be owner');\n        }\n        return undefined;\n      case 'ED25519':\n      case 'Secp256k1':\n      case 'Secp256r1': {\n        const publicKey = PublicKeySerde.de({\n          publicKeyEncoded: parsedSignature.publicKey,\n          schema: parsedSignature.signatureScheme,\n        });\n        if (isSameAddress(publicKey.toSuiAddress(), address)) {\n          return publicKey;\n        }\n        return undefined;\n      }\n      default:\n        throw new Error('Invalid signature scheme');\n    }\n  }\n}\n","import { PublicKey, SIGNATURE_FLAG_TO_SCHEME, SignatureFlag, SignatureScheme } from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui.js/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui.js/keypairs/secp256r1';\nimport { fromB64 } from '@mysten/sui.js/utils';\nimport { ZkLoginPublicIdentifier } from '@mysten/sui.js/zklogin';\n\n/**\n * Class representing a Public Key Serializer/Deserializer.\n */\nexport class PublicKeySerde {\n  /**\n   * Serializes a public key.\n   *\n   * @param {PublicKey} publicKey - The public key to serialize.\n   * @return {Object} An object containing the serialized public key and the signature scheme.\n   *   - publicKeyEncoded: The serialized public key encoded in base64.\n   *   - scheme: The signature scheme corresponding to the public key flag.\n   */\n  static ser(publicKey: PublicKey): { publicKeyEncoded: string; schema: SignatureScheme } {\n    return {\n      publicKeyEncoded: publicKey.toBase64(),\n      schema: SIGNATURE_FLAG_TO_SCHEME[publicKey.flag() as SignatureFlag],\n    };\n  }\n\n  /**\n   * Generates a public key object based on the provided input.\n   *\n   * @param {object} input - The input object containing the public key and the signature scheme.\n   * @param {string | Uint8Array} input.publicKey - The public key.\n   * @param {SignatureScheme} input.schema - The signature scheme.\n   *\n   * @return {PublicKey} - The generated public key object.\n   *\n   * @throws {Error} - If the signature scheme is unsupported.\n   */\n  static de(input: { publicKeyEncoded: string | Uint8Array; schema: string }): PublicKey {\n    let pkEncoded =\n      typeof input.publicKeyEncoded === 'string' ? fromB64(input.publicKeyEncoded) : input.publicKeyEncoded;\n\n    let { schema } = input;\n    if (pkEncoded.length === 34 || (input.schema === 'ED25519' && pkEncoded.length === 33)) {\n      if (pkEncoded[0] === 0x00 || pkEncoded[0] === 0x01 || pkEncoded[0] === 0x02) {\n        schema = SIGNATURE_FLAG_TO_SCHEME[pkEncoded[0]];\n        pkEncoded = pkEncoded.slice(1);\n      }\n    }\n\n    switch (schema) {\n      case 'ED25519':\n        return new Ed25519PublicKey(pkEncoded);\n      case 'Secp256k1':\n        return new Secp256k1PublicKey(pkEncoded);\n      case 'Secp256r1':\n        return new Secp256r1PublicKey(pkEncoded);\n      case 'ZkLogin':\n        return new ZkLoginPublicIdentifier(pkEncoded);\n      default:\n        throw new Error('Unsupported signature scheme: $input.scheme');\n    }\n  }\n}\n","import { Buffer } from 'buffer';\n\nimport { normalizeStructTag, normalizeSuiAddress } from '@mysten/sui.js/utils';\n\n/**\n * Check if the given addresses are same address\n * @param address1 address 1\n * @param address2 address 2\n * @returns if two addresses are equal\n */\nexport function isSameAddress(address1: string, address2: string) {\n  return normalizeSuiAddress(address1) === normalizeSuiAddress(address2);\n}\n\n/**\n * Check if the given structs are same\n * @param struct1 struct 1\n * @param struct2 struct 2\n * @returns if two struct are equal\n */\nexport function isSuiStructEqual(struct1: string, struct2: string) {\n  return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n}\n\n/**\n * Check if is coin object type\n * @param struct struct\n * @returns if is coin object type\n */\nexport function isCoinObjectType(struct: string) {\n  const normalized = normalizeStructTag(struct);\n  const coinPrefix = normalizeStructTag('0x2::coin::Coin');\n  return normalized.startsWith(coinPrefix);\n}\n\n/**\n * Convert a string to Buffer object\n * @param s string\n * @returns\n */\nexport function stringToBuffer(s: string): Buffer {\n  return Buffer.from(s, 'utf-8');\n}\n\n/**\n * Convert buffer to hex string\n * @param buffer buffer\n * @returns hex string\n */\nexport function Uint8ArrayToHex(buffer: Uint8Array): string {\n  return `0x${Array.prototype.map.call(buffer, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\n/**\n * Convert hex string to buffer\n * @param hex hex string\n * @returns buffer\n */\nexport function HexToUint8Array(hex: string): Uint8Array {\n  return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","/**\n * Create a msafe login message to sign\n *\n * @Deprecated: Use SigningMessageHelper instead\n * @returns login message\n */\nexport function createLoginMessage() {\n  return createLoginMessageWithTimestamp(new Date().toUTCString());\n}\n\nexport function createLoginMessageWithTimestamp(timestamp: string) {\n  return `Welcome to MSafe. ${timestamp}`;\n}\n\n/**\n * decode login message timestamp\n *\n * @Deprecated: Use SigningMessageHelper instead\n *\n * @param message login message\n * @returns match timestamp\n */\nexport function decodeLoginMessageTimestamp(message: string) {\n  const regex = /Welcome to MSafe. (.+)/;\n  const matches = message.match(regex);\n  return matches ? matches[1] : undefined;\n}\n\n/**\n * @Deprecated: Use SigningMessageHelper instead\n * Create a msafe creation message to sign\n * @param address msafe address\n * @returns msafe account create message\n */\nexport function createAccountCreationMessage(address: string) {\n  return `Create MSafe Account: ${address}`;\n}\n\n/**\n * @Deprecated: Use SigningMessageHelper instead\n * Create propose intention sign message\n * @param intention intention\n * @param sn sequence number\n * @returns intention sign message\n */\nexport function createProposeIntentionMessage(intention: any, sn: number) {\n  return JSON.stringify({\n    intention,\n    sn,\n  });\n}\n","import { CoinStruct, PaginatedCoins, SuiClient, SuiObjectResponse } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { SUI_COIN } from './constants';\nimport { CoinTransferIntention, ObjectTransferIntention, SuiAddress, TxIntention } from './types';\nimport { isCoinObjectType, isSameAddress, isSuiStructEqual } from './utils';\n\nexport function serializeIntention(intention: any) {\n  return JSON.stringify(intention, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value));\n}\n\n/**\n * Get all owner coins\n * @param client sui client\n * @param owner owner address\n * @param coinType coin type\n * @returns coins\n */\nexport async function getAllCoins(client: SuiClient, owner: SuiAddress, coinType: string | undefined) {\n  let hasNext = true;\n  let cursor: string | undefined | null;\n  const res: CoinStruct[] = [];\n  while (hasNext) {\n    const currentPage: PaginatedCoins = await client.getCoins({\n      owner,\n      coinType,\n      cursor,\n    });\n    res.push(...currentPage.data);\n    hasNext = currentPage.hasNextPage;\n    cursor = currentPage.nextCursor;\n  }\n  return res;\n}\n\nexport function deserializeIntention(value: string): TxIntention {\n  const intention = JSON.parse(value);\n  if (typeof intention !== 'object') {\n    throw new Error('Invalid intention');\n  }\n  return intention;\n}\n\nexport function buildRejectTxb(sender: SuiAddress) {\n  const block = new TransactionBlock();\n  block.setSender(sender);\n  return block;\n}\n\nexport async function buildCoinTransferTxb(client: SuiClient, intention: CoinTransferIntention, sender: SuiAddress) {\n  if (isSuiStructEqual(intention.coinType, SUI_COIN)) {\n    return buildSuiCoinTransferTxb(intention, sender);\n  }\n  return buildOtherCoinTransferTxb(client, intention, sender);\n}\n\nexport function buildSuiCoinTransferTxb(intention: CoinTransferIntention, sender: SuiAddress) {\n  const block = new TransactionBlock();\n  const [coin] = block.splitCoins(block.gas, [block.pure(intention.amount)]);\n  block.transferObjects([coin], block.pure(intention.recipient));\n  block.setSender(sender);\n  return block;\n}\n\nexport async function buildOtherCoinTransferTxb(\n  client: SuiClient,\n  intention: CoinTransferIntention,\n  sender: SuiAddress,\n) {\n  const objs = await getAllCoins(client, sender, intention.coinType);\n  if (objs.length === 0) {\n    throw new Error('No valid coin found to send');\n  }\n  const totalBal = objs.reduce((sum, coin) => sum + BigInt(coin.balance), 0n);\n  if (totalBal < BigInt(intention.amount)) {\n    throw new Error('Not enough balance');\n  }\n  const txb = new TransactionBlock();\n  const primary = txb.object(objs[0].coinObjectId);\n  if (objs.length > 1) {\n    txb.mergeCoins(\n      primary,\n      objs.slice(1).map((obj) => txb.object(obj.coinObjectId)),\n    );\n  }\n  const [coin] = txb.splitCoins(primary, [txb.pure(intention.amount)]);\n  txb.transferObjects([coin], txb.pure(intention.recipient));\n  txb.setSender(sender);\n  return txb;\n}\n\nexport async function buildObjectTransferTxb(\n  client: SuiClient,\n  intention: ObjectTransferIntention,\n  sender: SuiAddress,\n) {\n  await validateObjectTransfer(client, intention, sender);\n\n  const txb = new TransactionBlock();\n  txb.transferObjects([txb.object(intention.objectId)], txb.pure(intention.receiver));\n  txb.setSender(sender);\n\n  return txb;\n}\n\nasync function validateObjectTransfer(client: SuiClient, intention: ObjectTransferIntention, sender: SuiAddress) {\n  const obj = await client.getObject({\n    id: intention.objectId,\n    options: {\n      showType: true,\n      showOwner: true,\n    },\n  });\n\n  if (obj.data === undefined) {\n    throw new Error('Object not found');\n  }\n  if (!obj.data?.type) {\n    throw new Error('Object type is null');\n  }\n  if (!isSuiStructEqual(obj.data.type, intention.objectType)) {\n    throw new Error('Object type not expected');\n  }\n  if (isCoinObjectType(obj.data.type)) {\n    throw new Error('Can not transfer coin object in Object Transfer transactions');\n  }\n  const addressOwner = getAddressOwner(obj);\n  if (!isSameAddress(addressOwner, sender)) {\n    throw new Error('Object owner not match');\n  }\n}\n\nfunction getAddressOwner(object: SuiObjectResponse) {\n  const owner = object.data?.owner;\n  if (!owner) {\n    throw new Error('Object Owner not found');\n  }\n\n  if (typeof owner !== 'object' || !('AddressOwner' in owner)) {\n    throw new Error('Invalid object owner');\n  }\n  return owner.AddressOwner;\n}\n","export enum StreamStatus {\n  Streaming = 'streaming',\n  Completed = 'completed',\n  Canceled = 'canceled',\n  Settled = 'settled',\n}\n\nexport enum StreamEventType {\n  Create = 'create_stream',\n  Cancel = 'cancel_stream',\n  Claim = 'claim',\n  AutoClaim = 'auto_claim',\n  SetAutoClaim = 'set_auto_claim',\n}\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 CancelStreamIntentionData {\n  streamId: string;\n}\n\nexport interface ClaimByProxyStreamIntentionData {\n  streamId: string;\n}\n\nexport interface ClaimStreamIntentionData {\n  streamId: string;\n}\n\nexport interface CreateStreamIntentionData {\n  name: string;\n  coinType: string;\n  recipients: RecipientWithAmount[];\n  interval: bigint;\n  steps: bigint;\n  startTimeMs: bigint;\n  cancelable: boolean;\n}\n\nexport interface RecipientWithAmount {\n  address: string;\n  amountPerStep: bigint;\n  cliffAmount: bigint;\n}\n\nexport interface SetAutoClaimIntentionData {\n  streamId: string;\n  enabled: boolean;\n}\n","export enum RawStreamStatusEnum {\n  OPEN = 0,\n  COMPLETED = 1,\n  CANCELED = 16,\n  CANCELED_COMPLETED = 17,\n}\n\nexport interface EventStreamConfig {\n  amount_per_epoch: string;\n  cancelable: boolean;\n  cliff: string;\n  creator: string;\n  epoch_interval: string;\n  metadata: string;\n  recipient: string;\n  time_start: string;\n  total_epoch: string;\n}\n\nexport interface EventStreamStatus {\n  epoch_canceled: string;\n  epoch_claimed: string;\n  status: RawStreamStatusEnum;\n}\n\nexport interface EventCreateStream {\n  id: string;\n  balance: string;\n  coin: string;\n  config: EventStreamConfig;\n  status: EventStreamStatus;\n}\n","import { bcs } from '@mysten/sui.js/bcs';\n\nexport const metadataBcsType = {\n  groupId: 'string',\n  name: 'string',\n};\n\nexport interface StreamMetadata {\n  groupId: string;\n  name: string;\n}\n\nexport function decodeMetadata(metaStr: string) {\n  return bcs.de(metadataBcsType, metaStr, 'base64') as StreamMetadata;\n}\n","import { decodeMetadata } from '@/stream/metadata';\nimport { StreamEventType, StreamStatus } from '@/stream/types';\n\nexport class StreamHelper {\n  static decodeMetadata(metaStr: string) {\n    return decodeMetadata(metaStr);\n  }\n\n  static parseStreamStatus(rawStatus: number) {\n    switch (rawStatus) {\n      case 0:\n        return StreamStatus.Streaming;\n      case 1:\n        return StreamStatus.Completed;\n      case 16:\n        return StreamStatus.Canceled;\n      case 17:\n        return StreamStatus.Settled;\n      default:\n        throw new Error(`Unknown Stream Status: ${rawStatus}`);\n    }\n  }\n\n  static fullStreamEventType(packageId: string, eventType: StreamEventType) {\n    switch (eventType) {\n      case StreamEventType.Create:\n        return `${packageId}::stream::CreateEvent`;\n      case StreamEventType.Claim:\n        return `${packageId}::stream::ClaimEvent`;\n      case StreamEventType.Cancel:\n        return `${packageId}::stream::CancelEvent`;\n      case StreamEventType.SetAutoClaim:\n        return `${packageId}::stream::SetAutoClaimEvent`;\n      default:\n        throw new Error(`Unknown StreamEventType: ${eventType}`);\n    }\n  }\n}\n","import { PublicKey, SignatureScheme } from '@mysten/sui.js/cryptography';\n\nimport { StreamTransactionType } from './stream';\n\nexport type SuiAddress = string;\nexport type MessageType = 'TransactionBlock' | 'Personal';\nexport enum UserMSafeStatus {\n  active = 'ACTIVE',\n  pending = 'PENDING',\n  ignored = 'IGNORED',\n}\n\nexport interface IOwnerWithWeight {\n  address: string;\n  weight: number;\n}\n\nexport type IOwnerWithWeightPK = IOwnerWithWeight & {\n  publicKey: PublicKey;\n};\n\nexport interface PublicKeyWithWeight {\n  publicKey: PublicKey;\n  weight: number;\n}\n\nexport interface PublicKeyWithSchema {\n  publicKeyEncoded: string;\n  schema: SignatureScheme;\n}\n\nexport interface MSafeConfig extends MultiSigConfig {\n  name: string;\n  description?: string;\n}\n\nexport interface MultiSigConfig {\n  threshold: number;\n  ownersWithWeight: PublicKeyWithWeight[];\n  creationNonce: number | undefined;\n}\n\nexport interface CoinTransferIntention {\n  recipient: SuiAddress;\n  coinType: string;\n  amount: string;\n}\n\nexport interface ObjectTransferIntention {\n  receiver: SuiAddress;\n  objectType: string;\n  objectId: string;\n}\n\nexport interface PlainPayloadIntention {\n  payload: string;\n}\n\nexport interface RejectIntention {\n  txType: 'Reject';\n}\n\nexport interface CoinTransferPayload {\n  coinType: string;\n  to: string;\n  amount: bigint;\n}\n\nexport interface ObjectTransferPayload {\n  objectId: string;\n  objectVersion: string;\n  objectType: string;\n  to: string;\n}\n\nexport const TransactionDefaultApplication = 'msafe-core';\n\nexport enum TransactionType {\n  Assets = 'Assets',\n  NFT = 'NFT',\n  Account = 'Account',\n  Swap = 'Swap',\n  Staking = 'Staking',\n  Bridge = 'Bridge',\n  Ending = 'Ending',\n  Stream = 'Stream',\n  Other = 'Other',\n}\n\nexport const TransactionSubTypes = {\n  assets: {\n    coin: {\n      send: 'SendCoin',\n      receive: 'ReceiveCoin',\n    },\n    object: {\n      send: 'SendObject',\n      receive: 'ReceiveObject',\n    },\n  },\n  account: {\n    creation: 'CreateAccount',\n  },\n  others: {\n    plain: 'PlainTransaction',\n  },\n  stream: {\n    create: StreamTransactionType.CREATE_STREAM,\n    claim: StreamTransactionType.CLAIM,\n    claimByProxy: StreamTransactionType.CLAIM_BY_PROXY,\n    setAutoClaim: StreamTransactionType.SET_AUTO_CLAIM,\n    cancel: StreamTransactionType.CANCEL,\n  },\n};\n\nexport enum OpAddressBookType {\n  Delete = 'delete',\n  Upsert = 'upsert',\n}\n\nexport type UpdateAddressBookEntry = DeleteAddressBookEntry | UpsertAddressBookEntry;\n\nexport interface DeleteAddressBookEntry {\n  opType: OpAddressBookType.Delete;\n  address: string;\n}\n\nexport interface UpsertAddressBookEntry {\n  opType: OpAddressBookType.Upsert;\n  address: string;\n  addressName: string;\n  remark?: string;\n}\n\nexport type JWTToken = string;\n\nexport enum IntentionBuildStatus {\n  Success = 'SUCCESS',\n  Failed = 'FAILED',\n  New = 'NEW',\n}\n\nexport interface IMSafeConfig {\n  address: string;\n  name: string;\n  description?: string;\n  owners: IOwnerWithWeightPK[];\n  threshold: number;\n  creationNonce: number;\n}\n\nexport type TxIntention = CoinTransferIntention | ObjectTransferIntention | PlainPayloadIntention | any;\n\nexport interface AggregatedAssets {\n  coinType: string;\n  sum: bigint;\n  isReceive: boolean;\n}\n","import { SuiClient, TransactionBlockData } from '@mysten/sui.js/client';\nimport { normalizeSuiAddress, normalizeSuiObjectId, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { Coin } from '@/coin';\nimport { SUI_COIN, UNKNOWN_COIN } from '@/constants';\n\nimport { CoinTransferPayload, ObjectTransferPayload } from './types';\n\n/**\n * @deprecated Use TxParser instead.\n */\nexport class TransactionResponseDataDecoder {\n  constructor(private transactionData: TransactionBlockData) {}\n\n  // coin transfer composed of [MergeCoins], SplitCoins and TransferObjects\n  isCoinTransfer(): boolean {\n    const transactions =\n      this.transactionData.transaction.kind === 'ProgrammableTransaction'\n        ? this.transactionData.transaction.transactions\n        : null;\n\n    if (!transactions || transactions.length < 2 || transactions.length > 3) {\n      return false;\n    }\n\n    if (transactions.length === 2) {\n      return 'SplitCoins' in transactions[0] && 'TransferObjects' in transactions[1];\n    }\n\n    return 'SplitCoins' in transactions[1] && 'TransferObjects' in transactions[2];\n  }\n\n  isObjectTransfer(): boolean {\n    if (this.transactionData.transaction.kind !== 'ProgrammableTransaction') {\n      return false;\n    }\n    const { transactions } = this.transactionData.transaction;\n    if (transactions.length !== 1) {\n      return false;\n    }\n    return 'TransferObjects' in transactions[0] && transactions[0].TransferObjects != null;\n  }\n\n  async coinTransferInfo(suiClient: SuiClient): Promise<CoinTransferPayload> {\n    if (!this.isCoinTransfer()) {\n      throw new Error('Not a coin transfer');\n    }\n    if (this.transactionData.transaction.kind !== 'ProgrammableTransaction') {\n      throw new Error('Not a coin transfer');\n    }\n    const { transactions } = this.transactionData.transaction;\n    const { inputs } = this.transactionData.transaction;\n\n    const splitPayload = transactions.length === 2 ? transactions[0] : transactions[1];\n    const transferPayload = transactions.length === 2 ? transactions[1] : transactions[2];\n\n    if (!('SplitCoins' in splitPayload && 'TransferObjects' in transferPayload)) {\n      throw new Error('Not a coin transfer');\n    }\n\n    const splitAmount = TransactionResponseDataDecoder.decodePureInput(inputs, {\n      index: (splitPayload.SplitCoins[1][0] as { Input: number }).Input,\n    });\n    const toAddress = TransactionResponseDataDecoder.decodePureInput(inputs, {\n      index: (transferPayload.TransferObjects[1] as { Input: number }).Input,\n    });\n\n    let coinType = normalizeStructTag(SUI_COIN);\n    if (splitPayload.SplitCoins[0] !== 'GasCoin') {\n      const objectDecoded = TransactionResponseDataDecoder.decodeObjectInput(inputs, {\n        index: (splitPayload.SplitCoins[0] as { Input: number }).Input,\n      });\n      const objectInfo = await suiClient.tryGetPastObject({\n        id: objectDecoded.objectId,\n        version: objectDecoded.version,\n        options: { showType: true },\n      });\n      if (objectInfo.status === 'VersionFound') {\n        const foundCoinType = objectInfo.details.type;\n        const suiCoinType = Coin.getCoinType(foundCoinType);\n        coinType = suiCoinType ? normalizeStructTag(suiCoinType) : UNKNOWN_COIN;\n      }\n    }\n    return {\n      coinType,\n      amount: BigInt(splitAmount),\n      to: normalizeSuiAddress(toAddress),\n    };\n  }\n\n  async objectTransferInfo(suiClient: SuiClient): Promise<ObjectTransferPayload> {\n    if (!this.isObjectTransfer()) {\n      throw new Error('Not an object transfer');\n    }\n    if (this.transactionData.transaction.kind !== 'ProgrammableTransaction') {\n      throw new Error('Not an object transfer');\n    }\n\n    const { transactions, inputs } = this.transactionData.transaction;\n\n    const transactionPayload = transactions.pop();\n    const transferObjects = 'TransferObjects' in transactionPayload && transactionPayload.TransferObjects;\n\n    const toAddress = TransactionResponseDataDecoder.decodePureInput(inputs, {\n      index: (transferObjects[1] as { Input: number }).Input,\n    });\n\n    const transferObjectsInput = (transferObjects[0][0] as any).Input as number;\n    if (transferObjectsInput >= 0) {\n      const objectDecoded = TransactionResponseDataDecoder.decodeObjectInput(inputs, {\n        index: transferObjectsInput,\n      });\n\n      const objectInfo = await suiClient.tryGetPastObject({\n        id: objectDecoded.objectId,\n        version: objectDecoded.version,\n        options: { showType: true },\n      });\n\n      return {\n        objectId: normalizeSuiObjectId(objectDecoded.objectId),\n        objectVersion: objectDecoded.version.toString(),\n        objectType: objectInfo.status === 'VersionFound' ? objectInfo.details.type : '',\n        to: normalizeSuiAddress(toAddress),\n      };\n    }\n    if (transferObjects[0][0] === 'GasCoin') {\n      return {\n        objectId: normalizeSuiObjectId('0x2'),\n        objectVersion: '0',\n        objectType: normalizeSuiObjectId('0x2'),\n        to: normalizeSuiAddress(toAddress),\n      };\n    }\n    throw new Error('invliad object transfer tx');\n  }\n\n  static decodeObjectInput(inputs: any, param: { index: number }) {\n    const input = inputs[param.index];\n    return {\n      objectId: normalizeSuiObjectId(input.objectId),\n      version: parseInt(input.version ?? input.initialSharedVersion, 10),\n    };\n  }\n\n  static decodePureInput(inputs: any, param: { index: number }) {\n    const input = inputs[param.index];\n    return input.value;\n  }\n}\n","import { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n  private _client: SuiClient;\n\n  private _queryCache: Map<string, Promise<CoinMetadata>>;\n\n  private _coinMetaReg: Map<string, CoinMetadata>;\n\n  constructor(client: SuiClient) {\n    this._client = client;\n    this._queryCache = new Map();\n    this._coinMetaReg = new Map();\n  }\n\n  async getCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n    const normalized = normalizeStructTag(coinType);\n    if (this._coinMetaReg.has(normalized)) {\n      return this._coinMetaReg.get(normalized);\n    }\n\n    if (!this._queryCache.has(normalized)) {\n      this._queryCache.set(\n        normalized,\n        this.queryCoinMeta(normalized).then((meta) => {\n          if (meta) {\n            this._coinMetaReg.set(normalized, meta);\n          }\n          return meta;\n        }),\n      );\n    }\n\n    return this._queryCache.get(normalized);\n  }\n\n  private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n    const res = await this._client.getCoinMetadata({ coinType });\n    return res || undefined;\n  }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n  /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n  static isCoin(type: string | undefined | null): boolean {\n    if (!type) {\n      return false;\n    }\n    return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n  }\n\n  static getCoinType(type: string) {\n    const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n    return res || null;\n  }\n\n  static getBalance(data: SuiObjectData): bigint | undefined {\n    if (!Coin.isCoin(data.type)) {\n      return undefined;\n    }\n    if (data.content?.dataType !== 'moveObject') {\n      return undefined;\n    }\n    const { balance } = data.content?.fields as any;\n    if (balance === undefined) {\n      return undefined;\n    }\n    return BigInt(balance);\n  }\n}\n","import { TransactionStatus } from './transaction';\n\nexport const API_SIGNATURE_KEY_HEADER = 'Authorization-Signature';\n\nexport interface ISetCheckpointReq {\n  checkpoint: string;\n}\n\nexport interface IGetCheckpointResp {\n  checkpoint: string;\n}\n\nexport interface IExistMSafeResp {\n  exist: boolean;\n}\n\nexport interface IProcessTransactionRequest {\n  digest: string;\n  status: TransactionStatus;\n  executedAt: Date;\n}\n\nexport interface IProcessCoinTransferRequest {\n  digest: string;\n  msafeAddress: string;\n  coinType: string;\n  amount: string;\n  sender: string;\n  receiver: string;\n  executedAt: Date;\n}\n\nexport interface IProcessObjectTransferRequest {\n  digest: string;\n  msafeAddress: string;\n  objectId: string;\n  objectVersion: string;\n  objectType: string;\n  sender: string;\n  receiver: string;\n  executedAt: Date;\n}\n","import { HistoryTransaction, PendingTransaction, TransactionIntention } from '@msafe/sui3-model/core';\nimport { DryRunTransactionBlockResponse, GasCostSummary } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport {\n  CoinTransferIntention,\n  ObjectTransferIntention,\n  PlainPayloadIntention,\n  SuiAddress,\n  TransactionType,\n  TxIntention,\n} from '@/types';\n\nimport { IMSafeInfoResp } from './msafe';\nimport { IPagedResult } from './page';\n\nexport enum TransactionStatus {\n  SUCCESS = 'SUCCESS',\n  FAILED = 'FAILED',\n  REJECTED = 'REJECTED',\n}\n\nexport enum TransactionIntentionStatus {\n  NEW = 'NEW',\n  SUCCESS = 'SUCCESS',\n  FAILED = 'FAILED',\n}\n\nexport interface IMSafeAddressRequest {\n  msafeAddress: string;\n}\n\nexport interface IGetSequenceNumberRequest extends IMSafeAddressRequest {}\n\nexport interface IGetPendingTransactionRequest extends IMSafeAddressRequest {}\n\nexport interface IGetHistoryTransactionsRequest extends IMSafeAddressRequest {\n  page?: string;\n  limit?: string;\n}\n\nexport interface IGetIntentionsRequest extends IGetHistoryTransactionsRequest {}\n\nexport interface GetPendingTransactionResponse {\n  pending?: PendingTransactionItem;\n  reject?: PendingTransactionItem;\n}\n\nexport interface GetHistoryTransactionsResponse extends IPagedResult<HistoryTransactionItem> {}\n\nexport interface GetTransactionIntentionsResponse extends IPagedResult<TransactionIntentionItem> {}\n\nexport interface IProposeIntentionRequest {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  intention: TxIntention;\n  sequenceNumber: number;\n  msafeAddress: string;\n  signature: SerializedSignature;\n}\n\nexport interface IProposeIntentionAndBuildAndVoteRequest extends IGasOption {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  intention: TxIntention;\n  sequenceNumber: number;\n  msafeAddress: string;\n  signature: SerializedSignature;\n  forceBuild: boolean;\n  payload: string;\n  digest: string;\n}\n\nexport interface ISimulateIntentionRequest {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  intention: TxIntention;\n}\n\nexport interface SimulateIntentionResponse {\n  success: boolean;\n  message: string;\n  gasPrice: bigint;\n  gasUsed: GasCostSummary;\n  result: DryRunTransactionBlockResponse;\n}\n\nexport interface ISkipIntentionRequest extends IMSafeAddressRequest {}\n\nexport type IBuildTransactionRequest = IMSafeAddressRequest & IGasOption & { forceBuild: boolean };\n\nexport interface IVoteTransactionRequest {\n  msafeAddress: string;\n  digest: string;\n  signature: string;\n}\n\nexport type IRejectTransactionRequest = IVoteTransactionRequest & IGasOption & { forceBuild: boolean };\n\nexport type PendingTransactionItem = Omit<PendingTransaction, 'id' | 'updateAt' | 'isRejectTx'> & {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  intention?: TxIntention;\n  votes: PendingVote[];\n};\n\nexport type HistoryTransactionItem = HistoryTransactionSendItem | HistoryTransactionReceiveItem;\n\nexport type HistoryTransactionSendItem = Omit<HistoryTransaction, 'id' | 'updateAt'> & {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  isSendTx: true;\n  approveVotes: HistoryVote[];\n  rejectVotes: HistoryVote[];\n  intention: CoinTransferIntentionItem | ObjectTransferIntentionItem | PlainPayloadIntentionItem | OtherIntentionItem;\n};\n\nexport type HistoryTransactionReceiveItem = {\n  application: string;\n  txType: TransactionType;\n  txSubType: string;\n  isSendTx: false;\n  type: 'ReceiveCoin' | 'ReceiveObject' | 'CreateAccount';\n  digest: string;\n  sender: string;\n  executedAt: Date;\n  data: CoinReceiveType | ObjectReceiveType | CreateAccountType;\n};\n\nexport type CoinTransferIntentionItem = {\n  txType: TransactionType.Assets;\n  txSubType: 'SendCoin';\n} & CoinTransferIntention;\n\nexport type ObjectTransferIntentionItem = {\n  txType: TransactionType.Assets;\n  txSubType: 'SendObject';\n} & ObjectTransferIntention;\n\nexport type PlainPayloadIntentionItem = {\n  txType: TransactionType.Other;\n  txSubType: 'PlainPayload';\n} & PlainPayloadIntention;\n\nexport type OtherIntentionItem = {\n  txType: TransactionType;\n  txSubType: string;\n} & TxIntention;\n\nexport type CoinReceiveType = {\n  sender: string;\n  receiver: string;\n  coinType: string;\n  amount: string;\n};\n\nexport type ObjectReceiveType = {\n  sender: string;\n  receiver: string;\n  objectType: string;\n  objectId: string;\n};\n\nexport type CreateAccountType = IMSafeInfoResp;\n\nexport type TransactionIntentionItem = Omit<TransactionIntention, 'id' | 'updateAt'> & {\n  intentionId: string;\n  intention: TxIntention;\n};\n\nexport type PendingVote = HistoryVote & {\n  signature: string;\n};\n\nexport interface HistoryVote {\n  userAddress: SuiAddress;\n  timestamp: Date;\n}\n\nexport interface IGasOption {\n  gasPrice: bigint;\n  gasBudget: bigint;\n}\n","import { normalizeSuiAddress } from '@mysten/sui.js/utils';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\nimport sortKeys from 'sort-keys-recursive';\n\nimport { UpdateAddressBookEntry } from '@/types';\nimport { stringToBuffer } from '@/utils';\n\n/**\n * MessageHelper defines messages to be signed by single signer wallet\n */\nexport class SigningMessageHelper {\n  static createMSafeMessage(msafeAddress: string): string {\n    return `Create MSafe Account: ${msafeAddress}`;\n  }\n\n  static loginMessageWithTimestamp(timestamp: string) {\n    return `Welcome to MSafe. ${timestamp}`;\n  }\n\n  static loginMessage() {\n    return SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n  }\n\n  static decodeLoginMessageTimestamp(message: string) {\n    const regex = /Welcome to MSafe. (.+)/;\n    const matches = message.match(regex);\n    return matches ? matches[1] : undefined;\n  }\n\n  static proposeIntentionMessage(input: { intention: any; sn: number; msafeAddress: string }) {\n    const sortedInput = sortKeys(input);\n    const message = JSON.stringify(sortedInput, (_, value) =>\n      typeof value === 'bigint' ? `${value.toString()}n` : value,\n    );\n    const hash = sha256(message);\n    const hashStr = bytesToHex(hash);\n    return `Submit a new transaction proposal [${input.sn}]: ${hashStr}`;\n  }\n\n  static updateAddressBookMessage(updates: UpdateAddressBookEntry[]) {\n    const sortedUpdates = updates\n      .map((update) => ({\n        ...update,\n        address: normalizeSuiAddress(update.address),\n      }))\n      .map((update) => SigningMessageHelper.sortObjectKeys(update));\n    const raw = JSON.stringify(\n      sortedUpdates,\n      (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value),\n      2,\n    );\n    const encoded = stringToBuffer(raw);\n    if (encoded.length <= 1000) {\n      // BCS signing can handle this amount of data, directly return\n      return `Address book entry update: ${raw}`;\n    }\n    return `Bulk address book update: ${sha256(raw)}`;\n  }\n\n  private static sortObjectKeys(obj: Record<string, any>): Record<string, any> {\n    return Object.keys(obj)\n      .sort()\n      .reduce((result, key) => ({ ...result, [key]: obj[key] }), {} as Record<string, any>);\n  }\n}\n","import { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\nimport sortKeys from 'sort-keys-recursive';\n\nexport enum SyncField {\n  // TODO: Reduce to checkpoint or processed\n  checkpoint = 'syncCheckpoint',\n}\n\nexport class SyncApiService {\n  signPayload<T>(input: { payload: T; secretKey: string }): { payload: T; signature: string } {\n    const { payload, secretKey } = input;\n    const sortedPayload = sortKeys(payload);\n    const signingMessage = `${JSON.stringify(sortedPayload, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))}::${secretKey}`;\n    const hash = sha256(signingMessage);\n    const signature = bytesToHex(hash);\n    return {\n      payload,\n      signature,\n    };\n  }\n\n  verify<T>(input: { payload: T; secretKey: string; signature: string }): boolean {\n    const { payload, secretKey, signature } = input;\n    const result = this.signPayload({ payload, secretKey });\n    return result.signature === signature;\n  }\n}\n","export enum IssueType {\n  Bug = 'Bug',\n  Feature = 'Feature',\n  Support = 'Support',\n  Auto = 'Auto',\n}\n\nexport enum ContactType {\n  Email = 'Email',\n  Telegram = 'Telegram',\n  Discord = 'Discord',\n  Phone = 'Phone',\n}\n\nexport interface Report {\n  reportType: IssueType;\n  summary: string; // Summary of the issue\n  description?: string;\n\n  userAddress?: string;\n  msafeAddress?: string;\n  stack?: string;\n\n  contactType: ContactType;\n  contact: string;\n}\n","export enum AddressBookMode {\n  Unknown = 'unknown',\n  Local = 'local',\n  Remote = 'remote',\n}\n\nexport const ADDRESS_BOOK_SETTING_KEY = 'address-book-mode';\n","import { SuiCallArg, SuiTransactionBlockResponse, SuiArgument, SuiClient } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { ParsedCoinTransfer, ParsedObjectTransfer, ParsedTransaction } from '@/transactions/tx-types';\nimport { isCoinObjectType } from '@/utils';\n\n// TODO: TxParser can be made into a more generalized framework\nexport class TxParser {\n  static async fetchAndParse(suiClient: SuiClient, digest: string): Promise<ParsedTransaction | undefined> {\n    const resp = await suiClient.getTransactionBlock({\n      digest,\n      options: {\n        showBalanceChanges: true,\n        showInput: true,\n        showEffects: true,\n        showEvents: true,\n        showObjectChanges: true,\n        showRawInput: true,\n      },\n    });\n\n    return this.parse(resp);\n  }\n\n  static parse(resp: SuiTransactionBlockResponse): ParsedTransaction | undefined {\n    const coinPayload = this.parseCoinTransfer(resp);\n    if (coinPayload) {\n      return coinPayload;\n    }\n\n    return this.parseObjectTransfer(resp);\n  }\n\n  static parseCoinTransfer(resp: SuiTransactionBlockResponse): ParsedCoinTransfer | undefined {\n    const transactionData = resp.transaction?.data;\n    if (!transactionData || transactionData.transaction.kind !== 'ProgrammableTransaction') {\n      return undefined;\n    }\n    const { transactions, inputs } = transactionData.transaction;\n    const isCoinTransfer = transactions.reduce(\n      (res, tx) => res && ('TransferObjects' in tx || 'SplitCoins' in tx || 'MergeCoins' in tx),\n      true,\n    );\n    if (!isCoinTransfer) {\n      return undefined;\n    }\n\n    const recipients = (\n      transactions.filter((tx) => 'TransferObjects' in tx) as { TransferObjects: [SuiArgument[], SuiArgument] }[]\n    ).map((tx) => {\n      const [, recipient] = tx.TransferObjects;\n      return this.getPureAddress(inputs, recipient);\n    });\n\n    if (new Set(recipients).size !== 1) {\n      return undefined;\n    }\n    const recipient = recipients[0];\n    if (!resp.balanceChanges) {\n      return undefined;\n    }\n    const recBalChange = resp.balanceChanges.filter(\n      (change) =>\n        typeof change.owner !== 'string' && 'AddressOwner' in change.owner && change.owner.AddressOwner === recipient,\n    );\n    if (recBalChange.length !== 1) {\n      return undefined;\n    }\n\n    return {\n      type: 'coin_transfer',\n      from: transactionData.sender,\n      to: recipient,\n      amount: recBalChange[0].amount,\n      coinType: normalizeStructTag(recBalChange[0].coinType),\n    };\n  }\n\n  static parseObjectTransfer(resp: SuiTransactionBlockResponse): ParsedObjectTransfer | undefined {\n    const transactionData = resp.transaction?.data;\n    if (!transactionData || transactionData.transaction.kind !== 'ProgrammableTransaction') {\n      return undefined;\n    }\n    const { transactions, inputs } = transactionData.transaction;\n    if (transactions.length !== 1 || !('TransferObjects' in transactions[0])) {\n      return undefined;\n    }\n    const transferArgs = transactions[0].TransferObjects;\n\n    const toAddress = this.getPureAddress(inputs, transferArgs[1]);\n    const objIds = transferArgs[0].map((arg) => this.getOwnedObject(inputs, arg));\n    const from = transactionData.sender;\n    if (!toAddress || objIds.indexOf(undefined) !== -1) {\n      return undefined;\n    }\n\n    const objects = objIds\n      .map((id) => {\n        const found = resp.objectChanges.find((change) => change.type === 'mutated' && change.objectId === id);\n        if (found && found.type === 'mutated' && !!found.objectType && !isCoinObjectType(found.objectType)) {\n          return {\n            objectId: id,\n            version: found.version,\n            type: normalizeStructTag(found.objectType),\n          };\n        }\n        return undefined;\n      })\n      .filter((object) => !!object);\n\n    return objects\n      ? {\n          type: 'object_transfer',\n          from,\n          to: toAddress,\n          objects,\n        }\n      : undefined;\n  }\n\n  private static getOwnedObject(inputs: SuiCallArg[], arg: SuiArgument): string {\n    const input = this.getInput(inputs, arg);\n    if (!input || input.type !== 'object' || input.objectType !== 'immOrOwnedObject') {\n      return undefined;\n    }\n    return input.objectId;\n  }\n\n  private static getPureAddress(inputs: SuiCallArg[], arg: SuiArgument): string {\n    const input = this.getInput(inputs, arg);\n    if (!input || input.type !== 'pure' || input.valueType !== 'address') {\n      return undefined;\n    }\n    return input.value as string;\n  }\n\n  private static getInput(inputs: SuiCallArg[], arg: SuiArgument) {\n    if (typeof arg === 'string' || !('Input' in arg)) {\n      return undefined;\n    }\n    return inputs[arg.Input];\n  }\n}\n"],"mappings":"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","names":["SIGNATURE_FLAG_TO_SCHEME","Ed25519PublicKey","Secp256k1PublicKey","Secp256r1PublicKey","MultiSigPublicKey","Ed25519PublicKey","SIGNATURE_FLAG_TO_SCHEME","Ed25519PublicKey","Secp256k1PublicKey","Secp256r1PublicKey","MultiSigPublicKey","coin","StreamStatus","StreamEventType","StreamTransactionType","RawStreamStatusEnum","UserMSafeStatus","TransactionType","OpAddressBookType","IntentionBuildStatus","normalizeSuiAddress","normalizeStructTag","normalizeStructTag","normalizeStructTag","normalizeSuiAddress","TransactionStatus","TransactionIntentionStatus","normalizeSuiAddress","normalizeSuiAddress","sha256","bytesToHex","sortKeys","SyncField","IssueType","ContactType","AddressBookMode","normalizeStructTag","recipient","normalizeStructTag"]}