@msafe/sui3-sdk 1.0.21 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/gasFunding.ts","../src/utils/coinReservation.ts","../src/utils/sui.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/transaction.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk as unknown as PublicKey);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as unknown as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n } as unknown as MultiSigConfig;\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: string) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as never),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { fromHex, normalizeStructTag, toHex } from '@mysten/sui/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { prepareGasFunding } from '@/utils/gasFunding';\nimport { BatchObjectOptions, getAllOwnedObjects, type OwnedObjectData } from '@/utils/iter/object';\nimport { getIntentionContent, toSuiTransaction, transactionFromContent } from '@/utils/transaction';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances: { coinType: string; addressBalance: string }[] = [];\n let cursor: string | null = null;\n let hasNext = true;\n while (hasNext) {\n const page = await this.suiClient.listBalances({ owner: this.address, cursor, limit: 50 });\n balances.push(...page.balances);\n hasNext = page.hasNextPage;\n cursor = page.cursor;\n }\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(balance.addressBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<OwnedObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (obj: OwnedObjectData) => !obj?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(\n request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {\n txb?: Transaction;\n },\n ) {\n const txb = await this.buildTxFromIntention(request);\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {\n txb?: Transaction;\n },\n ): Promise<void> {\n const txb = await this.buildTxFromIntention(input);\n txb.setGasPrice(input.gasPrice);\n txb.setSender(this.address);\n await prepareGasFunding({\n tx: txb,\n suiClient: this.globals.suiClient,\n owner: this.address,\n gasPrice: input.gasPrice,\n gasBudget: input.gasBudget,\n });\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n return this.backend.proposeIntentionAndBuildVote({\n ...input,\n payload: toHex(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = Transaction.from(intention.payload);\n\n const data = tb.getData();\n if (!data.sender || !isSameAddress(data.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = toSuiTransaction(buildRejectTxb(this.address));\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n // API independently rebuilds via buildRejectTxb() + build() and compares digest.\n // Do not set gas / prepareGasFunding here — that changes payment and breaks the check.\n const rejectTxb = toSuiTransaction(buildRejectTxb(this.address));\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const txb = await this.buildTxFromIntention({\n application: intention.application,\n intention: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: string[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransaction({\n transaction: HexToUint8Array(payload),\n signatures: [multiSignature],\n include: { effects: true, events: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n /**\n * Resolve a Transaction from propose/simulate input.\n * 1. Caller-supplied `txb` (generic store path — do not rebuild).\n * 2. Registered app helper `build`.\n * 3. Unregistered app: restore from `intention.content` (JSON or hex).\n */\n private async buildTxFromIntention(input: {\n application: string;\n txType: TransactionType;\n txSubType: string;\n intention: unknown;\n txb?: Transaction;\n }): Promise<Transaction> {\n if (input.txb) {\n return input.txb;\n }\n\n let appHelper: ReturnType<typeof appHelpers.getAppHelper> | undefined;\n try {\n appHelper = appHelpers.getAppHelper(input.application);\n } catch {\n appHelper = undefined;\n }\n\n if (appHelper) {\n return toSuiTransaction(\n await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHex(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n }),\n );\n }\n\n const content = getIntentionContent(input.intention);\n if (content != null) {\n return transactionFromContent(content);\n }\n\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import type { SuiClientTypes } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport type { GasObjectReference, SimulationResult, SimulateDryRunResponse } from '@/types';\nimport { computeGasBudget, prepareGasFunding } from '@/utils/gasFunding';\n\nexport { computeGasBudget, InsufficientGasFundsError } from '@/utils/gasFunding';\n\nfunction formatExecutionError(error: SuiClientTypes.ExecutionError): string {\n return error.message;\n}\n\nfunction gasObjectToReference(gas: SuiClientTypes.ChangedObject | null | undefined): GasObjectReference {\n if (!gas?.objectId) {\n throw new Error('Gas object missing from simulation effects');\n }\n const version = gas.outputVersion ?? gas.inputVersion ?? '0';\n const digest = gas.outputDigest ?? gas.inputDigest ?? '';\n return { objectId: gas.objectId, version, digest };\n}\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: Transaction; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransaction(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n tx.setSender(input.sender);\n\n try {\n // Resolve budget (no storageRebate) and select classic / address-balance / mixed top-up.\n await prepareGasFunding({\n tx,\n suiClient,\n owner: input.sender,\n gasPrice,\n });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n\n let built: Uint8Array;\n try {\n built = await tx.build({ client: suiClient });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n\n let inspectResult: SimulateDryRunResponse;\n try {\n inspectResult = await suiClient.simulateTransaction({\n transaction: built,\n include: {\n effects: true,\n balanceChanges: true,\n events: true,\n objectTypes: true,\n transaction: true,\n bcs: true,\n commandResults: true,\n },\n });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n const txRow = inspectResult.Transaction ?? inspectResult.FailedTransaction;\n const { effects } = txRow;\n if (!effects) {\n throw new Error('simulateTransaction did not return effects');\n }\n const success = effects.status.success === true;\n\n if (!success) {\n const err = effects.status.success === false ? effects.status.error : null;\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: err ? formatExecutionError(err) : 'Simulation failed',\n };\n }\n const gasBudget = this.toGasBudget(effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: gasObjectToReference(effects.gasObject),\n gasUsed: effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n const { referenceGasPrice } = await this.globals.suiClient.getReferenceGasPrice();\n return BigInt(referenceGasPrice);\n }\n\n private toGasBudget(gasUsed: SuiClientTypes.GasCostSummary, gasPrice: bigint) {\n return computeGasBudget(gasUsed, gasPrice);\n }\n\n private copyTransaction(tx: Transaction): Transaction {\n return Transaction.from(tx);\n }\n}\n","import type { SuiClientTypes } from '@mysten/sui/client';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeStructTag, normalizeSuiObjectId } from '@mysten/sui/utils';\n\nimport { createCoinReservationRef } from '@/utils/coinReservation';\nimport { getAllCoins, SUI_COIN } from '@/utils/sui';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport type GasFundingMode = 'classic' | 'addressBalance' | 'mixedTopUp';\n\nexport interface GasFundingResult {\n mode: GasFundingMode;\n gasBudget: bigint;\n coinBalance: bigint;\n addressBalance: bigint;\n}\n\nexport class InsufficientGasFundsError extends Error {\n readonly gasBudget: bigint;\n\n readonly coinBalance: bigint;\n\n readonly addressBalance: bigint;\n\n constructor(gasBudget: bigint, coinBalance: bigint, addressBalance: bigint) {\n const total = coinBalance + addressBalance;\n super(\n `Insufficient gas funds: need ${gasBudget}, have coinBalance=${coinBalance} + addressBalance=${addressBalance} = ${total}`,\n );\n this.name = 'InsufficientGasFundsError';\n this.gasBudget = gasBudget;\n this.coinBalance = coinBalance;\n this.addressBalance = addressBalance;\n }\n}\n\n/**\n * Gas budget must cover pre-rebate costs (computation + storage + overhead).\n * storageRebate is refunded after execution and must not reduce the budget.\n */\nexport function computeGasBudget(\n gasUsed: Pick<SuiClientTypes.GasCostSummary, 'computationCost' | 'storageCost'>,\n gasPrice: bigint,\n): bigint {\n const { computationCost, storageCost } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n return BigInt(computationCost) + BigInt(storageCost) + safeOverhead;\n}\n\ntype PaymentCoinRef = { objectId: string; version: string; digest: string; balance: bigint };\n\ninterface SuiGasFunding {\n paymentCoins: PaymentCoinRef[];\n coinBalance: bigint;\n addressBalance: bigint;\n total: bigint;\n}\n\nfunction collectUsedObjectIds(tx: Transaction): Set<string> {\n return tx.getData().inputs.reduce<Set<string>>((used, input) => {\n const immOrOwned = input.Object?.ImmOrOwnedObject?.objectId;\n if (immOrOwned) {\n used.add(normalizeSuiObjectId(immOrOwned));\n return used;\n }\n const unresolved = input.UnresolvedObject?.objectId;\n if (unresolved) {\n used.add(normalizeSuiObjectId(unresolved));\n }\n return used;\n }, new Set<string>());\n}\n\n/**\n * Mysten CoinWithBalance with useGasCoin=false (type is 0x2::sui::SUI, not \"gas\")\n * loads every unused SUI coin as a mutable input at resolve time. Those coins\n * cannot also be gas payment or the node rejects:\n * \"Mutable object ... cannot appear more than one in one transaction\".\n */\nfunction txConsumesOwnedSuiCoins(tx: Transaction): boolean {\n return tx.getData().commands.some((cmd) => {\n if (cmd.$kind !== '$Intent' || cmd.$Intent.name !== 'CoinWithBalance') {\n return false;\n }\n const type = (cmd.$Intent.data as { type?: string } | undefined)?.type;\n if (!type || type === 'gas') {\n return false;\n }\n try {\n return normalizeStructTag(type) === normalizeStructTag(SUI_COIN);\n } catch {\n return false;\n }\n });\n}\n\nasync function loadSuiGasFunding(suiClient: SuiGrpcClient, owner: string, tx: Transaction): Promise<SuiGasFunding> {\n const usedObjectIds = collectUsedObjectIds(tx);\n const [coins, balanceRes] = await Promise.all([\n getAllCoins({ suiClient, owner, coinType: SUI_COIN }),\n suiClient.getBalance({ owner, coinType: SUI_COIN }),\n ]);\n\n const addressBalance = BigInt(balanceRes.balance.addressBalance);\n\n // Intent will take every owned SUI coin at resolve time — leave them off gas payment.\n if (txConsumesOwnedSuiCoins(tx)) {\n return {\n paymentCoins: [],\n coinBalance: 0n,\n addressBalance,\n total: addressBalance,\n };\n }\n\n const paymentCoins = coins\n .filter((coin) => !usedObjectIds.has(normalizeSuiObjectId(coin.objectId)) && BigInt(coin.balance) > 0n)\n .map((coin) => ({\n objectId: coin.objectId,\n version: coin.version,\n digest: coin.digest,\n balance: BigInt(coin.balance),\n }));\n\n const coinBalance = paymentCoins.reduce((sum, coin) => sum + coin.balance, 0n);\n return {\n paymentCoins,\n coinBalance,\n addressBalance,\n total: coinBalance + addressBalance,\n };\n}\n\nfunction toObjectRefs(coins: PaymentCoinRef[]) {\n return coins.map(({ objectId, version, digest }) => ({ objectId, version, digest }));\n}\n\n/**\n * Top up classic gas payment from address balance via compatibility coin reservation.\n *\n * Protocol gas-smashing (real Coin listed first): the reservation is withdrawn from\n * address balance into that gas coin — the gas-payment equivalent of redeem_funds +\n * mergeCoins into the primary gas coin, and it satisfies the upfront gas-budget check.\n * (A PTB-only redeem+merge cannot fund gasBudget > coinBalance because budget is\n * checked against gas payment before commands execute.)\n */\nasync function applyMixedTopUp(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n paymentCoins: PaymentCoinRef[];\n topUpAmount: bigint;\n}): Promise<void> {\n const { tx, suiClient, owner, paymentCoins, topUpAmount } = input;\n if (paymentCoins.length === 0) {\n throw new Error('mixed gas top-up requires at least one SUI coin object');\n }\n if (topUpAmount <= 0n) {\n tx.setGasPayment(toObjectRefs(paymentCoins));\n return;\n }\n\n const [{ chainIdentifier }, { systemState }] = await Promise.all([\n suiClient.core.getChainIdentifier(),\n suiClient.core.getCurrentSystemState(),\n ]);\n\n const reservation = createCoinReservationRef(topUpAmount, owner, chainIdentifier, systemState.epoch);\n\n // Real Coin first so reservation is smashed into the gas coin (not into address balance).\n tx.setGasPayment([...toObjectRefs(paymentCoins), reservation]);\n}\n\n/**\n * Select gas funding before tx.build() according to mixed coin/addressBalance policy:\n * 1) budget without storageRebate (caller supplies computeGasBudget result)\n * 2-3) fail if total < budget\n * 4) coins exist and coinBal >= budget → classic setGasPayment(coins)\n * 5) coins exist and total >= budget → mixed top-up via coin reservation\n * 6) no usable coins and addrBal >= budget → Address Balance gas (payment: [])\n */\nexport async function selectGasFunding(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasBudget: bigint;\n}): Promise<GasFundingResult> {\n const { tx, suiClient, owner, gasBudget } = input;\n const { payment } = tx.getData().gasData;\n\n // Only respect an explicit *classic* gas payment (non-empty ObjectRefs).\n // Do NOT respect payment: [] — Mysten auto-pick and plain-tx\n // Transaction.from(builtHex) often bake address-balance gas; respecting it\n // skips re-selection and fails InsufficientGas under a tight budget.\n // Selection below always overwrites payment via setGasPayment(...).\n if (payment != null && payment.length > 0) {\n const funding = await loadSuiGasFunding(suiClient, owner, tx);\n return {\n mode: 'classic',\n gasBudget,\n coinBalance: funding.coinBalance,\n addressBalance: funding.addressBalance,\n };\n }\n\n const funding = await loadSuiGasFunding(suiClient, owner, tx);\n const { paymentCoins, coinBalance, addressBalance, total } = funding;\n\n if (total < gasBudget) {\n throw new InsufficientGasFundsError(gasBudget, coinBalance, addressBalance);\n }\n\n // Prefer classic / mixed whenever owned SUI coins exist. Pure address-balance\n // gas (payment: []) is stricter on budget and is what Mysten auto-picks when\n // addressBalance > 0 — avoid it unless there is no usable gas coin.\n if (paymentCoins.length > 0 && coinBalance >= gasBudget) {\n tx.setGasPayment(toObjectRefs(paymentCoins));\n return { mode: 'classic', gasBudget, coinBalance, addressBalance };\n }\n\n if (paymentCoins.length > 0 && total >= gasBudget) {\n const topUpAmount = gasBudget - coinBalance; // > 0 and <= addressBalance\n await applyMixedTopUp({\n tx,\n suiClient,\n owner,\n paymentCoins,\n topUpAmount,\n });\n return { mode: 'mixedTopUp', gasBudget, coinBalance, addressBalance };\n }\n\n if (addressBalance >= gasBudget) {\n tx.setGasPayment([]);\n return { mode: 'addressBalance', gasBudget, coinBalance, addressBalance };\n }\n\n throw new InsufficientGasFundsError(gasBudget, coinBalance, addressBalance);\n}\n\n/**\n * Estimate gas budget (no storageRebate) using a probe build/simulate.\n * Prefers classic coin gas when coin objects exist so the estimate matches the\n * cheaper payment path. Budget is left unset so Mysten can dry-run with MAX_GAS\n * overrides (avoids locking the full balance away from GasCoin splits).\n */\n/**\n * Clone a tx with gas budget/payment/expiration cleared.\n * Needed because Mysten treats budget \"0\" as set (truthy) and skips re-estimation,\n * and app-store helper.build() often pre-builds with payment:[] + budget:\"0\".\n */\nfunction cloneWithClearedGasConfig(tx: Transaction): Transaction {\n const data = structuredClone(tx.getData()) as {\n version: number;\n sender: string | null;\n expiration: unknown;\n gasData: {\n budget: string | null;\n price: string | null;\n owner: string | null;\n payment: unknown;\n };\n inputs: unknown;\n commands: unknown;\n };\n data.gasData.budget = null;\n data.gasData.price = null;\n data.gasData.payment = null;\n // Address-balance gas bakes ValidDuring; clear so classic gas probe is valid.\n data.expiration = null;\n return Transaction.from(JSON.stringify(data));\n}\n\nfunction isPositiveBudget(budget: string | number | bigint | null | undefined): boolean {\n if (budget == null) {\n return false;\n }\n try {\n return BigInt(budget) > 0n;\n } catch {\n return false;\n }\n}\n\nexport async function estimateGasBudget(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasPrice: bigint;\n}): Promise<bigint> {\n const { tx, suiClient, owner, gasPrice } = input;\n const funding = await loadSuiGasFunding(suiClient, owner, tx);\n if (funding.total <= 0n) {\n throw new InsufficientGasFundsError(0n, funding.coinBalance, funding.addressBalance);\n }\n\n const { budget, payment } = tx.getData().gasData;\n // app-store / Mysten pre-build can leave payment:[] with budget \"0\".\n // Mysten's setGasBudget skips when budget is the string \"0\" (truthy), so clear first.\n const mustResetGas = (payment != null && payment.length === 0) || (budget != null && !isPositiveBudget(budget));\n const probe = mustResetGas ? cloneWithClearedGasConfig(tx) : Transaction.from(tx);\n probe.setSender(owner);\n probe.setGasPrice(gasPrice);\n\n // Prefer classic coins for the probe when available (cheaper than address-balance gas).\n if (funding.paymentCoins.length > 0) {\n probe.setGasPayment(toObjectRefs(funding.paymentCoins));\n }\n\n let built: Uint8Array;\n try {\n built = await probe.build({ client: suiClient });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to estimate gas budget: ${message}`);\n }\n\n const inspect = await suiClient.simulateTransaction({\n transaction: built,\n include: { effects: true },\n });\n const effects = (inspect.Transaction ?? inspect.FailedTransaction)?.effects;\n if (!effects?.gasUsed) {\n throw new Error('Failed to estimate gas budget: simulateTransaction returned no gasUsed');\n }\n if (effects.status.success !== true) {\n const err = effects.status.success === false ? effects.status.error?.message : undefined;\n throw new Error(`Failed to estimate gas budget: ${err ?? 'simulation failed'}`);\n }\n return computeGasBudget(effects.gasUsed, gasPrice);\n}\n\n/**\n * Resolve gasBudget (no rebate) and apply gas funding selection before build.\n */\nexport async function prepareGasFunding(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasPrice: bigint;\n gasBudget?: bigint;\n}): Promise<GasFundingResult> {\n const { tx, suiClient, owner, gasPrice } = input;\n const { payment, budget: existingBudget } = tx.getData().gasData;\n const bakedAddressBalanceGas = payment != null && payment.length === 0;\n\n // Never trust a budget baked into plain-tx / Mysten auto AB-gas txs.\n // Those budgets are often under-estimated for payment: [] and would skip\n // estimateGasBudget if we kept existingBudget.\n // Also never trust budget \"0\" / 0n — Mysten treats \"0\" as set and skips resolve.\n let { gasBudget } = input;\n if (gasBudget != null && gasBudget <= 0n) {\n gasBudget = undefined;\n }\n const existingPositive = isPositiveBudget(existingBudget) ? BigInt(existingBudget as string) : null;\n\n if (gasBudget == null) {\n if (bakedAddressBalanceGas || existingPositive == null) {\n gasBudget = await estimateGasBudget({ tx, suiClient, owner, gasPrice });\n } else {\n gasBudget = existingPositive;\n }\n }\n\n tx.setGasBudget(gasBudget);\n // Drop ValidDuring from a prior address-balance pre-build; classic gas must not keep it,\n // and AB gas will re-attach expiration during the final build when payment is [].\n if (bakedAddressBalanceGas) {\n tx.setExpiration(null);\n }\n return selectGasFunding({ tx, suiClient, owner, gasBudget });\n}\n\n/**\n * @deprecated Use {@link prepareGasFunding} / {@link selectGasFunding}.\n * Kept as a thin classic-only helper for callers that only want coin gas when available.\n */\nexport async function preferClassicGasPayment(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n}): Promise<boolean> {\n const { tx, suiClient, owner } = input;\n const { payment } = tx.getData().gasData;\n if (payment != null) {\n return payment.length > 0;\n }\n const funding = await loadSuiGasFunding(suiClient, owner, tx);\n if (funding.paymentCoins.length === 0) {\n return false;\n }\n tx.setGasPayment(toObjectRefs(funding.paymentCoins));\n return true;\n}\n","import { bcs, TypeTagSerializer } from '@mysten/sui/bcs';\nimport { deriveDynamicFieldID, fromBase58, fromHex, normalizeSuiAddress, toBase58, toHex } from '@mysten/sui/utils';\n\n/**\n * Compatibility coin-reservation ObjectRef (Mysten gas-smashing).\n * Reserves address-balance SUI into gas payment without a persisted Coin object.\n * Vendored because @mysten/sui does not export createCoinReservationRef publicly.\n */\n\nconst SUI_ACCUMULATOR_ROOT_OBJECT_ID = normalizeSuiAddress('0xacc');\nconst ACCUMULATOR_KEY_TYPE_TAG = TypeTagSerializer.parseFromStr(\n '0x2::accumulator::Key<0x2::balance::Balance<0x2::sui::SUI>>',\n);\n\nexport const COIN_RESERVATION_MAGIC = new Uint8Array([\n 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,\n 0xac,\n]);\n\nexport function isCoinReservationDigest(digestBase58: string): boolean {\n const digestBytes = fromBase58(digestBase58);\n const last20Bytes = digestBytes.slice(12, 32);\n return last20Bytes.every((byte: number, i: number) => byte === COIN_RESERVATION_MAGIC[i]);\n}\n\nfunction deriveReservationObjectId(owner: string, chainIdentifier: string): string {\n const keyBcs = bcs.Address.serialize(owner).toBytes();\n const accumulatorId = deriveDynamicFieldID(SUI_ACCUMULATOR_ROOT_OBJECT_ID, ACCUMULATOR_KEY_TYPE_TAG, keyBcs);\n\n const accBytes = fromHex(accumulatorId.slice(2));\n const chainBytes = fromBase58(chainIdentifier);\n if (chainBytes.length !== 32) {\n throw new Error(`Invalid chain identifier length: expected 32 bytes, got ${chainBytes.length}`);\n }\n const xored = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n // XOR is required to derive the reservation object ID from accumulator + chain id.\n // eslint-disable-next-line no-bitwise\n xored[i] = accBytes[i] ^ chainBytes[i];\n }\n return `0x${toHex(xored)}`;\n}\n\nexport function createCoinReservationRef(\n reservedBalance: bigint,\n owner: string,\n chainIdentifier: string,\n epoch: string,\n): { objectId: string; version: string; digest: string } {\n const digestBytes = new Uint8Array(32);\n const view = new DataView(digestBytes.buffer);\n view.setBigUint64(0, reservedBalance, true);\n const epochNum = Number(epoch);\n if (!Number.isSafeInteger(epochNum) || epochNum < 0 || epochNum > 0xffffffff) {\n throw new Error(`Epoch ${epoch} out of u32 range for coin reservation digest`);\n }\n view.setUint32(8, epochNum, true);\n digestBytes.set(COIN_RESERVATION_MAGIC, 12);\n\n return {\n objectId: deriveReservationObjectId(owner, chainIdentifier),\n version: '0',\n digest: toBase58(digestBytes),\n };\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport type { SuiClientTypes } from '@mysten/sui/client';\nimport { parseSerializedSignature, type PublicKey } from '@mysten/sui/cryptography';\nimport { SuiGraphQLClient } from '@mysten/sui/graphql';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { MultiSigPublicKey } from '@mysten/sui/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nconst GRAPHQL_URL_BY_NETWORK: Record<string, string> = {\n mainnet: 'https://sui-mainnet.mystenlabs.com/graphql',\n testnet: 'https://sui-testnet.mystenlabs.com/graphql',\n devnet: 'https://sui-devnet.mystenlabs.com/graphql',\n};\n\nfunction graphqlClientForGrpc(suiClient: SuiGrpcClient) {\n const url = GRAPHQL_URL_BY_NETWORK[suiClient.network] ?? GRAPHQL_URL_BY_NETWORK.testnet;\n return new SuiGraphQLClient({ url, network: suiClient.network });\n}\n\nfunction collectSignatureStrings(value: unknown): string[] {\n if (typeof value === 'string') {\n return [value];\n }\n if (!value || typeof value !== 'object') {\n return [];\n }\n if ('base64' in value && typeof (value as { base64: unknown }).base64 === 'string') {\n return [(value as { base64: string }).base64];\n }\n if ('scheme' in value && 'base64' in value) {\n const b64 = (value as { base64?: unknown }).base64;\n return typeof b64 === 'string' ? [b64] : [];\n }\n return [];\n}\n\nconst TX_SIG_QUERY = `\n query PublicKeyTxSigs($sender: SuiAddress!, $first: Int!) {\n transactions(first: $first, filter: { sentAddress: $sender }) {\n nodes {\n signatures\n }\n }\n }\n`;\n\nexport async function getPublicKeyFromChain(suiClient: SuiGrpcClient, address: string): Promise<PublicKey | undefined> {\n const graphql = graphqlClientForGrpc(suiClient);\n let txs: { transactions?: { nodes?: unknown[] } };\n try {\n const res = await graphql.query({\n query: TX_SIG_QUERY,\n variables: { sender: address, first: 2 },\n });\n if (res.errors?.length) {\n return undefined;\n }\n txs = (res.data ?? {}) as { transactions?: { nodes?: unknown[] } };\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n const nodes = txs.transactions?.nodes ?? [];\n if (nodes.length === 0) {\n return undefined;\n }\n\n const first = nodes[0] as { signatures?: unknown };\n const rawSigs = first.signatures;\n const signatures: string[] = Array.isArray(rawSigs) ? rawSigs.flatMap((item) => collectSignatureStrings(item)) : [];\n\n if (signatures.length === 0) {\n return undefined;\n }\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: string, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk as unknown as PublicKey;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiGrpcClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | null | undefined;\n const res: SuiClientTypes.Coin[] = [];\n while (hasNext) {\n const currentPage = await input.suiClient.listCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.objects);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.cursor;\n }\n return res;\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\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 type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { normalizeStructTag } from '@mysten/sui/utils';\n\nimport type { CoinMetadata } from '@/types/assets';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiGrpcClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiGrpcClient) {\n this._client = client;\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 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._client.getCoinMetadata({ coinType });\n return res.coinMetadata ?? 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: {\n type?: string | null;\n json?: Record<string, unknown> | null;\n content?: { dataType?: string; fields?: { balance?: string } };\n }): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.json && typeof data.json === 'object' && 'balance' in data.json) {\n const { balance } = data.json as { balance?: string };\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as { balance?: string };\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { verifyPersonalMessageSignature, verifyTransactionSignature } from '@mysten/sui/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: string;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionSignature(input.message, input.signature);\n }\n return verifyPersonalMessageSignature(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: string }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: string;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: { messageStr: string; signature: string; targetAddress: string }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: string;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { Transaction, isTransaction } from '@mysten/sui/transactions';\nimport { fromHex } from '@mysten/sui/utils';\n\n/**\n * Normalize a transaction value to {@link Transaction}.\n * Prefer V2 restore paths — avoid deprecated V1 serialize() when possible\n * (V1 drops CallArg::FundsWithdrawal).\n */\nexport function toSuiTransaction(txb: Transaction | unknown): Transaction {\n if (isTransaction(txb)) {\n return txb as Transaction;\n }\n\n if (typeof txb === 'string' || txb instanceof Uint8Array) {\n return Transaction.from(txb);\n }\n\n // Last resort for true legacy TransactionBlock (pre-Transaction API).\n // Modern Transaction instances are handled by isTransaction above.\n const legacy = txb as { serialize?: () => string };\n if (typeof legacy?.serialize === 'function') {\n return Transaction.from(legacy.serialize()) as Transaction;\n }\n\n throw new Error('Unsupported transaction value for toSuiTransaction');\n}\n\nfunction isHex(str: string): boolean {\n return /^[0-9a-fA-F]+$/.test(str);\n}\n\nexport function getIntentionContent(intention: unknown): unknown {\n if (intention && typeof intention === 'object' && 'content' in intention) {\n return (intention as { content: unknown }).content;\n }\n return undefined;\n}\n\n/**\n * Restore a Transaction from plain-tx `intention.content`.\n * Accepts V2 JSON (`tx.toJSON()`), hex BCS bytes, or a JSON object.\n */\nexport function transactionFromContent(content: unknown): Transaction {\n if (content instanceof Uint8Array) {\n return Transaction.from(content);\n }\n if (typeof content === 'string') {\n if (isHex(content)) {\n return Transaction.from(fromHex(content));\n }\n return Transaction.from(content);\n }\n if (content && typeof content === 'object') {\n return Transaction.from(JSON.stringify(content));\n }\n throw new Error('Invalid transaction content');\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 type { SuiClientTypes } from '@mysten/sui/client';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\n/** Owned object row with Move JSON content (for helpers like Coin.getBalance). */\nexport type OwnedObjectData = SuiClientTypes.Object<{ json: true }>;\n\nexport type ObjectFilter = (obj: OwnedObjectData) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n /** Extra fields to request from the node; defaults include Move JSON for struct fields. */\n objectInclude?: SuiClientTypes.ObjectInclude;\n}\n\nconst defaultObjectInclude: SuiClientTypes.ObjectInclude = { json: true };\n\nfunction mergeInclude(options?: BatchObjectOptions): SuiClientTypes.ObjectInclude {\n return { ...defaultObjectInclude, ...options?.objectInclude };\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 provider: SuiGrpcClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(OwnedObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (OwnedObjectData | undefined)[];\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<OwnedObjectData> {\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<OwnedObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectInclude: SuiClientTypes.ObjectInclude;\n\n constructor(\n public readonly provider: SuiGrpcClient,\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.objectInclude = mergeInclude(options);\n }\n\n async doNextRequest(): Promise<PagedData<OwnedObjectData>> {\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 { objects } = await this.provider.getObjects({\n objectIds: requestPage,\n include: this.objectInclude,\n });\n const rows: OwnedObjectData[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const entry of objects) {\n if (entry instanceof Error) {\n continue;\n }\n rows.push(entry as OwnedObjectData);\n }\n let filtered: OwnedObjectData[];\n if (this.filter) {\n const { filter } = this;\n filtered = rows.filter((r) => filter(r));\n } else {\n filtered = rows;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiGrpcClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<OwnedObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as OwnedObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<OwnedObjectData> implements SuiIterator<OwnedObjectData> {\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<OwnedObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectInclude: SuiClientTypes.ObjectInclude;\n\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectInclude = mergeInclude(options);\n }\n\n async doNextRequest(): Promise<PagedData<OwnedObjectData>> {\n const res = await this.provider.listOwnedObjects({\n owner: this.owner,\n include: this.objectInclude,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.cursor;\n let filtered: OwnedObjectData[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.objects.filter((obj) => filter(obj as OwnedObjectData));\n } else {\n filtered = res.objects as OwnedObjectData[];\n }\n return {\n data: filtered,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport {\n getMSafeConfig,\n httpUrlToGrpcBaseUrl,\n MSafeConfig,\n MSafeConfigOptions,\n MSafeEnv,\n msafeChainToSuiNetwork,\n} from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiGrpcClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiGrpcClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = config.suiClient.transport\n ? new SuiGrpcClient({\n transport: config.suiClient.transport,\n network: msafeChainToSuiNetwork(config.network),\n })\n : new SuiGrpcClient({\n baseUrl: httpUrlToGrpcBaseUrl(config.suiClient.url),\n network: msafeChainToSuiNetwork(config.network),\n });\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? (PublicKeySerde.de(publicKeyWithSchema) as unknown as PublicKey) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: string }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\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).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\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 private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in 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 `${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","import type { RpcTransport } from '@mysten/sui/grpc';\n\nexport function msafeChainToSuiNetwork(chain: 'sui:mainnet' | 'sui:testnet'): 'mainnet' | 'testnet' {\n return chain === 'sui:mainnet' ? 'mainnet' : 'testnet';\n}\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\n/** Normalize HTTP(S) fullnode URL for SuiGrpcClient (gRPC-web) baseUrl. */\nexport function httpUrlToGrpcBaseUrl(url: string): string {\n const parsed = new URL(url);\n if (parsed.protocol === 'https:' && parsed.port === '') {\n return `https://${parsed.hostname}:443${parsed.pathname}${parsed.search}`;\n }\n if (parsed.protocol === 'http:' && parsed.port === '') {\n return `http://${parsed.hostname}:80${parsed.pathname}${parsed.search}`;\n }\n return `${parsed.origin}${parsed.pathname}${parsed.search}`;\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: RpcTransport;\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: RpcTransport;\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":"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","names":["SigningMessageHelper","UserMSafeStatus","SigningMessageHelper","MultiSigAccount","SigningMessageHelper","isSameAddress","Transaction","fromHex","normalizeStructTag","toHex","Transaction","normalizeStructTag","PublicKeySerde","normalizeSuiAddress","normalizeStructTag","balance","normalizeSuiAddress","normalizeStructTag","PublicKeySerde","normalizeStructTag","funding","Transaction","Transaction","fromHex","MultiSigAccount","normalizeStructTag","SigningMessageHelper","toHex","Transaction","isSameAddress","fromHex","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","PublicKeySerde","PublicKeySerde","MSafeEnv","SigningMessageHelper","UserMSafeStatus","InfoTypeKey"]}
1
+ {"version":3,"sources":["../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/gasFunding.ts","../src/utils/coinReservation.ts","../src/utils/sui.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/transaction.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk as unknown as PublicKey);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as unknown as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n } as unknown as MultiSigConfig;\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: string) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as never),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { fromHex, normalizeStructTag, toHex } from '@mysten/sui/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { parkedPayloadHex, prepareGasFunding } from '@/utils/gasFunding';\nimport { BatchObjectOptions, getAllOwnedObjects, type OwnedObjectData } from '@/utils/iter/object';\nimport { getIntentionContent, toSuiTransaction, transactionFromContent } from '@/utils/transaction';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances: { coinType: string; addressBalance: string }[] = [];\n let cursor: string | null = null;\n let hasNext = true;\n while (hasNext) {\n const page = await this.suiClient.listBalances({ owner: this.address, cursor, limit: 50 });\n balances.push(...page.balances);\n hasNext = page.hasNextPage;\n cursor = page.cursor;\n }\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(balance.addressBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<OwnedObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (obj: OwnedObjectData) => !obj?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(\n request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {\n txb?: Transaction;\n preferAddressBalance?: boolean;\n excludeObjectIds?: Iterable<string>;\n },\n ) {\n const txb = await this.buildTxFromIntention(request);\n txb.setSender(this.address);\n return this.simulator.simulate({\n txb,\n sender: this.address,\n preferAddressBalance: request.preferAddressBalance,\n excludeObjectIds: request.excludeObjectIds,\n });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {\n txb?: Transaction;\n preferAddressBalance?: boolean;\n excludeObjectIds?: Iterable<string>;\n },\n ): Promise<void> {\n const txb = await this.buildTxFromIntention(input);\n txb.setGasPrice(input.gasPrice);\n txb.setSender(this.address);\n await prepareGasFunding({\n tx: txb,\n suiClient: this.globals.suiClient,\n owner: this.address,\n gasPrice: input.gasPrice,\n gasBudget: input.gasBudget,\n preferAddressBalance: input.preferAddressBalance,\n excludeObjectIds: input.excludeObjectIds,\n });\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n const apiInput = { ...input };\n delete apiInput.txb;\n delete apiInput.preferAddressBalance;\n delete apiInput.excludeObjectIds;\n return this.backend.proposeIntentionAndBuildVote({\n ...apiInput,\n payload: toHex(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = Transaction.from(intention.payload);\n\n const data = tb.getData();\n if (!data.sender || !isSameAddress(data.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = toSuiTransaction(buildRejectTxb(this.address));\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n // API independently rebuilds via buildRejectTxb() + build() and compares digest.\n // Do not set gas / prepareGasFunding here — that changes payment and breaks the check.\n const rejectTxb = toSuiTransaction(buildRejectTxb(this.address));\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const parked = parkedPayloadHex(intention.intention);\n if (parked) {\n return this.simulator.simulateBuilt(fromHex(parked));\n }\n const txb = await this.buildTxFromIntention({\n application: intention.application,\n intention: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: string[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransaction({\n transaction: HexToUint8Array(payload),\n signatures: [multiSignature],\n include: { effects: true, events: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n /**\n * Resolve a Transaction from propose/simulate input.\n * 1. Caller-supplied `txb` (generic store path — do not rebuild).\n * 2. Registered app helper `build`.\n * 3. Unregistered app: restore from `intention.content` (JSON or hex).\n */\n private async buildTxFromIntention(input: {\n application: string;\n txType: TransactionType;\n txSubType: string;\n intention: unknown;\n txb?: Transaction;\n }): Promise<Transaction> {\n if (input.txb) {\n return input.txb;\n }\n\n let appHelper: ReturnType<typeof appHelpers.getAppHelper> | undefined;\n try {\n appHelper = appHelpers.getAppHelper(input.application);\n } catch {\n appHelper = undefined;\n }\n\n if (appHelper) {\n return toSuiTransaction(\n await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHex(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n }),\n );\n }\n\n const content = getIntentionContent(input.intention);\n if (content != null) {\n return transactionFromContent(content);\n }\n\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import type { SuiClientTypes } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport type { GasObjectReference, SimulationResult, SimulateDryRunResponse } from '@/types';\nimport { computeGasBudget, prepareGasFunding } from '@/utils/gasFunding';\n\nexport { computeGasBudget, InsufficientGasFundsError } from '@/utils/gasFunding';\n\nfunction formatExecutionError(error: SuiClientTypes.ExecutionError): string {\n return error.message;\n}\n\nfunction gasObjectToReference(gas: SuiClientTypes.ChangedObject | null | undefined): GasObjectReference {\n if (!gas?.objectId) {\n throw new Error('Gas object missing from simulation effects');\n }\n const version = gas.outputVersion ?? gas.inputVersion ?? '0';\n const digest = gas.outputDigest ?? gas.inputDigest ?? '';\n return { objectId: gas.objectId, version, digest };\n}\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: {\n txb: Transaction;\n sender: string;\n preferAddressBalance?: boolean;\n excludeObjectIds?: Iterable<string>;\n }): Promise<SimulationResult> {\n const tx = this.copyTransaction(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n tx.setSender(input.sender);\n\n try {\n // Resolve budget (no storageRebate) and select classic / address-balance / mixed top-up.\n await prepareGasFunding({\n tx,\n suiClient,\n owner: input.sender,\n gasPrice,\n preferAddressBalance: input.preferAddressBalance,\n excludeObjectIds: input.excludeObjectIds,\n });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n\n let built: Uint8Array;\n try {\n built = await tx.build({ client: suiClient });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n\n return this.inspectBuilt(built, gasPrice);\n }\n\n /** Dry-run a frozen payload without re-selecting gas. */\n public async simulateBuilt(built: Uint8Array): Promise<SimulationResult> {\n const gasPrice = await this.getGasPrice();\n return this.inspectBuilt(built, gasPrice);\n }\n\n private async inspectBuilt(built: Uint8Array, gasPrice: bigint): Promise<SimulationResult> {\n let inspectResult: SimulateDryRunResponse;\n try {\n inspectResult = await this.globals.suiClient.simulateTransaction({\n transaction: built,\n include: {\n effects: true,\n balanceChanges: true,\n events: true,\n objectTypes: true,\n transaction: true,\n bcs: true,\n commandResults: true,\n },\n });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n return {\n success: false,\n gasPrice,\n simulationError: message,\n };\n }\n const txRow = inspectResult.Transaction ?? inspectResult.FailedTransaction;\n const { effects } = txRow;\n if (!effects) {\n throw new Error('simulateTransaction did not return effects');\n }\n const success = effects.status.success === true;\n\n if (!success) {\n const err = effects.status.success === false ? effects.status.error : null;\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: err ? formatExecutionError(err) : 'Simulation failed',\n };\n }\n const gasBudget = this.toGasBudget(effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: gasObjectToReference(effects.gasObject),\n gasUsed: effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n const { referenceGasPrice } = await this.globals.suiClient.getReferenceGasPrice();\n return BigInt(referenceGasPrice);\n }\n\n private toGasBudget(gasUsed: SuiClientTypes.GasCostSummary, gasPrice: bigint) {\n return computeGasBudget(gasUsed, gasPrice);\n }\n\n private copyTransaction(tx: Transaction): Transaction {\n return Transaction.from(tx);\n }\n}\n","import type { SuiClientTypes } from '@mysten/sui/client';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { fromHex, normalizeStructTag, normalizeSuiObjectId } from '@mysten/sui/utils';\n\nimport { createCoinReservationRef } from '@/utils/coinReservation';\nimport { getAllCoins, SUI_COIN } from '@/utils/sui';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport type GasFundingMode = 'classic' | 'addressBalance' | 'mixedTopUp';\n\nexport interface GasFundingResult {\n mode: GasFundingMode;\n gasBudget: bigint;\n coinBalance: bigint;\n addressBalance: bigint;\n}\n\nexport class InsufficientGasFundsError extends Error {\n readonly gasBudget: bigint;\n\n readonly coinBalance: bigint;\n\n readonly addressBalance: bigint;\n\n constructor(gasBudget: bigint, coinBalance: bigint, addressBalance: bigint) {\n const total = coinBalance + addressBalance;\n super(\n `Insufficient gas funds: need ${gasBudget}, have coinBalance=${coinBalance} + addressBalance=${addressBalance} = ${total}`,\n );\n this.name = 'InsufficientGasFundsError';\n this.gasBudget = gasBudget;\n this.coinBalance = coinBalance;\n this.addressBalance = addressBalance;\n }\n}\n\n/**\n * Gas budget must cover pre-rebate costs (computation + storage + overhead).\n * storageRebate is refunded after execution and must not reduce the budget.\n */\nexport function computeGasBudget(\n gasUsed: Pick<SuiClientTypes.GasCostSummary, 'computationCost' | 'storageCost'>,\n gasPrice: bigint,\n): bigint {\n const { computationCost, storageCost } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n return BigInt(computationCost) + BigInt(storageCost) + safeOverhead;\n}\n\ntype PaymentCoinRef = { objectId: string; version: string; digest: string; balance: bigint };\n\ninterface SuiGasFunding {\n paymentCoins: PaymentCoinRef[];\n coinBalance: bigint;\n addressBalance: bigint;\n total: bigint;\n}\n\nfunction collectUsedObjectIds(tx: Transaction): Set<string> {\n const used = tx.getData().inputs.reduce<Set<string>>((acc, input) => {\n const immOrOwned = input.Object?.ImmOrOwnedObject?.objectId;\n if (immOrOwned) {\n acc.add(normalizeSuiObjectId(immOrOwned));\n return acc;\n }\n const unresolved = input.UnresolvedObject?.objectId;\n if (unresolved) {\n acc.add(normalizeSuiObjectId(unresolved));\n }\n return acc;\n }, new Set<string>());\n\n (tx.getData().gasData.payment ?? []).forEach((payment) => {\n if (payment.objectId) {\n used.add(normalizeSuiObjectId(payment.objectId));\n }\n });\n return used;\n}\n\nfunction addExcludeObjectIds(used: Set<string>, excludeObjectIds?: Iterable<string>) {\n Array.from(excludeObjectIds ?? [], (id) => used.add(normalizeSuiObjectId(id)));\n return used;\n}\n\nfunction payloadToTransaction(payload: string | Uint8Array): Transaction {\n if (typeof payload !== 'string') {\n return Transaction.from(payload);\n }\n if (/^[0-9a-fA-F]+$/.test(payload) && payload.length % 2 === 0) {\n return Transaction.from(fromHex(payload));\n }\n return Transaction.from(payload);\n}\n\n/** Object IDs a built payload already pins (inputs + gas payment). */\nexport function collectPayloadObjectIds(payload: string | Uint8Array): string[] {\n return [...collectUsedObjectIds(payloadToTransaction(payload))];\n}\n\n/**\n * Parked queue item: intention was saved with a built hex payload + digest\n * so build-next can promote it without rebuilding.\n */\nexport function parkedPayloadHex(intention: unknown): string | undefined {\n if (!intention || typeof intention !== 'object') {\n return undefined;\n }\n const { content, digest } = intention as { content?: unknown; digest?: unknown };\n if (typeof content !== 'string' || typeof digest !== 'string' || !digest) {\n return undefined;\n }\n if (!/^[0-9a-fA-F]+$/.test(content) || content.length < 64) {\n return undefined;\n }\n return content;\n}\n\n/** Coins already pinned by the current pending tx and any parked future payloads. */\nexport function collectQueueExcludeObjectIds(input: {\n pendingPayload?: string;\n parkedPayloads?: Array<string | undefined>;\n}): string[] {\n const ids = new Set<string>();\n if (input.pendingPayload) {\n collectPayloadObjectIds(input.pendingPayload).forEach((id) => ids.add(id));\n }\n (input.parkedPayloads ?? []).forEach((payload) => {\n if (!payload) {\n return;\n }\n collectPayloadObjectIds(payload).forEach((id) => ids.add(id));\n });\n return [...ids];\n}\n\n/**\n * Mysten CoinWithBalance with useGasCoin=false (type is 0x2::sui::SUI, not \"gas\")\n * loads every unused SUI coin as a mutable input at resolve time. Those coins\n * cannot also be gas payment or the node rejects:\n * \"Mutable object ... cannot appear more than one in one transaction\".\n */\nfunction txConsumesOwnedSuiCoins(tx: Transaction): boolean {\n return tx.getData().commands.some((cmd) => {\n if (cmd.$kind !== '$Intent' || cmd.$Intent.name !== 'CoinWithBalance') {\n return false;\n }\n const type = (cmd.$Intent.data as { type?: string } | undefined)?.type;\n if (!type || type === 'gas') {\n return false;\n }\n try {\n return normalizeStructTag(type) === normalizeStructTag(SUI_COIN);\n } catch {\n return false;\n }\n });\n}\n\nasync function loadSuiGasFunding(\n suiClient: SuiGrpcClient,\n owner: string,\n tx: Transaction,\n excludeObjectIds?: Iterable<string>,\n): Promise<SuiGasFunding> {\n const usedObjectIds = addExcludeObjectIds(collectUsedObjectIds(tx), excludeObjectIds);\n const [coins, balanceRes] = await Promise.all([\n getAllCoins({ suiClient, owner, coinType: SUI_COIN }),\n suiClient.getBalance({ owner, coinType: SUI_COIN }),\n ]);\n\n const addressBalance = BigInt(balanceRes.balance.addressBalance);\n\n // Intent will take every owned SUI coin at resolve time — leave them off gas payment.\n if (txConsumesOwnedSuiCoins(tx)) {\n return {\n paymentCoins: [],\n coinBalance: 0n,\n addressBalance,\n total: addressBalance,\n };\n }\n\n const paymentCoins = coins\n .filter((coin) => !usedObjectIds.has(normalizeSuiObjectId(coin.objectId)) && BigInt(coin.balance) > 0n)\n .map((coin) => ({\n objectId: coin.objectId,\n version: coin.version,\n digest: coin.digest,\n balance: BigInt(coin.balance),\n }));\n\n const coinBalance = paymentCoins.reduce((sum, coin) => sum + coin.balance, 0n);\n return {\n paymentCoins,\n coinBalance,\n addressBalance,\n total: coinBalance + addressBalance,\n };\n}\n\nfunction toObjectRefs(coins: PaymentCoinRef[]) {\n return coins.map(({ objectId, version, digest }) => ({ objectId, version, digest }));\n}\n\n/**\n * Top up classic gas payment from address balance via compatibility coin reservation.\n *\n * Protocol gas-smashing (real Coin listed first): the reservation is withdrawn from\n * address balance into that gas coin — the gas-payment equivalent of redeem_funds +\n * mergeCoins into the primary gas coin, and it satisfies the upfront gas-budget check.\n * (A PTB-only redeem+merge cannot fund gasBudget > coinBalance because budget is\n * checked against gas payment before commands execute.)\n */\nasync function applyMixedTopUp(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n paymentCoins: PaymentCoinRef[];\n topUpAmount: bigint;\n}): Promise<void> {\n const { tx, suiClient, owner, paymentCoins, topUpAmount } = input;\n if (paymentCoins.length === 0) {\n throw new Error('mixed gas top-up requires at least one SUI coin object');\n }\n if (topUpAmount <= 0n) {\n tx.setGasPayment(toObjectRefs(paymentCoins));\n return;\n }\n\n const [{ chainIdentifier }, { systemState }] = await Promise.all([\n suiClient.core.getChainIdentifier(),\n suiClient.core.getCurrentSystemState(),\n ]);\n\n const reservation = createCoinReservationRef(topUpAmount, owner, chainIdentifier, systemState.epoch);\n\n // Real Coin first so reservation is smashed into the gas coin (not into address balance).\n tx.setGasPayment([...toObjectRefs(paymentCoins), reservation]);\n}\n\n/**\n * Select gas funding before tx.build() according to mixed coin/addressBalance policy:\n * 1) budget without storageRebate (caller supplies computeGasBudget result)\n * 2-3) fail if total < budget\n * 4) coins exist and coinBal >= budget → classic setGasPayment(coins)\n * 5) coins exist and total >= budget → mixed top-up via coin reservation\n * 6) no usable coins and addrBal >= budget → Address Balance gas (payment: [])\n */\nexport async function selectGasFunding(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasBudget: bigint;\n excludeObjectIds?: Iterable<string>;\n}): Promise<GasFundingResult> {\n const { tx, suiClient, owner, gasBudget } = input;\n const { payment } = tx.getData().gasData;\n\n // Only respect an explicit *classic* gas payment (non-empty ObjectRefs).\n // Do NOT respect payment: [] — Mysten auto-pick and plain-tx\n // Transaction.from(builtHex) often bake address-balance gas; respecting it\n // skips re-selection and fails InsufficientGas under a tight budget.\n // Selection below always overwrites payment via setGasPayment(...).\n if (payment != null && payment.length > 0) {\n const funding = await loadSuiGasFunding(suiClient, owner, tx, input.excludeObjectIds);\n return {\n mode: 'classic',\n gasBudget,\n coinBalance: funding.coinBalance,\n addressBalance: funding.addressBalance,\n };\n }\n\n const funding = await loadSuiGasFunding(suiClient, owner, tx, input.excludeObjectIds);\n const { paymentCoins, coinBalance, addressBalance, total } = funding;\n\n if (total < gasBudget) {\n throw new InsufficientGasFundsError(gasBudget, coinBalance, addressBalance);\n }\n\n // Prefer classic / mixed whenever owned SUI coins exist. Pure address-balance\n // gas (payment: []) is stricter on budget and is what Mysten auto-picks when\n // addressBalance > 0 — avoid it unless there is no usable gas coin.\n if (paymentCoins.length > 0 && coinBalance >= gasBudget) {\n tx.setGasPayment(toObjectRefs(paymentCoins));\n return { mode: 'classic', gasBudget, coinBalance, addressBalance };\n }\n\n if (paymentCoins.length > 0 && total >= gasBudget) {\n const topUpAmount = gasBudget - coinBalance; // > 0 and <= addressBalance\n await applyMixedTopUp({\n tx,\n suiClient,\n owner,\n paymentCoins,\n topUpAmount,\n });\n return { mode: 'mixedTopUp', gasBudget, coinBalance, addressBalance };\n }\n\n if (addressBalance >= gasBudget) {\n tx.setGasPayment([]);\n return { mode: 'addressBalance', gasBudget, coinBalance, addressBalance };\n }\n\n throw new InsufficientGasFundsError(gasBudget, coinBalance, addressBalance);\n}\n\n/**\n * Estimate gas budget (no storageRebate) using a probe build/simulate.\n * Prefers classic coin gas when coin objects exist so the estimate matches the\n * cheaper payment path. Budget is left unset so Mysten can dry-run with MAX_GAS\n * overrides (avoids locking the full balance away from GasCoin splits).\n */\n/**\n * Clone a tx with gas budget/payment/expiration cleared.\n * Needed because Mysten treats budget \"0\" as set (truthy) and skips re-estimation,\n * and app-store helper.build() often pre-builds with payment:[] + budget:\"0\".\n */\nfunction cloneWithClearedGasConfig(tx: Transaction): Transaction {\n const data = structuredClone(tx.getData()) as {\n version: number;\n sender: string | null;\n expiration: unknown;\n gasData: {\n budget: string | null;\n price: string | null;\n owner: string | null;\n payment: unknown;\n };\n inputs: unknown;\n commands: unknown;\n };\n data.gasData.budget = null;\n data.gasData.price = null;\n data.gasData.payment = null;\n // Address-balance gas bakes ValidDuring; clear so classic gas probe is valid.\n data.expiration = null;\n return Transaction.from(JSON.stringify(data));\n}\n\nfunction isPositiveBudget(budget: string | number | bigint | null | undefined): boolean {\n if (budget == null) {\n return false;\n }\n try {\n return BigInt(budget) > 0n;\n } catch {\n return false;\n }\n}\n\nexport async function estimateGasBudget(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasPrice: bigint;\n excludeObjectIds?: Iterable<string>;\n preferAddressBalance?: boolean;\n}): Promise<bigint> {\n const { tx, suiClient, owner, gasPrice } = input;\n const funding = input.preferAddressBalance\n ? {\n ...(await loadSuiGasFunding(suiClient, owner, tx, input.excludeObjectIds)),\n paymentCoins: [] as PaymentCoinRef[],\n coinBalance: 0n,\n }\n : await loadSuiGasFunding(suiClient, owner, tx, input.excludeObjectIds);\n const fundingTotal = input.preferAddressBalance ? funding.addressBalance : funding.total;\n if (fundingTotal <= 0n) {\n throw new InsufficientGasFundsError(0n, funding.coinBalance, funding.addressBalance);\n }\n const { budget, payment } = tx.getData().gasData;\n // app-store / Mysten pre-build can leave payment:[] with budget \"0\".\n // Mysten's setGasBudget skips when budget is the string \"0\" (truthy), so clear first.\n const mustResetGas = (payment != null && payment.length === 0) || (budget != null && !isPositiveBudget(budget));\n const probe = mustResetGas ? cloneWithClearedGasConfig(tx) : Transaction.from(tx);\n probe.setSender(owner);\n probe.setGasPrice(gasPrice);\n\n // Prefer classic coins for the probe when available (cheaper than address-balance gas).\n if (funding.paymentCoins.length > 0) {\n probe.setGasPayment(toObjectRefs(funding.paymentCoins));\n }\n\n let built: Uint8Array;\n try {\n built = await probe.build({ client: suiClient });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to estimate gas budget: ${message}`);\n }\n\n const inspect = await suiClient.simulateTransaction({\n transaction: built,\n include: { effects: true },\n });\n const effects = (inspect.Transaction ?? inspect.FailedTransaction)?.effects;\n if (!effects?.gasUsed) {\n throw new Error('Failed to estimate gas budget: simulateTransaction returned no gasUsed');\n }\n if (effects.status.success !== true) {\n const err = effects.status.success === false ? effects.status.error?.message : undefined;\n throw new Error(`Failed to estimate gas budget: ${err ?? 'simulation failed'}`);\n }\n return computeGasBudget(effects.gasUsed, gasPrice);\n}\n\n/**\n * Resolve gasBudget (no rebate) and apply gas funding selection before build.\n */\nexport async function prepareGasFunding(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n gasPrice: bigint;\n gasBudget?: bigint;\n /**\n * Force Address Balance gas (`payment: []`). Prefer {@link excludeObjectIds}\n * for queue-behind-pending so unused SUI coins can still pay.\n */\n preferAddressBalance?: boolean;\n /**\n * Queue-behind-pending: do not pick coins the current pending / parked\n * payloads already pin. Those versions will change when the earlier tx executes.\n */\n excludeObjectIds?: Iterable<string>;\n}): Promise<GasFundingResult> {\n const { tx, suiClient, owner, gasPrice, excludeObjectIds } = input;\n const { payment, budget: existingBudget } = tx.getData().gasData;\n const bakedAddressBalanceGas = payment != null && payment.length === 0;\n\n // Never trust a budget baked into plain-tx / Mysten auto AB-gas txs.\n // Those budgets are often under-estimated for payment: [] and would skip\n // estimateGasBudget if we kept existingBudget.\n // Also never trust budget \"0\" / 0n — Mysten treats \"0\" as set and skips resolve.\n let { gasBudget } = input;\n if (gasBudget != null && gasBudget <= 0n) {\n gasBudget = undefined;\n }\n const existingPositive = isPositiveBudget(existingBudget) ? BigInt(existingBudget as string) : null;\n\n if (gasBudget == null) {\n if (bakedAddressBalanceGas || existingPositive == null) {\n gasBudget = await estimateGasBudget({\n tx,\n suiClient,\n owner,\n gasPrice,\n excludeObjectIds,\n preferAddressBalance: input.preferAddressBalance,\n });\n } else {\n gasBudget = existingPositive;\n }\n }\n\n tx.setGasBudget(gasBudget);\n // Drop ValidDuring from a prior address-balance pre-build; classic gas must not keep it,\n // and AB gas will re-attach expiration during the final build when payment is [].\n if (bakedAddressBalanceGas) {\n tx.setExpiration(null);\n }\n\n if (input.preferAddressBalance) {\n const funding = await loadSuiGasFunding(suiClient, owner, tx, excludeObjectIds);\n if (funding.addressBalance < gasBudget) {\n throw new InsufficientGasFundsError(gasBudget, funding.coinBalance, funding.addressBalance);\n }\n tx.setGasPayment([]);\n return {\n mode: 'addressBalance',\n gasBudget,\n coinBalance: funding.coinBalance,\n addressBalance: funding.addressBalance,\n };\n }\n\n return selectGasFunding({ tx, suiClient, owner, gasBudget, excludeObjectIds });\n}\n\n/**\n * @deprecated Use {@link prepareGasFunding} / {@link selectGasFunding}.\n * Kept as a thin classic-only helper for callers that only want coin gas when available.\n */\nexport async function preferClassicGasPayment(input: {\n tx: Transaction;\n suiClient: SuiGrpcClient;\n owner: string;\n}): Promise<boolean> {\n const { tx, suiClient, owner } = input;\n const { payment } = tx.getData().gasData;\n if (payment != null) {\n return payment.length > 0;\n }\n const funding = await loadSuiGasFunding(suiClient, owner, tx);\n if (funding.paymentCoins.length === 0) {\n return false;\n }\n tx.setGasPayment(toObjectRefs(funding.paymentCoins));\n return true;\n}\n","import { bcs, TypeTagSerializer } from '@mysten/sui/bcs';\nimport { deriveDynamicFieldID, fromBase58, fromHex, normalizeSuiAddress, toBase58, toHex } from '@mysten/sui/utils';\n\n/**\n * Compatibility coin-reservation ObjectRef (Mysten gas-smashing).\n * Reserves address-balance SUI into gas payment without a persisted Coin object.\n * Vendored because @mysten/sui does not export createCoinReservationRef publicly.\n */\n\nconst SUI_ACCUMULATOR_ROOT_OBJECT_ID = normalizeSuiAddress('0xacc');\nconst ACCUMULATOR_KEY_TYPE_TAG = TypeTagSerializer.parseFromStr(\n '0x2::accumulator::Key<0x2::balance::Balance<0x2::sui::SUI>>',\n);\n\nexport const COIN_RESERVATION_MAGIC = new Uint8Array([\n 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac,\n 0xac,\n]);\n\nexport function isCoinReservationDigest(digestBase58: string): boolean {\n const digestBytes = fromBase58(digestBase58);\n const last20Bytes = digestBytes.slice(12, 32);\n return last20Bytes.every((byte: number, i: number) => byte === COIN_RESERVATION_MAGIC[i]);\n}\n\nfunction deriveReservationObjectId(owner: string, chainIdentifier: string): string {\n const keyBcs = bcs.Address.serialize(owner).toBytes();\n const accumulatorId = deriveDynamicFieldID(SUI_ACCUMULATOR_ROOT_OBJECT_ID, ACCUMULATOR_KEY_TYPE_TAG, keyBcs);\n\n const accBytes = fromHex(accumulatorId.slice(2));\n const chainBytes = fromBase58(chainIdentifier);\n if (chainBytes.length !== 32) {\n throw new Error(`Invalid chain identifier length: expected 32 bytes, got ${chainBytes.length}`);\n }\n const xored = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n // XOR is required to derive the reservation object ID from accumulator + chain id.\n // eslint-disable-next-line no-bitwise\n xored[i] = accBytes[i] ^ chainBytes[i];\n }\n return `0x${toHex(xored)}`;\n}\n\nexport function createCoinReservationRef(\n reservedBalance: bigint,\n owner: string,\n chainIdentifier: string,\n epoch: string,\n): { objectId: string; version: string; digest: string } {\n const digestBytes = new Uint8Array(32);\n const view = new DataView(digestBytes.buffer);\n view.setBigUint64(0, reservedBalance, true);\n const epochNum = Number(epoch);\n if (!Number.isSafeInteger(epochNum) || epochNum < 0 || epochNum > 0xffffffff) {\n throw new Error(`Epoch ${epoch} out of u32 range for coin reservation digest`);\n }\n view.setUint32(8, epochNum, true);\n digestBytes.set(COIN_RESERVATION_MAGIC, 12);\n\n return {\n objectId: deriveReservationObjectId(owner, chainIdentifier),\n version: '0',\n digest: toBase58(digestBytes),\n };\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport type { SuiClientTypes } from '@mysten/sui/client';\nimport { parseSerializedSignature, type PublicKey } from '@mysten/sui/cryptography';\nimport { SuiGraphQLClient } from '@mysten/sui/graphql';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { MultiSigPublicKey } from '@mysten/sui/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nconst GRAPHQL_URL_BY_NETWORK: Record<string, string> = {\n mainnet: 'https://sui-mainnet.mystenlabs.com/graphql',\n testnet: 'https://sui-testnet.mystenlabs.com/graphql',\n devnet: 'https://sui-devnet.mystenlabs.com/graphql',\n};\n\nfunction graphqlClientForGrpc(suiClient: SuiGrpcClient) {\n const url = GRAPHQL_URL_BY_NETWORK[suiClient.network] ?? GRAPHQL_URL_BY_NETWORK.testnet;\n return new SuiGraphQLClient({ url, network: suiClient.network });\n}\n\nfunction collectSignatureStrings(value: unknown): string[] {\n if (typeof value === 'string') {\n return [value];\n }\n if (!value || typeof value !== 'object') {\n return [];\n }\n if ('base64' in value && typeof (value as { base64: unknown }).base64 === 'string') {\n return [(value as { base64: string }).base64];\n }\n if ('scheme' in value && 'base64' in value) {\n const b64 = (value as { base64?: unknown }).base64;\n return typeof b64 === 'string' ? [b64] : [];\n }\n return [];\n}\n\nconst TX_SIG_QUERY = `\n query PublicKeyTxSigs($sender: SuiAddress!, $first: Int!) {\n transactions(first: $first, filter: { sentAddress: $sender }) {\n nodes {\n signatures\n }\n }\n }\n`;\n\nexport async function getPublicKeyFromChain(suiClient: SuiGrpcClient, address: string): Promise<PublicKey | undefined> {\n const graphql = graphqlClientForGrpc(suiClient);\n let txs: { transactions?: { nodes?: unknown[] } };\n try {\n const res = await graphql.query({\n query: TX_SIG_QUERY,\n variables: { sender: address, first: 2 },\n });\n if (res.errors?.length) {\n return undefined;\n }\n txs = (res.data ?? {}) as { transactions?: { nodes?: unknown[] } };\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n const nodes = txs.transactions?.nodes ?? [];\n if (nodes.length === 0) {\n return undefined;\n }\n\n const first = nodes[0] as { signatures?: unknown };\n const rawSigs = first.signatures;\n const signatures: string[] = Array.isArray(rawSigs) ? rawSigs.flatMap((item) => collectSignatureStrings(item)) : [];\n\n if (signatures.length === 0) {\n return undefined;\n }\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: string, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk as unknown as PublicKey;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiGrpcClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | null | undefined;\n const res: SuiClientTypes.Coin[] = [];\n while (hasNext) {\n const currentPage = await input.suiClient.listCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.objects);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.cursor;\n }\n return res;\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\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 type { SuiGrpcClient } from '@mysten/sui/grpc';\nimport { normalizeStructTag } from '@mysten/sui/utils';\n\nimport type { CoinMetadata } from '@/types/assets';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiGrpcClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiGrpcClient) {\n this._client = client;\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 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._client.getCoinMetadata({ coinType });\n return res.coinMetadata ?? 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: {\n type?: string | null;\n json?: Record<string, unknown> | null;\n content?: { dataType?: string; fields?: { balance?: string } };\n }): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.json && typeof data.json === 'object' && 'balance' in data.json) {\n const { balance } = data.json as { balance?: string };\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as { balance?: string };\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { verifyPersonalMessageSignature, verifyTransactionSignature } from '@mysten/sui/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: string;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionSignature(input.message, input.signature);\n }\n return verifyPersonalMessageSignature(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: string }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: string;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: { messageStr: string; signature: string; targetAddress: string }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: string;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { Transaction, isTransaction } from '@mysten/sui/transactions';\nimport { fromHex } from '@mysten/sui/utils';\n\n/**\n * Normalize a transaction value to {@link Transaction}.\n * Prefer V2 restore paths — avoid deprecated V1 serialize() when possible\n * (V1 drops CallArg::FundsWithdrawal).\n */\nexport function toSuiTransaction(txb: Transaction | unknown): Transaction {\n if (isTransaction(txb)) {\n return txb as Transaction;\n }\n\n if (typeof txb === 'string' || txb instanceof Uint8Array) {\n return Transaction.from(txb);\n }\n\n // Last resort for true legacy TransactionBlock (pre-Transaction API).\n // Modern Transaction instances are handled by isTransaction above.\n const legacy = txb as { serialize?: () => string };\n if (typeof legacy?.serialize === 'function') {\n return Transaction.from(legacy.serialize()) as Transaction;\n }\n\n throw new Error('Unsupported transaction value for toSuiTransaction');\n}\n\nfunction isHex(str: string): boolean {\n return /^[0-9a-fA-F]+$/.test(str);\n}\n\nexport function getIntentionContent(intention: unknown): unknown {\n if (intention && typeof intention === 'object' && 'content' in intention) {\n return (intention as { content: unknown }).content;\n }\n return undefined;\n}\n\n/**\n * Restore a Transaction from plain-tx `intention.content`.\n * Accepts V2 JSON (`tx.toJSON()`), hex BCS bytes, or a JSON object.\n */\nexport function transactionFromContent(content: unknown): Transaction {\n if (content instanceof Uint8Array) {\n return Transaction.from(content);\n }\n if (typeof content === 'string') {\n if (isHex(content)) {\n return Transaction.from(fromHex(content));\n }\n return Transaction.from(content);\n }\n if (content && typeof content === 'object') {\n return Transaction.from(JSON.stringify(content));\n }\n throw new Error('Invalid transaction content');\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 type { SuiClientTypes } from '@mysten/sui/client';\nimport type { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\n/** Owned object row with Move JSON content (for helpers like Coin.getBalance). */\nexport type OwnedObjectData = SuiClientTypes.Object<{ json: true }>;\n\nexport type ObjectFilter = (obj: OwnedObjectData) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n /** Extra fields to request from the node; defaults include Move JSON for struct fields. */\n objectInclude?: SuiClientTypes.ObjectInclude;\n}\n\nconst defaultObjectInclude: SuiClientTypes.ObjectInclude = { json: true };\n\nfunction mergeInclude(options?: BatchObjectOptions): SuiClientTypes.ObjectInclude {\n return { ...defaultObjectInclude, ...options?.objectInclude };\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 provider: SuiGrpcClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(OwnedObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (OwnedObjectData | undefined)[];\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<OwnedObjectData> {\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<OwnedObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectInclude: SuiClientTypes.ObjectInclude;\n\n constructor(\n public readonly provider: SuiGrpcClient,\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.objectInclude = mergeInclude(options);\n }\n\n async doNextRequest(): Promise<PagedData<OwnedObjectData>> {\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 { objects } = await this.provider.getObjects({\n objectIds: requestPage,\n include: this.objectInclude,\n });\n const rows: OwnedObjectData[] = [];\n // eslint-disable-next-line no-restricted-syntax\n for (const entry of objects) {\n if (entry instanceof Error) {\n continue;\n }\n rows.push(entry as OwnedObjectData);\n }\n let filtered: OwnedObjectData[];\n if (this.filter) {\n const { filter } = this;\n filtered = rows.filter((r) => filter(r));\n } else {\n filtered = rows;\n }\n return {\n data: filtered,\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiGrpcClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<OwnedObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as OwnedObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<OwnedObjectData> implements SuiIterator<OwnedObjectData> {\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<OwnedObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectInclude: SuiClientTypes.ObjectInclude;\n\n constructor(\n public readonly provider: SuiGrpcClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectInclude = mergeInclude(options);\n }\n\n async doNextRequest(): Promise<PagedData<OwnedObjectData>> {\n const res = await this.provider.listOwnedObjects({\n owner: this.owner,\n include: this.objectInclude,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.cursor;\n let filtered: OwnedObjectData[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.objects.filter((obj) => filter(obj as OwnedObjectData));\n } else {\n filtered = res.objects as OwnedObjectData[];\n }\n return {\n data: filtered,\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiGrpcClient } from '@mysten/sui/grpc';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport {\n getMSafeConfig,\n httpUrlToGrpcBaseUrl,\n MSafeConfig,\n MSafeConfigOptions,\n MSafeEnv,\n msafeChainToSuiNetwork,\n} from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiGrpcClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiGrpcClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = config.suiClient.transport\n ? new SuiGrpcClient({\n transport: config.suiClient.transport,\n network: msafeChainToSuiNetwork(config.network),\n })\n : new SuiGrpcClient({\n baseUrl: httpUrlToGrpcBaseUrl(config.suiClient.url),\n network: msafeChainToSuiNetwork(config.network),\n });\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? (PublicKeySerde.de(publicKeyWithSchema) as unknown as PublicKey) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: string }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\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).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\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 private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in 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 `${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","import type { RpcTransport } from '@mysten/sui/grpc';\n\nexport function msafeChainToSuiNetwork(chain: 'sui:mainnet' | 'sui:testnet'): 'mainnet' | 'testnet' {\n return chain === 'sui:mainnet' ? 'mainnet' : 'testnet';\n}\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\n/** Normalize HTTP(S) fullnode URL for SuiGrpcClient (gRPC-web) baseUrl. */\nexport function httpUrlToGrpcBaseUrl(url: string): string {\n const parsed = new URL(url);\n if (parsed.protocol === 'https:' && parsed.port === '') {\n return `https://${parsed.hostname}:443${parsed.pathname}${parsed.search}`;\n }\n if (parsed.protocol === 'http:' && parsed.port === '') {\n return `http://${parsed.hostname}:80${parsed.pathname}${parsed.search}`;\n }\n return `${parsed.origin}${parsed.pathname}${parsed.search}`;\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: RpcTransport;\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: RpcTransport;\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":"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","names":["SigningMessageHelper","UserMSafeStatus","SigningMessageHelper","MultiSigAccount","SigningMessageHelper","isSameAddress","Transaction","fromHex","normalizeStructTag","toHex","Transaction","fromHex","normalizeStructTag","PublicKeySerde","normalizeSuiAddress","normalizeStructTag","balance","normalizeSuiAddress","normalizeStructTag","PublicKeySerde","fromHex","normalizeStructTag","funding","Transaction","Transaction","fromHex","MultiSigAccount","normalizeStructTag","SigningMessageHelper","toHex","Transaction","isSameAddress","fromHex","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","PublicKeySerde","PublicKeySerde","MSafeEnv","SigningMessageHelper","UserMSafeStatus","InfoTypeKey"]}