@msafe/sui3-sdk 0.0.83 → 0.0.85

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
@@ -658,23 +658,28 @@ var MSafeAccount = class _MSafeAccount {
658
658
  return this.backend.getNextSequenceNumber(this.address);
659
659
  }
660
660
  async simulateIntention(request) {
661
- const appHelper = import_sui_app_store.appHelpers.getAppHelper(request.application);
662
- if (!appHelper) {
663
- throw new Error(`Can't find app helper for application ${request.application}`);
664
- }
665
- const txb = await appHelper.build({
666
- network: this.globals.config.network,
667
- intentionData: request.intention,
668
- txType: request.txType,
669
- txSubType: request.txSubType,
670
- clientUrl: this.globals.config.suiClient.url,
671
- account: {
672
- address: this.address,
673
- publicKey: (0, import_utils3.fromHEX)(this.address),
674
- chains: [import_wallet_standard.SUI_MAINNET_CHAIN, import_wallet_standard.SUI_TESTNET_CHAIN],
675
- features: []
661
+ let txb;
662
+ if (request.txb) {
663
+ txb = request.txb;
664
+ } else {
665
+ const appHelper = import_sui_app_store.appHelpers.getAppHelper(request.application);
666
+ if (!appHelper) {
667
+ throw new Error(`Can't find app helper for application ${request.application}`);
676
668
  }
677
- });
669
+ txb = await appHelper.build({
670
+ network: this.globals.config.network,
671
+ intentionData: request.intention,
672
+ txType: request.txType,
673
+ txSubType: request.txSubType,
674
+ clientUrl: this.globals.config.suiClient.url,
675
+ account: {
676
+ address: this.address,
677
+ publicKey: (0, import_utils3.fromHEX)(this.address),
678
+ chains: [import_wallet_standard.SUI_MAINNET_CHAIN, import_wallet_standard.SUI_TESTNET_CHAIN],
679
+ features: []
680
+ }
681
+ });
682
+ }
678
683
  txb.setSender(this.address);
679
684
  return this.simulator.simulate({ txb, sender: this.address });
680
685
  }
@@ -694,14 +699,14 @@ var MSafeAccount = class _MSafeAccount {
694
699
  });
695
700
  }
