@msafe/sui3-sdk 0.0.81 → 0.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +20 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +20 -19
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/core/MSafeAccount.ts +22 -19
package/dist/index.cjs
CHANGED
|
@@ -185,7 +185,6 @@ var InvitationSDK = class {
|
|
|
185
185
|
// src/core/MSafeAccount.ts
|
|
186
186
|
var import_sui_app_store = require("@msafe/sui-app-store");
|
|
187
187
|
var import_sui3_utils4 = require("@msafe/sui3-utils");
|
|
188
|
-
var import_client = require("@mysten/sui.js/client");
|
|
189
188
|
var import_transactions2 = require("@mysten/sui.js/transactions");
|
|
190
189
|
var import_utils3 = require("@mysten/sui.js/utils");
|
|
191
190
|
var import_wallet_standard = require("@mysten/wallet-standard");
|
|
@@ -669,9 +668,6 @@ var MSafeAccount = class _MSafeAccount {
|
|
|
669
668
|
txType: request.txType,
|
|
670
669
|
txSubType: request.txSubType,
|
|
671
670
|
clientUrl: this.globals.config.suiClient.url,
|
|
672
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
673
|
-
// @ts-ignore
|
|
674
|
-
suiClient: new import_client.SuiClient({ url: this.globals.config.suiClient.url }),
|
|
675
671
|
account: {
|
|
676
672
|
address: this.address,
|
|
677
673
|
publicKey: (0, import_utils3.fromHEX)(this.address),
|
|
@@ -702,19 +698,24 @@ var MSafeAccount = class _MSafeAccount {
|
|
|
702
698
|
if (!appHelper) {
|
|
703
699
|
throw new Error(`Can't find app helper for application ${input.application}`);
|
|
704
700
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
701
|
+
let txb;
|
|
702
|
+
if (input.txb) {
|
|
703
|
+
txb = input.txb;
|
|
704
|
+
} else {
|
|
705
|
+
txb = await appHelper.build({
|
|
706
|
+
network: this.globals.config.network,
|
|
707
|
+
intentionData: input.intention,
|
|
708
|
+
txType: input.txType,
|
|
709
|
+
txSubType: input.txSubType,
|
|
710
|
+
clientUrl: this.globals.config.suiClient.url,
|
|
711
|
+
account: {
|
|
712
|
+
address: this.address,
|
|
713
|
+
publicKey: (0, import_utils3.fromHEX)(this.address),
|
|
714
|
+
chains: [import_wallet_standard.SUI_MAINNET_CHAIN, import_wallet_standard.SUI_TESTNET_CHAIN],
|
|
715
|
+
features: []
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
}
|
|
718
719
|
txb.setGasPrice(input.gasPrice);
|
|
719
720
|
txb.setGasBudget(input.gasBudget);
|
|
720
721
|
txb.setSender(this.address);
|
|
@@ -1008,7 +1009,7 @@ var ReportSDK = class {
|
|
|
1008
1009
|
};
|
|
1009
1010
|
|
|
1010
1011
|
// src/globals/MSafeGlobals.ts
|
|
1011
|
-
var
|
|
1012
|
+
var import_client = require("@mysten/sui.js/client");
|
|
1012
1013
|
|
|
1013
1014
|
// src/backend/BackendImpl.ts
|
|
1014
1015
|
var import_sui3_utils6 = require("@msafe/sui3-utils");
|
|
@@ -1430,7 +1431,7 @@ var MSafeGlobals = class _MSafeGlobals {
|
|
|
1430
1431
|
}
|
|
1431
1432
|
static async New(env, options) {
|
|
1432
1433
|
const config = getMSafeConfig(env, options);
|
|
1433
|
-
const suiClient = new
|
|
1434
|
+
const suiClient = new import_client.SuiClient(
|
|
1434
1435
|
config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url }
|
|
1435
1436
|
);
|
|
1436
1437
|
const backend = new BackendImpl(config.backend.url, options?.mockAddress);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './types';\nexport * from './utils';\n","import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as PublicKey),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { SuiObjectData, SuiObjectResponse, SuiClient } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>,\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n return this.backend.proposeIntentionAndBuildVote({\n ...input,\n payload: toHEX(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = buildRejectTxb(this.address);\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const rejectTxb = buildRejectTxb(this.address);\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: SerializedSignature[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: SerializedSignature;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\n}\n\nexport function addPrefix(s: string, prefix: string) {\n if (s.startsWith(prefix)) {\n return s;\n }\n return prefix + s;\n}\n","import { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\n this._client = client;\n this._coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType);\n if (this._coinMetaReg.has(normalized)) {\n return this._coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this._coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this._client.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: SerializedSignature, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | undefined)[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\n );\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de(publicKeyWithSchema) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: SerializedSignature }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\n };\n }\n\n private async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios.get<T, R, D>(fullUrl, config).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private getFullUrl(url: string) {\n return url.startsWith(this.apiURL) ? url : `${this.apiURL}${addPrefix(url, '/')}`;\n }\n\n private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in e.response.data) {\n return new BackendError(e as AxiosError);\n }\n return undefined;\n }\n\n get status() {\n return this.e.response?.status ?? undefined;\n }\n\n get message(): string {\n return `${this.respMessage() ?? 'Unknown resp'}`;\n }\n\n private respMessage() {\n if (!this.e.response?.data) {\n return undefined;\n }\n return (this.e.response?.data as any).message ?? undefined;\n }\n\n get endpoint() {\n return this.e.config?.url ?? '';\n }\n\n toString() {\n return this.message;\n }\n}\n","import type { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":"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","names":["import_sui3_utils","import_sui3_utils","import_sui3_utils","import_transactions","import_utils","import_utils","import_sui3_utils","import_sui3_utils","import_utils","import_client","import_sui3_utils","axios","MSafeEnv","InfoTypeKey"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './types';\nexport * from './utils';\n","import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as PublicKey),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {\n txb?: TransactionBlock;\n },\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\n txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n }\n txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n return this.backend.proposeIntentionAndBuildVote({\n ...input,\n payload: toHEX(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = buildRejectTxb(this.address);\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const rejectTxb = buildRejectTxb(this.address);\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: SerializedSignature[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: SerializedSignature;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\n}\n\nexport function addPrefix(s: string, prefix: string) {\n if (s.startsWith(prefix)) {\n return s;\n }\n return prefix + s;\n}\n","import { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\n this._client = client;\n this._coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType);\n if (this._coinMetaReg.has(normalized)) {\n return this._coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this._coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this._client.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: SerializedSignature, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | undefined)[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\n );\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de(publicKeyWithSchema) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: SerializedSignature }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\n };\n }\n\n private async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios.get<T, R, D>(fullUrl, config).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private getFullUrl(url: string) {\n return url.startsWith(this.apiURL) ? url : `${this.apiURL}${addPrefix(url, '/')}`;\n }\n\n private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in e.response.data) {\n return new BackendError(e as AxiosError);\n }\n return undefined;\n }\n\n get status() {\n return this.e.response?.status ?? undefined;\n }\n\n get message(): string {\n return `${this.respMessage() ?? 'Unknown resp'}`;\n }\n\n private respMessage() {\n if (!this.e.response?.data) {\n return undefined;\n }\n return (this.e.response?.data as any).message ?? undefined;\n }\n\n get endpoint() {\n return this.e.config?.url ?? '';\n }\n\n toString() {\n return this.message;\n }\n}\n","import type { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,kBAAkB,SAAuE;AAC7F,UAAM,YAAY,gCAAW,aAAa,QAAQ,WAAW;AAC7D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yCAAyC,QAAQ,WAAW,EAAE;AAAA,IAChF;AAEA,UAAM,MAAM,MAAM,UAAU,MAAM;AAAA,MAChC,SAAS,KAAK,QAAQ,OAAO;AAAA,MAC7B,eAAe,QAAQ;AAAA,MACvB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,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,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,UAAM,YAAY,gCAAW,aAAa,MAAM,WAAW;AAC3D,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yCAAyC,MAAM,WAAW,EAAE;AAAA,IAC9E;AACA,QAAI;AACJ,QAAI,MAAM,KAAK;AACb,YAAM,MAAM;AAAA,IACd,OAAO;AACL,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;;;ASrbA,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
|
@@ -358,7 +358,9 @@ declare class MSafeAccount {
|
|
|
358
358
|
nextSequenceNumber(): Promise<number>;
|
|
359
359
|
simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
|
|
360
360
|
proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
|
|
361
|
-
proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>
|
|
361
|
+
proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
|
|
362
|
+
txb?: TransactionBlock;
|
|
363
|
+
}): Promise<void>;
|
|
362
364
|
simulateCoinTransferIntention(intention: CoinTransferIntention): Promise<SimulationResult>;
|
|
363
365
|
proposeCoinTransferIntention(intention: CoinTransferIntention): Promise<void>;
|
|
364
366
|
simulateObjectTransferIntention(intention: ObjectTransferIntention): Promise<SimulationResult>;
|
package/dist/index.d.ts
CHANGED
|
@@ -358,7 +358,9 @@ declare class MSafeAccount {
|
|
|
358
358
|
nextSequenceNumber(): Promise<number>;
|
|
359
359
|
simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>): Promise<SimulationResult>;
|
|
360
360
|
proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>): Promise<void>;
|
|
361
|
-
proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>
|
|
361
|
+
proposeIntentionAndBuildVote(input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
|
|
362
|
+
txb?: TransactionBlock;
|
|
363
|
+
}): Promise<void>;
|
|
362
364
|
simulateCoinTransferIntention(intention: CoinTransferIntention): Promise<SimulationResult>;
|
|
363
365
|
proposeCoinTransferIntention(intention: CoinTransferIntention): Promise<void>;
|
|
364
366
|
simulateObjectTransferIntention(intention: ObjectTransferIntention): Promise<SimulationResult>;
|
package/dist/index.js
CHANGED
|
@@ -133,7 +133,6 @@ import {
|
|
|
133
133
|
buildRejectTxb,
|
|
134
134
|
isSameAddress as isSameAddress2
|
|
135
135
|
} from "@msafe/sui3-utils";
|
|
136
|
-
import { SuiClient } from "@mysten/sui.js/client";
|
|
137
136
|
import { TransactionBlock as TransactionBlock2 } from "@mysten/sui.js/transactions";
|
|
138
137
|
import { fromHEX, normalizeStructTag as normalizeStructTag3, toHEX } from "@mysten/sui.js/utils";
|
|
139
138
|
import { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from "@mysten/wallet-standard";
|
|
@@ -617,9 +616,6 @@ var MSafeAccount = class _MSafeAccount {
|
|
|
617
616
|
txType: request.txType,
|
|
618
617
|
txSubType: request.txSubType,
|
|
619
618
|
clientUrl: this.globals.config.suiClient.url,
|
|
620
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
621
|
-
// @ts-ignore
|
|
622
|
-
suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),
|
|
623
619
|
account: {
|
|
624
620
|
address: this.address,
|
|
625
621
|
publicKey: fromHEX(this.address),
|
|
@@ -650,19 +646,24 @@ var MSafeAccount = class _MSafeAccount {
|
|
|
650
646
|
if (!appHelper) {
|
|
651
647
|
throw new Error(`Can't find app helper for application ${input.application}`);
|
|
652
648
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
649
|
+
let txb;
|
|
650
|
+
if (input.txb) {
|
|
651
|
+
txb = input.txb;
|
|
652
|
+
} else {
|
|
653
|
+
txb = await appHelper.build({
|
|
654
|
+
network: this.globals.config.network,
|
|
655
|
+
intentionData: input.intention,
|
|
656
|
+
txType: input.txType,
|
|
657
|
+
txSubType: input.txSubType,
|
|
658
|
+
clientUrl: this.globals.config.suiClient.url,
|
|
659
|
+
account: {
|
|
660
|
+
address: this.address,
|
|
661
|
+
publicKey: fromHEX(this.address),
|
|
662
|
+
chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
|
|
663
|
+
features: []
|
|
664
|
+
}
|
|
665
|
+
});
|
|
666
|
+
}
|
|
666
667
|
txb.setGasPrice(input.gasPrice);
|
|
667
668
|
txb.setGasBudget(input.gasBudget);
|
|
668
669
|
txb.setSender(this.address);
|
|
@@ -956,7 +957,7 @@ var ReportSDK = class {
|
|
|
956
957
|
};
|
|
957
958
|
|
|
958
959
|
// src/globals/MSafeGlobals.ts
|
|
959
|
-
import { SuiClient
|
|
960
|
+
import { SuiClient } from "@mysten/sui.js/client";
|
|
960
961
|
|
|
961
962
|
// src/backend/BackendImpl.ts
|
|
962
963
|
import {
|
|
@@ -1381,7 +1382,7 @@ var MSafeGlobals = class _MSafeGlobals {
|
|
|
1381
1382
|
}
|
|
1382
1383
|
static async New(env, options) {
|
|
1383
1384
|
const config = getMSafeConfig(env, options);
|
|
1384
|
-
const suiClient = new
|
|
1385
|
+
const suiClient = new SuiClient(
|
|
1385
1386
|
config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url }
|
|
1386
1387
|
);
|
|
1387
1388
|
const backend = new BackendImpl(config.backend.url, options?.mockAddress);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as PublicKey),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { SuiObjectData, SuiObjectResponse, SuiClient } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'>,\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n return this.backend.proposeIntentionAndBuildVote({\n ...input,\n payload: toHEX(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = buildRejectTxb(this.address);\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const rejectTxb = buildRejectTxb(this.address);\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: SerializedSignature[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: SerializedSignature;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\n}\n\nexport function addPrefix(s: string, prefix: string) {\n if (s.startsWith(prefix)) {\n return s;\n }\n return prefix + s;\n}\n","import { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\n this._client = client;\n this._coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType);\n if (this._coinMetaReg.has(normalized)) {\n return this._coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this._coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this._client.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: SerializedSignature, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | undefined)[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\n );\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de(publicKeyWithSchema) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: SerializedSignature }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\n };\n }\n\n private async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios.get<T, R, D>(fullUrl, config).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private getFullUrl(url: string) {\n return url.startsWith(this.apiURL) ? url : `${this.apiURL}${addPrefix(url, '/')}`;\n }\n\n private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in e.response.data) {\n return new BackendError(e as AxiosError);\n }\n return undefined;\n }\n\n get status() {\n return this.e.response?.status ?? undefined;\n }\n\n get message(): string {\n return `${this.respMessage() ?? 'Unknown resp'}`;\n }\n\n private respMessage() {\n if (!this.e.response?.data) {\n return undefined;\n }\n return (this.e.response?.data as any).message ?? undefined;\n }\n\n get endpoint() {\n return this.e.config?.url ?? '';\n }\n\n toString() {\n return this.message;\n }\n}\n","import type { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":"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","names":["SigningMessageHelper","UserMSafeStatus","SigningMessageHelper","MultiSigAccount","SigningMessageHelper","isSameAddress","TransactionBlock","normalizeStructTag","normalizeStructTag","normalizeStructTag","PublicKeySerde","PublicKeySerde","MultiSigAccount","normalizeStructTag","SigningMessageHelper","TransactionBlock","isSameAddress","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","SuiClient","PublicKeySerde","PublicKeySerde","MSafeEnv","SuiClient","SigningMessageHelper","UserMSafeStatus","InfoTypeKey"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/CreateHelper.ts","../src/core/MSafeClient.ts","../src/core/AddressBookSDK.ts","../src/core/InvitationSDK.ts","../src/core/MSafeAccount.ts","../src/simulate/simulator.ts","../src/utils/buffer.ts","../src/utils/crypto.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/iter/iterator.ts","../src/utils/iter/object.ts","../src/core/PublicKeyHelper.ts","../src/core/ReportSDK.ts","../src/globals/MSafeGlobals.ts","../src/backend/BackendImpl.ts","../src/globals/const.ts","../src/backend/types/notification.ts"],"sourcesContent":["import {\n isSameAddress,\n MultiSigAccount,\n MultiSigConfig,\n PublicKeySerde,\n PublicKeyWithSchema,\n SigningMessageHelper,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\n\nexport class CreateHelper {\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly pkHelper: PublicKeyHelper,\n ) {}\n\n async getPublicKeyBatch(addresses: string[]) {\n return this.pkHelper.getPublicKeyBatch(addresses);\n }\n\n async calculateMSafeAddress(info: CreateMSafeInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new MultiSigAccount(msConfig);\n return ms.address;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeInfo) {\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n /**\n * Add user manually added public key for an address. If user input the public key with\n * extra signature scheme flag, the scheme value will be automatically fixed.\n *\n * @param address\n * @param pkEncoded\n * @throws error if the public key does not match\n */\n addPublicKey(address: string, pkEncoded: PublicKeyWithSchema) {\n const pk = PublicKeySerde.de(pkEncoded);\n if (!isSameAddress(address, pk.toSuiAddress())) {\n throw new Error('Public key not match');\n }\n this.pkHelper.addPublicKey(address, pk);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = SigningMessageHelper.createMSafeMessage(msafeAddress);\n const signature = await this.globals.wallet.signPersonalMessage({ messageStr: signingMessage });\n\n await this.submitToBackend(creationInfo, signature.signature);\n return msafeAddress;\n }\n\n private async reduceCreationInfoToRawConfig(info: CreateMSafeInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.owners.map((owner) => owner.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.owners[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownersWithWeight: info.owners.map((owner, i) => ({\n publicKey: publicKeys[i] as PublicKey,\n weight: owner.weight,\n })),\n creationNonce: info.creationNonce,\n };\n }\n\n private async submitToBackend(createInfo: CreateMSafeInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.owners.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n owners: createInfo.owners.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n status: '',\n ...PublicKeySerde.ser(pks[i] as PublicKey),\n })),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n IMSafeConfig,\n IPagedResult,\n IPageOptions,\n JWTToken,\n SigningMessageHelper,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\n\nimport { AddressBookSDK } from '@/core/AddressBookSDK';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { InvitationSDK } from '@/core/InvitationSDK';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { ReportSDK } from '@/core/ReportSDK';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeInfo } from '@/types';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = SigningMessageHelper.loginMessageWithTimestamp(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo();\n }\n\n async ownedMSafe(pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status: UserMSafeStatus.active, pagination });\n }\n\n async createAccount(info: CreateMSafeInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: IMSafeConfig) {\n return new MSafeAccount(this.globals, info);\n }\n\n async getMSafeAccountFromAddress(msafeAddress: string) {\n const info = await this.backend.getMSafeAccountInfo(msafeAddress);\n return new MSafeAccount(this.globals, info);\n }\n\n // Get the creation helper to calculate the msafe account address,\n // validation, and more.\n get creationHelper() {\n if (!this._creationHelper) {\n this._creationHelper = new CreateHelper(this.globals, this.publicKeyHelper);\n }\n return this._creationHelper;\n }\n\n get publicKeyHelper() {\n if (!this._publicKeyHelper) {\n this._publicKeyHelper = new PublicKeyHelper(this.globals);\n }\n return this._publicKeyHelper;\n }\n\n get config() {\n return this.globals.config;\n }\n\n get backend() {\n return this.globals.backend;\n }\n\n get wallet() {\n return this.globals.wallet;\n }\n\n get AddressBook(): AddressBookSDK {\n return new AddressBookSDK(this.globals);\n }\n\n get Invitation(): InvitationSDK {\n return new InvitationSDK(this.globals);\n }\n\n get Report(): ReportSDK {\n return new ReportSDK(this.globals);\n }\n\n private async walletAddress() {\n return this.wallet.address();\n }\n}\n","import { AddressBookMode, IPageOptions, SigningMessageHelper, UpdateAddressBookEntry } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class AddressBookSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getEntries(pagination?: IPageOptions) {\n return this.globals.backend.getAddressBookEntries(pagination);\n }\n\n async update(updates: UpdateAddressBookEntry[]) {\n const messageStr = SigningMessageHelper.updateAddressBookMessage(updates);\n const sig = await this.globals.wallet.signPersonalMessage({ messageStr });\n return this.globals.backend.updateAddressBook({ updates, signature: sig.signature });\n }\n\n async getMode() {\n const res = await this.globals.backend.getAddressBookMode();\n return res.mode;\n }\n\n async setMode(mode: AddressBookMode) {\n return this.globals.backend.setAddressBookMode({ mode });\n }\n}\n","import { IMSafeConfig, IPagedResult, IPageOptions, UserMSafeStatus } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class InvitationSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async getMSafeByStatus(status: UserMSafeStatus, pagination?: IPageOptions): Promise<IPagedResult<IMSafeConfig>> {\n return this.globals.backend.getOwnedMSafeByStatus({ status, pagination });\n }\n\n async updateMSafeStatus(msafeAddress: string, status: UserMSafeStatus) {\n return this.globals.backend.updateMSafeStatus({ msafeAddress, status });\n }\n}\n","import { appHelpers } from '@msafe/sui-app-store';\nimport {\n CoinTransferIntention,\n IGasOption,\n IMSafeConfig,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n MultiSigAccount,\n ObjectTransferIntention,\n PlainPayloadIntention,\n SigningMessageHelper,\n TransactionDefaultApplication,\n TransactionSubTypes,\n TransactionType,\n buildRejectTxb,\n isSameAddress,\n} from '@msafe/sui3-utils';\nimport { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\nimport { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';\nimport { SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN } from '@mysten/wallet-standard';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { Simulator } from '@/simulate/simulator';\nimport { OwnedCoin } from '@/types/assets';\nimport { Pagination, PendingTx, SimulationResult } from '@/types/msafe';\nimport { CoinHelper } from '@/utils';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { BatchObjectOptions, getAllOwnedObjects } from '@/utils/iter/object';\n\nexport class MSafeAccount {\n public multiSig: MultiSigAccount;\n\n public simulator: Simulator;\n\n private coinHelper: CoinHelper;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: IMSafeConfig,\n ) {\n this.multiSig = new MultiSigAccount({\n threshold: info.threshold,\n ownersWithWeight: info.owners,\n creationNonce: info.creationNonce,\n });\n this.coinHelper = new CoinHelper(this.suiClient);\n this.simulator = new Simulator(globals);\n }\n\n static async New(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n const ms = new MSafeAccount(globals, info);\n if (ms.address !== address) {\n throw new Error('Invalid msafe config with address');\n }\n }\n\n async ownedCoins(): Promise<OwnedCoin[]> {\n const balances = await this.suiClient.getAllBalances({ owner: this.address });\n return Promise.all(\n balances.map(async (balance): Promise<OwnedCoin> => {\n const meta = await this.coinHelper.getCoinMeta(balance.coinType);\n const unlockedBalance = balance.lockedBalance.number\n ? BigInt(balance.totalBalance) - BigInt(balance.lockedBalance.number)\n : BigInt(balance.totalBalance);\n\n return {\n type: normalizeStructTag(balance.coinType),\n balance: BigInt(unlockedBalance),\n metadata: meta,\n };\n }),\n );\n }\n\n async ownedObjects(options?: BatchObjectOptions): Promise<SuiObjectData[]> {\n const filterCoinObjectOptions = {\n filter: (objRes: SuiObjectResponse) => !objRes?.data?.type?.startsWith('0x2::coin::Coin'),\n ...options,\n };\n return getAllOwnedObjects(this.suiClient, this.address, filterCoinObjectOptions);\n }\n\n async pendingTransaction(): Promise<PendingTx | undefined> {\n const res = await this.backend.getPendingTransactions({ msafeAddress: this.address });\n if (!res?.pending) {\n return undefined;\n }\n\n const pendingTx = res.pending;\n const rejectPending = res.reject;\n\n return {\n application: pendingTx.application,\n txType: pendingTx.txType,\n txSubType: pendingTx.txSubType,\n createdAt: pendingTx.createdAt as Date,\n creator: pendingTx.creator,\n digest: pendingTx.digest,\n intention: pendingTx.intention,\n sequenceNumber: pendingTx.sequenceNumber,\n payload: pendingTx.payload,\n votes: pendingTx.votes,\n approvalWeight: this.calculateWeightFromVotes(pendingTx.votes),\n msafeAddress: pendingTx.msafeAddress,\n rejectDigest: rejectPending?.digest ?? '',\n rejectPayload: rejectPending?.payload ?? '',\n rejectVotes: rejectPending?.votes ?? [],\n rejectWeight: this.calculateWeightFromVotes(rejectPending?.votes ?? []),\n };\n }\n\n async historyTransaction(pagination?: Pagination) {\n return this.backend.getHistoryTransactions({\n msafeAddress: this.address,\n ...pagination,\n });\n }\n\n async futureIntentions(pagination?: Pagination) {\n return this.backend.getFutureIntentions({ msafeAddress: this.address, ...pagination });\n }\n\n async currentSequenceNumber() {\n return this.backend.getCurrentSequenceNumber(this.address);\n }\n\n async nextSequenceNumber() {\n return this.backend.getNextSequenceNumber(this.address);\n }\n\n async simulateIntention(request: Omit<IProposeIntentionRequest, 'msafeAddress' | 'signature'>) {\n const appHelper = appHelpers.getAppHelper(request.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${request.application}`);\n }\n // const config = getMSafeConfig(env, options);\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: request.intention,\n txType: request.txType,\n txSubType: request.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async proposeIntention(input: Omit<IProposeIntentionRequest, 'signature' | 'msafeAddress'>) {\n const message = SigningMessageHelper.proposeIntentionMessage({\n msafeAddress: this.address,\n intention: input.intention,\n sn: input.sequenceNumber,\n });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n\n return this.backend.proposeIntention({\n ...input,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async proposeIntentionAndBuildVote(\n input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {\n txb?: TransactionBlock;\n },\n ): Promise<void> {\n const appHelper = appHelpers.getAppHelper(input.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${input.application}`);\n }\n let txb: TransactionBlock;\n if (input.txb) {\n txb = input.txb;\n } else {\n txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: input.intention,\n txType: input.txType,\n txSubType: input.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n }\n txb.setGasPrice(input.gasPrice);\n txb.setGasBudget(input.gasBudget);\n txb.setSender(this.address);\n const payload = await txb.build({ client: this.globals.suiClient });\n const digest = await txb.getDigest({ client: this.globals.suiClient });\n\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n\n return this.backend.proposeIntentionAndBuildVote({\n ...input,\n payload: toHEX(payload),\n digest,\n msafeAddress: this.address,\n signature: signature.signature,\n });\n }\n\n async simulateCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeCoinTransferIntention(intention: CoinTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.coin.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulateObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposeObjectTransferIntention(intention: ObjectTransferIntention) {\n const sn = await this.nextSequenceNumber();\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Assets,\n txSubType: TransactionSubTypes.assets.object.send,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async simulatePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n return this.simulateIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async proposePlainPayloadIntention(intention: PlainPayloadIntention) {\n const sn = await this.nextSequenceNumber();\n\n const tb = TransactionBlock.from(intention.payload);\n\n if (!tb.blockData.sender || !isSameAddress(tb.blockData.sender, this.address)) {\n throw new Error('Transaction sender is not same as the multisig address');\n }\n\n // TODO: add gas check\n\n return this.proposeIntention({\n application: TransactionDefaultApplication,\n txType: TransactionType.Other,\n txSubType: TransactionSubTypes.others.plain,\n sequenceNumber: sn,\n intention,\n });\n }\n\n async voteForTransaction(digest: string, payload: string) {\n const payloadBytes = HexToUint8Array(payload);\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payloadBytes });\n return this.backend.voteForTransaction({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n });\n }\n\n async simulateRejectTx() {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const txb = buildRejectTxb(this.address);\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async rejectCurrentTx(input: IGasOption & { forceBuild: boolean }) {\n const pendingTx = await this.pendingTransaction();\n if (!pendingTx || pendingTx.rejectDigest !== '') {\n throw new Error('Already rejected');\n }\n\n const rejectTxb = buildRejectTxb(this.address);\n const digest = await rejectTxb.getDigest({ client: this.suiClient });\n const payload = await rejectTxb.build({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.rejectCurrentTx({\n msafeAddress: this.address,\n digest,\n signature: signature.signature,\n ...input,\n });\n }\n\n async simulateBuildTransaction(): Promise<SimulationResult> {\n const intention = await this.backend.getNextIntention({ msafeAddress: this.address });\n const appHelper = appHelpers.getAppHelper(intention.application);\n if (!appHelper) {\n throw new Error(`Can't find app helper for application ${intention.application}`);\n }\n const txb = await appHelper.build({\n network: this.globals.config.network,\n intentionData: intention.intention,\n txType: intention.txType as TransactionType,\n txSubType: intention.txSubType,\n clientUrl: this.globals.config.suiClient.url,\n account: {\n address: this.address,\n publicKey: fromHEX(this.address),\n chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],\n features: [],\n },\n });\n txb.setSender(this.address);\n return this.simulator.simulate({ txb, sender: this.address });\n }\n\n async buildNextIntentionAndAddToPending(gasOption: IGasOption & { forceBuild: boolean }) {\n return this.backend.buildNextIntentionAndAddToPending({\n msafeAddress: this.address,\n forceBuild: gasOption.forceBuild,\n gasPrice: gasOption.gasPrice,\n gasBudget: gasOption.gasBudget,\n });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address });\n }\n\n async fetchTransaction() {\n return this.backend.fetchTransaction({ msafeAddress: this.address });\n }\n\n async executePendingTx(pending: PendingTx, isRejectTx: boolean = false) {\n const votes = isRejectTx ? pending.rejectVotes : pending.votes;\n const payload = isRejectTx ? pending.rejectPayload : pending.payload;\n\n if (this.calculateWeightFromVotes(votes) < this.info.threshold) {\n throw new Error('Not enough signature');\n }\n\n const sortedSigs: SerializedSignature[] = [];\n const gotSigs = new Map(votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.owners.length; i++) {\n const owner = this.info.owners[i];\n const signature = gotSigs.get(owner.address);\n if (signature) {\n sortedSigs.push(signature);\n }\n }\n const multiSignature = this.multiSig.combinePartialSignatures(sortedSigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(payload),\n signature: multiSignature,\n options: { showEffects: true, showEvents: true },\n });\n }\n\n async dashboard() {\n return this.backend.getDashboard({\n msafeAddress: this.address,\n });\n }\n\n private calculateWeightFromVotes(votes: { userAddress: string }[]) {\n return this.calculateWeight(votes.map((vote) => vote.userAddress));\n }\n\n private calculateWeight(addressList: string[]) {\n let gotWeight = 0;\n\n for (let i = 0; i < addressList.length; i++) {\n const found = this.info.owners.find((owner) => isSameAddress(owner.address, addressList[i]));\n if (found) {\n gotWeight += found.weight;\n }\n }\n return gotWeight;\n }\n\n get address() {\n return this.multiSig.address;\n }\n\n private get backend() {\n return this.globals.backend;\n }\n\n private get wallet() {\n return this.globals.wallet;\n }\n\n private async userAddress() {\n return this.globals.wallet.address();\n }\n\n private get suiClient() {\n return this.globals.suiClient;\n }\n}\n","import { GasCostSummary } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\n// Default to 120% o the reference gas price\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { SimulationResult } from '@/types';\n\nconst GAS_SAFE_OVERHEAD = 1000n;\n\nexport class Simulator {\n constructor(private globals: MSafeGlobals) {}\n\n public async simulate(input: { txb: TransactionBlock; sender: string }): Promise<SimulationResult> {\n const tx = this.copyTransactionBlock(input.txb);\n\n const { suiClient } = this.globals;\n\n const gasPrice = await this.getGasPrice();\n\n tx.setGasPrice(gasPrice);\n\n const inspectResult = await suiClient.dryRunTransactionBlock({\n transactionBlock: await tx.build({ client: suiClient }),\n });\n const success = inspectResult.effects.status.status === 'success';\n\n if (!success) {\n return {\n success,\n gasPrice,\n response: inspectResult,\n simulationError: inspectResult.effects.status.error!,\n };\n }\n const gasBudget = this.toGasBudget(inspectResult.effects.gasUsed, gasPrice);\n\n return {\n success,\n gasPrice,\n gasObject: inspectResult.effects.gasObject.reference,\n gasUsed: inspectResult.effects.gasUsed,\n gasBudget,\n response: inspectResult,\n };\n }\n\n private async getGasPrice() {\n return this.globals.suiClient.getReferenceGasPrice();\n }\n\n private toGasBudget(gasUsed: GasCostSummary, gasPrice: bigint) {\n const { computationCost, storageCost, storageRebate } = gasUsed;\n const safeOverhead = GAS_SAFE_OVERHEAD * gasPrice;\n\n const baseComputationCostWithOverhead = BigInt(computationCost) + safeOverhead;\n\n // do not subtract rebate for now, because it may cause normally tx gas to be lower than empty tx gas\n const gasBudget = baseComputationCostWithOverhead + BigInt(storageCost) - BigInt(storageRebate);\n\n // Set the budget to max(computation, computation + storage - rebate)\n return gasBudget > baseComputationCostWithOverhead ? gasBudget : baseComputationCostWithOverhead;\n }\n\n private copyTransactionBlock(tx: TransactionBlock): TransactionBlock {\n return TransactionBlock.from(tx.serialize());\n }\n}\n","import { Buffer } from 'buffer';\n\nexport function stringToBuffer(s: string) {\n return Buffer.from(s, 'utf-8');\n}\n\nexport function Uint8ArrayToHex(b: Uint8Array): string {\n return `0x${Array.prototype.map.call(b, (x) => `0${x.toString(16)}`.slice(-2)).join('')}`;\n}\n\nexport function HexToUint8Array(hex: string): Uint8Array {\n return Uint8Array.from(Buffer.from(hex.startsWith('0x') ? hex.slice(2) : hex, 'hex'));\n}\n","import { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { verifyPersonalMessage, verifyTransactionBlock } from '@mysten/sui.js/verify';\n\nimport { stringToBuffer } from '@/utils/buffer';\nimport { Formatter } from '@/utils/format';\n\nexport class SignatureVerifier {\n static async getPublicKeyFromSignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n }) {\n if (input.messageType === 'TransactionBlock') {\n return verifyTransactionBlock(input.message, input.signature);\n }\n return verifyPersonalMessage(input.message, input.signature);\n }\n\n static async getPublicKeyFromPersonalSignature(input: { messageStr: string; signature: SerializedSignature }) {\n const message = stringToBuffer(input.messageStr);\n return this.getPublicKeyFromSignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n });\n }\n\n static async verifySignature(input: {\n message: Uint8Array;\n messageType: 'TransactionBlock' | 'Personal';\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const publicKey = await SignatureVerifier.getPublicKeyFromSignature(input);\n return Formatter.isSuiAddressEqual(publicKey.toSuiAddress(), input.targetAddress);\n }\n\n static async verifyPersonalSignature(input: {\n messageStr: string;\n signature: SerializedSignature;\n targetAddress: string;\n }) {\n const message = stringToBuffer(input.messageStr);\n return this.verifySignature({\n message,\n messageType: 'Personal',\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n\n static async verifyTransactionSignature(input: {\n payload: Uint8Array;\n signature: SerializedSignature;\n targetAddress: string;\n }): Promise<boolean> {\n return this.verifySignature({\n messageType: 'TransactionBlock',\n message: input.payload,\n signature: input.signature,\n targetAddress: input.targetAddress,\n });\n }\n}\n","import { normalizeSuiAddress, normalizeStructTag } from '@mysten/sui.js/utils';\n\nimport { Coin } from '@/utils/coin';\n\nexport class Formatter {\n static normalizeSuiAddress(addr: string) {\n return normalizeSuiAddress(addr);\n }\n\n static normalizeStructTag(struct: string) {\n return normalizeStructTag(struct);\n }\n\n static isSuiAddressEqual(addr1: string, addr2: string) {\n return normalizeSuiAddress(addr1) === normalizeSuiAddress(addr2);\n }\n\n static isSuiStructEqual(struct1: string, struct2: string) {\n return normalizeStructTag(struct1) === normalizeStructTag(struct2);\n }\n\n static isCoinObjectType(struct: string) {\n return Coin.isCoin(struct);\n }\n}\n\nexport function addPrefix(s: string, prefix: string) {\n if (s.startsWith(prefix)) {\n return s;\n }\n return prefix + s;\n}\n","import { CoinMetadata, SuiClient, SuiObjectData } from '@mysten/sui.js/client';\nimport { normalizeStructTag } from '@mysten/sui.js/utils';\n\n// CoinHelper is the coin helper to query for coin metadata.\nexport class CoinHelper {\n private _client: SuiClient;\n\n private _coinMetaReg: Map<string, CoinMetadata>;\n\n constructor(client: SuiClient) {\n this._client = client;\n this._coinMetaReg = new Map();\n }\n\n async getCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const normalized = normalizeStructTag(coinType);\n if (this._coinMetaReg.has(normalized)) {\n return this._coinMetaReg.get(normalized);\n }\n const meta = await this.queryCoinMeta(normalized);\n if (meta) {\n this._coinMetaReg.set(normalized, meta);\n }\n return meta;\n }\n\n private async queryCoinMeta(coinType: string): Promise<CoinMetadata | undefined> {\n const res = await this._client.getCoinMetadata({ coinType });\n return res || undefined;\n }\n}\n\n// Copied from sui/sdk/typescript/src/framework/framework.ts\n\nexport const COIN_TYPE_ARG_REGEX =\n /^0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<(.+)>$/;\n\nexport class Coin {\n static isCoin(type: string | undefined | null): boolean {\n if (!type) {\n return false;\n }\n return normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) != null;\n }\n\n static getCoinType(type: string) {\n const [, res] = normalizeStructTag(type).match(COIN_TYPE_ARG_REGEX) ?? [];\n return res || null;\n }\n\n static getBalance(data: SuiObjectData): bigint | undefined {\n if (!Coin.isCoin(data.type)) {\n return undefined;\n }\n if (data.content?.dataType !== 'moveObject') {\n return undefined;\n }\n const { balance } = data.content?.fields as any;\n if (balance === undefined) {\n return undefined;\n }\n return BigInt(balance);\n }\n}\n","import { PublicKeySerde } from '@msafe/sui3-utils';\nimport { SuiClient, PaginatedTransactionResponse, PaginatedCoins, CoinStruct } from '@mysten/sui.js/client';\nimport { parseSerializedSignature, PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { Formatter } from '@/utils/format';\n\nexport const SUI_COIN = '0x2::sui::SUI';\n\nexport async function getPublicKeyFromChain(suiClient: SuiClient, address: string): Promise<PublicKey | undefined> {\n let txs: PaginatedTransactionResponse;\n try {\n txs = await suiClient.queryTransactionBlocks({\n // Disable naming rule since the variable is defined by Mysten\n filter: { FromAddress: address },\n options: { showInput: true },\n limit: 2,\n });\n } catch (e) {\n // Currently when there is no history transaction, will report an error:\n // Error: byte deserialization failed, cause by: Odd number of digits\n // TODO: remove the catch logic when sui part is fixed;\n return undefined;\n }\n\n if (txs.data.length === 0 || !txs.data[0].transaction?.txSignatures) {\n return undefined;\n }\n const tx = txs.data[0];\n const signatures = tx.transaction?.txSignatures as string[];\n\n for (let i = 0; i !== signatures.length; i++) {\n const serializedSig = signatures[i];\n const pk = getAddressFromSignatures(serializedSig, address);\n if (!pk) {\n continue;\n }\n return pk;\n }\n return undefined;\n}\n\nfunction getAddressFromSignatures(serializedSig: SerializedSignature, targetAddress: string) {\n const decoded = parseSerializedSignature(serializedSig);\n switch (decoded.signatureScheme) {\n case 'MultiSig': {\n const multiSigAddress = new MultiSigPublicKey(decoded.multisig.multisig_pk).toSuiAddress();\n if (Formatter.isSuiAddressEqual(multiSigAddress, targetAddress)) {\n throw new Error('multi-sig wallet cannot be owner');\n }\n return undefined;\n }\n case 'ZkLogin':\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKeyEncoded: decoded.publicKey, schema: decoded.signatureScheme });\n if (Formatter.isSuiAddressEqual(pk.toSuiAddress(), targetAddress)) {\n return pk;\n }\n return undefined;\n }\n\n default:\n throw new Error('Unknown schema');\n }\n}\n\nexport async function getAllCoins(input: { suiClient: SuiClient; owner: string; coinType: string | undefined }) {\n let hasNext = true;\n let cursor: string | undefined | null;\n const res: CoinStruct[] = [];\n while (hasNext) {\n const currentPage: PaginatedCoins = await input.suiClient.getCoins({\n owner: input.owner,\n coinType: input.coinType,\n cursor,\n });\n res.push(...currentPage.data);\n hasNext = currentPage.hasNextPage;\n cursor = currentPage.nextCursor;\n }\n return res;\n}\n","import { PagedData, Requester } from './requester';\n\nexport const REQUEST_PAGE_SIZE = 25;\n\nexport interface SuiIterator<T> {\n next: () => Promise<T | undefined>;\n hasNext: () => Promise<boolean>;\n}\n\nexport async function getAllFromIterator<T>(it: SuiIterator<T>): Promise<(T | undefined) | (T | undefined)[]> {\n const res: (T | undefined)[] = [];\n while (await it.hasNext()) {\n const val = await it.next();\n res.push(val);\n }\n if (res && Array.isArray(res[0])) {\n return res.flat(1) as T;\n }\n return res;\n}\n\nexport class PagedIterator<T> implements SuiIterator<(T | undefined)[]> {\n private curPage: PagedData<T> | undefined;\n\n private init: boolean;\n\n constructor(public readonly requester: Requester<T>) {\n this.curPage = undefined;\n this.init = true;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.init) {\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return !!this.curPage.data?.length || this.curPage.hasNext;\n }\n if (!this.curPage) {\n throw new Error('invalid implementation of iterator');\n }\n return this.curPage.hasNext;\n }\n\n async next(): Promise<(T | undefined)[]> {\n if (this.init) {\n this.init = false;\n if (!this.curPage) {\n this.curPage = await this.requester.doNextRequest();\n }\n return this.curPage.data;\n }\n this.curPage = await this.requester.doNextRequest();\n return this.curPage.data;\n }\n}\n\nexport class EntryIterator<T> implements SuiIterator<T> {\n cursor: number;\n\n pager: PagedIterator<T>;\n\n curData: (T | undefined)[];\n\n constructor(public readonly requester: Requester<T>) {\n this.pager = new PagedIterator<T>(requester);\n this.curData = [];\n this.cursor = 0;\n }\n\n async hasNext(): Promise<boolean> {\n if (this.cursor < this.curData.length - 1) {\n return true;\n }\n return this.pager.hasNext();\n }\n\n async next(): Promise<T | undefined> {\n this.cursor += 1;\n while (this.cursor >= this.curData.length) {\n if (!(await this.pager.hasNext())) {\n throw new Error('not more data'); // Shall not happen for legit data source.\n } else {\n this.curData = await this.pager.next();\n this.cursor = 0;\n }\n }\n return this.curData[this.cursor];\n }\n}\n","import { SuiObjectResponse, SuiObjectDataOptions, SuiObjectData, SuiClient } from '@mysten/sui.js/client';\n\nimport { EntryIterator, getAllFromIterator, REQUEST_PAGE_SIZE, SuiIterator } from './iterator';\nimport { PagedData, Requester } from './requester';\n\n// TODO: setup testnet faucet and test this file\n\nexport type ObjectFilter = (objRes: SuiObjectResponse) => boolean;\n\n// OidIter is the iterator to give the list of object ids\nexport type OidIter = SuiIterator<string>;\n\nexport interface BatchObjectOptions {\n filter?: ObjectFilter;\n pageSize?: number;\n objectOptions?: SuiObjectDataOptions;\n}\n\n// getObjectsById get the list of objects by id.\n// Compared with the multiGetObject method defined by SUI, this method will do the pagination\n// for get object requests.\nexport async function getObjectsById(\n provider: SuiClient,\n ids: string[],\n options?: BatchObjectOptions,\n): Promise<(SuiObjectData | undefined)[]> {\n const oidIter = new ListOidIterator(ids);\n const iter = new ObjectBatchIterator(provider, oidIter, options);\n return (await getAllFromIterator(iter)) as (SuiObjectData | undefined)[];\n}\n\n// ListOidIterator is the iterator that iterate through a list of ids.\n// This iterator shall be used when the number requested objects is big\n// which is inappropriate to fit the requested objects into a single\n// request.\nexport class ListOidIterator implements OidIter {\n cursor: number;\n\n constructor(public readonly ids: string[]) {\n this.cursor = -1;\n }\n\n async hasNext(): Promise<boolean> {\n return this.cursor < this.ids.length - 1;\n }\n\n async next(): Promise<string> {\n this.cursor += 1;\n if (this.cursor >= this.ids.length) {\n throw new Error('invalid iterator implementation'); // Shall be unreachable\n }\n return this.ids[this.cursor];\n }\n}\n\nexport class ObjectBatchIterator extends EntryIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly idIter: OidIter,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new ObjectBatchRequester(provider, idIter, options));\n }\n}\n\n// TODO: Test with customize objects\nexport class ObjectBatchRequester implements Requester<SuiObjectData> {\n filter: ObjectFilter | undefined;\n\n pageSize: number;\n\n objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly stringIter: OidIter,\n public options?: BatchObjectOptions,\n ) {\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const requestPage: string[] = [];\n while (requestPage.length < this.pageSize) {\n const hasNext = await this.stringIter.hasNext();\n if (!hasNext) {\n break;\n }\n const objId = await this.stringIter.next();\n if (objId) {\n requestPage.push(objId);\n }\n }\n const res: SuiObjectResponse[] = await this.provider.multiGetObjects({\n ids: requestPage,\n options: this.objectOptions,\n });\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.filter((r: SuiObjectResponse) => filter?.(r));\n } else {\n filtered = res;\n }\n return {\n data: filtered.map((objRes) => objRes.data).filter((data) => data) as SuiObjectData[],\n hasNext: await this.stringIter.hasNext(),\n };\n }\n}\n\nexport async function getAllOwnedObjects(\n provider: SuiClient,\n owner: string,\n options?: BatchObjectOptions,\n): Promise<SuiObjectData[]> {\n const iter = new OwnedObjectIterator(provider, owner, options);\n return (await getAllFromIterator(iter)) as SuiObjectData[];\n}\n\nexport class OwnedObjectIterator extends EntryIterator<SuiObjectData> implements SuiIterator<SuiObjectData> {\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n super(new OwnedObjectRequester(provider, owner, options));\n }\n}\n\nexport class OwnedObjectRequester implements Requester<SuiObjectData> {\n nextCursor: string | null;\n\n public filter: ObjectFilter | undefined;\n\n public pageSize: number;\n\n public objectOptions: SuiObjectDataOptions;\n\n constructor(\n public readonly provider: SuiClient,\n public readonly owner: string,\n public readonly options?: BatchObjectOptions,\n ) {\n this.nextCursor = null;\n this.filter = options?.filter;\n this.pageSize = options?.pageSize || REQUEST_PAGE_SIZE;\n this.objectOptions = options?.objectOptions || {\n showType: true,\n showContent: true,\n };\n }\n\n async doNextRequest(): Promise<PagedData<SuiObjectData>> {\n const res = await this.provider.getOwnedObjects({\n owner: this.owner,\n options: this.objectOptions,\n cursor: this.nextCursor,\n limit: this.pageSize,\n });\n this.nextCursor = res.nextCursor as string;\n let filtered: SuiObjectResponse[];\n if (this.filter) {\n const { filter } = this;\n filtered = res.data.filter((obj: SuiObjectResponse) => filter?.(obj));\n } else {\n filtered = res.data;\n }\n return {\n data: filtered.map((r: SuiObjectResponse) => r.data).filter((data) => data) as SuiObjectData[],\n hasNext: res.hasNextPage,\n };\n }\n}\n","import { isSameAddress } from '@msafe/sui3-utils';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\nimport { normalizeSuiAddress } from '@mysten/sui.js/utils';\n\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { getPublicKeyFromChain } from '@/utils/sui';\n\n/**\n * PublicKeyHelper is the helper to query for public keys from\n * backend and blockchain.\n */\nexport class PublicKeyHelper {\n private knownPublicKeys: Map<string, PublicKey>;\n\n constructor(public readonly globals: MSafeGlobals) {\n this.knownPublicKeys = new Map<string, PublicKey>();\n }\n\n async getPublicKey(address: string) {\n const cached = this.knownPublicKeys.get(address);\n if (cached) {\n return cached;\n }\n const pk = await this._getPublicKey(address);\n if (pk) {\n this.knownPublicKeys.set(address, pk);\n }\n return pk;\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const results: (PublicKey | undefined)[] = new Array(addresses.length).fill(undefined);\n\n // Query local cache first\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n results[i] = this.knownPublicKeys.get(address);\n }\n\n // Query backend in batch\n const emptyIndexes = results\n .map((elem, index) => (elem === undefined ? index : -1))\n .filter((index) => index !== -1);\n if (emptyIndexes.length === 0) {\n return results;\n }\n const backendResult = await this.globals.backend.getPublicKeyBatch(emptyIndexes.map((index) => addresses[index]));\n for (let i = 0; i < emptyIndexes.length; i++) {\n const index = emptyIndexes[i];\n results[index] = backendResult[i];\n }\n\n // Query the public key from blockchain\n for (let i = 0; i < results.length; i++) {\n if (results[i] === undefined) {\n results[i] = await this.getPublicKeyFromChain(addresses[i]);\n }\n }\n\n // Finally, write the public keys to the local cache\n for (let i = 0; i < addresses.length; i++) {\n if (results[i]) {\n this.knownPublicKeys.set(addresses[i], results[i] as PublicKey);\n }\n }\n return results;\n }\n\n addPublicKey(address: string, publicKey: PublicKey) {\n if (!isSameAddress(address, publicKey.toSuiAddress())) {\n throw new Error('Invalid public key');\n }\n this.knownPublicKeys.set(normalizeSuiAddress(address), publicKey);\n }\n\n private async _getPublicKey(address: string) {\n const pkBackend = await this.getPublicKeyFromBackend(address);\n if (pkBackend) {\n return pkBackend;\n }\n const pkChain = await this.getPublicKeyFromChain(address);\n if (pkChain) {\n return pkChain;\n }\n return undefined;\n }\n\n private async getPublicKeyFromBackend(address: string): Promise<PublicKey | undefined> {\n try {\n const pk = await this.globals.backend.getPublicKey(address);\n return pk;\n } catch (_) {\n return undefined;\n }\n }\n\n private async getPublicKeyFromChain(address: string): Promise<PublicKey | undefined> {\n return getPublicKeyFromChain(this.globals.suiClient, address);\n }\n}\n","import { Report } from '@msafe/sui3-utils';\n\nimport { MSafeGlobals } from '@/globals';\n\nexport class ReportSDK {\n constructor(public readonly globals: MSafeGlobals) {}\n\n async create(report: Report) {\n return this.globals.backend.submitReport(report);\n }\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { BackendImpl } from '@/backend/BackendImpl';\nimport { IBackend } from '@/backend/interface';\nimport { getMSafeConfig, MSafeConfig, MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { IWallet } from '@/types/wallet';\n\nexport class MSafeGlobals {\n public readonly backend: IBackend;\n\n public readonly suiClient: SuiClient;\n\n public readonly config: MSafeConfig;\n\n _wallet: IWallet | undefined;\n\n constructor(input: { backend: IBackend; suiClient: SuiClient; config: MSafeConfig }) {\n this.backend = input.backend;\n this.suiClient = input.suiClient;\n this.config = input.config;\n }\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = getMSafeConfig(env, options);\n const suiClient = new SuiClient(\n config.suiClient.transport ? { transport: config.suiClient.transport } : { url: config.suiClient.url },\n );\n const backend = new BackendImpl(config.backend.url, options?.mockAddress);\n return new MSafeGlobals({\n backend,\n suiClient,\n config,\n });\n }\n\n connectWallet(wallet: IWallet) {\n this._wallet = wallet;\n }\n\n get wallet() {\n if (!this._wallet) {\n throw new Error('wallet not connected');\n }\n return this._wallet;\n }\n\n set wallet(val: IWallet) {\n this._wallet = val;\n }\n}\n","import {\n GetHistoryTransactionsResponse,\n GetPendingTransactionResponse,\n GetTransactionIntentionsResponse,\n IAuthLoginReq,\n IAuthLoginResp,\n IBuildTransactionRequest,\n ICreateMSafeReq,\n IGetAddressBookModeResult,\n IGetAddressBookResult,\n IGetDashboardReq,\n IGetDashboardResp,\n IGetHistoryTransactionsRequest,\n IGetIntentionsRequest,\n IGetMSafeQuery,\n IGetMSafesQuery,\n IGetPendingTransactionRequest,\n IGetPublicKeyBatchQuery,\n IGetPublicKeyBatchResp,\n IMSafeAddressRequest,\n IMSafeConfig,\n IMSafeInfoResp,\n IPageOptions,\n IPagedResult,\n IProposeIntentionAndBuildAndVoteRequest,\n IProposeIntentionRequest,\n IRejectTransactionRequest,\n ISetAddressBookModeReq,\n ISkipIntentionRequest,\n IUpdateMSafeStatusReq,\n IUserInfoResp,\n IVoteTransactionRequest,\n JWTToken,\n PublicKeySerde,\n Report,\n TransactionIntentionItem,\n UpdateAddressBookEntry,\n UserMSafeStatus,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport axios, { AxiosError, AxiosRequestConfig, AxiosRequestTransformer, AxiosResponse } from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { addPrefix } from '@/utils';\n\nimport { NotificationInfo, NotificationSubscribeDto, NotificationUpdateDto } from './types/notification';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(\n private readonly apiURL: string,\n private readonly mockAddress?: string,\n ) {}\n\n getNotificationInfo(): Promise<NotificationInfo> {\n return this.get<NotificationInfo>(`/notification`, {\n headers: this.headers(),\n }).then((res) => res.data);\n }\n\n subscribeNotification(input: NotificationSubscribeDto): Promise<void> {\n return this.post(`/notification/subscribe`, input, {\n headers: this.headers(),\n });\n }\n\n updateNotificationSubscription(input: NotificationUpdateDto): Promise<void> {\n return this.post(`/notification/update`, input, {\n headers: this.headers(),\n });\n }\n\n async authSign(input: IAuthLoginReq): Promise<JWTToken> {\n const res = await this.post<IAuthLoginResp>(`/auth/login`, input);\n\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await this.get(`/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const query: IGetPublicKeyBatchQuery = {\n userAddressList: addresses,\n };\n const res = await this.get<IGetPublicKeyBatchResp>(`/user/public-keys`, {\n params: query,\n headers: this.headers(),\n });\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de(publicKeyWithSchema) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<IMSafeConfig> {\n const q: IGetMSafeQuery = {\n msafeAddress,\n };\n const res = await this.get<IMSafeInfoResp>(`/msafe`, {\n params: q,\n headers: this.headers(),\n });\n return BackendImpl.toMSafeConfig(res.data);\n }\n\n async getUserInfo(): Promise<IUserInfoResp> {\n const userRes = await this.get<IUserInfoResp>(`/user`, {\n headers: this.headers(),\n });\n return userRes.data;\n }\n\n async getOwnedMSafeByStatus(input: {\n status?: UserMSafeStatus;\n pagination?: IPageOptions;\n }): Promise<IPagedResult<IMSafeConfig>> {\n const q: IGetMSafesQuery = {\n status: input.status ?? UserMSafeStatus.active,\n ...(input.pagination\n ? {\n page: input.pagination.page.toString(),\n limit: input.pagination.limit.toString(),\n }\n : {}),\n };\n const res = await this.get<IPagedResult<IMSafeInfoResp>>(`/msafe/owned`, {\n params: q,\n headers: this.headers(),\n });\n return {\n data: res.data?.data?.map(BackendImpl.toMSafeConfig),\n meta: res.data?.meta,\n };\n }\n\n async updateMSafeStatus(input: { msafeAddress: string; status: UserMSafeStatus }): Promise<void> {\n const p: IUpdateMSafeStatusReq = input;\n await this.post(`/msafe/status`, p, { headers: this.headers() });\n }\n\n async getPendingTransactions(input: IGetPendingTransactionRequest): Promise<GetPendingTransactionResponse> {\n const res = await this.get<GetPendingTransactionResponse>(`/transaction/pending`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getHistoryTransactions(input: IGetHistoryTransactionsRequest): Promise<GetHistoryTransactionsResponse> {\n const res = await this.get<GetHistoryTransactionsResponse>(`/transaction/history`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getFutureIntentions(input: IGetIntentionsRequest): Promise<GetTransactionIntentionsResponse> {\n const res = await this.get<GetTransactionIntentionsResponse>(`/transaction/intention`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextIntention(input: IMSafeAddressRequest): Promise<TransactionIntentionItem> {\n const res = await this.get<TransactionIntentionItem>(`/transaction/intention/next`, {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getCurrentSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/current`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async getNextSequenceNumber(address: string): Promise<number> {\n const res = await this.get<number>(`/transaction/sn/next`, {\n params: {\n msafeAddress: address,\n },\n headers: this.headers(),\n });\n return res.data;\n }\n\n async createMSafeAccount(input: ICreateMSafeReq): Promise<void> {\n await this.post(`/msafe/create`, input, {\n headers: this.headers(),\n });\n }\n\n async proposeIntention(input: IProposeIntentionRequest): Promise<void> {\n await this.post(`/transaction/intention`, input, { headers: this.headers() });\n }\n\n async rejectCurrentTx(input: IRejectTransactionRequest) {\n await this.post(\n `/transaction/pending/reject`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n {\n headers: this.headers(),\n },\n );\n }\n\n async voteForTransaction(input: IVoteTransactionRequest) {\n await this.post(`/transaction/pending/vote`, input, {\n headers: this.headers(),\n });\n }\n\n async buildNextIntentionAndAddToPending(input: IBuildTransactionRequest) {\n await this.post(\n `/transaction/pending/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async proposeIntentionAndBuildVote(input: IProposeIntentionAndBuildAndVoteRequest): Promise<void> {\n await this.post(\n `/transaction/intention/build`,\n { ...input, gasPrice: input.gasPrice.toString(), gasBudget: input.gasBudget.toString() },\n { headers: this.headers() },\n );\n }\n\n async skipNextFailedIntention(input: ISkipIntentionRequest) {\n await this.post(`/transaction/pending/skip`, input, { headers: this.headers() });\n }\n\n async fetchTransaction(input: IMSafeAddressRequest): Promise<string[]> {\n const res = await this.post(`/transaction/fetch`, input, { headers: this.headers() });\n return res.data as string[];\n }\n\n async getAddressBookEntries(pagination?: IPageOptions): Promise<IGetAddressBookResult> {\n const res = await this.get<IGetAddressBookResult>(`/address-book`, {\n headers: this.headers(),\n params: pagination,\n });\n return res.data;\n }\n\n async updateAddressBook(input: { updates: UpdateAddressBookEntry[]; signature: SerializedSignature }) {\n await this.post(`/address-book`, input, { headers: this.headers() });\n }\n\n async getAddressBookMode(): Promise<IGetAddressBookModeResult> {\n const res = await this.get<IGetAddressBookModeResult>('/address-book/mode', { headers: this.headers() });\n return res.data;\n }\n\n async setAddressBookMode(input: ISetAddressBookModeReq) {\n await this.post('/address-book/mode', { mode: input.mode }, { headers: this.headers() });\n }\n\n async submitReport(report: Report) {\n await this.post('/report', report);\n }\n\n async getDashboard(input: IGetDashboardReq): Promise<IGetDashboardResp> {\n const res = await this.get<IGetDashboardResp>('/dashboard', {\n params: input,\n headers: this.headers(),\n });\n return res.data;\n }\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}`, 'sui-mock-user': this.mockAddress };\n }\n\n private static toMSafeConfig(resp: IMSafeInfoResp): IMSafeConfig {\n return {\n ...resp,\n owners: resp.owners.map((owner) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: PublicKeySerde.de({\n publicKeyEncoded: owner.publicKeyEncoded,\n schema: owner.schema,\n }),\n status: owner.status,\n })),\n };\n }\n\n private async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios.get<T, R, D>(fullUrl, config).then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private async post<T = any, R = AxiosResponse<T>, D = any>(\n url: string,\n data?: D,\n config?: AxiosRequestConfig<D>,\n ): Promise<R> {\n const fullUrl = this.getFullUrl(url);\n try {\n return await axios\n .post<T, R, D>(fullUrl, data, {\n ...config,\n transformRequest: this.getTransformRequest(),\n })\n .then((res: any) => {\n if (res.response && res.response.status && res.response.status >= 400) {\n throw res;\n }\n return res;\n });\n } catch (e) {\n throw BackendError.fromError(e) ?? e;\n }\n }\n\n private getFullUrl(url: string) {\n return url.startsWith(this.apiURL) ? url : `${this.apiURL}${addPrefix(url, '/')}`;\n }\n\n private getTransformRequest() {\n let transformRequests: AxiosRequestTransformer[] = [];\n const { transformRequest } = axios.defaults;\n\n if (!transformRequest) {\n transformRequests = [];\n } else if (transformRequest instanceof Array) {\n transformRequests = transformRequest;\n } else {\n transformRequests = [transformRequest];\n }\n\n return [\n (d: any) =>\n JSON.parse(JSON.stringify(d, (_, value) => (typeof value === 'bigint' ? `${value.toString()}n` : value))),\n ...transformRequests,\n ];\n }\n}\n\nexport class BackendError extends Error {\n constructor(public readonly e: AxiosError) {\n super();\n Error.captureStackTrace(this, this.constructor);\n }\n\n public readonly name: 'Backend';\n\n static fromError(e: unknown) {\n if (axios.isAxiosError(e) && e?.response?.data && 'message' in e.response.data) {\n return new BackendError(e as AxiosError);\n }\n return undefined;\n }\n\n get status() {\n return this.e.response?.status ?? undefined;\n }\n\n get message(): string {\n return `${this.respMessage() ?? 'Unknown resp'}`;\n }\n\n private respMessage() {\n if (!this.e.response?.data) {\n return undefined;\n }\n return (this.e.response?.data as any).message ?? undefined;\n }\n\n get endpoint() {\n return this.e.config?.url ?? '';\n }\n\n toString() {\n return this.message;\n }\n}\n","import type { SuiClientOptions } from '@mysten/sui.js/client';\n\nexport enum MSafeEnv {\n local = 'local',\n unit = 'unit',\n dev = 'dev',\n prev = 'prev',\n prod = 'prod',\n}\n\nexport interface MSafeConfig {\n suiClient: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend: {\n url: string;\n };\n syncingURL: string;\n network: 'sui:mainnet' | 'sui:testnet';\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url: string;\n transport?: SuiClientOptions['transport'];\n };\n backend?: {\n url?: string;\n };\n mockAddress?: string;\n}\n\nexport const TESTNET_RPC_URL = 'https://fullnode.testnet.sui.io';\nexport const MAINNET_RPC_URL = 'https://fullnode.mainnet.sui.io';\n\nexport const LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'https://sui-dev.m-safe.link';\nexport const DEV_SYNCING_URL = 'http://13.56.226.148:81';\n\nexport const PREV_API_URL = 'https://sui-preview.m-safe.link';\n\nexport const PROD_API_URL = 'https://sui.m-safe.link';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: LOCAL_API_URL,\n },\n syncingURL: LOCAL_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: {\n url: DEV_API_URL,\n },\n syncingURL: DEV_SYNCING_URL,\n network: 'sui:testnet',\n },\n ],\n [\n MSafeEnv.prev,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PREV_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n [\n MSafeEnv.prod,\n {\n suiClient: {\n url: MAINNET_RPC_URL,\n },\n backend: {\n url: PROD_API_URL,\n },\n syncingURL: '',\n network: 'sui:mainnet',\n },\n ],\n]);\n\nexport function getMSafeConfig(env: MSafeEnv, options?: MSafeConfigOptions) {\n const config = ENV_CONFIGS.get(env);\n if (!config) {\n throw new Error('Unknown environment');\n }\n if (options?.suiClient?.url) {\n config.suiClient.url = options.suiClient.url;\n }\n if (options?.suiClient?.transport) {\n config.suiClient.transport = options.suiClient.transport;\n }\n if (options?.backend?.url) {\n config.backend.url = options.backend.url;\n }\n return config;\n}\n","export enum InfoTypeKey {\n receive = 'info_type_receive',\n send = 'info_type_send',\n invitation = 'info_type_invitation',\n awaitApproval = 'info_type_await_approval',\n}\nexport interface NotificationInfo {\n enabled: boolean;\n data?: NotificationData;\n}\n\nexport interface NotificationData {\n email: string;\n infoTypes: { infoType: InfoTypeKey; enabled: boolean }[];\n msafeEnabled: { msafeAddress: string; enabled: boolean }[];\n}\nexport class NotificationSubscribeDto {\n email: string;\n}\n\nexport class NotificationUpdateDto {\n email?: string;\n\n infoTypes?: InfoTypeEnabledDto[];\n\n msafeEnabled?: MSafeEnabledDto[];\n}\n\nexport class InfoTypeEnabledDto {\n infoType: InfoTypeKey;\n\n enabled: boolean;\n}\n\nexport class MSafeEnabledDto {\n msafeAddress: string;\n\n enabled: boolean;\n}\n"],"mappings":"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","names":["SigningMessageHelper","UserMSafeStatus","SigningMessageHelper","MultiSigAccount","SigningMessageHelper","isSameAddress","TransactionBlock","normalizeStructTag","normalizeStructTag","normalizeStructTag","PublicKeySerde","PublicKeySerde","MultiSigAccount","normalizeStructTag","SigningMessageHelper","TransactionBlock","isSameAddress","isSameAddress","normalizeSuiAddress","isSameAddress","normalizeSuiAddress","PublicKeySerde","PublicKeySerde","MSafeEnv","SigningMessageHelper","UserMSafeStatus","InfoTypeKey"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@msafe/sui3-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.83",
|
|
4
4
|
"description": "SDK for MSafe SUI V3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@msafe/mpay-sdk-sui": "^1.0.25",
|
|
30
|
-
"@msafe/sui-app-store": "0.0.
|
|
30
|
+
"@msafe/sui-app-store": "^0.0.222",
|
|
31
31
|
"@msafe/sui3-utils": "^5.0.2",
|
|
32
32
|
"@mysten/sui.js": "^0.54.1",
|
|
33
33
|
"@mysten/wallet-standard": "^0.11.6",
|
package/src/core/MSafeAccount.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
buildRejectTxb,
|
|
16
16
|
isSameAddress,
|
|
17
17
|
} from '@msafe/sui3-utils';
|
|
18
|
-
import { SuiObjectData, SuiObjectResponse
|
|
18
|
+
import { SuiObjectData, SuiObjectResponse } from '@mysten/sui.js/client';
|
|
19
19
|
import { SerializedSignature } from '@mysten/sui.js/cryptography';
|
|
20
20
|
import { TransactionBlock } from '@mysten/sui.js/transactions';
|
|
21
21
|
import { fromHEX, normalizeStructTag, toHEX } from '@mysten/sui.js/utils';
|
|
@@ -143,9 +143,6 @@ export class MSafeAccount {
|
|
|
143
143
|
txType: request.txType,
|
|
144
144
|
txSubType: request.txSubType,
|
|
145
145
|
clientUrl: this.globals.config.suiClient.url,
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
147
|
-
// @ts-ignore
|
|
148
|
-
suiClient: new SuiClient({ url: this.globals.config.suiClient.url }),
|
|
149
146
|
account: {
|
|
150
147
|
address: this.address,
|
|
151
148
|
publicKey: fromHEX(this.address),
|
|
@@ -175,26 +172,32 @@ export class MSafeAccount {
|
|
|
175
172
|
}
|
|
176
173
|
|
|
177
174
|
async proposeIntentionAndBuildVote(
|
|
178
|
-
input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'
|
|
175
|
+
input: Omit<IProposeIntentionAndBuildAndVoteRequest, 'signature' | 'msafeAddress' | 'payload' | 'digest'> & {
|
|
176
|
+
txb?: TransactionBlock;
|
|
177
|
+
},
|
|
179
178
|
): Promise<void> {
|
|
180
179
|
const appHelper = appHelpers.getAppHelper(input.application);
|
|
181
180
|
if (!appHelper) {
|
|
182
181
|
throw new Error(`Can't find app helper for application ${input.application}`);
|
|
183
182
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
183
|
+
let txb: TransactionBlock;
|
|
184
|
+
if (input.txb) {
|
|
185
|
+
txb = input.txb;
|
|
186
|
+
} else {
|
|
187
|
+
txb = await appHelper.build({
|
|
188
|
+
network: this.globals.config.network,
|
|
189
|
+
intentionData: input.intention,
|
|
190
|
+
txType: input.txType,
|
|
191
|
+
txSubType: input.txSubType,
|
|
192
|
+
clientUrl: this.globals.config.suiClient.url,
|
|
193
|
+
account: {
|
|
194
|
+
address: this.address,
|
|
195
|
+
publicKey: fromHEX(this.address),
|
|
196
|
+
chains: [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN],
|
|
197
|
+
features: [],
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
198
201
|
txb.setGasPrice(input.gasPrice);
|
|
199
202
|
txb.setGasBudget(input.gasBudget);
|
|
200
203
|
txb.setSender(this.address);
|