@msafe/sui3-sdk 0.0.81 → 0.0.83

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.cjs CHANGED
@@ -185,7 +185,6 @@ var InvitationSDK = class {
185
185
  // src/core/MSafeAccount.ts
186
186
  var import_sui_app_store = require("@msafe/sui-app-store");
187
187
  var import_sui3_utils4 = require("@msafe/sui3-utils");
188
- var import_client = require("@mysten/sui.js/client");
189
188
  var import_transactions2 = require("@mysten/sui.js/transactions");
190
189
  var import_utils3 = require("@mysten/sui.js/utils");
191
190
  var import_wallet_standard = require("@mysten/wallet-standard");
@@ -669,9 +668,6 @@ var MSafeAccount = class _MSafeAccount {
669
668
  txType: request.txType,
670
669
  txSubType: request.txSubType,
671
670
  clientUrl: this.globals.config.suiClient.url,
672
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
673
- // @ts-ignore
674
- suiClient: new import_client.SuiClient({ url: this.globals.config.suiClient.url }),
675
671
  account: {
676
672
  address: this.address,
677
673
  publicKey: (0, import_utils3.fromHEX)(this.address),
@@ -702,19 +698,24 @@ var MSafeAccount = class _MSafeAccount {
702
698
  if (!appHelper) {
703
699
  throw new Error(`Can't find app helper for application ${input.application}`);
704
700
  }
705
- const txb = await appHelper.build({
706
- network: this.globals.config.network,
707
- intentionData: input.intention,
708
- txType: input.txType,
709
- txSubType: input.txSubType,
710
- clientUrl: this.globals.config.suiClient.url,
711
- account: {
712
- address: this.address,
713
- publicKey: (0, import_utils3.fromHEX)(this.address),
714
- chains: [import_wallet_standard.SUI_MAINNET_CHAIN, import_wallet_standard.SUI_TESTNET_CHAIN],
715
- features: []
716
- }
717
- });
701
+ let txb;
702
+ if (input.txb) {
703
+ txb = input.txb;
704
+ } else {
705
+ txb = await appHelper.build({
706
+ network: this.globals.config.network,
707
+ intentionData: input.intention,
708
+ txType: input.txType,
709
+ txSubType: input.txSubType,
710
+ clientUrl: this.globals.config.suiClient.url,
711
+ account: {
712
+ address: this.address,
713
+ publicKey: (0, import_utils3.fromHEX)(this.address),
714
+ chains: [import_wallet_standard.SUI_MAINNET_CHAIN, import_wallet_standard.SUI_TESTNET_CHAIN],
715
+ features: []
716
+ }
717
+ });
718
+ }
718
719
  txb.setGasPrice(input.gasPrice);
719
720
  txb.setGasBudget(input.gasBudget);
720
721
  txb.setSender(this.address);
@@ -1008,7 +1009,7 @@ var ReportSDK = class {
1008
1009
  };
1009
1010
 
1010
1011
  // src/globals/MSafeGlobals.ts
1011
- var import_client2 = require("@mysten/sui.js/client");
1012
+ var import_client = require("@mysten/sui.js/client");
1012
1013
 
1013
1014
  // src/backend/BackendImpl.ts
1014
1015
  var import_sui3_utils6 = require("@msafe/sui3-utils");
@@ -1430,7 +1431,7 @@ var MSafeGlobals = class _MSafeGlobals {
1430
1431
  }
1431
1432
  static async New(env, options) {
1432
1433
  const config = getMSafeConfig(env, options);
1433
- const suiClient = new import_client2.SuiClient(
1434
+ const suiClient = new import_client.SuiClient(
1434
1435
  config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url }
1435
1436
  );
1436
1437
  const backend = new BackendImpl(config.backend.url, options?.mockAddress);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.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":["export * from './core';\nexport * from './globals';\nexport * from './types';\nexport * from './utils';\n","import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/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);\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 PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\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 PublicKey),\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 { SuiObjectData, SuiObjectResponse, SuiClient } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/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 { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\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 = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.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(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n suiClient: new SuiClient({ url: 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 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 ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n const txb = 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 txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\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 = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.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 = 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 const rejectTxb = 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 appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.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 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: SerializedSignature[] = [];\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.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\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 { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/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: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\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: SerializedSignature;\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: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\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: SerializedSignature;\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 { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/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 { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\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 || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\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 if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\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: SerializedSignature, 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;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\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 { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\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\nexport type ObjectFilter = (objRes: SuiObjectResponse) => 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 objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | 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<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\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.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; 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 = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\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, SerializedSignature } from '@mysten/sui.js/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) : 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: SerializedSignature }) {\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 { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\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?: SuiClientOptions['transport'];\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: LOCAL_API_URL,\n },\n syncingURL: LOCAL_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":["import_sui3_utils","import_sui3_utils","import_sui3_utils","import_transactions","import_utils","import_utils","import_sui3_utils","import_sui3_utils","import_utils","import_client","import_sui3_utils","axios","MSafeEnv","InfoTypeKey"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.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":["export * from './core';\nexport * from './globals';\nexport * from './types';\nexport * from './utils';\n","import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/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);\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 PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\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 PublicKey),\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 { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/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 { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\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 = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.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(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.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 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?: TransactionBlock;\n },\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\n txb = 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 txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\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 = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.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 = 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 const rejectTxb = 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 appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.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 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: SerializedSignature[] = [];\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.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\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 { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/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: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\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: SerializedSignature;\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: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\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: SerializedSignature;\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 { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/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 { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\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 || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\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 if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\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: SerializedSignature, 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;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\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 { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\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\nexport type ObjectFilter = (objRes: SuiObjectResponse) => 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 objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | 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<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\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.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; 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 = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\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, SerializedSignature } from '@mysten/sui.js/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) : 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: SerializedSignature }) {\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 { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\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?: SuiClientOptions['transport'];\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: LOCAL_API_URL,\n },\n syncingURL: LOCAL_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":["import_sui3_utils","import_sui3_utils","import_sui3_utils","import_transactions","import_utils","import_utils","import_sui3_utils","import_sui3_utils","import_utils","import_sui3_utils","axios","MSafeEnv","InfoTypeKey"]}
package/dist/index.d.cts CHANGED
@@ -358,7 +358,9 @@ declare class MSafeAccount {
358
358
  nextSequenceNumber(): Promise<number>;
359
359
  simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
360
360
  proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
361
- proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>): Promise<void>;
361
+ proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
362
+ txb?: TransactionBlock;
363
+ }): Promise<void>;
362
364
  simulateCoinTransferIntention(intention: CoinTransferIntention): Promise<SimulationResult>;
363
365
  proposeCoinTransferIntention(intention: CoinTransferIntention): Promise<void>;
364
366
  simulateObjectTransferIntention(intention: ObjectTransferIntention): Promise<SimulationResult>;
package/dist/index.d.ts CHANGED
@@ -358,7 +358,9 @@ declare class MSafeAccount {
358
358
  nextSequenceNumber(): Promise<number>;
359
359
  simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
360
360
  proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
361
- proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>): Promise<void>;
361
+ proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
362
+ txb?: TransactionBlock;
363
+ }): Promise<void>;
362
364
  simulateCoinTransferIntention(intention: CoinTransferIntention): Promise<SimulationResult>;
363
365
  proposeCoinTransferIntention(intention: CoinTransferIntention): Promise<void>;
364
366
  simulateObjectTransferIntention(intention: ObjectTransferIntention): Promise<SimulationResult>;
package/dist/index.js CHANGED
@@ -133,7 +133,6 @@ import {
133
133
  buildRejectTxb,
134
134
  isSameAddress as isSameAddress2
135
135
  } from "@msafe/sui3-utils";
136
- import { SuiClient } from "@mysten/sui.js/client";
137
136
  import { TransactionBlock as TransactionBlock2 } from "@mysten/sui.js/transactions";
138
137
  import { fromHEX, normalizeStructTag as normalizeStructTag3, toHEX } from "@mysten/sui.js/utils";
139
138
  import { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from "@mysten/wallet-standard";
@@ -617,9 +616,6 @@ var MSafeAccount = class _MSafeAccount {
617
616
  txType: request.txType,
618
617
  txSubType: request.txSubType,
619
618
  clientUrl: this.globals.config.suiClient.url,
620
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
621
- // @ts-ignore
622
- suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),
623
619
  account: {
624
620
  address: this.address,
625
621
  publicKey: fromHEX(this.address),
@@ -650,19 +646,24 @@ var MSafeAccount = class _MSafeAccount {
650
646
  if (!appHelper) {
651
647
  throw new Error(`Can't find app helper for application ${input.application}`);
652
648
  }
653
- const txb = await appHelper.build({
654
- network: this.globals.config.network,
655
- intentionData: input.intention,
656
- txType: input.txType,
657
- txSubType: input.txSubType,
658
- clientUrl: this.globals.config.suiClient.url,
659
- account: {
660
- address: this.address,
661
- publicKey: fromHEX(this.address),
662
- chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
663
- features: []
664
- }
665
- });
649
+ let txb;
650
+ if (input.txb) {
651
+ txb = input.txb;
652
+ } else {
653
+ txb = await appHelper.build({
654
+ network: this.globals.config.network,
655
+ intentionData: input.intention,
656
+ txType: input.txType,
657
+ txSubType: input.txSubType,
658
+ clientUrl: this.globals.config.suiClient.url,
659
+ account: {
660
+ address: this.address,
661
+ publicKey: fromHEX(this.address),
662
+ chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
663
+ features: []
664
+ }
665
+ });
666
+ }
666
667
  txb.setGasPrice(input.gasPrice);
667
668
  txb.setGasBudget(input.gasBudget);
668
669
  txb.setSender(this.address);
@@ -956,7 +957,7 @@ var ReportSDK = class {
956
957
  };
957
958
 
958
959
  // src/globals/MSafeGlobals.ts
959
- import { SuiClient as SuiClient2 } from "@mysten/sui.js/client";
960
+ import { SuiClient } from "@mysten/sui.js/client";
960
961
 
961
962
  // src/backend/BackendImpl.ts
962
963
  import {
@@ -1381,7 +1382,7 @@ var MSafeGlobals = class _MSafeGlobals {
1381
1382
  }
1382
1383
  static async New(env, options) {
1383
1384
  const config = getMSafeConfig(env, options);
1384
- const suiClient = new SuiClient2(
1385
+ const suiClient = new SuiClient(
1385
1386
  config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url }
1386
1387
  );
1387
1388
  const backend = new BackendImpl(config.backend.url, options?.mockAddress);
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/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.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, SerializedSignature } from '@mysten/sui.js/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);\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 PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\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 PublicKey),\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 { SuiObjectData, SuiObjectResponse, SuiClient } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/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 { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\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 = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.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(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n suiClient: new SuiClient({ url: 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 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 ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n const txb = 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 txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\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 = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.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 = 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 const rejectTxb = 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 appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.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 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: SerializedSignature[] = [];\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.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\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 { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/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: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\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: SerializedSignature;\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: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\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: SerializedSignature;\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 { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/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 { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\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 || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\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 if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\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: SerializedSignature, 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;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\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 { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\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\nexport type ObjectFilter = (objRes: SuiObjectResponse) => 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 objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | 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<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\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.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; 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 = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\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, SerializedSignature } from '@mysten/sui.js/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) : 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: SerializedSignature }) {\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 { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\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?: SuiClientOptions['transport'];\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: LOCAL_API_URL,\n },\n syncingURL: LOCAL_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","TransactionBlock","normalizeStructTag","normalizeStructTag","normalizeStructTag","PublicKeySerde","PublicKeySerde","MultiSigAccount","normalizeStructTag","SigningMessageHelper","TransactionBlock","isSameAddress","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","SuiClient","PublicKeySerde","PublicKeySerde","MSafeEnv","SuiClient","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/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.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, SerializedSignature } from '@mysten/sui.js/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);\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 PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\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 PublicKey),\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 { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/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 { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\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 = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.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(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.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 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?: TransactionBlock;\n },\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\n txb = 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 txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\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 = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.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 = 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 const rejectTxb = 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 appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.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 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: SerializedSignature[] = [];\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.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\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 { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/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: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\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: SerializedSignature;\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: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\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: SerializedSignature;\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 { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/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 { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\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 || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\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 if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\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: SerializedSignature, 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;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\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 { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\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\nexport type ObjectFilter = (objRes: SuiObjectResponse) => 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 objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | 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<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\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<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\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.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; 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 = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\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, SerializedSignature } from '@mysten/sui.js/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) : 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: SerializedSignature }) {\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 { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\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?: SuiClientOptions['transport'];\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: LOCAL_API_URL,\n },\n syncingURL: LOCAL_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","TransactionBlock","normalizeStructTag","normalizeStructTag","normalizeStructTag","PublicKeySerde","PublicKeySerde","MultiSigAccount","normalizeStructTag","SigningMessageHelper","TransactionBlock","isSameAddress","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","PublicKeySerde","PublicKeySerde","MSafeEnv","SigningMessageHelper","UserMSafeStatus","InfoTypeKey"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msafe/sui3-sdk",
3
- "version": "0.0.81",
3
+ "version": "0.0.83",
4
4
  "description": "SDK for MSafe SUI V3",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "devDependencies": {
29
29
  "@msafe/mpay-sdk-sui": "^1.0.25",
30
- "@msafe/sui-app-store": "0.0.140",
30
+ "@msafe/sui-app-store": "^0.0.222",
31
31
  "@msafe/sui3-utils": "^5.0.2",
32
32
  "@mysten/sui.js": "^0.54.1",
33
33
  "@mysten/wallet-standard": "^0.11.6",
@@ -15,7 +15,7 @@ import {
15
15
  buildRejectTxb,
16
16
  isSameAddress,
17
17
  } from '@msafe/sui3-utils';
18
- import { SuiObjectData, SuiObjectResponse, SuiClient } from '@mysten/sui.js/client';
18
+ import { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';
19
19
  import { SerializedSignature } from '@mysten/sui.js/cryptography';
20
20
  import { TransactionBlock } from '@mysten/sui.js/transactions';
21
21
  import { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';
@@ -143,9 +143,6 @@ export class MSafeAccount {
143
143
  txType: request.txType,
144
144
  txSubType: request.txSubType,
145
145
  clientUrl: this.globals.config.suiClient.url,
146
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
147
- // @ts-ignore
148
- suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),
149
146
  account: {
150
147
  address: this.address,
151
148
  publicKey: fromHEX(this.address),
@@ -175,26 +172,32 @@ export class MSafeAccount {
175
172
  }
176
173
 
177
174
  async proposeIntentionAndBuildVote(
178
- input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>,
175
+ input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
176
+ txb?: TransactionBlock;
177
+ },
179
178
  ): Promise<void> {
180
179
  const appHelper = appHelpers.getAppHelper(input.application);
181
180
  if (!appHelper) {
182
181
  throw new Error(`Can't find app helper for application ${input.application}`);
183
182
  }
184
-
185
- const txb = await appHelper.build({
186
- network: this.globals.config.network,
187
- intentionData: input.intention,
188
- txType: input.txType,
189
- txSubType: input.txSubType,
190
- clientUrl: this.globals.config.suiClient.url,
191
- account: {
192
- address: this.address,
193
- publicKey: fromHEX(this.address),
194
- chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
195
- features: [],
196
- },
197
- });
183
+ let txb: TransactionBlock;
184
+ if (input.txb) {
185
+ txb = input.txb;
186
+ } else {
187
+ txb = await appHelper.build({
188
+ network: this.globals.config.network,
189
+ intentionData: input.intention,
190
+ txType: input.txType,
191
+ txSubType: input.txSubType,
192
+ clientUrl: this.globals.config.suiClient.url,
193
+ account: {
194
+ address: this.address,
195
+ publicKey: fromHEX(this.address),
196
+ chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
197
+ features: [],
198
+ },
199
+ });
200
+ }
198
201
  txb.setGasPrice(input.gasPrice);
199
202
  txb.setGasBudget(input.gasBudget);
200
203
  txb.setSender(this.address);