696
701
  async proposeIntentionAndBuildVote(input) {
697
- const appHelper = import_sui_app_store.appHelpers.getAppHelper(input.application);
698
- if (!appHelper) {
699
- throw new Error(`Can't find app helper for application ${input.application}`);
700
- }
701
702
  let txb;
702
703
  if (input.txb) {
703
704
  txb = input.txb;
704
705
  } else {
706
+ const appHelper = import_sui_app_store.appHelpers.getAppHelper(input.application);
707
+ if (!appHelper) {
708
+ throw new Error(`Can't find app helper for application ${input.application}`);
709
+ }
705
710
  txb = await appHelper.build({
706
711
  network: this.globals.config.network,
707
712
  intentionData: input.intention,
@@ -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 } 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"]}
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(\n request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {\n txb?: TransactionBlock;\n },\n ) {\n let txb: TransactionBlock;\n if (request.txb) {\n txb = request.txb;\n } else {\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 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 }\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 let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,wBAOO;AAOA,IAAM,eAAN,MAAmB;AAAA,EACxB,YACkB,SACA,UAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,MAAM,kBAAkB,WAAqB;AAC3C,WAAO,KAAK,SAAS,kBAAkB,SAAS;AAAA,EAClD;AAAA,EAEA,MAAM,sBAAsB,MAAuB;AACjD,UAAM,WAAW,MAAM,KAAK,8BAA8B,IAAI;AAC9D,UAAM,KAAK,IAAI,kCAAgB,QAAQ;AACvC,WAAO,GAAG;AAAA,EACZ;AAAA;AAAA,EAGA,MAAM,mBAAmB,YAA6B;AAEpD,WAAO,KAAK,sBAAsB,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,SAAiB,WAAgC;AAC5D,UAAM,KAAK,iCAAe,GAAG,SAAS;AACtC,QAAI,KAAC,iCAAc,SAAS,GAAG,aAAa,CAAC,GAAG;AAC9C,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,SAAK,SAAS,aAAa,SAAS,EAAE;AAAA,EACxC;AAAA,EAEA,MAAM,oBAAoB,cAA+B;AACvD,UAAM,eAAe,MAAM,KAAK,mBAAmB,YAAY;AAE/D,UAAM,iBAAiB,uCAAqB,mBAAmB,YAAY;AAC3E,UAAM,YAAY,MAAM,KAAK,QAAQ,OAAO,oBAAoB,EAAE,YAAY,eAAe,CAAC;AAE9F,UAAM,KAAK,gBAAgB,cAAc,UAAU,SAAS;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,8BAA8B,MAAgD;AAC1F,UAAM,aAAa,MAAM,KAAK,kBAAkB,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACzF,eAAW,QAAQ,CAAC,IAAI,MAAM;AAC5B,UAAI,OAAO,QAAW;AACpB,cAAM,IAAI,MAAM,mCAAmC,KAAK,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,MAC7E;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,QAC/C,WAAW,WAAW,CAAC;AAAA,QACvB,QAAQ,MAAM;AAAA,MAChB,EAAE;AAAA,MACF,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,YAA6B,WAAgC;AACzF,UAAM,MAAM,MAAM,KAAK,SAAS,kBAAkB,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,KAAK,QAAQ,QAAQ,mBAAmB;AAAA,MAC5C,QAAQ,WAAW,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,QAC3C,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,QAAQ;AAAA,QACR,GAAG,iCAAe,IAAI,IAAI,CAAC,CAAc;AAAA,MAC3C,EAAE;AAAA,MACF,WAAW,WAAW;AAAA,MACtB,MAAM,WAAW;AAAA;AAAA,MACjB,aAAa,WAAW;AAAA;AAAA,MACxB,eAAe,WAAW;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/FA,IAAAA,qBAOO;;;ACPP,IAAAC,qBAA4F;AAIrF,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,WAAW,YAA2B;AAC1C,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,UAAU;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,SAAmC;AAC9C,UAAM,aAAa,wCAAqB,yBAAyB,OAAO;AACxE,UAAM,MAAM,MAAM,KAAK,QAAQ,OAAO,oBAAoB,EAAE,WAAW,CAAC;AACxE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,SAAS,WAAW,IAAI,UAAU,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ,mBAAmB;AAC1D,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,QAAQ,MAAuB;AACnC,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,KAAK,CAAC;AAAA,EACzD;AACF;;;ACrBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,iBAAiB,QAAyB,YAAgE;AAC9G,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,kBAAkB,cAAsB,QAAyB;AACrE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,cAAc,OAAO,CAAC;AAAA,EACxE;AACF;;;ACdA,2BAA2B;AAC3B,IAAAC,qBAeO;AAGP,IAAAC,uBAAiC;AACjC,IAAAC,gBAAmD;AACnD,6BAAqD;;;ACpBrD,0BAAiC;AAMjC,IAAM,oBAAoB;AAEnB,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAa,SAAS,OAA6E;AACjG,UAAM,KAAK,KAAK,qBAAqB,MAAM,GAAG;AAE9C,UAAM,EAAE,UAAU,IAAI,KAAK;AAE3B,UAAM,WAAW,MAAM,KAAK,YAAY;AAExC,OAAG,YAAY,QAAQ;AAEvB,UAAM,gBAAgB,MAAM,UAAU,uBAAuB;AAAA,MAC3D,kBAAkB,MAAM,GAAG,MAAM,EAAE,QAAQ,UAAU,CAAC;AAAA,IACxD,CAAC;AACD,UAAM,UAAU,cAAc,QAAQ,OAAO,WAAW;AAExD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,iBAAiB,cAAc,QAAQ,OAAO;AAAA,MAChD;AAAA,IACF;AACA,UAAM,YAAY,KAAK,YAAY,cAAc,QAAQ,SAAS,QAAQ;AAE1E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,cAAc,QAAQ,UAAU;AAAA,MAC3C,SAAS,cAAc,QAAQ;AAAA,MAC/B;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAc,cAAc;AAC1B,WAAO,KAAK,QAAQ,UAAU,qBAAqB;AAAA,EACrD;AAAA,EAEQ,YAAY,SAAyB,UAAkB;AAC7D,UAAM,EAAE,iBAAiB,aAAa,cAAc,IAAI;AACxD,UAAM,eAAe,oBAAoB;AAEzC,UAAM,kCAAkC,OAAO,eAAe,IAAI;AAGlE,UAAM,YAAY,kCAAkC,OAAO,WAAW,IAAI,OAAO,aAAa;AAG9F,WAAO,YAAY,kCAAkC,YAAY;AAAA,EACnE;AAAA,EAEQ,qBAAqB,IAAwC;AACnE,WAAO,qCAAiB,KAAK,GAAG,UAAU,CAAC;AAAA,EAC7C;AACF;;;AClEA,oBAAuB;AAEhB,SAAS,eAAe,GAAW;AACxC,SAAO,qBAAO,KAAK,GAAG,OAAO;AAC/B;AAEO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,KAAK,MAAM,UAAU,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AACzF;AAEO,SAAS,gBAAgB,KAAyB;AACvD,SAAO,WAAW,KAAK,qBAAO,KAAK,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;AACtF;;;ACXA,oBAA8D;;;ACD9D,IAAAC,gBAAwD;;;ACCxD,mBAAmC;AAG5B,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAEA;AAAA,EAER,YAAY,QAAmB;AAC7B,SAAK,UAAU;AACf,SAAK,eAAe,oBAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,UAAqD;AACrE,UAAM,iBAAa,iCAAmB,QAAQ;AAC9C,QAAI,KAAK,aAAa,IAAI,UAAU,GAAG;AACrC,aAAO,KAAK,aAAa,IAAI,UAAU;AAAA,IACzC;AACA,UAAM,OAAO,MAAM,KAAK,cAAc,UAAU;AAChD,QAAI,MAAM;AACR,WAAK,aAAa,IAAI,YAAY,IAAI;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAqD;AAC/E,UAAM,MAAM,MAAM,KAAK,QAAQ,gBAAgB,EAAE,SAAS,CAAC;AAC3D,WAAO,OAAO;AAAA,EAChB;AACF;AAIO,IAAM,sBACX;AAEK,IAAM,OAAN,MAAM,MAAK;AAAA,EAChB,OAAO,OAAO,MAA0C;AACtD,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,eAAO,iCAAmB,IAAI,EAAE,MAAM,mBAAmB,KAAK;AAAA,EAChE;AAAA,EAEA,OAAO,YAAY,MAAc;AAC/B,UAAM,CAAC,EAAE,GAAG,QAAI,iCAAmB,IAAI,EAAE,MAAM,mBAAmB,KAAK,CAAC;AACxE,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,WAAW,MAAyC;AACzD,QAAI,CAAC,MAAK,OAAO,KAAK,IAAI,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,aAAa,cAAc;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,EAAE,QAAQ,IAAI,KAAK,SAAS;AAClC,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,OAAO;AAAA,EACvB;AACF;;;AD3DO,IAAM,YAAN,MAAgB;AAAA,EACrB,OAAO,oBAAoB,MAAc;AACvC,eAAO,mCAAoB,IAAI;AAAA,EACjC;AAAA,EAEA,OAAO,mBAAmB,QAAgB;AACxC,eAAO,kCAAmB,MAAM;AAAA,EAClC;AAAA,EAEA,OAAO,kBAAkB,OAAe,OAAe;AACrD,eAAO,mCAAoB,KAAK,UAAM,mCAAoB,KAAK;AAAA,EACjE;AAAA,EAEA,OAAO,iBAAiB,SAAiB,SAAiB;AACxD,eAAO,kCAAmB,OAAO,UAAM,kCAAmB,OAAO;AAAA,EACnE;AAAA,EAEA,OAAO,iBAAiB,QAAgB;AACtC,WAAO,KAAK,OAAO,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,UAAU,GAAW,QAAgB;AACnD,MAAI,EAAE,WAAW,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;;;ADzBO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAC7B,aAAa,0BAA0B,OAIpC;AACD,QAAI,MAAM,gBAAgB,oBAAoB;AAC5C,iBAAO,sCAAuB,MAAM,SAAS,MAAM,SAAS;AAAA,IAC9D;AACA,eAAO,qCAAsB,MAAM,SAAS,MAAM,SAAS;AAAA,EAC7D;AAAA,EAEA,aAAa,kCAAkC,OAA+D;AAC5G,UAAM,UAAU,eAAe,MAAM,UAAU;AAC/C,WAAO,KAAK,0BAA0B;AAAA,MACpC;AAAA,MACA,aAAa;AAAA,MACb,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,gBAAgB,OAK1B;AACD,UAAM,YAAY,MAAM,mBAAkB,0BAA0B,KAAK;AACzE,WAAO,UAAU,kBAAkB,UAAU,aAAa,GAAG,MAAM,aAAa;AAAA,EAClF;AAAA,EAEA,aAAa,wBAAwB,OAIlC;AACD,UAAM,UAAU,eAAe,MAAM,UAAU;AAC/C,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA,aAAa;AAAA,MACb,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,2BAA2B,OAInB;AACnB,WAAO,KAAK,gBAAgB;AAAA,MAC1B,aAAa;AAAA,MACb,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AACF;;;AG/DA,IAAAC,qBAA+B;AAE/B,0BAAyE;AACzE,sBAAkC;AAI3B,IAAM,WAAW;AAExB,eAAsB,sBAAsB,WAAsB,SAAiD;AACjH,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,UAAU,uBAAuB;AAAA;AAAA,MAE3C,QAAQ,EAAE,aAAa,QAAQ;AAAA,MAC/B,SAAS,EAAE,WAAW,KAAK;AAAA,MAC3B,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,GAAG;AAIV,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,KAAK,WAAW,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,aAAa,cAAc;AACnE,WAAO;AAAA,EACT;AACA,QAAM,KAAK,IAAI,KAAK,CAAC;AACrB,QAAM,aAAa,GAAG,aAAa;AAEnC,WAAS,IAAI,GAAG,MAAM,WAAW,QAAQ,KAAK;AAC5C,UAAM,gBAAgB,WAAW,CAAC;AAClC,UAAM,KAAK,yBAAyB,eAAe,OAAO;AAC1D,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,eAAoC,eAAuB;AAC3F,QAAM,cAAU,8CAAyB,aAAa;AACtD,UAAQ,QAAQ,iBAAiB;AAAA,IAC/B,KAAK,YAAY;AACf,YAAM,kBAAkB,IAAI,kCAAkB,QAAQ,SAAS,WAAW,EAAE,aAAa;AACzF,UAAI,UAAU,kBAAkB,iBAAiB,aAAa,GAAG;AAC/D,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,aAAa;AAChB,YAAM,KAAK,kCAAe,GAAG,EAAE,kBAAkB,QAAQ,WAAW,QAAQ,QAAQ,gBAAgB,CAAC;AACrG,UAAI,UAAU,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG;AACjE,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,gBAAgB;AAAA,EACpC;AACF;AAEA,eAAsB,YAAY,OAA8E;AAC9G,MAAI,UAAU;AACd,MAAI;AACJ,QAAM,MAAoB,CAAC;AAC3B,SAAO,SAAS;AACd,UAAM,cAA8B,MAAM,MAAM,UAAU,SAAS;AAAA,MACjE,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,GAAG,YAAY,IAAI;AAC5B,cAAU,YAAY;AACtB,aAAS,YAAY;AAAA,EACvB;AACA,SAAO;AACT;;;ACjFO,IAAM,oBAAoB;AAOjC,eAAsB,mBAAsB,IAAkE;AAC5G,QAAM,MAAyB,CAAC;AAChC,SAAO,MAAM,GAAG,QAAQ,GAAG;AACzB,UAAM,MAAM,MAAM,GAAG,KAAK;AAC1B,QAAI,KAAK,GAAG;AAAA,EACd;AACA,MAAI,OAAO,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AAChC,WAAO,IAAI,KAAK,CAAC;AAAA,EACnB;AACA,SAAO;AACT;AAEO,IAAM,gBAAN,MAAiE;AAAA,EAKtE,YAA4B,WAAyB;AAAzB;AAC1B,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EACd;AAAA,EAPQ;AAAA,EAEA;AAAA,EAOR,MAAM,UAA4B;AAChC,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAAA,MACpD;AACA,aAAO,CAAC,CAAC,KAAK,QAAQ,MAAM,UAAU,KAAK,QAAQ;AAAA,IACrD;AACA,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,OAAmC;AACvC,QAAI,KAAK,MAAM;AACb,WAAK,OAAO;AACZ,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAAA,MACpD;AACA,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,SAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAClD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;AAEO,IAAM,gBAAN,MAAiD;AAAA,EAOtD,YAA4B,WAAyB;AAAzB;AAC1B,SAAK,QAAQ,IAAI,cAAiB,SAAS;AAC3C,SAAK,UAAU,CAAC;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAVA;AAAA,EAEA;AAAA,EAEA;AAAA,EAQA,MAAM,UAA4B;AAChC,QAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,GAAG;AACzC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,OAA+B;AACnC,SAAK,UAAU;AACf,WAAO,KAAK,UAAU,KAAK,QAAQ,QAAQ;AACzC,UAAI,CAAE,MAAM,KAAK,MAAM,QAAQ,GAAI;AACjC,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC,OAAO;AACL,aAAK,UAAU,MAAM,KAAK,MAAM,KAAK;AACrC,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,KAAK,MAAM;AAAA,EACjC;AACF;;;AC2BA,eAAsB,mBACpB,UACA,OACA,SAC0B;AAC1B,QAAM,OAAO,IAAI,oBAAoB,UAAU,OAAO,OAAO;AAC7D,SAAQ,MAAM,mBAAmB,IAAI;AACvC;AAEO,IAAM,sBAAN,cAAkC,cAAmE;AAAA,EAC1G,YACkB,UACA,OACA,SAChB;AACA,UAAM,IAAI,qBAAqB,UAAU,OAAO,OAAO,CAAC;AAJxC;AACA;AACA;AAAA,EAGlB;AACF;AAEO,IAAM,uBAAN,MAA+D;AAAA,EASpE,YACkB,UACA,OACA,SAChB;AAHgB;AACA;AACA;AAEhB,SAAK,aAAa;AAClB,SAAK,SAAS,SAAS;AACvB,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,gBAAgB,SAAS,iBAAiB;AAAA,MAC7C,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EApBA;AAAA,EAEO;AAAA,EAEA;AAAA,EAEA;AAAA,EAgBP,MAAM,gBAAmD;AACvD,UAAM,MAAM,MAAM,KAAK,SAAS,gBAAgB;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd,CAAC;AACD,SAAK,aAAa,IAAI;AACtB,QAAI;AACJ,QAAI,KAAK,QAAQ;AACf,YAAM,EAAE,OAAO,IAAI;AACnB,iBAAW,IAAI,KAAK,OAAO,CAAC,QAA2B,SAAS,GAAG,CAAC;AAAA,IACtE,OAAO;AACL,iBAAW,IAAI;AAAA,IACjB;AACA,WAAO;AAAA,MACL,MAAM,SAAS,IAAI,CAAC,MAAyB,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI;AAAA,MAC1E,SAAS,IAAI;AAAA,IACf;AAAA,EACF;AACF;;;ARnJO,IAAM,eAAN,MAAM,cAAa;AAAA,EAOxB,YACkB,SACA,MAChB;AAFgB;AACA;AAEhB,SAAK,WAAW,IAAI,mCAAgB;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,eAAe,KAAK;AAAA,IACtB,CAAC;AACD,SAAK,aAAa,IAAI,WAAW,KAAK,SAAS;AAC/C,SAAK,YAAY,IAAI,UAAU,OAAO;AAAA,EACxC;AAAA,EAjBO;AAAA,EAEA;AAAA,EAEC;AAAA,EAeR,aAAa,IAAI,SAAuB,SAAiB;AACvD,UAAM,OAAO,MAAM,QAAQ,QAAQ,oBAAoB,OAAO;AAC9D,UAAM,KAAK,IAAI,cAAa,SAAS,IAAI;AACzC,QAAI,GAAG,YAAY,SAAS;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,aAAmC;AACvC,UAAM,WAAW,MAAM,KAAK,UAAU,eAAe,EAAE,OAAO,KAAK,QAAQ,CAAC;AAC5E,WAAO,QAAQ;AAAA,MACb,SAAS,IAAI,OAAO,YAAgC;AAClD,cAAM,OAAO,MAAM,KAAK,WAAW,YAAY,QAAQ,QAAQ;AAC/D,cAAM,kBAAkB,QAAQ,cAAc,SAC1C,OAAO,QAAQ,YAAY,IAAI,OAAO,QAAQ,cAAc,MAAM,IAClE,OAAO,QAAQ,YAAY;AAE/B,eAAO;AAAA,UACL,UAAM,kCAAmB,QAAQ,QAAQ;AAAA,UACzC,SAAS,OAAO,eAAe;AAAA,UAC/B,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAAwD;AACzE,UAAM,0BAA0B;AAAA,MAC9B,QAAQ,CAAC,WAA8B,CAAC,QAAQ,MAAM,MAAM,WAAW,iBAAiB;AAAA,MACxF,GAAG;AAAA,IACL;AACA,WAAO,mBAAmB,KAAK,WAAW,KAAK,SAAS,uBAAuB;AAAA,EACjF;AAAA,EAEA,MAAM,qBAAqD;AACzD,UAAM,MAAM,MAAM,KAAK,QAAQ,uBAAuB,EAAE,cAAc,KAAK,QAAQ,CAAC;AACpF,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,IAAI;AACtB,UAAM,gBAAgB,IAAI;AAE1B,WAAO;AAAA,MACL,aAAa,UAAU;AAAA,MACvB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,WAAW,UAAU;AAAA,MACrB,SAAS,UAAU;AAAA,MACnB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,gBAAgB,UAAU;AAAA,MAC1B,SAAS,UAAU;AAAA,MACnB,OAAO,UAAU;AAAA,MACjB,gBAAgB,KAAK,yBAAyB,UAAU,KAAK;AAAA,MAC7D,cAAc,UAAU;AAAA,MACxB,cAAc,eAAe,UAAU;AAAA,MACvC,eAAe,eAAe,WAAW;AAAA,MACzC,aAAa,eAAe,SAAS,CAAC;AAAA,MACtC,cAAc,KAAK,yBAAyB,eAAe,SAAS,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,YAAyB;AAChD,WAAO,KAAK,QAAQ,uBAAuB;AAAA,MACzC,cAAc,KAAK;AAAA,MACnB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,YAAyB;AAC9C,WAAO,KAAK,QAAQ,oBAAoB,EAAE,cAAc,KAAK,SAAS,GAAG,WAAW,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,wBAAwB;AAC5B,WAAO,KAAK,QAAQ,yBAAyB,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,qBAAqB;AACzB,WAAO,KAAK,QAAQ,sBAAsB,KAAK,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,kBACJ,SAGA;AACA,QAAI;AACJ,QAAI,QAAQ,KAAK;AACf,YAAM,QAAQ;AAAA,IAChB,OAAO;AACL,YAAM,YAAY,gCAAW,aAAa,QAAQ,WAAW;AAC7D,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,yCAAyC,QAAQ,WAAW,EAAE;AAAA,MAChF;AACA,YAAM,MAAM,UAAU,MAAM;AAAA,QAC1B,SAAS,KAAK,QAAQ,OAAO;AAAA,QAC7B,eAAe,QAAQ;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,QACzC,SAAS;AAAA,UACP,SAAS,KAAK;AAAA,UACd,eAAW,uBAAQ,KAAK,OAAO;AAAA,UAC/B,QAAQ,CAAC,0CAAmB,wCAAiB;AAAA,UAC7C,UAAU,CAAC;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,iBAAiB,OAAqE;AAC1F,UAAM,UAAU,wCAAqB,wBAAwB;AAAA,MAC3D,cAAc,KAAK;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,IAAI,MAAM;AAAA,IACZ,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,OAAO,oBAAoB;AAAA,MACtD,YAAY;AAAA,IACd,CAAC;AAED,WAAO,KAAK,QAAQ,iBAAiB;AAAA,MACnC,GAAG;AAAA,MACH,cAAc,KAAK;AAAA,MACnB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BACJ,OAGe;AACf,QAAI;AACJ,QAAI,MAAM,KAAK;AACb,YAAM,MAAM;AAAA,IACd,OAAO;AACL,YAAM,YAAY,gCAAW,aAAa,MAAM,WAAW;AAC3D,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,yCAAyC,MAAM,WAAW,EAAE;AAAA,MAC9E;AACA,YAAM,MAAM,UAAU,MAAM;AAAA,QAC1B,SAAS,KAAK,QAAQ,OAAO;AAAA,QAC7B,eAAe,MAAM;AAAA,QACrB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,QACzC,SAAS;AAAA,UACP,SAAS,KAAK;AAAA,UACd,eAAW,uBAAQ,KAAK,OAAO;AAAA,UAC/B,QAAQ,CAAC,0CAAmB,wCAAiB;AAAA,UAC7C,UAAU,CAAC;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,YAAY,MAAM,QAAQ;AAC9B,QAAI,aAAa,MAAM,SAAS;AAChC,QAAI,UAAU,KAAK,OAAO;AAC1B,UAAM,UAAU,MAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAClE,UAAM,SAAS,MAAM,IAAI,UAAU,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAErE,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,QAAQ,CAAC;AAEtF,WAAO,KAAK,QAAQ,6BAA6B;AAAA,MAC/C,GAAG;AAAA,MACH,aAAS,qBAAM,OAAO;AAAA,MACtB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,8BAA8B,WAAkC;AACpE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BAA6B,WAAkC;AACnE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gCAAgC,WAAoC;AACxE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO,OAAO;AAAA,MAC7C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,+BAA+B,WAAoC;AACvE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO,OAAO;AAAA,MAC7C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,8BAA8B,WAAkC;AACpE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO;AAAA,MACtC,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BAA6B,WAAkC;AACnE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AAEzC,UAAM,KAAK,sCAAiB,KAAK,UAAU,OAAO;AAElD,QAAI,CAAC,GAAG,UAAU,UAAU,KAAC,kCAAc,GAAG,UAAU,QAAQ,KAAK,OAAO,GAAG;AAC7E,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAIA,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,mCAAgB;AAAA,MACxB,WAAW,uCAAoB,OAAO;AAAA,MACtC,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,QAAgB,SAAiB;AACxD,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,aAAa,CAAC;AAC3F,WAAO,KAAK,QAAQ,mBAAmB;AAAA,MACrC,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB;AACvB,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,CAAC,aAAa,UAAU,iBAAiB,IAAI;AAC/C,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,UAAM,mCAAe,KAAK,OAAO;AACvC,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,gBAAgB,OAA6C;AACjE,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,CAAC,aAAa,UAAU,iBAAiB,IAAI;AAC/C,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,gBAAY,mCAAe,KAAK,OAAO;AAC7C,UAAM,SAAS,MAAM,UAAU,UAAU,EAAE,QAAQ,KAAK,UAAU,CAAC;AACnE,UAAM,UAAU,MAAM,UAAU,MAAM,EAAE,QAAQ,KAAK,UAAU,CAAC;AAChE,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,QAAQ,CAAC;AACtF,WAAO,KAAK,QAAQ,gBAAgB;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW,UAAU;AAAA,MACrB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,2BAAsD;AAC1D,UAAM,YAAY,MAAM,KAAK,QAAQ,iBAAiB,EAAE,cAAc,KAAK,QAAQ,CAAC;AACpF,UAAM,YAAY,gCAAW,aAAa,UAAU,WAAW;AAC/D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yCAAyC,UAAU,WAAW,EAAE;AAAA,IAClF;AACA,UAAM,MAAM,MAAM,UAAU,MAAM;AAAA,MAChC,SAAS,KAAK,QAAQ,OAAO;AAAA,MAC7B,eAAe,UAAU;AAAA,MACzB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,MACzC,SAAS;AAAA,QACP,SAAS,KAAK;AAAA,QACd,eAAW,uBAAQ,KAAK,OAAO;AAAA,QAC/B,QAAQ,CAAC,0CAAmB,wCAAiB;AAAA,QAC7C,UAAU,CAAC;AAAA,MACb;AAAA,IACF,CAAC;AACD,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,kCAAkC,WAAiD;AACvF,WAAO,KAAK,QAAQ,kCAAkC;AAAA,MACpD,cAAc,KAAK;AAAA,MACnB,YAAY,UAAU;AAAA,MACtB,UAAU,UAAU;AAAA,MACpB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BAA0B;AAC9B,WAAO,KAAK,QAAQ,wBAAwB,EAAE,cAAc,KAAK,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,mBAAmB;AACvB,WAAO,KAAK,QAAQ,iBAAiB,EAAE,cAAc,KAAK,QAAQ,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,iBAAiB,SAAoB,aAAsB,OAAO;AACtE,UAAM,QAAQ,aAAa,QAAQ,cAAc,QAAQ;AACzD,UAAM,UAAU,aAAa,QAAQ,gBAAgB,QAAQ;AAE7D,QAAI,KAAK,yBAAyB,KAAK,IAAI,KAAK,KAAK,WAAW;AAC9D,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,UAAM,aAAoC,CAAC;AAC3C,UAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,aAAa,KAAK,SAAS,CAAC,CAAC;AAC/E,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK,OAAO,QAAQ,KAAK;AAChD,YAAM,QAAQ,KAAK,KAAK,OAAO,CAAC;AAChC,YAAM,YAAY,QAAQ,IAAI,MAAM,OAAO;AAC3C,UAAI,WAAW;AACb,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,SAAS,yBAAyB,UAAU;AACxE,WAAO,KAAK,UAAU,wBAAwB;AAAA,MAC5C,kBAAkB,gBAAgB,OAAO;AAAA,MACzC,WAAW;AAAA,MACX,SAAS,EAAE,aAAa,MAAM,YAAY,KAAK;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY;AAChB,WAAO,KAAK,QAAQ,aAAa;AAAA,MAC/B,cAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,yBAAyB,OAAkC;AACjE,WAAO,KAAK,gBAAgB,MAAM,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC;AAAA,EACnE;AAAA,EAEQ,gBAAgB,aAAuB;AAC7C,QAAI,YAAY;AAEhB,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,CAAC,cAAU,kCAAc,MAAM,SAAS,YAAY,CAAC,CAAC,CAAC;AAC3F,UAAI,OAAO;AACT,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAY,SAAS;AACnB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAc,cAAc;AAC1B,WAAO,KAAK,QAAQ,OAAO,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAY,YAAY;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AS7bA,IAAAC,qBAA8B;AAE9B,IAAAC,gBAAoC;AAS7B,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAA4B,SAAuB;AAAvB;AAC1B,SAAK,kBAAkB,oBAAI,IAAuB;AAAA,EACpD;AAAA,EAJQ;AAAA,EAMR,MAAM,aAAa,SAAiB;AAClC,UAAM,SAAS,KAAK,gBAAgB,IAAI,OAAO;AAC/C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,KAAK,MAAM,KAAK,cAAc,OAAO;AAC3C,QAAI,IAAI;AACN,WAAK,gBAAgB,IAAI,SAAS,EAAE;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,WAAyD;AAC/E,UAAM,UAAqC,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK,MAAS;AAGrF,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,UAAU,UAAU,CAAC;AAC3B,cAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO;AAAA,IAC/C;AAGA,UAAM,eAAe,QAClB,IAAI,CAAC,MAAM,UAAW,SAAS,SAAY,QAAQ,EAAG,EACtD,OAAO,CAAC,UAAU,UAAU,EAAE;AACjC,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,MAAM,KAAK,QAAQ,QAAQ,kBAAkB,aAAa,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC,CAAC;AAChH,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,QAAQ,aAAa,CAAC;AAC5B,cAAQ,KAAK,IAAI,cAAc,CAAC;AAAA,IAClC;AAGA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,QAAQ,CAAC,MAAM,QAAW;AAC5B,gBAAQ,CAAC,IAAI,MAAM,KAAK,sBAAsB,UAAU,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,QAAQ,CAAC,GAAG;AACd,aAAK,gBAAgB,IAAI,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAc;AAAA,MAChE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,SAAiB,WAAsB;AAClD,QAAI,KAAC,kCAAc,SAAS,UAAU,aAAa,CAAC,GAAG;AACrD,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,SAAK,gBAAgB,QAAI,mCAAoB,OAAO,GAAG,SAAS;AAAA,EAClE;AAAA,EAEA,MAAc,cAAc,SAAiB;AAC3C,UAAM,YAAY,MAAM,KAAK,wBAAwB,OAAO;AAC5D,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,KAAK,sBAAsB,OAAO;AACxD,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,wBAAwB,SAAiD;AACrF,QAAI;AACF,YAAM,KAAK,MAAM,KAAK,QAAQ,QAAQ,aAAa,OAAO;AAC1D,aAAO;AAAA,IACT,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,SAAiD;AACnF,WAAO,sBAAsB,KAAK,QAAQ,WAAW,OAAO;AAAA,EAC9D;AACF;;;AC/FO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,OAAO,QAAgB;AAC3B,WAAO,KAAK,QAAQ,QAAQ,aAAa,MAAM;AAAA,EACjD;AACF;;;ACVA,oBAA0B;;;ACA1B,IAAAC,qBAsCO;AAEP,mBAA8F;AAOvF,IAAM,cAAN,MAAM,aAAgC;AAAA,EAG3C,YACmB,QACA,aACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EALK;AAAA,EAOR,sBAAiD;AAC/C,WAAO,KAAK,IAAsB,iBAAiB;AAAA,MACjD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEA,sBAAsB,OAAgD;AACpE,WAAO,KAAK,KAAK,2BAA2B,OAAO;AAAA,MACjD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,+BAA+B,OAA6C;AAC1E,WAAO,KAAK,KAAK,wBAAwB,OAAO;AAAA,MAC9C,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,OAAyC;AACtD,UAAM,MAAM,MAAM,KAAK,KAAqB,eAAe,KAAK;AAEhE,SAAK,SAAS,IAAI,KAAK;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAAY,KAAiC;AACjD,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,IAAI,SAAS,EAAE,SAAS,KAAK,QAAQ,GAAG,EAAE,CAAC;AAClE,aAAO,IAAI,WAAW;AAAA,IACxB,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,YAAY,OAAiB;AAC3B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,aAAa,SAAiD;AAClE,YAAQ,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,kBAAkB,WAAyD;AAC/E,UAAM,QAAiC;AAAA,MACrC,iBAAiB;AAAA,IACnB;AACA,UAAM,MAAM,MAAM,KAAK,IAA4B,qBAAqB;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI,MAAM;AAAA,MAAI,CAAC,wBACpB,sBAAsB,kCAAe,GAAG,mBAAmB,IAAI;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,cAA6C;AACrE,UAAM,IAAoB;AAAA,MACxB;AAAA,IACF;AACA,UAAM,MAAM,MAAM,KAAK,IAAoB,UAAU;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,aAAY,cAAc,IAAI,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAM,cAAsC;AAC1C,UAAM,UAAU,MAAM,KAAK,IAAmB,SAAS;AAAA,MACrD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,sBAAsB,OAGY;AACtC,UAAM,IAAqB;AAAA,MACzB,QAAQ,MAAM,UAAU,mCAAgB;AAAA,MACxC,GAAI,MAAM,aACN;AAAA,QACE,MAAM,MAAM,WAAW,KAAK,SAAS;AAAA,QACrC,OAAO,MAAM,WAAW,MAAM,SAAS;AAAA,MACzC,IACA,CAAC;AAAA,IACP;AACA,UAAM,MAAM,MAAM,KAAK,IAAkC,gBAAgB;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,MACL,MAAM,IAAI,MAAM,MAAM,IAAI,aAAY,aAAa;AAAA,MACnD,MAAM,IAAI,MAAM;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,OAAyE;AAC/F,UAAM,IAA2B;AACjC,UAAM,KAAK,KAAK,iBAAiB,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,uBAAuB,OAA8E;AACzG,UAAM,MAAM,MAAM,KAAK,IAAmC,wBAAwB;AAAA,MAChF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,uBAAuB,OAAgF;AAC3G,UAAM,MAAM,MAAM,KAAK,IAAoC,wBAAwB;AAAA,MACjF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,oBAAoB,OAAyE;AACjG,UAAM,MAAM,MAAM,KAAK,IAAsC,0BAA0B;AAAA,MACrF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,iBAAiB,OAAgE;AACrF,UAAM,MAAM,MAAM,KAAK,IAA8B,+BAA+B;AAAA,MAClF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,yBAAyB,SAAkC;AAC/D,UAAM,MAAM,MAAM,KAAK,IAAY,2BAA2B;AAAA,MAC5D,QAAQ;AAAA,QACN,cAAc;AAAA,MAChB;AAAA,MACA,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,sBAAsB,SAAkC;AAC5D,UAAM,MAAM,MAAM,KAAK,IAAY,wBAAwB;AAAA,MACzD,QAAQ;AAAA,QACN,cAAc;AAAA,MAChB;AAAA,MACA,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,OAAuC;AAC9D,UAAM,KAAK,KAAK,iBAAiB,OAAO;AAAA,MACtC,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,OAAgD;AACrE,UAAM,KAAK,KAAK,0BAA0B,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,gBAAgB,OAAkC;AACtD,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF;AAAA,QACE,SAAS,KAAK,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,OAAgC;AACvD,UAAM,KAAK,KAAK,6BAA6B,OAAO;AAAA,MAClD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kCAAkC,OAAiC;AACvE,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,6BAA6B,OAA+D;AAChG,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,OAA8B;AAC1D,UAAM,KAAK,KAAK,6BAA6B,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,iBAAiB,OAAgD;AACrE,UAAM,MAAM,MAAM,KAAK,KAAK,sBAAsB,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACpF,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,sBAAsB,YAA2D;AACrF,UAAM,MAAM,MAAM,KAAK,IAA2B,iBAAiB;AAAA,MACjE,SAAS,KAAK,QAAQ;AAAA,MACtB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,kBAAkB,OAA8E;AACpG,UAAM,KAAK,KAAK,iBAAiB,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,qBAAyD;AAC7D,UAAM,MAAM,MAAM,KAAK,IAA+B,sBAAsB,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACvG,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,OAA+B;AACtD,UAAM,KAAK,KAAK,sBAAsB,EAAE,MAAM,MAAM,KAAK,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,aAAa,QAAgB;AACjC,UAAM,KAAK,KAAK,WAAW,MAAM;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,OAAqD;AACtE,UAAM,MAAM,MAAM,KAAK,IAAuB,cAAc;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEQ,QAAQ,OAAgB;AAC9B,WAAO,EAAE,eAAe,UAAU,SAAS,KAAK,MAAM,IAAI,iBAAiB,KAAK,YAAY;AAAA,EAC9F;AAAA,EAEA,OAAe,cAAc,MAAoC;AAC/D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW;AAAA,QAClC,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,WAAW,kCAAe,GAAG;AAAA,UAC3B,kBAAkB,MAAM;AAAA,UACxB,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,QAAQ,MAAM;AAAA,MAChB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAc,IAA4C,KAAa,QAA4C;AACjH,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,QAAI;AACF,aAAO,MAAM,aAAAC,QAAM,IAAa,SAAS,MAAM,EAAE,KAAK,CAAC,QAAa;AAClE,YAAI,IAAI,YAAY,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AACrE,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,GAAG;AACV,YAAM,aAAa,UAAU,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAc,KACZ,KACA,MACA,QACY;AACZ,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,QAAI;AACF,aAAO,MAAM,aAAAA,QACV,KAAc,SAAS,MAAM;AAAA,QAC5B,GAAG;AAAA,QACH,kBAAkB,KAAK,oBAAoB;AAAA,MAC7C,CAAC,EACA,KAAK,CAAC,QAAa;AAClB,YAAI,IAAI,YAAY,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AACrE,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACL,SAAS,GAAG;AACV,YAAM,aAAa,UAAU,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,WAAW,KAAa;AAC9B,WAAO,IAAI,WAAW,KAAK,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,GAAG,UAAU,KAAK,GAAG,CAAC;AAAA,EACjF;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,oBAA+C,CAAC;AACpD,UAAM,EAAE,iBAAiB,IAAI,aAAAA,QAAM;AAEnC,QAAI,CAAC,kBAAkB;AACrB,0BAAoB,CAAC;AAAA,IACvB,WAAW,4BAA4B,OAAO;AAC5C,0BAAoB;AAAA,IACtB,OAAO;AACL,0BAAoB,CAAC,gBAAgB;AAAA,IACvC;AAEA,WAAO;AAAA,MACL,CAAC,MACC,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC,GAAG,UAAW,OAAO,UAAU,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,KAAM,CAAC;AAAA,MAC1G,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAA4B,GAAe;AACzC,UAAM;AADoB;AAE1B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAChD;AAAA,EAEgB;AAAA,EAEhB,OAAO,UAAU,GAAY;AAC3B,QAAI,aAAAA,QAAM,aAAa,CAAC,KAAK,GAAG,UAAU,QAAQ,aAAa,EAAE,SAAS,MAAM;AAC9E,aAAO,IAAI,cAAa,CAAe;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,EAAE,UAAU,UAAU;AAAA,EACpC;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,GAAG,KAAK,YAAY,KAAK,cAAc;AAAA,EAChD;AAAA,EAEQ,cAAc;AACpB,QAAI,CAAC,KAAK,EAAE,UAAU,MAAM;AAC1B,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,EAAE,UAAU,MAAa,WAAW;AAAA,EACnD;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,EAAE,QAAQ,OAAO;AAAA,EAC/B;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;;;ACvZO,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AALG,SAAAA;AAAA,GAAA;AA+BL,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAE1B,IAAM,cAAc;AACpB,IAAM,kBAAkB;AAExB,IAAM,eAAe;AAErB,IAAM,eAAe;AAErB,IAAM,cAAc,oBAAI,IAA2B;AAAA,EACxD;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAEM,SAAS,eAAe,KAAe,SAA8B;AAC1E,QAAM,SAAS,YAAY,IAAI,GAAG;AAClC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACA,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO,UAAU,MAAM,QAAQ,UAAU;AAAA,EAC3C;AACA,MAAI,SAAS,WAAW,WAAW;AACjC,WAAO,UAAU,YAAY,QAAQ,UAAU;AAAA,EACjD;AACA,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO,QAAQ,MAAM,QAAQ,QAAQ;AAAA,EACvC;AACA,SAAO;AACT;;;AF1HO,IAAM,eAAN,MAAM,cAAa;AAAA,EACR;AAAA,EAEA;AAAA,EAEA;AAAA,EAEhB;AAAA,EAEA,YAAY,OAAyE;AACnF,SAAK,UAAU,MAAM;AACrB,SAAK,YAAY,MAAM;AACvB,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,aAAa,IAAI,KAAe,SAA8B;AAC5D,UAAM,SAAS,eAAe,KAAK,OAAO;AAC1C,UAAM,YAAY,IAAI;AAAA,MACpB,OAAO,UAAU,YAAY,EAAE,WAAW,OAAO,UAAU,UAAU,IAAI,EAAE,KAAK,OAAO,UAAU,IAAI;AAAA,IACvG;AACA,UAAM,UAAU,IAAI,YAAY,OAAO,QAAQ,KAAK,SAAS,WAAW;AACxE,WAAO,IAAI,cAAa;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,QAAiB;AAC7B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,SAAS;AACX,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO,KAAc;AACvB,SAAK,UAAU;AAAA,EACjB;AACF;;;Ad7BO,IAAM,cAAN,MAAM,aAAY;AAAA,EAKvB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAJ5C;AAAA,EAEA;AAAA,EAIR,aAAa,IAAI,KAAe,SAA8B;AAC5D,UAAM,UAAU,MAAM,aAAa,IAAI,KAAK,OAAO;AACnD,WAAO,IAAI,aAAY,OAAO;AAAA,EAChC;AAAA,EAEA,MAAM,cAAc,OAAoE;AACtF,QAAI,MAAM,UAAU;AAClB,YAAM,WAAW,MAAM,KAAK,QAAQ,YAAY,MAAM,QAAQ;AAC9D,UAAI,UAAU;AACZ,aAAK,QAAQ,SAAS,MAAM;AAC5B,aAAK,QAAQ,YAAY,MAAM,QAAQ;AACvC,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AACA,UAAM,MAAM,MAAM,KAAK,SAAS,MAAM,MAAM;AAC5C,SAAK,QAAQ,SAAS,MAAM;AAC5B,SAAK,QAAQ,YAAY,GAAG;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,QAAoC;AACzD,UAAM,aAAa,wCAAqB,2BAA0B,oBAAI,KAAK,GAAE,YAAY,CAAC;AAC1F,UAAM,MAAM,MAAM,OAAO,oBAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,WAAO,KAAK,QAAQ,SAAS;AAAA,MAC3B,SAAS,MAAM,OAAO,QAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,WAAW,IAAI;AAAA,MACf,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW;AACf,WAAO,KAAK,QAAQ,QAAQ,YAAY;AAAA,EAC1C;AAAA,EAEA,MAAM,WAAW,YAAgE;AAC/E,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,QAAQ,mCAAgB,QAAQ,WAAW,CAAC;AAAA,EAClG;AAAA,EAEA,MAAM,cAAc,MAAuB;AACzC,WAAO,KAAK,eAAe,oBAAoB,IAAI;AAAA,EACrD;AAAA,EAEA,gBAAgB,MAAoB;AAClC,WAAO,IAAI,aAAa,KAAK,SAAS,IAAI;AAAA,EAC5C;AAAA,EAEA,MAAM,2BAA2B,cAAsB;AACrD,UAAM,OAAO,MAAM,KAAK,QAAQ,oBAAoB,YAAY;AAChE,WAAO,IAAI,aAAa,KAAK,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA,EAIA,IAAI,iBAAiB;AACnB,QAAI,CAAC,KAAK,iBAAiB;AACzB,WAAK,kBAAkB,IAAI,aAAa,KAAK,SAAS,KAAK,eAAe;AAAA,IAC5E;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAAkB;AACpB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,mBAAmB,IAAI,gBAAgB,KAAK,OAAO;AAAA,IAC1D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,cAA8B;AAChC,WAAO,IAAI,eAAe,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,aAA4B;AAC9B,WAAO,IAAI,cAAc,KAAK,OAAO;AAAA,EACvC;AAAA,EAEA,IAAI,SAAoB;AACtB,WAAO,IAAI,UAAU,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,MAAc,gBAAgB;AAC5B,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AACF;;;AiB5HO,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,mBAAgB;AAJN,SAAAA;AAAA,GAAA;AAgBL,IAAM,2BAAN,MAA+B;AAAA,EACpC;AACF;AAEO,IAAM,wBAAN,MAA4B;AAAA,EACjC;AAAA,EAEA;AAAA,EAEA;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B;AAAA,EAEA;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B;AAAA,EAEA;AACF;","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
@@ -356,7 +356,9 @@ declare class MSafeAccount {
356
356
  futureIntentions(pagination?: Pagination): Promise<_msafe_sui3_utils.GetTransactionIntentionsResponse>;
357
357
  currentSequenceNumber(): Promise<number>;
358
358
  nextSequenceNumber(): Promise<number>;
359
- simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
359
+ simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {
360
+ txb?: TransactionBlock;
361
+ }): Promise<SimulationResult>;
360
362
  proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
361
363
  proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
362
364
  txb?: TransactionBlock;
package/dist/index.d.ts CHANGED
@@ -356,7 +356,9 @@ declare class MSafeAccount {
356
356
  futureIntentions(pagination?: Pagination): Promise<_msafe_sui3_utils.GetTransactionIntentionsResponse>;
357
357
  currentSequenceNumber(): Promise<number>;
358
358
  nextSequenceNumber(): Promise<number>;
359
- simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
359
+ simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {
360
+ txb?: TransactionBlock;
361
+ }): Promise<SimulationResult>;
360
362
  proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
361
363
  proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
362
364
  txb?: TransactionBlock;
package/dist/index.js CHANGED
@@ -606,23 +606,28 @@ var MSafeAccount = class _MSafeAccount {
606
606
  return this.backend.getNextSequenceNumber(this.address);
607
607
  }
608
608
  async simulateIntention(request) {
609
- const appHelper = appHelpers.getAppHelper(request.application);
610
- if (!appHelper) {
611
- throw new Error(`Can't find app helper for application ${request.application}`);
612
- }
613
- const txb = await appHelper.build({
614
- network: this.globals.config.network,
615
- intentionData: request.intention,
616
- txType: request.txType,
617
- txSubType: request.txSubType,
618
- clientUrl: this.globals.config.suiClient.url,
619
- account: {
620
- address: this.address,
621
- publicKey: fromHEX(this.address),
622
- chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
623
- features: []
609
+ let txb;
610
+ if (request.txb) {
611
+ txb = request.txb;
612
+ } else {
613
+ const appHelper = appHelpers.getAppHelper(request.application);
614
+ if (!appHelper) {
615
+ throw new Error(`Can't find app helper for application ${request.application}`);
624
616
  }
625
- });
617
+ txb = await appHelper.build({
618
+ network: this.globals.config.network,
619
+ intentionData: request.intention,
620
+ txType: request.txType,
621
+ txSubType: request.txSubType,
622
+ clientUrl: this.globals.config.suiClient.url,
623
+ account: {
624
+ address: this.address,
625
+ publicKey: fromHEX(this.address),
626
+ chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
627
+ features: []
628
+ }
629
+ });
630
+ }
626
631
  txb.setSender(this.address);
627
632
  return this.simulator.simulate({ txb, sender: this.address });
628
633
  }
@@ -642,14 +647,14 @@ var MSafeAccount = class _MSafeAccount {
642
647
  });
643
648
  }
644
649
  async proposeIntentionAndBuildVote(input) {
645
- const appHelper = appHelpers.getAppHelper(input.application);
646
- if (!appHelper) {
647
- throw new Error(`Can't find app helper for application ${input.application}`);
648
- }
649
650
  let txb;
650
651
  if (input.txb) {
651
652
  txb = input.txb;
652
653
  } else {
654
+ const appHelper = appHelpers.getAppHelper(input.application);
655
+ if (!appHelper) {
656
+ throw new Error(`Can't find app helper for application ${input.application}`);
657
+ }
653
658
  txb = await appHelper.build({
654
659
  network: this.globals.config.network,
655
660
  intentionData: input.intention,
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 } 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"]}
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(\n request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {\n txb?: TransactionBlock;\n },\n ) {\n let txb: TransactionBlock;\n if (request.txb) {\n txb = request.txb;\n } else {\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 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 }\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 let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\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 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":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,OACK;AAOA,IAAM,eAAN,MAAmB;AAAA,EACxB,YACkB,SACA,UAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,MAAM,kBAAkB,WAAqB;AAC3C,WAAO,KAAK,SAAS,kBAAkB,SAAS;AAAA,EAClD;AAAA,EAEA,MAAM,sBAAsB,MAAuB;AACjD,UAAM,WAAW,MAAM,KAAK,8BAA8B,IAAI;AAC9D,UAAM,KAAK,IAAI,gBAAgB,QAAQ;AACvC,WAAO,GAAG;AAAA,EACZ;AAAA;AAAA,EAGA,MAAM,mBAAmB,YAA6B;AAEpD,WAAO,KAAK,sBAAsB,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,SAAiB,WAAgC;AAC5D,UAAM,KAAK,eAAe,GAAG,SAAS;AACtC,QAAI,CAAC,cAAc,SAAS,GAAG,aAAa,CAAC,GAAG;AAC9C,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,SAAK,SAAS,aAAa,SAAS,EAAE;AAAA,EACxC;AAAA,EAEA,MAAM,oBAAoB,cAA+B;AACvD,UAAM,eAAe,MAAM,KAAK,mBAAmB,YAAY;AAE/D,UAAM,iBAAiB,qBAAqB,mBAAmB,YAAY;AAC3E,UAAM,YAAY,MAAM,KAAK,QAAQ,OAAO,oBAAoB,EAAE,YAAY,eAAe,CAAC;AAE9F,UAAM,KAAK,gBAAgB,cAAc,UAAU,SAAS;AAC5D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,8BAA8B,MAAgD;AAC1F,UAAM,aAAa,MAAM,KAAK,kBAAkB,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACzF,eAAW,QAAQ,CAAC,IAAI,MAAM;AAC5B,UAAI,OAAO,QAAW;AACpB,cAAM,IAAI,MAAM,mCAAmC,KAAK,OAAO,CAAC,EAAE,OAAO,EAAE;AAAA,MAC7E;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,QAC/C,WAAW,WAAW,CAAC;AAAA,QACvB,QAAQ,MAAM;AAAA,MAChB,EAAE;AAAA,MACF,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,YAA6B,WAAgC;AACzF,UAAM,MAAM,MAAM,KAAK,SAAS,kBAAkB,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,KAAK,QAAQ,QAAQ,mBAAmB;AAAA,MAC5C,QAAQ,WAAW,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,QAC3C,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,QAAQ;AAAA,QACR,GAAG,eAAe,IAAI,IAAI,CAAC,CAAc;AAAA,MAC3C,EAAE;AAAA,MACF,WAAW,WAAW;AAAA,MACtB,MAAM,WAAW;AAAA;AAAA,MACjB,aAAa,WAAW;AAAA;AAAA,MACxB,eAAe,WAAW;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/FA;AAAA,EAKE,wBAAAA;AAAA,EACA,mBAAAC;AAAA,OACK;;;ACPP,SAAwC,wBAAAC,6BAAoD;AAIrF,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,WAAW,YAA2B;AAC1C,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,UAAU;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,SAAmC;AAC9C,UAAM,aAAaA,sBAAqB,yBAAyB,OAAO;AACxE,UAAM,MAAM,MAAM,KAAK,QAAQ,OAAO,oBAAoB,EAAE,WAAW,CAAC;AACxE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,SAAS,WAAW,IAAI,UAAU,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,UAAU;AACd,UAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ,mBAAmB;AAC1D,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,QAAQ,MAAuB;AACnC,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,KAAK,CAAC;AAAA,EACzD;AACF;;;ACrBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,iBAAiB,QAAyB,YAAgE;AAC9G,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,QAAQ,WAAW,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,kBAAkB,cAAsB,QAAyB;AACrE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,cAAc,OAAO,CAAC;AAAA,EACxE;AACF;;;ACdA,SAAS,kBAAkB;AAC3B;AAAA,EAME,mBAAAC;AAAA,EAGA,wBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,OACK;AAGP,SAAS,oBAAAC,yBAAwB;AACjC,SAAS,SAAS,sBAAAC,qBAAoB,aAAa;AACnD,SAAS,mBAAmB,yBAAyB;;;ACpBrD,SAAS,wBAAwB;AAMjC,IAAM,oBAAoB;AAEnB,IAAM,YAAN,MAAgB;AAAA,EACrB,YAAoB,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAE5C,MAAa,SAAS,OAA6E;AACjG,UAAM,KAAK,KAAK,qBAAqB,MAAM,GAAG;AAE9C,UAAM,EAAE,UAAU,IAAI,KAAK;AAE3B,UAAM,WAAW,MAAM,KAAK,YAAY;AAExC,OAAG,YAAY,QAAQ;AAEvB,UAAM,gBAAgB,MAAM,UAAU,uBAAuB;AAAA,MAC3D,kBAAkB,MAAM,GAAG,MAAM,EAAE,QAAQ,UAAU,CAAC;AAAA,IACxD,CAAC;AACD,UAAM,UAAU,cAAc,QAAQ,OAAO,WAAW;AAExD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,iBAAiB,cAAc,QAAQ,OAAO;AAAA,MAChD;AAAA,IACF;AACA,UAAM,YAAY,KAAK,YAAY,cAAc,QAAQ,SAAS,QAAQ;AAE1E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,cAAc,QAAQ,UAAU;AAAA,MAC3C,SAAS,cAAc,QAAQ;AAAA,MAC/B;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAc,cAAc;AAC1B,WAAO,KAAK,QAAQ,UAAU,qBAAqB;AAAA,EACrD;AAAA,EAEQ,YAAY,SAAyB,UAAkB;AAC7D,UAAM,EAAE,iBAAiB,aAAa,cAAc,IAAI;AACxD,UAAM,eAAe,oBAAoB;AAEzC,UAAM,kCAAkC,OAAO,eAAe,IAAI;AAGlE,UAAM,YAAY,kCAAkC,OAAO,WAAW,IAAI,OAAO,aAAa;AAG9F,WAAO,YAAY,kCAAkC,YAAY;AAAA,EACnE;AAAA,EAEQ,qBAAqB,IAAwC;AACnE,WAAO,iBAAiB,KAAK,GAAG,UAAU,CAAC;AAAA,EAC7C;AACF;;;AClEA,SAAS,cAAc;AAEhB,SAAS,eAAe,GAAW;AACxC,SAAO,OAAO,KAAK,GAAG,OAAO;AAC/B;AAEO,SAAS,gBAAgB,GAAuB;AACrD,SAAO,KAAK,MAAM,UAAU,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AACzF;AAEO,SAAS,gBAAgB,KAAyB;AACvD,SAAO,WAAW,KAAK,OAAO,KAAK,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;AACtF;;;ACXA,SAAS,uBAAuB,8BAA8B;;;ACD9D,SAAS,qBAAqB,sBAAAC,2BAA0B;;;ACCxD,SAAS,0BAA0B;AAG5B,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAEA;AAAA,EAER,YAAY,QAAmB;AAC7B,SAAK,UAAU;AACf,SAAK,eAAe,oBAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,UAAqD;AACrE,UAAM,aAAa,mBAAmB,QAAQ;AAC9C,QAAI,KAAK,aAAa,IAAI,UAAU,GAAG;AACrC,aAAO,KAAK,aAAa,IAAI,UAAU;AAAA,IACzC;AACA,UAAM,OAAO,MAAM,KAAK,cAAc,UAAU;AAChD,QAAI,MAAM;AACR,WAAK,aAAa,IAAI,YAAY,IAAI;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAqD;AAC/E,UAAM,MAAM,MAAM,KAAK,QAAQ,gBAAgB,EAAE,SAAS,CAAC;AAC3D,WAAO,OAAO;AAAA,EAChB;AACF;AAIO,IAAM,sBACX;AAEK,IAAM,OAAN,MAAM,MAAK;AAAA,EAChB,OAAO,OAAO,MAA0C;AACtD,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,WAAO,mBAAmB,IAAI,EAAE,MAAM,mBAAmB,KAAK;AAAA,EAChE;AAAA,EAEA,OAAO,YAAY,MAAc;AAC/B,UAAM,CAAC,EAAE,GAAG,IAAI,mBAAmB,IAAI,EAAE,MAAM,mBAAmB,KAAK,CAAC;AACxE,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,OAAO,WAAW,MAAyC;AACzD,QAAI,CAAC,MAAK,OAAO,KAAK,IAAI,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,aAAa,cAAc;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,EAAE,QAAQ,IAAI,KAAK,SAAS;AAClC,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,OAAO;AAAA,EACvB;AACF;;;AD3DO,IAAM,YAAN,MAAgB;AAAA,EACrB,OAAO,oBAAoB,MAAc;AACvC,WAAO,oBAAoB,IAAI;AAAA,EACjC;AAAA,EAEA,OAAO,mBAAmB,QAAgB;AACxC,WAAOC,oBAAmB,MAAM;AAAA,EAClC;AAAA,EAEA,OAAO,kBAAkB,OAAe,OAAe;AACrD,WAAO,oBAAoB,KAAK,MAAM,oBAAoB,KAAK;AAAA,EACjE;AAAA,EAEA,OAAO,iBAAiB,SAAiB,SAAiB;AACxD,WAAOA,oBAAmB,OAAO,MAAMA,oBAAmB,OAAO;AAAA,EACnE;AAAA,EAEA,OAAO,iBAAiB,QAAgB;AACtC,WAAO,KAAK,OAAO,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,UAAU,GAAW,QAAgB;AACnD,MAAI,EAAE,WAAW,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAClB;;;ADzBO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAC7B,aAAa,0BAA0B,OAIpC;AACD,QAAI,MAAM,gBAAgB,oBAAoB;AAC5C,aAAO,uBAAuB,MAAM,SAAS,MAAM,SAAS;AAAA,IAC9D;AACA,WAAO,sBAAsB,MAAM,SAAS,MAAM,SAAS;AAAA,EAC7D;AAAA,EAEA,aAAa,kCAAkC,OAA+D;AAC5G,UAAM,UAAU,eAAe,MAAM,UAAU;AAC/C,WAAO,KAAK,0BAA0B;AAAA,MACpC;AAAA,MACA,aAAa;AAAA,MACb,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,gBAAgB,OAK1B;AACD,UAAM,YAAY,MAAM,mBAAkB,0BAA0B,KAAK;AACzE,WAAO,UAAU,kBAAkB,UAAU,aAAa,GAAG,MAAM,aAAa;AAAA,EAClF;AAAA,EAEA,aAAa,wBAAwB,OAIlC;AACD,UAAM,UAAU,eAAe,MAAM,UAAU;AAC/C,WAAO,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA,aAAa;AAAA,MACb,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,2BAA2B,OAInB;AACnB,WAAO,KAAK,gBAAgB;AAAA,MAC1B,aAAa;AAAA,MACb,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AACF;;;AG/DA,SAAS,kBAAAC,uBAAsB;AAE/B,SAAS,gCAAgE;AACzE,SAAS,yBAAyB;AAI3B,IAAM,WAAW;AAExB,eAAsB,sBAAsB,WAAsB,SAAiD;AACjH,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,UAAU,uBAAuB;AAAA;AAAA,MAE3C,QAAQ,EAAE,aAAa,QAAQ;AAAA,MAC/B,SAAS,EAAE,WAAW,KAAK;AAAA,MAC3B,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,GAAG;AAIV,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,KAAK,WAAW,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,aAAa,cAAc;AACnE,WAAO;AAAA,EACT;AACA,QAAM,KAAK,IAAI,KAAK,CAAC;AACrB,QAAM,aAAa,GAAG,aAAa;AAEnC,WAAS,IAAI,GAAG,MAAM,WAAW,QAAQ,KAAK;AAC5C,UAAM,gBAAgB,WAAW,CAAC;AAClC,UAAM,KAAK,yBAAyB,eAAe,OAAO;AAC1D,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,eAAoC,eAAuB;AAC3F,QAAM,UAAU,yBAAyB,aAAa;AACtD,UAAQ,QAAQ,iBAAiB;AAAA,IAC/B,KAAK,YAAY;AACf,YAAM,kBAAkB,IAAI,kBAAkB,QAAQ,SAAS,WAAW,EAAE,aAAa;AACzF,UAAI,UAAU,kBAAkB,iBAAiB,aAAa,GAAG;AAC/D,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,aAAa;AAChB,YAAM,KAAKC,gBAAe,GAAG,EAAE,kBAAkB,QAAQ,WAAW,QAAQ,QAAQ,gBAAgB,CAAC;AACrG,UAAI,UAAU,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG;AACjE,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,gBAAgB;AAAA,EACpC;AACF;AAEA,eAAsB,YAAY,OAA8E;AAC9G,MAAI,UAAU;AACd,MAAI;AACJ,QAAM,MAAoB,CAAC;AAC3B,SAAO,SAAS;AACd,UAAM,cAA8B,MAAM,MAAM,UAAU,SAAS;AAAA,MACjE,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB;AAAA,IACF,CAAC;AACD,QAAI,KAAK,GAAG,YAAY,IAAI;AAC5B,cAAU,YAAY;AACtB,aAAS,YAAY;AAAA,EACvB;AACA,SAAO;AACT;;;ACjFO,IAAM,oBAAoB;AAOjC,eAAsB,mBAAsB,IAAkE;AAC5G,QAAM,MAAyB,CAAC;AAChC,SAAO,MAAM,GAAG,QAAQ,GAAG;AACzB,UAAM,MAAM,MAAM,GAAG,KAAK;AAC1B,QAAI,KAAK,GAAG;AAAA,EACd;AACA,MAAI,OAAO,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AAChC,WAAO,IAAI,KAAK,CAAC;AAAA,EACnB;AACA,SAAO;AACT;AAEO,IAAM,gBAAN,MAAiE;AAAA,EAKtE,YAA4B,WAAyB;AAAzB;AAC1B,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EACd;AAAA,EAPQ;AAAA,EAEA;AAAA,EAOR,MAAM,UAA4B;AAChC,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAAA,MACpD;AACA,aAAO,CAAC,CAAC,KAAK,QAAQ,MAAM,UAAU,KAAK,QAAQ;AAAA,IACrD;AACA,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,OAAmC;AACvC,QAAI,KAAK,MAAM;AACb,WAAK,OAAO;AACZ,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAAA,MACpD;AACA,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,SAAK,UAAU,MAAM,KAAK,UAAU,cAAc;AAClD,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;AAEO,IAAM,gBAAN,MAAiD;AAAA,EAOtD,YAA4B,WAAyB;AAAzB;AAC1B,SAAK,QAAQ,IAAI,cAAiB,SAAS;AAC3C,SAAK,UAAU,CAAC;AAChB,SAAK,SAAS;AAAA,EAChB;AAAA,EAVA;AAAA,EAEA;AAAA,EAEA;AAAA,EAQA,MAAM,UAA4B;AAChC,QAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,GAAG;AACzC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,OAA+B;AACnC,SAAK,UAAU;AACf,WAAO,KAAK,UAAU,KAAK,QAAQ,QAAQ;AACzC,UAAI,CAAE,MAAM,KAAK,MAAM,QAAQ,GAAI;AACjC,cAAM,IAAI,MAAM,eAAe;AAAA,MACjC,OAAO;AACL,aAAK,UAAU,MAAM,KAAK,MAAM,KAAK;AACrC,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,KAAK,MAAM;AAAA,EACjC;AACF;;;AC2BA,eAAsB,mBACpB,UACA,OACA,SAC0B;AAC1B,QAAM,OAAO,IAAI,oBAAoB,UAAU,OAAO,OAAO;AAC7D,SAAQ,MAAM,mBAAmB,IAAI;AACvC;AAEO,IAAM,sBAAN,cAAkC,cAAmE;AAAA,EAC1G,YACkB,UACA,OACA,SAChB;AACA,UAAM,IAAI,qBAAqB,UAAU,OAAO,OAAO,CAAC;AAJxC;AACA;AACA;AAAA,EAGlB;AACF;AAEO,IAAM,uBAAN,MAA+D;AAAA,EASpE,YACkB,UACA,OACA,SAChB;AAHgB;AACA;AACA;AAEhB,SAAK,aAAa;AAClB,SAAK,SAAS,SAAS;AACvB,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,gBAAgB,SAAS,iBAAiB;AAAA,MAC7C,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EApBA;AAAA,EAEO;AAAA,EAEA;AAAA,EAEA;AAAA,EAgBP,MAAM,gBAAmD;AACvD,UAAM,MAAM,MAAM,KAAK,SAAS,gBAAgB;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd,CAAC;AACD,SAAK,aAAa,IAAI;AACtB,QAAI;AACJ,QAAI,KAAK,QAAQ;AACf,YAAM,EAAE,OAAO,IAAI;AACnB,iBAAW,IAAI,KAAK,OAAO,CAAC,QAA2B,SAAS,GAAG,CAAC;AAAA,IACtE,OAAO;AACL,iBAAW,IAAI;AAAA,IACjB;AACA,WAAO;AAAA,MACL,MAAM,SAAS,IAAI,CAAC,MAAyB,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,IAAI;AAAA,MAC1E,SAAS,IAAI;AAAA,IACf;AAAA,EACF;AACF;;;ARnJO,IAAM,eAAN,MAAM,cAAa;AAAA,EAOxB,YACkB,SACA,MAChB;AAFgB;AACA;AAEhB,SAAK,WAAW,IAAIC,iBAAgB;AAAA,MAClC,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,eAAe,KAAK;AAAA,IACtB,CAAC;AACD,SAAK,aAAa,IAAI,WAAW,KAAK,SAAS;AAC/C,SAAK,YAAY,IAAI,UAAU,OAAO;AAAA,EACxC;AAAA,EAjBO;AAAA,EAEA;AAAA,EAEC;AAAA,EAeR,aAAa,IAAI,SAAuB,SAAiB;AACvD,UAAM,OAAO,MAAM,QAAQ,QAAQ,oBAAoB,OAAO;AAC9D,UAAM,KAAK,IAAI,cAAa,SAAS,IAAI;AACzC,QAAI,GAAG,YAAY,SAAS;AAC1B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,aAAmC;AACvC,UAAM,WAAW,MAAM,KAAK,UAAU,eAAe,EAAE,OAAO,KAAK,QAAQ,CAAC;AAC5E,WAAO,QAAQ;AAAA,MACb,SAAS,IAAI,OAAO,YAAgC;AAClD,cAAM,OAAO,MAAM,KAAK,WAAW,YAAY,QAAQ,QAAQ;AAC/D,cAAM,kBAAkB,QAAQ,cAAc,SAC1C,OAAO,QAAQ,YAAY,IAAI,OAAO,QAAQ,cAAc,MAAM,IAClE,OAAO,QAAQ,YAAY;AAE/B,eAAO;AAAA,UACL,MAAMC,oBAAmB,QAAQ,QAAQ;AAAA,UACzC,SAAS,OAAO,eAAe;AAAA,UAC/B,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAAwD;AACzE,UAAM,0BAA0B;AAAA,MAC9B,QAAQ,CAAC,WAA8B,CAAC,QAAQ,MAAM,MAAM,WAAW,iBAAiB;AAAA,MACxF,GAAG;AAAA,IACL;AACA,WAAO,mBAAmB,KAAK,WAAW,KAAK,SAAS,uBAAuB;AAAA,EACjF;AAAA,EAEA,MAAM,qBAAqD;AACzD,UAAM,MAAM,MAAM,KAAK,QAAQ,uBAAuB,EAAE,cAAc,KAAK,QAAQ,CAAC;AACpF,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,IAAI;AACtB,UAAM,gBAAgB,IAAI;AAE1B,WAAO;AAAA,MACL,aAAa,UAAU;AAAA,MACvB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,WAAW,UAAU;AAAA,MACrB,SAAS,UAAU;AAAA,MACnB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,gBAAgB,UAAU;AAAA,MAC1B,SAAS,UAAU;AAAA,MACnB,OAAO,UAAU;AAAA,MACjB,gBAAgB,KAAK,yBAAyB,UAAU,KAAK;AAAA,MAC7D,cAAc,UAAU;AAAA,MACxB,cAAc,eAAe,UAAU;AAAA,MACvC,eAAe,eAAe,WAAW;AAAA,MACzC,aAAa,eAAe,SAAS,CAAC;AAAA,MACtC,cAAc,KAAK,yBAAyB,eAAe,SAAS,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,YAAyB;AAChD,WAAO,KAAK,QAAQ,uBAAuB;AAAA,MACzC,cAAc,KAAK;AAAA,MACnB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,YAAyB;AAC9C,WAAO,KAAK,QAAQ,oBAAoB,EAAE,cAAc,KAAK,SAAS,GAAG,WAAW,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,wBAAwB;AAC5B,WAAO,KAAK,QAAQ,yBAAyB,KAAK,OAAO;AAAA,EAC3D;AAAA,EAEA,MAAM,qBAAqB;AACzB,WAAO,KAAK,QAAQ,sBAAsB,KAAK,OAAO;AAAA,EACxD;AAAA,EAEA,MAAM,kBACJ,SAGA;AACA,QAAI;AACJ,QAAI,QAAQ,KAAK;AACf,YAAM,QAAQ;AAAA,IAChB,OAAO;AACL,YAAM,YAAY,WAAW,aAAa,QAAQ,WAAW;AAC7D,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,yCAAyC,QAAQ,WAAW,EAAE;AAAA,MAChF;AACA,YAAM,MAAM,UAAU,MAAM;AAAA,QAC1B,SAAS,KAAK,QAAQ,OAAO;AAAA,QAC7B,eAAe,QAAQ;AAAA,QACvB,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,QACzC,SAAS;AAAA,UACP,SAAS,KAAK;AAAA,UACd,WAAW,QAAQ,KAAK,OAAO;AAAA,UAC/B,QAAQ,CAAC,mBAAmB,iBAAiB;AAAA,UAC7C,UAAU,CAAC;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,iBAAiB,OAAqE;AAC1F,UAAM,UAAUC,sBAAqB,wBAAwB;AAAA,MAC3D,cAAc,KAAK;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,IAAI,MAAM;AAAA,IACZ,CAAC;AACD,UAAM,YAAY,MAAM,KAAK,OAAO,oBAAoB;AAAA,MACtD,YAAY;AAAA,IACd,CAAC;AAED,WAAO,KAAK,QAAQ,iBAAiB;AAAA,MACnC,GAAG;AAAA,MACH,cAAc,KAAK;AAAA,MACnB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BACJ,OAGe;AACf,QAAI;AACJ,QAAI,MAAM,KAAK;AACb,YAAM,MAAM;AAAA,IACd,OAAO;AACL,YAAM,YAAY,WAAW,aAAa,MAAM,WAAW;AAC3D,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,yCAAyC,MAAM,WAAW,EAAE;AAAA,MAC9E;AACA,YAAM,MAAM,UAAU,MAAM;AAAA,QAC1B,SAAS,KAAK,QAAQ,OAAO;AAAA,QAC7B,eAAe,MAAM;AAAA,QACrB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,QACzC,SAAS;AAAA,UACP,SAAS,KAAK;AAAA,UACd,WAAW,QAAQ,KAAK,OAAO;AAAA,UAC/B,QAAQ,CAAC,mBAAmB,iBAAiB;AAAA,UAC7C,UAAU,CAAC;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,YAAY,MAAM,QAAQ;AAC9B,QAAI,aAAa,MAAM,SAAS;AAChC,QAAI,UAAU,KAAK,OAAO;AAC1B,UAAM,UAAU,MAAM,IAAI,MAAM,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAClE,UAAM,SAAS,MAAM,IAAI,UAAU,EAAE,QAAQ,KAAK,QAAQ,UAAU,CAAC;AAErE,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,QAAQ,CAAC;AAEtF,WAAO,KAAK,QAAQ,6BAA6B;AAAA,MAC/C,GAAG;AAAA,MACH,SAAS,MAAM,OAAO;AAAA,MACtB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,8BAA8B,WAAkC;AACpE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BAA6B,WAAkC;AACnE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gCAAgC,WAAoC;AACxE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO,OAAO;AAAA,MAC7C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,+BAA+B,WAAoC;AACvE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO,OAAO;AAAA,MAC7C,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,8BAA8B,WAAkC;AACpE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AACzC,WAAO,KAAK,kBAAkB;AAAA,MAC5B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO;AAAA,MACtC,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,6BAA6B,WAAkC;AACnE,UAAM,KAAK,MAAM,KAAK,mBAAmB;AAEzC,UAAM,KAAKC,kBAAiB,KAAK,UAAU,OAAO;AAElD,QAAI,CAAC,GAAG,UAAU,UAAU,CAACC,eAAc,GAAG,UAAU,QAAQ,KAAK,OAAO,GAAG;AAC7E,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAIA,WAAO,KAAK,iBAAiB;AAAA,MAC3B,aAAa;AAAA,MACb,QAAQ,gBAAgB;AAAA,MACxB,WAAW,oBAAoB,OAAO;AAAA,MACtC,gBAAgB;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,QAAgB,SAAiB;AACxD,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,aAAa,CAAC;AAC3F,WAAO,KAAK,QAAQ,mBAAmB;AAAA,MACrC,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB;AACvB,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,CAAC,aAAa,UAAU,iBAAiB,IAAI;AAC/C,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,MAAM,eAAe,KAAK,OAAO;AACvC,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,gBAAgB,OAA6C;AACjE,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,CAAC,aAAa,UAAU,iBAAiB,IAAI;AAC/C,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,YAAY,eAAe,KAAK,OAAO;AAC7C,UAAM,SAAS,MAAM,UAAU,UAAU,EAAE,QAAQ,KAAK,UAAU,CAAC;AACnE,UAAM,UAAU,MAAM,UAAU,MAAM,EAAE,QAAQ,KAAK,UAAU,CAAC;AAChE,UAAM,YAAY,MAAM,KAAK,OAAO,qBAAqB,EAAE,kBAAkB,QAAQ,CAAC;AACtF,WAAO,KAAK,QAAQ,gBAAgB;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,WAAW,UAAU;AAAA,MACrB,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,2BAAsD;AAC1D,UAAM,YAAY,MAAM,KAAK,QAAQ,iBAAiB,EAAE,cAAc,KAAK,QAAQ,CAAC;AACpF,UAAM,YAAY,WAAW,aAAa,UAAU,WAAW;AAC/D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yCAAyC,UAAU,WAAW,EAAE;AAAA,IAClF;AACA,UAAM,MAAM,MAAM,UAAU,MAAM;AAAA,MAChC,SAAS,KAAK,QAAQ,OAAO;AAAA,MAC7B,eAAe,UAAU;AAAA,MACzB,QAAQ,UAAU;AAAA,MAClB,WAAW,UAAU;AAAA,MACrB,WAAW,KAAK,QAAQ,OAAO,UAAU;AAAA,MACzC,SAAS;AAAA,QACP,SAAS,KAAK;AAAA,QACd,WAAW,QAAQ,KAAK,OAAO;AAAA,QAC/B,QAAQ,CAAC,mBAAmB,iBAAiB;AAAA,QAC7C,UAAU,CAAC;AAAA,MACb;AAAA,IACF,CAAC;AACD,QAAI,UAAU,KAAK,OAAO;AAC1B,WAAO,KAAK,UAAU,SAAS,EAAE,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,kCAAkC,WAAiD;AACvF,WAAO,KAAK,QAAQ,kCAAkC;AAAA,MACpD,cAAc,KAAK;AAAA,MACnB,YAAY,UAAU;AAAA,MACtB,UAAU,UAAU;AAAA,MACpB,WAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BAA0B;AAC9B,WAAO,KAAK,QAAQ,wBAAwB,EAAE,cAAc,KAAK,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,mBAAmB;AACvB,WAAO,KAAK,QAAQ,iBAAiB,EAAE,cAAc,KAAK,QAAQ,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,iBAAiB,SAAoB,aAAsB,OAAO;AACtE,UAAM,QAAQ,aAAa,QAAQ,cAAc,QAAQ;AACzD,UAAM,UAAU,aAAa,QAAQ,gBAAgB,QAAQ;AAE7D,QAAI,KAAK,yBAAyB,KAAK,IAAI,KAAK,KAAK,WAAW;AAC9D,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AAEA,UAAM,aAAoC,CAAC;AAC3C,UAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,aAAa,KAAK,SAAS,CAAC,CAAC;AAC/E,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK,OAAO,QAAQ,KAAK;AAChD,YAAM,QAAQ,KAAK,KAAK,OAAO,CAAC;AAChC,YAAM,YAAY,QAAQ,IAAI,MAAM,OAAO;AAC3C,UAAI,WAAW;AACb,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,SAAS,yBAAyB,UAAU;AACxE,WAAO,KAAK,UAAU,wBAAwB;AAAA,MAC5C,kBAAkB,gBAAgB,OAAO;AAAA,MACzC,WAAW;AAAA,MACX,SAAS,EAAE,aAAa,MAAM,YAAY,KAAK;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY;AAChB,WAAO,KAAK,QAAQ,aAAa;AAAA,MAC/B,cAAc,KAAK;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,yBAAyB,OAAkC;AACjE,WAAO,KAAK,gBAAgB,MAAM,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC;AAAA,EACnE;AAAA,EAEQ,gBAAgB,aAAuB;AAC7C,QAAI,YAAY;AAEhB,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,CAAC,UAAUA,eAAc,MAAM,SAAS,YAAY,CAAC,CAAC,CAAC;AAC3F,UAAI,OAAO;AACT,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAY,UAAU;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAY,SAAS;AACnB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAc,cAAc;AAC1B,WAAO,KAAK,QAAQ,OAAO,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAY,YAAY;AACtB,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;AS7bA,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,uBAAAC,4BAA2B;AAS7B,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAA4B,SAAuB;AAAvB;AAC1B,SAAK,kBAAkB,oBAAI,IAAuB;AAAA,EACpD;AAAA,EAJQ;AAAA,EAMR,MAAM,aAAa,SAAiB;AAClC,UAAM,SAAS,KAAK,gBAAgB,IAAI,OAAO;AAC/C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,KAAK,MAAM,KAAK,cAAc,OAAO;AAC3C,QAAI,IAAI;AACN,WAAK,gBAAgB,IAAI,SAAS,EAAE;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,WAAyD;AAC/E,UAAM,UAAqC,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK,MAAS;AAGrF,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,UAAU,UAAU,CAAC;AAC3B,cAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO;AAAA,IAC/C;AAGA,UAAM,eAAe,QAClB,IAAI,CAAC,MAAM,UAAW,SAAS,SAAY,QAAQ,EAAG,EACtD,OAAO,CAAC,UAAU,UAAU,EAAE;AACjC,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,MAAM,KAAK,QAAQ,QAAQ,kBAAkB,aAAa,IAAI,CAAC,UAAU,UAAU,KAAK,CAAC,CAAC;AAChH,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,QAAQ,aAAa,CAAC;AAC5B,cAAQ,KAAK,IAAI,cAAc,CAAC;AAAA,IAClC;AAGA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,QAAQ,CAAC,MAAM,QAAW;AAC5B,gBAAQ,CAAC,IAAI,MAAM,KAAK,sBAAsB,UAAU,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,QAAQ,CAAC,GAAG;AACd,aAAK,gBAAgB,IAAI,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAc;AAAA,MAChE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,SAAiB,WAAsB;AAClD,QAAI,CAACC,eAAc,SAAS,UAAU,aAAa,CAAC,GAAG;AACrD,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,SAAK,gBAAgB,IAAIC,qBAAoB,OAAO,GAAG,SAAS;AAAA,EAClE;AAAA,EAEA,MAAc,cAAc,SAAiB;AAC3C,UAAM,YAAY,MAAM,KAAK,wBAAwB,OAAO;AAC5D,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,KAAK,sBAAsB,OAAO;AACxD,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,wBAAwB,SAAiD;AACrF,QAAI;AACF,YAAM,KAAK,MAAM,KAAK,QAAQ,QAAQ,aAAa,OAAO;AAC1D,aAAO;AAAA,IACT,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,sBAAsB,SAAiD;AACnF,WAAO,sBAAsB,KAAK,QAAQ,WAAW,OAAO;AAAA,EAC9D;AACF;;;AC/FO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAEpD,MAAM,OAAO,QAAgB;AAC3B,WAAO,KAAK,QAAQ,QAAQ,aAAa,MAAM;AAAA,EACjD;AACF;;;ACVA,SAAS,iBAAiB;;;ACA1B;AAAA,EAiCE,kBAAAC;AAAA,EAIA;AAAA,OACK;AAEP,OAAO,WAAuF;AAOvF,IAAM,cAAN,MAAM,aAAgC;AAAA,EAG3C,YACmB,QACA,aACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EALK;AAAA,EAOR,sBAAiD;AAC/C,WAAO,KAAK,IAAsB,iBAAiB;AAAA,MACjD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEA,sBAAsB,OAAgD;AACpE,WAAO,KAAK,KAAK,2BAA2B,OAAO;AAAA,MACjD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,+BAA+B,OAA6C;AAC1E,WAAO,KAAK,KAAK,wBAAwB,OAAO;AAAA,MAC9C,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,OAAyC;AACtD,UAAM,MAAM,MAAM,KAAK,KAAqB,eAAe,KAAK;AAEhE,SAAK,SAAS,IAAI,KAAK;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAAY,KAAiC;AACjD,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,IAAI,SAAS,EAAE,SAAS,KAAK,QAAQ,GAAG,EAAE,CAAC;AAClE,aAAO,IAAI,WAAW;AAAA,IACxB,SAAS,GAAG;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,YAAY,OAAiB;AAC3B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,aAAa,SAAiD;AAClE,YAAQ,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,kBAAkB,WAAyD;AAC/E,UAAM,QAAiC;AAAA,MACrC,iBAAiB;AAAA,IACnB;AACA,UAAM,MAAM,MAAM,KAAK,IAA4B,qBAAqB;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI,MAAM;AAAA,MAAI,CAAC,wBACpB,sBAAsBC,gBAAe,GAAG,mBAAmB,IAAI;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,cAA6C;AACrE,UAAM,IAAoB;AAAA,MACxB;AAAA,IACF;AACA,UAAM,MAAM,MAAM,KAAK,IAAoB,UAAU;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,aAAY,cAAc,IAAI,IAAI;AAAA,EAC3C;AAAA,EAEA,MAAM,cAAsC;AAC1C,UAAM,UAAU,MAAM,KAAK,IAAmB,SAAS;AAAA,MACrD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,sBAAsB,OAGY;AACtC,UAAM,IAAqB;AAAA,MACzB,QAAQ,MAAM,UAAU,gBAAgB;AAAA,MACxC,GAAI,MAAM,aACN;AAAA,QACE,MAAM,MAAM,WAAW,KAAK,SAAS;AAAA,QACrC,OAAO,MAAM,WAAW,MAAM,SAAS;AAAA,MACzC,IACA,CAAC;AAAA,IACP;AACA,UAAM,MAAM,MAAM,KAAK,IAAkC,gBAAgB;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,MACL,MAAM,IAAI,MAAM,MAAM,IAAI,aAAY,aAAa;AAAA,MACnD,MAAM,IAAI,MAAM;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,OAAyE;AAC/F,UAAM,IAA2B;AACjC,UAAM,KAAK,KAAK,iBAAiB,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,uBAAuB,OAA8E;AACzG,UAAM,MAAM,MAAM,KAAK,IAAmC,wBAAwB;AAAA,MAChF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,uBAAuB,OAAgF;AAC3G,UAAM,MAAM,MAAM,KAAK,IAAoC,wBAAwB;AAAA,MACjF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,oBAAoB,OAAyE;AACjG,UAAM,MAAM,MAAM,KAAK,IAAsC,0BAA0B;AAAA,MACrF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,iBAAiB,OAAgE;AACrF,UAAM,MAAM,MAAM,KAAK,IAA8B,+BAA+B;AAAA,MAClF,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,yBAAyB,SAAkC;AAC/D,UAAM,MAAM,MAAM,KAAK,IAAY,2BAA2B;AAAA,MAC5D,QAAQ;AAAA,QACN,cAAc;AAAA,MAChB;AAAA,MACA,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,sBAAsB,SAAkC;AAC5D,UAAM,MAAM,MAAM,KAAK,IAAY,wBAAwB;AAAA,MACzD,QAAQ;AAAA,QACN,cAAc;AAAA,MAChB;AAAA,MACA,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,OAAuC;AAC9D,UAAM,KAAK,KAAK,iBAAiB,OAAO;AAAA,MACtC,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,OAAgD;AACrE,UAAM,KAAK,KAAK,0BAA0B,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,gBAAgB,OAAkC;AACtD,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF;AAAA,QACE,SAAS,KAAK,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,OAAgC;AACvD,UAAM,KAAK,KAAK,6BAA6B,OAAO;AAAA,MAClD,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kCAAkC,OAAiC;AACvE,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,6BAA6B,OAA+D;AAChG,UAAM,KAAK;AAAA,MACT;AAAA,MACA,EAAE,GAAG,OAAO,UAAU,MAAM,SAAS,SAAS,GAAG,WAAW,MAAM,UAAU,SAAS,EAAE;AAAA,MACvF,EAAE,SAAS,KAAK,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,OAA8B;AAC1D,UAAM,KAAK,KAAK,6BAA6B,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,iBAAiB,OAAgD;AACrE,UAAM,MAAM,MAAM,KAAK,KAAK,sBAAsB,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACpF,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,sBAAsB,YAA2D;AACrF,UAAM,MAAM,MAAM,KAAK,IAA2B,iBAAiB;AAAA,MACjE,SAAS,KAAK,QAAQ;AAAA,MACtB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,kBAAkB,OAA8E;AACpG,UAAM,KAAK,KAAK,iBAAiB,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,qBAAyD;AAC7D,UAAM,MAAM,MAAM,KAAK,IAA+B,sBAAsB,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACvG,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,OAA+B;AACtD,UAAM,KAAK,KAAK,sBAAsB,EAAE,MAAM,MAAM,KAAK,GAAG,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,aAAa,QAAgB;AACjC,UAAM,KAAK,KAAK,WAAW,MAAM;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,OAAqD;AACtE,UAAM,MAAM,MAAM,KAAK,IAAuB,cAAc;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,IACxB,CAAC;AACD,WAAO,IAAI;AAAA,EACb;AAAA,EAEQ,QAAQ,OAAgB;AAC9B,WAAO,EAAE,eAAe,UAAU,SAAS,KAAK,MAAM,IAAI,iBAAiB,KAAK,YAAY;AAAA,EAC9F;AAAA,EAEA,OAAe,cAAc,MAAoC;AAC/D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW;AAAA,QAClC,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,WAAWA,gBAAe,GAAG;AAAA,UAC3B,kBAAkB,MAAM;AAAA,UACxB,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,QAAQ,MAAM;AAAA,MAChB,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAc,IAA4C,KAAa,QAA4C;AACjH,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,QAAI;AACF,aAAO,MAAM,MAAM,IAAa,SAAS,MAAM,EAAE,KAAK,CAAC,QAAa;AAClE,YAAI,IAAI,YAAY,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AACrE,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,SAAS,GAAG;AACV,YAAM,aAAa,UAAU,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAc,KACZ,KACA,MACA,QACY;AACZ,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,QAAI;AACF,aAAO,MAAM,MACV,KAAc,SAAS,MAAM;AAAA,QAC5B,GAAG;AAAA,QACH,kBAAkB,KAAK,oBAAoB;AAAA,MAC7C,CAAC,EACA,KAAK,CAAC,QAAa;AAClB,YAAI,IAAI,YAAY,IAAI,SAAS,UAAU,IAAI,SAAS,UAAU,KAAK;AACrE,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACL,SAAS,GAAG;AACV,YAAM,aAAa,UAAU,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,WAAW,KAAa;AAC9B,WAAO,IAAI,WAAW,KAAK,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,GAAG,UAAU,KAAK,GAAG,CAAC;AAAA,EACjF;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,oBAA+C,CAAC;AACpD,UAAM,EAAE,iBAAiB,IAAI,MAAM;AAEnC,QAAI,CAAC,kBAAkB;AACrB,0BAAoB,CAAC;AAAA,IACvB,WAAW,4BAA4B,OAAO;AAC5C,0BAAoB;AAAA,IACtB,OAAO;AACL,0BAAoB,CAAC,gBAAgB;AAAA,IACvC;AAEA,WAAO;AAAA,MACL,CAAC,MACC,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC,GAAG,UAAW,OAAO,UAAU,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,KAAM,CAAC;AAAA,MAC1G,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAA4B,GAAe;AACzC,UAAM;AADoB;AAE1B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAChD;AAAA,EAEgB;AAAA,EAEhB,OAAO,UAAU,GAAY;AAC3B,QAAI,MAAM,aAAa,CAAC,KAAK,GAAG,UAAU,QAAQ,aAAa,EAAE,SAAS,MAAM;AAC9E,aAAO,IAAI,cAAa,CAAe;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,EAAE,UAAU,UAAU;AAAA,EACpC;AAAA,EAEA,IAAI,UAAkB;AACpB,WAAO,GAAG,KAAK,YAAY,KAAK,cAAc;AAAA,EAChD;AAAA,EAEQ,cAAc;AACpB,QAAI,CAAC,KAAK,EAAE,UAAU,MAAM;AAC1B,aAAO;AAAA,IACT;AACA,YAAQ,KAAK,EAAE,UAAU,MAAa,WAAW;AAAA,EACnD;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,EAAE,QAAQ,OAAO;AAAA,EAC/B;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AACF;;;ACvZO,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,UAAO;AALG,SAAAA;AAAA,GAAA;AA+BL,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAE1B,IAAM,cAAc;AACpB,IAAM,kBAAkB;AAExB,IAAM,eAAe;AAErB,IAAM,eAAe;AAErB,IAAM,cAAc,oBAAI,IAA2B;AAAA,EACxD;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT,KAAK;AAAA,MACP;AAAA,MACA,SAAS;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAEM,SAAS,eAAe,KAAe,SAA8B;AAC1E,QAAM,SAAS,YAAY,IAAI,GAAG;AAClC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AACA,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO,UAAU,MAAM,QAAQ,UAAU;AAAA,EAC3C;AACA,MAAI,SAAS,WAAW,WAAW;AACjC,WAAO,UAAU,YAAY,QAAQ,UAAU;AAAA,EACjD;AACA,MAAI,SAAS,SAAS,KAAK;AACzB,WAAO,QAAQ,MAAM,QAAQ,QAAQ;AAAA,EACvC;AACA,SAAO;AACT;;;AF1HO,IAAM,eAAN,MAAM,cAAa;AAAA,EACR;AAAA,EAEA;AAAA,EAEA;AAAA,EAEhB;AAAA,EAEA,YAAY,OAAyE;AACnF,SAAK,UAAU,MAAM;AACrB,SAAK,YAAY,MAAM;AACvB,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAEA,aAAa,IAAI,KAAe,SAA8B;AAC5D,UAAM,SAAS,eAAe,KAAK,OAAO;AAC1C,UAAM,YAAY,IAAI;AAAA,MACpB,OAAO,UAAU,YAAY,EAAE,WAAW,OAAO,UAAU,UAAU,IAAI,EAAE,KAAK,OAAO,UAAU,IAAI;AAAA,IACvG;AACA,UAAM,UAAU,IAAI,YAAY,OAAO,QAAQ,KAAK,SAAS,WAAW;AACxE,WAAO,IAAI,cAAa;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,QAAiB;AAC7B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAI,SAAS;AACX,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO,KAAc;AACvB,SAAK,UAAU;AAAA,EACjB;AACF;;;Ad7BO,IAAM,cAAN,MAAM,aAAY;AAAA,EAKvB,YAA4B,SAAuB;AAAvB;AAAA,EAAwB;AAAA,EAJ5C;AAAA,EAEA;AAAA,EAIR,aAAa,IAAI,KAAe,SAA8B;AAC5D,UAAM,UAAU,MAAM,aAAa,IAAI,KAAK,OAAO;AACnD,WAAO,IAAI,aAAY,OAAO;AAAA,EAChC;AAAA,EAEA,MAAM,cAAc,OAAoE;AACtF,QAAI,MAAM,UAAU;AAClB,YAAM,WAAW,MAAM,KAAK,QAAQ,YAAY,MAAM,QAAQ;AAC9D,UAAI,UAAU;AACZ,aAAK,QAAQ,SAAS,MAAM;AAC5B,aAAK,QAAQ,YAAY,MAAM,QAAQ;AACvC,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AACA,UAAM,MAAM,MAAM,KAAK,SAAS,MAAM,MAAM;AAC5C,SAAK,QAAQ,SAAS,MAAM;AAC5B,SAAK,QAAQ,YAAY,GAAG;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,QAAoC;AACzD,UAAM,aAAaC,sBAAqB,2BAA0B,oBAAI,KAAK,GAAE,YAAY,CAAC;AAC1F,UAAM,MAAM,MAAM,OAAO,oBAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,WAAO,KAAK,QAAQ,SAAS;AAAA,MAC3B,SAAS,MAAM,OAAO,QAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,WAAW,IAAI;AAAA,MACf,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW;AACf,WAAO,KAAK,QAAQ,QAAQ,YAAY;AAAA,EAC1C;AAAA,EAEA,MAAM,WAAW,YAAgE;AAC/E,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,QAAQC,iBAAgB,QAAQ,WAAW,CAAC;AAAA,EAClG;AAAA,EAEA,MAAM,cAAc,MAAuB;AACzC,WAAO,KAAK,eAAe,oBAAoB,IAAI;AAAA,EACrD;AAAA,EAEA,gBAAgB,MAAoB;AAClC,WAAO,IAAI,aAAa,KAAK,SAAS,IAAI;AAAA,EAC5C;AAAA,EAEA,MAAM,2BAA2B,cAAsB;AACrD,UAAM,OAAO,MAAM,KAAK,QAAQ,oBAAoB,YAAY;AAChE,WAAO,IAAI,aAAa,KAAK,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA,EAIA,IAAI,iBAAiB;AACnB,QAAI,CAAC,KAAK,iBAAiB;AACzB,WAAK,kBAAkB,IAAI,aAAa,KAAK,SAAS,KAAK,eAAe;AAAA,IAC5E;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAAkB;AACpB,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,mBAAmB,IAAI,gBAAgB,KAAK,OAAO;AAAA,IAC1D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,cAA8B;AAChC,WAAO,IAAI,eAAe,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,aAA4B;AAC9B,WAAO,IAAI,cAAc,KAAK,OAAO;AAAA,EACvC;AAAA,EAEA,IAAI,SAAoB;AACtB,WAAO,IAAI,UAAU,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,MAAc,gBAAgB;AAC5B,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AACF;;;AiB5HO,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,gBAAa;AACb,EAAAA,aAAA,mBAAgB;AAJN,SAAAA;AAAA,GAAA;AAgBL,IAAM,2BAAN,MAA+B;AAAA,EACpC;AACF;AAEO,IAAM,wBAAN,MAA4B;AAAA,EACjC;AAAA,EAEA;AAAA,EAEA;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B;AAAA,EAEA;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B;AAAA,EAEA;AACF;","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.83",
3
+ "version": "0.0.85",
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.222",
30
+ "@msafe/sui-app-store": "^0.0.266",
31
31
  "@msafe/sui3-utils": "^5.0.2",
32
32
  "@mysten/sui.js": "^0.54.1",
33
33
  "@mysten/wallet-standard": "^0.11.6",
@@ -131,25 +131,33 @@ export class MSafeAccount {
131
131
  return this.backend.getNextSequenceNumber(this.address);
132
132
  }
133
133
 
134
- async simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {
135
- const appHelper = appHelpers.getAppHelper(request.application);
136
- if (!appHelper) {
137
- throw new Error(`Can't find app helper for application ${request.application}`);
134
+ async simulateIntention(
135
+ request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'> & {
136
+ txb?: TransactionBlock;
137
+ },
138
+ ) {
139
+ let txb: TransactionBlock;
140
+ if (request.txb) {
141
+ txb = request.txb;
142
+ } else {
143
+ const appHelper = appHelpers.getAppHelper(request.application);
144
+ if (!appHelper) {
145
+ throw new Error(`Can't find app helper for application ${request.application}`);
146
+ }
147
+ txb = await appHelper.build({
148
+ network: this.globals.config.network,
149
+ intentionData: request.intention,
150
+ txType: request.txType,
151
+ txSubType: request.txSubType,
152
+ clientUrl: this.globals.config.suiClient.url,
153
+ account: {
154
+ address: this.address,
155
+ publicKey: fromHEX(this.address),
156
+ chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
157
+ features: [],
158
+ },
159
+ });
138
160
  }
139
- // const config = getMSafeConfig(env, options);
140
- const txb = await appHelper.build({
141
- network: this.globals.config.network,
142
- intentionData: request.intention,
143
- txType: request.txType,
144
- txSubType: request.txSubType,
145
- clientUrl: this.globals.config.suiClient.url,
146
- account: {
147
- address: this.address,
148
- publicKey: fromHEX(this.address),
149
- chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
150
- features: [],
151
- },
152
- });
153
161
  txb.setSender(this.address);
154
162
  return this.simulator.simulate({ txb, sender: this.address });
155
163
  }
@@ -176,14 +184,14 @@ export class MSafeAccount {
176
184
  txb?: TransactionBlock;
177
185
  },
178
186
  ): Promise<void> {
179
- const appHelper = appHelpers.getAppHelper(input.application);
180
- if (!appHelper) {
181
- throw new Error(`Can't find app helper for application ${input.application}`);
182
- }
183
187
  let txb: TransactionBlock;
184
188
  if (input.txb) {
185
189
  txb = input.txb;
186
190
  } else {
191
+ const appHelper = appHelpers.getAppHelper(input.application);
192
+ if (!appHelper) {
193
+ throw new Error(`Can't find app helper for application ${input.application}`);
194
+ }
187
195
  txb = await appHelper.build({
188
196
  network: this.globals.config.network,
189
197
  intentionData: input.intention,