@msafe/sui3-sdk 0.0.2 → 0.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/transactions/coin-transfer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/utils/multi-sig.ts","../src/core/CreateHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/backend/PseudoBackend.ts","../src/backend/CoreDatabase.ts","../src/globals/const.ts","../src/core/MSafeClient.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './transactions';\nexport * from './types';\nexport * from './utils';\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Formatter } from '@/utils/format';\nimport { getAllCoins, SUI_COIN } from '@/utils/sui';\n\nexport interface IntentionCoinTransfer {\n txType: 'CoinTransfer';\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport async function buildCoinTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionCoinTransfer;\n}) {\n if (Formatter.isSuiStructEqual(input.intention.coinType, SUI_COIN)) {\n return buildSuiCoinTransferTxb(input);\n }\n return buildOtherCoinTransferTxb(input);\n}\n\nfunction buildSuiCoinTransferTxb(input: { sender: string; intention: IntentionCoinTransfer }): TransactionBlock {\n const txb = new TransactionBlock();\n const [coin] = txb.splitCoins(txb.gas, [txb.pure(input.intention.amount)]);\n txb.transferObjects([coin], txb.pure(input.intention.recipient));\n txb.setSender(input.sender);\n return txb;\n}\n\nasync function buildOtherCoinTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionCoinTransfer;\n}) {\n const { suiClient, sender, intention } = input;\n\n const objs = await getAllCoins({\n suiClient,\n owner: sender,\n coinType: intention.coinType,\n });\n if (objs.length === 0) {\n throw new Error('No valid coin found to send');\n }\n const totalBal = objs.reduce((sum, coin) => sum + BigInt(coin.balance), 0n);\n if (totalBal < BigInt(intention.amount)) {\n throw new Error('Not enough balance');\n }\n const txb = new TransactionBlock();\n const primary = txb.object(objs[0].coinObjectId);\n if (objs.length > 1) {\n txb.mergeCoins(\n primary,\n objs.slice(1).map((obj) => txb.object(obj.coinObjectId)),\n );\n }\n const [coin] = txb.splitCoins(primary, [txb.pure(intention.amount)]);\n txb.transferObjects([coin], txb.pure(intention.recipient));\n txb.setSender(input.sender);\n return txb;\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","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 { 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 { PublicKeySerde } from '@/utils/crypto';\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 if (Formatter.isSuiAddressEqual(decoded.zkLogin.address, targetAddress)) {\n throw new Error('ZkLogin wallet cannot be owner');\n }\n return undefined;\n }\n\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKey: decoded.publicKey, scheme: 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 {\n PublicKey,\n SerializedSignature,\n SIGNATURE_FLAG_TO_SCHEME,\n SignatureFlag,\n SignatureScheme,\n} from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui.js/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui.js/keypairs/secp256r1';\nimport { 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\nexport class PublicKeySerde {\n static ser(publicKey: PublicKey) {\n return {\n publicKey: publicKey.toBase64(),\n scheme: SIGNATURE_FLAG_TO_SCHEME[publicKey.flag() as SignatureFlag],\n };\n }\n\n static de(input: { publicKey: string | Uint8Array; scheme: SignatureScheme }): PublicKey {\n switch (input.scheme) {\n case 'ED25519':\n return new Ed25519PublicKey(input.publicKey);\n case 'Secp256k1':\n return new Secp256k1PublicKey(input.publicKey);\n case 'Secp256r1':\n return new Secp256r1PublicKey(input.publicKey);\n default:\n throw new Error('Unsupported signature scheme: $input.scheme');\n }\n }\n}\n","export 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 { SuiClient } from '@mysten/sui.js/client';\nimport type { SuiObjectResponse } from '@mysten/sui.js/src/client/types';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Formatter } from '@/utils/format';\n\nexport interface IntentionObjectTransfer {\n txType: 'ObjectTransfer';\n receiver: string;\n objectId: string;\n objectType: string;\n}\n\nexport async function buildObjectTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionObjectTransfer;\n}) {\n await validateObjectTransfer(input);\n\n const txb = new TransactionBlock();\n txb.transferObjects([txb.object(input.intention.objectId)], txb.pure(input.intention.receiver));\n txb.setSender(input.sender);\n\n return txb;\n}\n\nasync function validateObjectTransfer(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionObjectTransfer;\n}) {\n const { suiClient, sender, intention } = input;\n const obj = await suiClient.getObject({\n id: intention.objectId,\n });\n\n if (obj.data === undefined) {\n throw new Error('Object not found');\n }\n if (!obj.data?.type) {\n throw new Error('Object type is null');\n }\n if (!Formatter.isSuiStructEqual(obj.data.type, intention.objectType)) {\n throw new Error('Object type not expected');\n }\n if (Formatter.isCoinObjectType(obj.data.type)) {\n throw new Error('Can not transfer coin object in Object Transfer transactions');\n }\n const addressOwner = getAddressOwner(obj);\n if (!Formatter.isSuiAddressEqual(addressOwner, sender)) {\n throw new Error('Object owner not match');\n }\n}\n\nfunction getAddressOwner(object: SuiObjectResponse) {\n const owner = object.data?.owner;\n if (!owner) {\n throw new Error('Object Owner not found');\n }\n\n if (typeof owner !== 'object' || !('AddressOwner' in owner)) {\n throw new Error('Invalid object owner');\n }\n return owner.AddressOwner;\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { HexToUint8Array } from '@/utils/buffer';\n\nexport async function buildRejectTxb(input: { sender: string; payloadToReject: string }) {\n const approveTxb = TransactionBlock.from(HexToUint8Array(input.payloadToReject) as Uint8Array);\n const gasPayment = approveTxb.blockData.gasConfig.payment;\n if (!gasPayment) {\n throw new Error('No gas payment found for approve payload');\n }\n // Reject transaction is an empty transaction block with the same gas payment as the\n // transaction to be rejected.\n const txb = new TransactionBlock();\n txb.setGasPayment(gasPayment);\n txb.setSender(input.sender);\n return txb;\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { buildCoinTransferTxb, IntentionCoinTransfer } from '@/transactions/coin-transfer';\nimport { buildObjectTransferTxb, IntentionObjectTransfer } from '@/transactions/object-transfer';\nimport { buildRejectTxb } from '@/transactions/reject';\n\nexport type TxIntention = IntentionObjectTransfer | IntentionCoinTransfer;\n\n// TODO: Refactor later\nexport class IntentionHelper {\n static ser(intention: TxIntention) {\n return JSON.stringify(intention);\n }\n\n static de(val: string): TxIntention {\n const intention = JSON.parse(val);\n if (typeof intention !== 'object' || !('txType' in intention)) {\n throw new Error(`Failed to deserialize intention: ${val}`);\n }\n return JSON.parse(val);\n }\n\n // TODO: Add gas option here.\n static buildTxb(input: { suiClient: SuiClient; intention: TxIntention; sender: string }) {\n switch (input.intention.txType) {\n case 'CoinTransfer':\n return buildCoinTransferTxb({\n suiClient: input.suiClient,\n sender: input.sender,\n intention: input.intention as IntentionCoinTransfer,\n });\n case 'ObjectTransfer':\n return buildObjectTransferTxb({\n suiClient: input.suiClient,\n sender: input.sender,\n intention: input.intention as IntentionObjectTransfer,\n });\n default:\n throw new Error(`Unknown tx type: ${input.intention}`);\n }\n }\n\n static getTxType(intention: TxIntention) {\n switch (intention.txType) {\n case 'CoinTransfer':\n return {\n txType: 'CoinTransfer',\n txSubType: 'CoinTransfer',\n };\n case 'ObjectTransfer':\n return {\n txType: 'ObjectTransfer',\n txSubType: 'ObjectTransfer',\n };\n default:\n throw new Error('Unknown intention type');\n }\n }\n\n static buildRejectTransaction(input: { msafeAddress: string; payloadToReject: string }) {\n return buildRejectTxb({ sender: input.msafeAddress, payloadToReject: input.payloadToReject });\n }\n}\n","import { IntentionHelper, TxIntention } from '@/transactions/intention';\n\nexport class MessageHelper {\n // Message used for MSafe creation\n static createMSafeMessage(msafeAddress: string): string {\n return `Create MSafe Account: ${msafeAddress}`;\n }\n\n static deCreateMSafeMessage(msg: string) {\n const regex = /Create MSafe Account: (.+)/;\n const matches = msg.match(regex);\n return matches ? matches[1] : undefined;\n }\n\n // Message to be used when user login. The timestamp string\n // is used to for extra validation.\n static welcomeMessage(timestamp: string): string {\n return `Welcome to MSafe. ${timestamp}`;\n }\n\n static deWelcomeMessage(msg: string): string | undefined {\n const regex = /Welcome to MSafe. (.+)/;\n const matches = msg.match(regex);\n return matches ? matches[1] : undefined;\n }\n\n static proposeIntentionMessage(data: ProposeIntentionData) {\n const { intention, sn } = data;\n const intentionData = IntentionHelper.ser(intention);\n const msg: ProposeIntentionMessage = {\n intentionData,\n sequenceNumber: sn,\n };\n return JSON.stringify(msg);\n }\n\n static deProposeIntentionMessage(s: string): ProposeIntentionData {\n const de = JSON.parse(s);\n if (\n !('intentionData' in de) ||\n typeof de.intentionData !== 'string' ||\n !('sequenceNumber' in de) ||\n typeof de.sequenceNumber !== 'number'\n ) {\n throw new Error('Invalid intention data');\n }\n const { sequenceNumber, intentionData } = de;\n return {\n sn: sequenceNumber,\n intention: IntentionHelper.de(intentionData),\n };\n }\n}\n\nexport interface ProposeIntentionData {\n intention: TxIntention;\n sn: number;\n}\n\nexport interface ProposeIntentionMessage {\n intentionData: string;\n sequenceNumber: number;\n}\n","import { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { MSafeAccountInfo } from '@/types/msafe';\nimport { stringToBuffer } from '@/utils/buffer';\n\nexport interface PublicKeyWithWeight {\n publicKey: PublicKey;\n weight: number;\n}\n\nexport interface MultiSigConfig {\n threshold: number;\n ownerWithWeight: PublicKeyWithWeight[];\n creationNonce: number | undefined;\n}\n\nexport const NONCE_PK_PREFIX = 'maven';\nexport const NONCE_PREFIX_MAX_SIZE = 16;\nexport const NONCE_PK_WEIGHT = 1;\n\nexport const MAX_WEIGHT = 255;\nexport const MIN_WEIGHT = 1;\nexport const MAX_OWNER_WITH_NONCE = 9;\nexport const MAX_OWNER_WITHOUT_NONCE = 10;\nexport const MIN_THRESHOLD = 1;\n\nexport class RawMultiSig {\n rawMsPK: MultiSigPublicKey;\n\n constructor(public readonly config: MultiSigConfig) {\n this.rawMsPK = getMultiSigPublicKey(config);\n }\n\n static fromMSafeAccountInfo(info: MSafeAccountInfo) {\n const parsed: MultiSigConfig = {\n threshold: info.threshold,\n ownerWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n };\n return new RawMultiSig(parsed);\n }\n\n get suiAddress(): string {\n return this.rawMsPK.toSuiAddress();\n }\n\n get publicKeys(): PublicKeyWithWeight[] {\n return this.rawMsPK.getPublicKeys();\n }\n\n get threshold(): number {\n return this.config.threshold;\n }\n\n combinePartialSignatures(signatures: SerializedSignature[]): SerializedSignature {\n return this.rawMsPK.combinePartialSignatures(signatures);\n }\n\n async verifyPersonalMessage(messageStr: string, multiSigSignature: SerializedSignature): Promise<boolean> {\n const message = stringToBuffer(messageStr);\n return this.rawMsPK.verifyPersonalMessage(message, multiSigSignature);\n }\n}\n\nexport function getMultiSigPublicKey(config: MultiSigConfig) {\n const { ownerWithWeight, threshold, creationNonce } = config;\n const pks = ownerWithWeight.map((pk) => ({\n publicKey: pk.publicKey,\n weight: pk.weight,\n }));\n if (creationNonce !== undefined) {\n pks.push({\n publicKey: makeNoncePublicKey(creationNonce),\n weight: NONCE_PK_WEIGHT,\n });\n }\n return MultiSigPublicKey.fromPublicKeys({ threshold, publicKeys: pks });\n}\n\nexport function makeNoncePublicKey(nonce: number) {\n const buffer = new ArrayBuffer(Ed25519PublicKey.SIZE);\n const textEncoder = new TextEncoder();\n textEncoder.encodeInto(NONCE_PK_PREFIX, new Uint8Array(buffer, 0, NONCE_PREFIX_MAX_SIZE));\n const nonceView = new DataView(buffer, NONCE_PREFIX_MAX_SIZE, 4);\n nonceView.setUint32(0, nonce, true);\n return new Ed25519PublicKey(new Uint8Array(buffer));\n}\n\nexport function validateMultiSigConfig(config: MultiSigConfig) {\n config.ownerWithWeight.forEach((pk) => {\n const { weight } = pk;\n if (weight < MIN_WEIGHT || weight > MAX_WEIGHT) {\n throw new Error(`Invalid multi-sig weight: ${weight} (1-${MAX_WEIGHT})`);\n }\n });\n const totalWeight = config.ownerWithWeight.reduce((s, pk) => s + pk.weight, 0);\n if (config.threshold > totalWeight) {\n throw new Error('Threshold is larger than total weight');\n }\n if (config.threshold < MIN_THRESHOLD) {\n throw new Error('Threshold is smaller than 1');\n }\n const maxOwner = config.creationNonce === undefined ? MAX_OWNER_WITHOUT_NONCE : MAX_OWNER_WITH_NONCE;\n if (config.ownerWithWeight.length > maxOwner) {\n throw new Error('Owner number bigger than upper cap');\n }\n const addressSet = new Set(config.ownerWithWeight.map((pk) => pk.publicKey.toSuiAddress()));\n if (addressSet.size !== config.ownerWithWeight.length) {\n throw new Error('Duplicate address detected');\n }\n}\n","import { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { MultiSigConfig, RawMultiSig, validateMultiSigConfig } from '@/utils/multi-sig';\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: CreatePermissionInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new RawMultiSig(msConfig);\n return ms.suiAddress;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeAccountInfo) {\n const rawConfig = await this.reduceCreationInfoToRawConfig(createInfo);\n validateMultiSigConfig(rawConfig);\n\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeAccountInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = MessageHelper.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: CreatePermissionInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.ownerWithWeight.map((oww) => oww.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.ownerWithWeight[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownerWithWeight: info.ownerWithWeight.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: CreateMSafeAccountInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.ownerWithWeight.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n ownerWithWeight: createInfo.ownerWithWeight.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: pks[i] as PublicKey, // PublicKey has been verified.\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { MSafeAccountInfo, PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { RawMultiSig } from '@/utils/multi-sig';\n\nexport class MSafeAccount {\n public rawMultiSig: RawMultiSig;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.rawMultiSig = RawMultiSig.fromMSafeAccountInfo(info);\n }\n\n static async new(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n return new MSafeAccount(globals, info);\n }\n\n async pendingTransactions() {\n return this.backend.getPendingTransactions(this.address);\n }\n\n async historyTransaction() {\n return this.backend.getHistoryTransactions(this.address);\n }\n\n async futureIntentions() {\n return this.backend.getFutureIntentions(this.address);\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 proposeIntention(intention: TxIntention, sequenceNumber: number) {\n const message = MessageHelper.proposeIntentionMessage({ intention, sn: sequenceNumber });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n await this.backend.proposeIntention({\n intention,\n sequenceNumber,\n msafeAddress: this.address,\n userAddress: await this.userAddress(),\n signature: signature.signature,\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 userAddress: await this.userAddress(),\n txDigest: digest,\n signature: signature.signature,\n });\n }\n\n // Shortcut for proposing a transaction to be a pending transaction, and add user vote to it.\n // Requires the multi-sig to be empty in pending transaction.\n async proposePendingTransaction(intention: TxIntention) {\n const txb = await IntentionHelper.buildTxb({\n suiClient: this.suiClient,\n intention,\n sender: this.address,\n });\n const payload = await txb.build({ client: this.suiClient });\n const digest = await txb.getDigest({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.proposePendingTransaction({\n msafeAddress: this.address,\n userAddress: await this.userAddress(),\n intention,\n digest,\n signature: signature.signature,\n });\n }\n\n async rejectCurrentTx(pending?: PendingTx) {\n let payloadToReject: string;\n if (pending) {\n if (pending.isRejectTx) {\n throw new Error('Pending not reject transaction');\n }\n payloadToReject = pending.payload;\n } else {\n const pendings = await this.pendingTransactions();\n if (pendings.length !== 1 || pendings[0].isRejectTx) {\n throw new Error('Already rejected');\n }\n payloadToReject = pendings[0].payload;\n }\n const rejectTxb = await IntentionHelper.buildRejectTransaction({\n msafeAddress: this.address,\n payloadToReject,\n });\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 userAddress: await this.userAddress(),\n digest,\n signature: signature.signature,\n });\n }\n\n async buildNextIntentionAndAddToPending() {\n return this.backend.buildNextIntentionAndAddToPending({ msafeAddress: this.address });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address, userAddress: await this.userAddress() });\n }\n\n async executePendingTx(pending: PendingTx) {\n if (pending.votes.length < this.info.threshold) {\n throw new Error('Not enough signatures');\n }\n const sigs: SerializedSignature[] = [];\n const gotSigs = new Map(pending.votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.ownersWithWeightPK.length; i++) {\n const owner = this.info.ownersWithWeightPK[i];\n const signature = gotSigs.get(owner.publicKey.toSuiAddress());\n if (signature) {\n sigs.push(signature);\n }\n }\n const multiSignature = this.rawMultiSig.combinePartialSignatures(sigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(pending.payload),\n signature: multiSignature,\n options: { showEffects: true },\n });\n }\n\n get address() {\n return this.info.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 { PublicKey } from '@mysten/sui.js/src/cryptography';\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 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 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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { IBackend } from '@/backend/interface';\nimport { PseudoBackend } from '@/backend/PseudoBackend';\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(config.suiClient);\n const backend = await PseudoBackend.New(config.backend, suiClient);\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 'reflect-metadata';\nimport {\n User,\n UserMSafe,\n HistoryTransaction,\n MSafe,\n TransactionIntention,\n UserVote,\n PendingTransaction,\n} from '@msafe/sui3-model/core';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { SignatureScheme } from '@mysten/sui.js/src/cryptography/signature-scheme';\nimport { MoreThanOrEqual } from 'typeorm';\n\nimport { CoreDB } from '@/backend/CoreDatabase';\nimport { IBackend } from '@/backend/interface';\nimport { CreateMSafeParams, JWTToken, UserWithOwnedMSafe } from '@/backend/types';\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { DBConfig } from '@/globals/const';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { FutureIntention, HistorySendTx, MSafeAccountInfo, PendingTx } from '@/types/msafe';\nimport { Uint8ArrayToHex, HexToUint8Array } from '@/utils/buffer';\nimport { PublicKeySerde, SignatureVerifier } from '@/utils/crypto';\nimport { Formatter } from '@/utils/format';\nimport { RawMultiSig } from '@/utils/multi-sig';\n\n/**\n * Represents a PseudoBackend class that implements the IBackend interface.\n * This class is responsible for interacting with a database and performing various operations.\n * Notice: For backend production code, all DB errors need to be handled correctly\n * TODO: Use QueryRunner to make all db operations atomic.\n * TODO: Permission validation for each request.\n * TODO: More input validation and normalization.\n */\nexport class PseudoBackend implements IBackend {\n private _token: JWTToken;\n\n private constructor(\n public readonly db: CoreDB,\n private readonly _suiClient: SuiClient,\n ) {}\n\n static async New(dbConfig: DBConfig, suiClient: SuiClient) {\n const db = await CoreDB.New(dbConfig);\n return new PseudoBackend(db, suiClient);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars,unused-imports/no-unused-vars\n async isJWTTokenValid(_jwt: JWTToken): Promise<boolean> {\n return true;\n }\n\n async authSign(input: {\n address: string;\n message: string;\n signature: SerializedSignature;\n walletType: string;\n }): Promise<JWTToken> {\n const timestamp = MessageHelper.deWelcomeMessage(input.message);\n if (!timestamp) {\n throw new Error('Invalid welcome message');\n }\n // Check if the signing message has expired\n const date = Date.parse(timestamp);\n if (new Date().getTime() - date < 0) {\n throw new Error('Invalid timestamp');\n }\n if (new Date().getTime() - date > 10 * 1000) {\n throw new Error('Signing message expired');\n }\n\n const publicKey = await SignatureVerifier.getPublicKeyFromPersonalSignature({\n messageStr: input.message,\n signature: input.signature,\n });\n if (!Formatter.isSuiAddressEqual(input.address, publicKey.toSuiAddress())) {\n throw new Error('Invalid signature');\n }\n // Add user data to database\n await this.db.upsertUser({\n address: input.address,\n publicKey,\n lastLogin: new Date(),\n });\n\n // Add wallet type\n await this.db.updateUserWalletType({\n address: input.address,\n walletType: input.walletType,\n });\n\n this._token = '';\n return this._token;\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string) {\n const user = await this.model.user.findOneBy({\n address,\n });\n if (user === null) {\n return undefined;\n }\n return PublicKeySerde.de({\n publicKey: user.publicKey,\n scheme: user.schema as SignatureScheme,\n });\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res: (PublicKey | undefined)[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const user = await this.getUser(address);\n res.push(\n user\n ? PublicKeySerde.de({\n publicKey: user.publicKey,\n scheme: user.schema as SignatureScheme,\n })\n : undefined,\n );\n }\n return res;\n }\n\n async createMSafeAccount(input: CreateMSafeParams) {\n const ms = new RawMultiSig(input);\n const msafeAddr = ms.suiAddress;\n\n const signingMsg = MessageHelper.createMSafeMessage(msafeAddr);\n const targetAddr = input.ownerWithWeight[0].address;\n const verifyResult = await SignatureVerifier.verifyPersonalSignature({\n messageStr: signingMsg,\n signature: input.signature,\n targetAddress: targetAddr,\n });\n if (!verifyResult) {\n throw new Error('Signature verification failed');\n }\n // TODO: In production, we will also need to verify whether the\n // JWT token align with the creator (targetAddr)\n // Check and verify the creation message.\n if (input.name.length > 128) {\n throw new Error('Name too long');\n }\n if (input.description && input.description.length > 512) {\n throw new Error('Description too long');\n }\n const creatorAddress = input.ownerWithWeight[0].address;\n const creator = await this.getUser(creatorAddress);\n if (creator === null) {\n throw new Error('Creator not found');\n }\n if (creator.nonce !== input.creationNonce) {\n throw new Error('Nonce not match');\n }\n const msafeExistCheck = await this.model.msafe.findOneBy({\n address: msafeAddr,\n });\n if (msafeExistCheck !== null) {\n throw new Error('MSafe already exist in database');\n }\n input.ownerWithWeight.forEach((ownerInfo) => {\n if (!Formatter.isSuiAddressEqual(ownerInfo.address, ownerInfo.publicKey.toSuiAddress())) {\n throw new Error('Sui address public key not match');\n }\n });\n\n // For each manager, add user info if not exist. Add userMSafe entry.\n for (let i = 0; i !== input.ownerWithWeight.length; i++) {\n const ownerInfo = input.ownerWithWeight[i];\n // Creator has been verified and already exist in database\n if (i !== 0) {\n const coManager = await this.getUser(ownerInfo.address);\n const serPK = PublicKeySerde.ser(ownerInfo.publicKey);\n // Add user with public key if not exist\n if (coManager === null) {\n const user: User = {\n address: ownerInfo.address,\n publicKey: serPK.publicKey,\n schema: serPK.scheme,\n nonce: 0,\n lastLogin: new Date(),\n };\n await this.model.user.save(user);\n }\n }\n\n // Add userMSafe record\n const userMSafe: UserMSafe = {\n userAddress: ownerInfo.address,\n msafeAddress: msafeAddr,\n index: i,\n weight: ownerInfo.weight,\n status: i === 0 ? 'active' : 'pending',\n };\n await this.model.userMSafe.save(userMSafe);\n }\n\n // Increment the creator nonce\n const creationNonce = creator.nonce;\n creator.nonce++;\n await this.model.user.save(creator);\n\n // Add MSafe record\n const msafe: MSafe = {\n address: msafeAddr,\n creationNonce,\n creator: creatorAddress,\n name: input.name,\n description: input.description,\n threshold: input.threshold,\n };\n await this.model.msafe.save(msafe);\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n // TODO: In production, we need verify whether the msafe\n // account belongs to the single signer from JWT token.\n\n const msafe = await this.model.msafe.findOneBy({ address: msafeAddress });\n if (msafe === null) {\n throw new Error('MSafe not found');\n }\n const userMSafes = await this.model.userMSafe.find({\n where: {\n msafeAddress,\n },\n order: {\n index: 'asc',\n },\n });\n if (userMSafes.length === 0) {\n throw new Error('MSafe does not have user info.');\n }\n const users = await Promise.all(userMSafes.map((um) => this.getUser(um.userAddress)));\n users.forEach((user) => {\n if (user === null) {\n throw new Error('User not found');\n }\n });\n const ownersWithWeightPK = userMSafes.map((userMSafe, i) => ({\n address: userMSafe.userAddress,\n weight: userMSafe.weight,\n publicKey: PublicKeySerde.de({ publicKey: users[i]!.publicKey, scheme: users[i]!.schema as SignatureScheme }),\n }));\n return {\n address: msafeAddress,\n ownersWithWeightPK,\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n // TODO: Do permission check on user JWT token.\n const user = await this.getUser(userAddress);\n if (user === null) {\n throw new Error('404: user not found');\n }\n // TODO: Add invitation status as well.\n const msafeAccounts = await this.model.userMSafe.findBy({ userAddress });\n const ownedMSafe = await Promise.all(\n msafeAccounts.map(async (msafeAccount) => this.getMSafeAccountInfo(msafeAccount.msafeAddress)),\n );\n return {\n address: userAddress,\n publicKey: user.publicKey,\n schema: user.schema,\n creationNonce: user.nonce,\n ownedMSafe,\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const pendings = await this.db.coreModel.pendingTransaction.findBy({\n msafeAddress,\n });\n if (pendings.length === 0) {\n return [];\n }\n const votes = await Promise.all(\n pendings.map((pending) => this.db.coreModel.userVote.findBy({ txDigest: pending.digest, isValid: true })),\n );\n const intention = await this.model.transactionIntention.findOneBy({\n msafeAddress,\n sequenceNumber: pendings[0].sequenceNumber,\n });\n if (intention === null) {\n throw new Error('Intention not found');\n }\n const intent = IntentionHelper.de(intention.data);\n return pendings.map((pending, i) => ({\n digest: pending.digest,\n payload: pending.payload,\n msafeAddress: pending.msafeAddress,\n isRejectTx: pending.isRejectTx,\n creator: pending.creator,\n createdAt: pending.createdAt as Date,\n votes: votes[i].map((vote) => ({\n userAddress: vote.userAddress,\n signature: vote.signature,\n timestamp: vote.updatedAt as Date,\n })),\n sequenceNumber: pending.sequenceNumber,\n intention: pending.isRejectTx ? undefined : intent,\n }));\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n // TODO: validate user permission\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n return maxSNHistory === null ? 0 : maxSNHistory.sequenceNumber + 1;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n // TODO: validate user permission\n const maxSNIntention = await this.model.transactionIntention.findOne({\n where: { msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n return maxSNIntention === null ? 0 : maxSNIntention.sequenceNumber + 1;\n }\n\n async getHistoryTransactions(msafeAddress: string): Promise<HistorySendTx[]> {\n // TODO: Add pagination options. Filter by sequence number based\n // on pagination options.\n // Notice there can be multiple transactions with the same sequence\n // number.\n // TODO: Add permission validation\n const transactions = await this.db.coreModel.historyTransaction.find({\n where: {\n msafeAddress,\n },\n order: { sequenceNumber: 'desc' },\n });\n const votes = await Promise.all(\n transactions.map((tx) =>\n this.db.coreModel.userVote.findBy({\n txDigest: tx.digest,\n isValid: true,\n }),\n ),\n );\n return transactions.map((tx, i) => ({\n digest: tx.digest,\n payload: tx.payload,\n msafeAddress: tx.msafeAddress,\n isRejectTx: tx.isRejectTx,\n status: tx.status,\n creator: tx.creator,\n createdAt: tx.createdAt as Date,\n sequenceNumber: tx.sequenceNumber,\n votes: votes[i].map((vote) => ({\n userAddress: vote.userAddress,\n timestamp: vote.updatedAt as Date,\n })),\n }));\n }\n\n async getFutureIntentions(msafeAddress: string): Promise<FutureIntention[]> {\n // TODO: Add pagination options, add user permission validation\n const currentSequenceNumber = await this.getCurrentSequenceNumber(msafeAddress);\n const hasPending = (await this.model.pendingTransaction.findOneBy({ msafeAddress })) !== null;\n const futureSNStart = hasPending ? currentSequenceNumber + 1 : currentSequenceNumber;\n\n const futureTxs = await this.model.transactionIntention.find({\n where: { msafeAddress, sequenceNumber: MoreThanOrEqual(futureSNStart) },\n order: { sequenceNumber: 'asc' },\n });\n return futureTxs.map((tx) => ({\n intention: IntentionHelper.de(tx.data),\n msafeAddress: tx.msafeAddress,\n sequenceNumber: tx.sequenceNumber,\n rawData: tx.data,\n txType: tx.txType,\n txSubType: tx.txSubType,\n status: tx.status,\n statusRemark: tx.statusRemark,\n creator: tx.creator,\n createdAt: tx.createdAt as Date,\n }));\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }) {\n // Validation:\n // 1. Whether the current wallet have permission\n // 2. Verify signature\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (!userMSafe) {\n throw new Error('User does not have permission to propose intention');\n }\n const verified = await SignatureVerifier.verifyPersonalSignature({\n messageStr: MessageHelper.proposeIntentionMessage({ intention: input.intention, sn: input.sequenceNumber }),\n signature: input.signature,\n targetAddress: input.userAddress,\n });\n if (!verified) {\n throw new Error('Invalid signature');\n }\n\n const sequenceNumber = await this.model.transactionIntention.count({\n where: {\n msafeAddress: input.msafeAddress,\n },\n });\n if (sequenceNumber !== input.sequenceNumber) {\n throw new Error('Sequence number not expected');\n }\n const intention: TransactionIntention = {\n msafeAddress: input.msafeAddress,\n sequenceNumber,\n ...IntentionHelper.getTxType(input.intention),\n data: IntentionHelper.ser(input.intention),\n status: 'future',\n creator: input.userAddress,\n };\n await this.model.transactionIntention.save(intention);\n }\n\n // Propose a pending transaction. Require the msafe account\n // Does not have any pending transactions.\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (userMSafe === null) {\n throw new Error('Unauthorized');\n }\n\n const msafePendings = await this.model.pendingTransaction.findBy({\n msafeAddress: input.msafeAddress,\n });\n if (msafePendings.length !== 0) {\n throw new Error('Still have pending transaction');\n }\n\n const txb = await IntentionHelper.buildTxb({\n suiClient: this._suiClient,\n intention: input.intention,\n sender: input.msafeAddress,\n });\n const payload = await txb.build({ client: this._suiClient });\n const txDigest = await txb.getDigest({ client: this._suiClient });\n if (txDigest !== input.digest) {\n throw new Error('Transaction digest un-match');\n }\n\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Failed to verify signature');\n }\n\n // Write intention\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const sequenceNumber = maxSNHistory === null ? 0 : maxSNHistory.sequenceNumber + 1;\n const intention: TransactionIntention = {\n msafeAddress: input.msafeAddress,\n sequenceNumber,\n ...IntentionHelper.getTxType(input.intention),\n data: IntentionHelper.ser(input.intention),\n status: 'future',\n creator: input.userAddress,\n };\n await this.model.transactionIntention.save(intention);\n\n // Write pending transaction\n const pendingTx: PendingTransaction = {\n digest: txDigest,\n msafeAddress: input.msafeAddress,\n payload: Uint8ArrayToHex(payload),\n sequenceNumber,\n isRejectTx: false,\n creator: input.userAddress,\n };\n await this.model.pendingTransaction.save(pendingTx);\n\n // Write user vote\n const userVote: UserVote = {\n userAddress: input.userAddress,\n txDigest,\n msafeAddress: input.msafeAddress,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(userVote);\n }\n\n // Calls for the first reject transaction\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n });\n if (userMSafe === null) {\n throw new Error('User does not have permission to MSafe');\n }\n\n const currentPending = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n isRejectTx: false,\n });\n if (currentPending === null) {\n throw new Error('No active pending transaction');\n }\n\n const txb = await IntentionHelper.buildRejectTransaction({\n msafeAddress: input.msafeAddress,\n payloadToReject: currentPending.payload,\n });\n const payload = await txb.build({ client: this._suiClient });\n const digest = await txb.getDigest({ client: this._suiClient });\n if (input.digest !== digest) {\n throw new Error('Digest not match');\n }\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Signature unverified');\n }\n\n const existPendingReject = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n isRejectTx: true,\n });\n if (existPendingReject !== null) {\n await this.voteForTransaction({\n txDigest: existPendingReject.digest,\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n signature: input.signature,\n });\n return;\n }\n\n const rejectPayloadStr = Uint8ArrayToHex(payload);\n const rejectDigest = await txb.getDigest({ client: this._suiClient });\n const rejectPending: PendingTransaction = {\n msafeAddress: input.msafeAddress,\n digest: rejectDigest,\n payload: rejectPayloadStr,\n sequenceNumber: currentPending.sequenceNumber,\n isRejectTx: true,\n creator: input.userAddress,\n };\n await this.model.pendingTransaction.save(rejectPending);\n\n // Vote for the transaction\n const rejectVote: UserVote = {\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n txDigest: rejectDigest,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(rejectVote);\n\n // If user has previously voted in the other way, revoke the vote\n const existVote = await this.model.userVote.findOneBy({\n txDigest: currentPending.digest,\n userAddress: input.userAddress,\n });\n if (existVote !== null) {\n await this.model.userVote.update(\n { userAddress: input.userAddress, txDigest: currentPending.digest },\n { isValid: false },\n );\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const pendingTx = await this.model.pendingTransaction.findOneBy({ digest: input.txDigest });\n if (!pendingTx) {\n throw new Error(`Pending transaction not found: ${input.txDigest}`);\n }\n if (pendingTx.msafeAddress !== input.msafeAddress) {\n throw new Error('MSafe address not match');\n }\n\n // Ensure user owns the msafe address\n const userMSafe = await this.model.userMSafe.findOneBy({\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n });\n if (userMSafe === null) {\n throw new Error(`User (${input.userAddress}) does not have permission on MSafe account (${input.msafeAddress})`);\n }\n\n // Verify the signature\n const payload = HexToUint8Array(pendingTx.payload);\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Invalid signature');\n }\n\n // If user has other vote on the reject transaction, Add the user vote.\n const rejectPendingTx = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: pendingTx.sequenceNumber,\n isRejectTx: !pendingTx.isRejectTx,\n });\n if (rejectPendingTx !== null) {\n await this.model.userVote.update(\n {\n userAddress: input.userAddress,\n txDigest: rejectPendingTx.digest,\n isValid: true,\n },\n { isValid: false },\n );\n }\n const existVote = await this.model.userVote.exist({\n where: {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n },\n });\n if (!existVote) {\n const userVote: UserVote = {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(userVote);\n } else {\n await this.model.userVote.update(\n {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n },\n { isValid: true },\n );\n }\n }\n\n // Mock the process of an executed transaction\n // Here only the essential logic of transaction processing logic\n // is implemented. Need more transaction parsing from the fetcher\n // module.\n //\n // TODO: User queryRunner to make the transaction atomic.\n async processExecutedTransaction(digest: string) {\n // TODO: Process the transaction result from blockchain.\n const historyTx = await this.model.historyTransaction.findOneBy({ digest });\n if (historyTx) {\n // Already processed, directly return\n const allHistories = await this.model.historyTransaction.findBy({\n msafeAddress: (historyTx as HistoryTransaction).msafeAddress,\n });\n console.log(allHistories);\n return;\n }\n const pendingTx = await this.model.pendingTransaction.findOneBy({ digest });\n if (!pendingTx) {\n throw new Error('Transaction digest not found');\n }\n // Mark the intention as processed.\n await this.model.transactionIntention.update(\n { msafeAddress: pendingTx.msafeAddress, sequenceNumber: pendingTx.sequenceNumber },\n { status: 'processed' },\n );\n // Delete the current pending transaction.\n // There can be multiple transactions. mark one as executed, other as rejected\n const pendings = await this.model.pendingTransaction.findBy({\n msafeAddress: pendingTx.msafeAddress,\n sequenceNumber: pendingTx.sequenceNumber,\n });\n if (pendings.length === 0) {\n throw new Error('Pending transaction not found');\n }\n // Add to transaction history and delete the pending transaction.\n const executionResult: 'success' | 'failed' = 'success';\n for (let i = 0; i !== pendings.length; i++) {\n const pending = pendings[i];\n const history: HistoryTransaction = {\n digest: pending.digest,\n payload: pending.payload,\n msafeAddress: pending.msafeAddress,\n sequenceNumber: pending.sequenceNumber,\n isRejectTx: pending.isRejectTx,\n creator: pending.creator,\n createdAt: pending.createdAt as Date,\n // TODO: Fill in this field based on transaction processing result\n status: pending.digest === digest ? executionResult : 'rejected',\n };\n await this.model.historyTransaction.save(history);\n await this.model.pendingTransaction.delete({ digest: pending.digest });\n }\n }\n\n /**\n * Build the next transaction intention, and add the built transaction to pendings.\n * @param input\n */\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const nextSequenceNumber = maxSNHistory ? maxSNHistory.sequenceNumber + 1 : 0;\n\n const currentPendings = await this.model.pendingTransaction.findBy({\n msafeAddress: input.msafeAddress,\n });\n if (currentPendings.length !== 0) {\n throw new Error('Still have pendings');\n }\n\n const nextTx = await this.model.transactionIntention.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n });\n if (nextTx === null) {\n throw new Error('No future intentions to build');\n }\n\n const nextIntention = IntentionHelper.de(nextTx.data);\n try {\n const newTxb = await IntentionHelper.buildTxb({\n suiClient: this._suiClient,\n sender: input.msafeAddress,\n intention: nextIntention,\n });\n const payload = await newTxb.build({ client: this._suiClient });\n const newDigest = await newTxb.getDigest({ client: this._suiClient });\n const newPending: PendingTransaction = {\n digest: newDigest,\n payload: Uint8ArrayToHex(payload),\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextTx.sequenceNumber,\n isRejectTx: false,\n creator: nextTx.creator,\n };\n await this.model.pendingTransaction.save(newPending);\n } catch (e: unknown) {\n // Build failed. Mark the intention as failed.\n await this.model.transactionIntention.update(\n {\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n },\n {\n status: 'failed',\n statusRemark: (e as any).toString(),\n },\n );\n throw new Error(`Intention build failed: {sequenceNumber: ${nextSequenceNumber}}`);\n }\n }\n\n /**\n * Skip next failed transaction if build of the intention has been failed before.\n */\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (userMSafe === null) {\n throw new Error('user does not have permission to MSafe');\n }\n\n const curSequenceNumber = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const nextSequenceNumber = curSequenceNumber ? curSequenceNumber.sequenceNumber + 1 : 0;\n\n const failedIntention = await this.model.transactionIntention.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n });\n if (failedIntention === null) {\n throw new Error('Next intention not found');\n }\n if (failedIntention.status !== 'failed') {\n throw new Error('Next intention not failed');\n }\n\n const history: HistoryTransaction = {\n msafeAddress: input.msafeAddress,\n digest: '0x0', // Special case for build has been failed,\n payload: '',\n sequenceNumber: nextSequenceNumber,\n creator: failedIntention.creator,\n isRejectTx: false,\n status: 'build-failed',\n };\n await this.model.historyTransaction.save(history);\n }\n\n private async getUser(address: string): Promise<User | null> {\n return this.model.user.findOneBy({ address });\n }\n\n private get model() {\n return this.db.coreModel;\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport 'reflect-metadata';\n\nimport { CoreModel, User, UserSetting } from '@msafe/sui3-model/core';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\n\nimport { DBConfig } from '@/globals/const';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport const WALLET_TYPE_KEY = 'wallet_type';\n\nexport class CoreDB {\n private constructor(public readonly coreModel: CoreModel) {}\n\n static async New(dbConfig: DBConfig) {\n const core = await CoreModel.New(dbConfig);\n return new CoreDB(core);\n }\n\n async upsertUser(input: { address: string; publicKey: PublicKey; lastLogin: Date }) {\n const currentUser = await this.coreModel.user.findOneBy({\n address: input.address,\n });\n if (currentUser !== null) {\n currentUser.lastLogin = input.lastLogin;\n await this.coreModel.user.save(currentUser);\n } else {\n const serializedPublicKey = PublicKeySerde.ser(input.publicKey);\n const user: User = {\n address: input.address,\n publicKey: serializedPublicKey.publicKey,\n schema: serializedPublicKey.scheme,\n nonce: 0,\n lastLogin: new Date(),\n };\n await this.coreModel.user.save(user);\n }\n }\n\n async updateUserWalletType(input: { address: string; walletType: string }) {\n const exist = await this.coreModel.userSetting.findOneBy({\n userAddress: input.address,\n key: WALLET_TYPE_KEY,\n });\n const walletType = input.walletType.trim();\n if (exist === null || exist.value !== walletType) {\n const userSetting: UserSetting = {\n userAddress: input.address,\n key: WALLET_TYPE_KEY,\n value: walletType,\n };\n await this.coreModel.userSetting.save(userSetting);\n }\n }\n}\n","import { ModelConfig } from '@msafe/sui3-model/common';\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 };\n backend: DBConfig;\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url?: string;\n };\n backend?: DBConfig;\n}\n\n// Use pseudo backend for now.\nexport type DBConfig = ModelConfig;\n\nexport const LOCAL_DATABASE_CONFIG: DBConfig = {\n type: 'mysql',\n host: '127.0.0.1',\n port: 3306,\n username: 'msafe',\n password: 'msafe',\n database: 'msafe_sui_local',\n logging: false,\n};\n\nexport const DEV_DATABASE_CONFIG: DBConfig = {\n type: 'mysql',\n host: 'msafe-dev-database.cluster-caos3ssocrx6.us-west-1.rds.amazonaws.com',\n port: 3306,\n username: 'msafe',\n password: 'Momentum.Safe2022',\n database: 'msafe_sui_dev',\n logging: false,\n};\n\nexport const TESTNET_RPC_URL = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const MAINNET_RPC_URL = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\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?.backend) {\n config.backend = options.backend;\n }\n return config;\n}\n\nexport const AUTH_SIGN_MESSAGE = 'Welcome to MSafe';\n","import { JWTToken } from '@/backend/types';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo } from '@/types/creation';\nimport { MSafeAccountInfo } from '@/types/msafe';\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 this.globals.wallet = input.wallet;\n const isValidJWT = input.jwtToken && (await this.backend.isJWTTokenValid(input.jwtToken));\n if (isValidJWT) {\n this.backend.setJWTToken(input.jwtToken as JWTToken);\n return input.jwtToken as JWTToken;\n }\n const messageStr = MessageHelper.welcomeMessage(new Date().toUTCString());\n const sig = await input.wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await input.wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: input.wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo(await this.walletAddress());\n }\n\n async createAccount(info: CreateMSafeAccountInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: MSafeAccountInfo) {\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 private async walletAddress() {\n return this.wallet.address();\n }\n}\n"],"mappings":"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","names":["import_utils","import_cryptography","coin","import_transactions","import_transactions","import_ed25519","import_multisig","import_reflect_metadata","MSafeEnv"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/transactions/coin-transfer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/utils/sui.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/utils/multi-sig.ts","../src/core/CreateHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/backend/PseudoBackend.ts","../src/backend/CoreDatabase.ts","../src/globals/const.ts","../src/core/MSafeClient.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './transactions';\nexport * from './types';\nexport * from './utils';\n","import { SuiClient } from '@mysten/sui.js/client';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Formatter } from '@/utils/format';\nimport { getAllCoins, SUI_COIN } from '@/utils/sui';\n\nexport interface IntentionCoinTransfer {\n txType: 'CoinTransfer';\n recipient: string;\n coinType: string;\n amount: string;\n}\n\nexport async function buildCoinTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionCoinTransfer;\n}) {\n if (Formatter.isSuiStructEqual(input.intention.coinType, SUI_COIN)) {\n return buildSuiCoinTransferTxb(input);\n }\n return buildOtherCoinTransferTxb(input);\n}\n\nfunction buildSuiCoinTransferTxb(input: { sender: string; intention: IntentionCoinTransfer }): TransactionBlock {\n const txb = new TransactionBlock();\n const [coin] = txb.splitCoins(txb.gas, [txb.pure(input.intention.amount)]);\n txb.transferObjects([coin], txb.pure(input.intention.recipient));\n txb.setSender(input.sender);\n return txb;\n}\n\nasync function buildOtherCoinTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionCoinTransfer;\n}) {\n const { suiClient, sender, intention } = input;\n\n const objs = await getAllCoins({\n suiClient,\n owner: sender,\n coinType: intention.coinType,\n });\n if (objs.length === 0) {\n throw new Error('No valid coin found to send');\n }\n const totalBal = objs.reduce((sum, coin) => sum + BigInt(coin.balance), 0n);\n if (totalBal < BigInt(intention.amount)) {\n throw new Error('Not enough balance');\n }\n const txb = new TransactionBlock();\n const primary = txb.object(objs[0].coinObjectId);\n if (objs.length > 1) {\n txb.mergeCoins(\n primary,\n objs.slice(1).map((obj) => txb.object(obj.coinObjectId)),\n );\n }\n const [coin] = txb.splitCoins(primary, [txb.pure(intention.amount)]);\n txb.transferObjects([coin], txb.pure(intention.recipient));\n txb.setSender(input.sender);\n return txb;\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","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 { 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 { PublicKeySerde } from '@/utils/crypto';\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 if (Formatter.isSuiAddressEqual(decoded.zkLogin.address, targetAddress)) {\n throw new Error('ZkLogin wallet cannot be owner');\n }\n return undefined;\n }\n\n case 'ED25519':\n case 'Secp256k1':\n case 'Secp256r1': {\n const pk = PublicKeySerde.de({ publicKey: decoded.publicKey, scheme: 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 {\n PublicKey,\n SerializedSignature,\n SIGNATURE_FLAG_TO_SCHEME,\n SignatureFlag,\n SignatureScheme,\n} from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { Secp256k1PublicKey } from '@mysten/sui.js/keypairs/secp256k1';\nimport { Secp256r1PublicKey } from '@mysten/sui.js/keypairs/secp256r1';\nimport { 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\nexport class PublicKeySerde {\n static ser(publicKey: PublicKey) {\n return {\n publicKey: publicKey.toBase64(),\n scheme: SIGNATURE_FLAG_TO_SCHEME[publicKey.flag() as SignatureFlag],\n };\n }\n\n static de(input: { publicKey: string | Uint8Array; scheme: SignatureScheme }): PublicKey {\n switch (input.scheme) {\n case 'ED25519':\n return new Ed25519PublicKey(input.publicKey);\n case 'Secp256k1':\n return new Secp256k1PublicKey(input.publicKey);\n case 'Secp256r1':\n return new Secp256r1PublicKey(input.publicKey);\n default:\n throw new Error('Unsupported signature scheme: $input.scheme');\n }\n }\n}\n","export 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 { SuiClient } from '@mysten/sui.js/client';\nimport type { SuiObjectResponse } from '@mysten/sui.js/src/client/types';\nimport { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { Formatter } from '@/utils/format';\n\nexport interface IntentionObjectTransfer {\n txType: 'ObjectTransfer';\n receiver: string;\n objectId: string;\n objectType: string;\n}\n\nexport async function buildObjectTransferTxb(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionObjectTransfer;\n}) {\n await validateObjectTransfer(input);\n\n const txb = new TransactionBlock();\n txb.transferObjects([txb.object(input.intention.objectId)], txb.pure(input.intention.receiver));\n txb.setSender(input.sender);\n\n return txb;\n}\n\nasync function validateObjectTransfer(input: {\n suiClient: SuiClient;\n sender: string;\n intention: IntentionObjectTransfer;\n}) {\n const { suiClient, sender, intention } = input;\n const obj = await suiClient.getObject({\n id: intention.objectId,\n });\n\n if (obj.data === undefined) {\n throw new Error('Object not found');\n }\n if (!obj.data?.type) {\n throw new Error('Object type is null');\n }\n if (!Formatter.isSuiStructEqual(obj.data.type, intention.objectType)) {\n throw new Error('Object type not expected');\n }\n if (Formatter.isCoinObjectType(obj.data.type)) {\n throw new Error('Can not transfer coin object in Object Transfer transactions');\n }\n const addressOwner = getAddressOwner(obj);\n if (!Formatter.isSuiAddressEqual(addressOwner, sender)) {\n throw new Error('Object owner not match');\n }\n}\n\nfunction getAddressOwner(object: SuiObjectResponse) {\n const owner = object.data?.owner;\n if (!owner) {\n throw new Error('Object Owner not found');\n }\n\n if (typeof owner !== 'object' || !('AddressOwner' in owner)) {\n throw new Error('Invalid object owner');\n }\n return owner.AddressOwner;\n}\n","import { TransactionBlock } from '@mysten/sui.js/transactions';\n\nimport { HexToUint8Array } from '@/utils/buffer';\n\nexport async function buildRejectTxb(input: { sender: string; payloadToReject: string }) {\n const approveTxb = TransactionBlock.from(HexToUint8Array(input.payloadToReject) as Uint8Array);\n const gasPayment = approveTxb.blockData.gasConfig.payment;\n if (!gasPayment) {\n throw new Error('No gas payment found for approve payload');\n }\n // Reject transaction is an empty transaction block with the same gas payment as the\n // transaction to be rejected.\n const txb = new TransactionBlock();\n txb.setGasPayment(gasPayment);\n txb.setSender(input.sender);\n return txb;\n}\n","import { SuiClient } from '@mysten/sui.js/client';\n\nimport { buildCoinTransferTxb, IntentionCoinTransfer } from '@/transactions/coin-transfer';\nimport { buildObjectTransferTxb, IntentionObjectTransfer } from '@/transactions/object-transfer';\nimport { buildRejectTxb } from '@/transactions/reject';\n\nexport type TxIntention = IntentionObjectTransfer | IntentionCoinTransfer;\n\n// TODO: Refactor later\nexport class IntentionHelper {\n static ser(intention: TxIntention) {\n return JSON.stringify(intention);\n }\n\n static de(val: string): TxIntention {\n const intention = JSON.parse(val);\n if (typeof intention !== 'object' || !('txType' in intention)) {\n throw new Error(`Failed to deserialize intention: ${val}`);\n }\n return JSON.parse(val);\n }\n\n // TODO: Add gas option here.\n static buildTxb(input: { suiClient: SuiClient; intention: TxIntention; sender: string }) {\n switch (input.intention.txType) {\n case 'CoinTransfer':\n return buildCoinTransferTxb({\n suiClient: input.suiClient,\n sender: input.sender,\n intention: input.intention as IntentionCoinTransfer,\n });\n case 'ObjectTransfer':\n return buildObjectTransferTxb({\n suiClient: input.suiClient,\n sender: input.sender,\n intention: input.intention as IntentionObjectTransfer,\n });\n default:\n throw new Error(`Unknown tx type: ${input.intention}`);\n }\n }\n\n static getTxType(intention: TxIntention) {\n switch (intention.txType) {\n case 'CoinTransfer':\n return {\n txType: 'CoinTransfer',\n txSubType: 'CoinTransfer',\n };\n case 'ObjectTransfer':\n return {\n txType: 'ObjectTransfer',\n txSubType: 'ObjectTransfer',\n };\n default:\n throw new Error('Unknown intention type');\n }\n }\n\n static buildRejectTransaction(input: { msafeAddress: string; payloadToReject: string }) {\n return buildRejectTxb({ sender: input.msafeAddress, payloadToReject: input.payloadToReject });\n }\n}\n","import { IntentionHelper, TxIntention } from '@/transactions/intention';\n\nexport class MessageHelper {\n // Message used for MSafe creation\n static createMSafeMessage(msafeAddress: string): string {\n return `Create MSafe Account: ${msafeAddress}`;\n }\n\n static deCreateMSafeMessage(msg: string) {\n const regex = /Create MSafe Account: (.+)/;\n const matches = msg.match(regex);\n return matches ? matches[1] : undefined;\n }\n\n // Message to be used when user login. The timestamp string\n // is used to for extra validation.\n static welcomeMessage(timestamp: string): string {\n return `Welcome to MSafe. ${timestamp}`;\n }\n\n static deWelcomeMessage(msg: string): string | undefined {\n const regex = /Welcome to MSafe. (.+)/;\n const matches = msg.match(regex);\n return matches ? matches[1] : undefined;\n }\n\n static proposeIntentionMessage(data: ProposeIntentionData) {\n const { intention, sn } = data;\n const intentionData = IntentionHelper.ser(intention);\n const msg: ProposeIntentionMessage = {\n intentionData,\n sequenceNumber: sn,\n };\n return JSON.stringify(msg);\n }\n\n static deProposeIntentionMessage(s: string): ProposeIntentionData {\n const de = JSON.parse(s);\n if (\n !('intentionData' in de) ||\n typeof de.intentionData !== 'string' ||\n !('sequenceNumber' in de) ||\n typeof de.sequenceNumber !== 'number'\n ) {\n throw new Error('Invalid intention data');\n }\n const { sequenceNumber, intentionData } = de;\n return {\n sn: sequenceNumber,\n intention: IntentionHelper.de(intentionData),\n };\n }\n}\n\nexport interface ProposeIntentionData {\n intention: TxIntention;\n sn: number;\n}\n\nexport interface ProposeIntentionMessage {\n intentionData: string;\n sequenceNumber: number;\n}\n","import { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui.js/keypairs/ed25519';\nimport { MultiSigPublicKey } from '@mysten/sui.js/multisig';\n\nimport { MSafeAccountInfo } from '@/types/msafe';\nimport { stringToBuffer } from '@/utils/buffer';\n\nexport interface PublicKeyWithWeight {\n publicKey: PublicKey;\n weight: number;\n}\n\nexport interface MultiSigConfig {\n threshold: number;\n ownerWithWeight: PublicKeyWithWeight[];\n creationNonce: number | undefined;\n}\n\nexport const NONCE_PK_PREFIX = 'maven';\nexport const NONCE_PREFIX_MAX_SIZE = 16;\nexport const NONCE_PK_WEIGHT = 1;\n\nexport const MAX_WEIGHT = 255;\nexport const MIN_WEIGHT = 1;\nexport const MAX_OWNER_WITH_NONCE = 9;\nexport const MAX_OWNER_WITHOUT_NONCE = 10;\nexport const MIN_THRESHOLD = 1;\n\nexport class RawMultiSig {\n rawMsPK: MultiSigPublicKey;\n\n constructor(public readonly config: MultiSigConfig) {\n this.rawMsPK = getMultiSigPublicKey(config);\n }\n\n static fromMSafeAccountInfo(info: MSafeAccountInfo) {\n const parsed: MultiSigConfig = {\n threshold: info.threshold,\n ownerWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n };\n return new RawMultiSig(parsed);\n }\n\n get suiAddress(): string {\n return this.rawMsPK.toSuiAddress();\n }\n\n get publicKeys(): PublicKeyWithWeight[] {\n return this.rawMsPK.getPublicKeys();\n }\n\n get threshold(): number {\n return this.config.threshold;\n }\n\n combinePartialSignatures(signatures: SerializedSignature[]): SerializedSignature {\n return this.rawMsPK.combinePartialSignatures(signatures);\n }\n\n async verifyPersonalMessage(messageStr: string, multiSigSignature: SerializedSignature): Promise<boolean> {\n const message = stringToBuffer(messageStr);\n return this.rawMsPK.verifyPersonalMessage(message, multiSigSignature);\n }\n}\n\nexport function getMultiSigPublicKey(config: MultiSigConfig) {\n const { ownerWithWeight, threshold, creationNonce } = config;\n const pks = ownerWithWeight.map((pk) => ({\n publicKey: pk.publicKey,\n weight: pk.weight,\n }));\n if (creationNonce !== undefined) {\n pks.push({\n publicKey: makeNoncePublicKey(creationNonce),\n weight: NONCE_PK_WEIGHT,\n });\n }\n return MultiSigPublicKey.fromPublicKeys({ threshold, publicKeys: pks });\n}\n\nexport function makeNoncePublicKey(nonce: number) {\n const buffer = new ArrayBuffer(Ed25519PublicKey.SIZE);\n const textEncoder = new TextEncoder();\n textEncoder.encodeInto(NONCE_PK_PREFIX, new Uint8Array(buffer, 0, NONCE_PREFIX_MAX_SIZE));\n const nonceView = new DataView(buffer, NONCE_PREFIX_MAX_SIZE, 4);\n nonceView.setUint32(0, nonce, true);\n return new Ed25519PublicKey(new Uint8Array(buffer));\n}\n\nexport function validateMultiSigConfig(config: MultiSigConfig) {\n config.ownerWithWeight.forEach((pk) => {\n const { weight } = pk;\n if (weight < MIN_WEIGHT || weight > MAX_WEIGHT) {\n throw new Error(`Invalid multi-sig weight: ${weight} (1-${MAX_WEIGHT})`);\n }\n });\n const totalWeight = config.ownerWithWeight.reduce((s, pk) => s + pk.weight, 0);\n if (config.threshold > totalWeight) {\n throw new Error('Threshold is larger than total weight');\n }\n if (config.threshold < MIN_THRESHOLD) {\n throw new Error('Threshold is smaller than 1');\n }\n const maxOwner = config.creationNonce === undefined ? MAX_OWNER_WITHOUT_NONCE : MAX_OWNER_WITH_NONCE;\n if (config.ownerWithWeight.length > maxOwner) {\n throw new Error('Owner number bigger than upper cap');\n }\n const addressSet = new Set(config.ownerWithWeight.map((pk) => pk.publicKey.toSuiAddress()));\n if (addressSet.size !== config.ownerWithWeight.length) {\n throw new Error('Duplicate address detected');\n }\n}\n","import { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { MultiSigConfig, RawMultiSig, validateMultiSigConfig } from '@/utils/multi-sig';\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: CreatePermissionInfo) {\n const msConfig = await this.reduceCreationInfoToRawConfig(info);\n const ms = new RawMultiSig(msConfig);\n return ms.suiAddress;\n }\n\n // Validate the create info and return the msafe address.\n async validateCreateInfo(createInfo: CreateMSafeAccountInfo) {\n const rawConfig = await this.reduceCreationInfoToRawConfig(createInfo);\n validateMultiSigConfig(rawConfig);\n\n // Calculate the sui address will check the multi-sig\n return this.calculateMSafeAddress(createInfo);\n }\n\n async submitMSafeCreation(creationInfo: CreateMSafeAccountInfo) {\n const msafeAddress = await this.validateCreateInfo(creationInfo);\n\n const signingMessage = MessageHelper.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: CreatePermissionInfo): Promise<MultiSigConfig> {\n const publicKeys = await this.getPublicKeyBatch(info.ownerWithWeight.map((oww) => oww.address));\n publicKeys.forEach((pk, i) => {\n if (pk === undefined) {\n throw new Error(`Unknown public key for address: ${info.ownerWithWeight[i].address}`);\n }\n });\n return {\n threshold: info.threshold,\n ownerWithWeight: info.ownerWithWeight.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: CreateMSafeAccountInfo, signature: SerializedSignature) {\n const pks = await this.pkHelper.getPublicKeyBatch(createInfo.ownerWithWeight.map((owner) => owner.address));\n await this.globals.backend.createMSafeAccount({\n ownerWithWeight: createInfo.ownerWithWeight.map((owner, i) => ({\n address: owner.address,\n weight: owner.weight,\n publicKey: pks[i] as PublicKey, // PublicKey has been verified.\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 { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { MSafeAccountInfo, PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { RawMultiSig } from '@/utils/multi-sig';\n\nexport class MSafeAccount {\n public rawMultiSig: RawMultiSig;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.rawMultiSig = RawMultiSig.fromMSafeAccountInfo(info);\n }\n\n static async new(globals: MSafeGlobals, address: string) {\n const info = await globals.backend.getMSafeAccountInfo(address);\n return new MSafeAccount(globals, info);\n }\n\n async pendingTransactions() {\n return this.backend.getPendingTransactions(this.address);\n }\n\n async historyTransaction() {\n return this.backend.getHistoryTransactions(this.address);\n }\n\n async futureIntentions() {\n return this.backend.getFutureIntentions(this.address);\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 proposeIntention(intention: TxIntention, sequenceNumber: number) {\n const message = MessageHelper.proposeIntentionMessage({ intention, sn: sequenceNumber });\n const signature = await this.wallet.signPersonalMessage({\n messageStr: message,\n });\n await this.backend.proposeIntention({\n intention,\n sequenceNumber,\n msafeAddress: this.address,\n userAddress: await this.userAddress(),\n signature: signature.signature,\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 userAddress: await this.userAddress(),\n txDigest: digest,\n signature: signature.signature,\n });\n }\n\n // Shortcut for proposing a transaction to be a pending transaction, and add user vote to it.\n // Requires the multi-sig to be empty in pending transaction.\n async proposePendingTransaction(intention: TxIntention) {\n const txb = await IntentionHelper.buildTxb({\n suiClient: this.suiClient,\n intention,\n sender: this.address,\n });\n const payload = await txb.build({ client: this.suiClient });\n const digest = await txb.getDigest({ client: this.suiClient });\n const signature = await this.wallet.signTransactionBlock({ transactionBlock: payload });\n return this.backend.proposePendingTransaction({\n msafeAddress: this.address,\n userAddress: await this.userAddress(),\n intention,\n digest,\n signature: signature.signature,\n });\n }\n\n async rejectCurrentTx(pending?: PendingTx) {\n let payloadToReject: string;\n if (pending) {\n if (pending.isRejectTx) {\n throw new Error('Pending not reject transaction');\n }\n payloadToReject = pending.payload;\n } else {\n const pendings = await this.pendingTransactions();\n if (pendings.length !== 1 || pendings[0].isRejectTx) {\n throw new Error('Already rejected');\n }\n payloadToReject = pendings[0].payload;\n }\n const rejectTxb = await IntentionHelper.buildRejectTransaction({\n msafeAddress: this.address,\n payloadToReject,\n });\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 userAddress: await this.userAddress(),\n digest,\n signature: signature.signature,\n });\n }\n\n async buildNextIntentionAndAddToPending() {\n return this.backend.buildNextIntentionAndAddToPending({ msafeAddress: this.address });\n }\n\n async skipNextFailedIntention() {\n return this.backend.skipNextFailedIntention({ msafeAddress: this.address, userAddress: await this.userAddress() });\n }\n\n async executePendingTx(pending: PendingTx) {\n if (pending.votes.length < this.info.threshold) {\n throw new Error('Not enough signatures');\n }\n const sigs: SerializedSignature[] = [];\n const gotSigs = new Map(pending.votes.map((vote) => [vote.userAddress, vote.signature]));\n for (let i = 0; i < this.info.ownersWithWeightPK.length; i++) {\n const owner = this.info.ownersWithWeightPK[i];\n const signature = gotSigs.get(owner.publicKey.toSuiAddress());\n if (signature) {\n sigs.push(signature);\n }\n }\n const multiSignature = this.rawMultiSig.combinePartialSignatures(sigs);\n return this.suiClient.executeTransactionBlock({\n transactionBlock: HexToUint8Array(pending.payload),\n signature: multiSignature,\n options: { showEffects: true },\n });\n }\n\n get address() {\n return this.info.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 { PublicKey } from '@mysten/sui.js/src/cryptography';\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 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 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 { SuiClient } from '@mysten/sui.js/client';\n\nimport { IBackend } from '@/backend/interface';\nimport { PseudoBackend } from '@/backend/PseudoBackend';\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(config.suiClient);\n const backend = await PseudoBackend.New(config.backend, suiClient);\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 'reflect-metadata';\nimport {\n User,\n UserMSafe,\n HistoryTransaction,\n MSafe,\n TransactionIntention,\n UserVote,\n PendingTransaction,\n} from '@msafe/sui3-model/core';\nimport { SuiClient } from '@mysten/sui.js/client';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { SignatureScheme } from '@mysten/sui.js/src/cryptography/signature-scheme';\nimport { MoreThanOrEqual } from 'typeorm';\n\nimport { CoreDB } from '@/backend/CoreDatabase';\nimport { IBackend } from '@/backend/interface';\nimport { CreateMSafeParams, JWTToken, UserWithOwnedMSafe } from '@/backend/types';\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { DBConfig } from '@/globals/const';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { FutureIntention, HistorySendTx, MSafeAccountInfo, PendingTx } from '@/types/msafe';\nimport { Uint8ArrayToHex, HexToUint8Array } from '@/utils/buffer';\nimport { PublicKeySerde, SignatureVerifier } from '@/utils/crypto';\nimport { Formatter } from '@/utils/format';\nimport { RawMultiSig } from '@/utils/multi-sig';\n\n/**\n * Represents a PseudoBackend class that implements the IBackend interface.\n * This class is responsible for interacting with a database and performing various operations.\n * Notice: For backend production code, all DB errors need to be handled correctly\n * TODO: Use QueryRunner to make all db operations atomic.\n * TODO: Permission validation for each request.\n * TODO: More input validation and normalization.\n */\nexport class PseudoBackend implements IBackend {\n private _token: JWTToken;\n\n private constructor(\n public readonly db: CoreDB,\n private readonly _suiClient: SuiClient,\n ) {}\n\n static async New(dbConfig: DBConfig, suiClient: SuiClient) {\n const db = await CoreDB.New(dbConfig);\n return new PseudoBackend(db, suiClient);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars,unused-imports/no-unused-vars\n async isJWTTokenValid(_jwt: JWTToken): Promise<boolean> {\n return true;\n }\n\n async authSign(input: {\n address: string;\n message: string;\n signature: SerializedSignature;\n walletType: string;\n }): Promise<JWTToken> {\n const timestamp = MessageHelper.deWelcomeMessage(input.message);\n if (!timestamp) {\n throw new Error('Invalid welcome message');\n }\n // Check if the signing message has expired\n const date = Date.parse(timestamp);\n if (new Date().getTime() - date < 0) {\n throw new Error('Invalid timestamp');\n }\n if (new Date().getTime() - date > 10 * 1000) {\n throw new Error('Signing message expired');\n }\n\n const publicKey = await SignatureVerifier.getPublicKeyFromPersonalSignature({\n messageStr: input.message,\n signature: input.signature,\n });\n if (!Formatter.isSuiAddressEqual(input.address, publicKey.toSuiAddress())) {\n throw new Error('Invalid signature');\n }\n // Add user data to database\n await this.db.upsertUser({\n address: input.address,\n publicKey,\n lastLogin: new Date(),\n });\n\n // Add wallet type\n await this.db.updateUserWalletType({\n address: input.address,\n walletType: input.walletType,\n });\n\n this._token = '';\n return this._token;\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string) {\n const user = await this.model.user.findOneBy({\n address,\n });\n if (user === null) {\n return undefined;\n }\n return PublicKeySerde.de({\n publicKey: user.publicKey,\n scheme: user.schema as SignatureScheme,\n });\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res: (PublicKey | undefined)[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const user = await this.getUser(address);\n res.push(\n user\n ? PublicKeySerde.de({\n publicKey: user.publicKey,\n scheme: user.schema as SignatureScheme,\n })\n : undefined,\n );\n }\n return res;\n }\n\n async createMSafeAccount(input: CreateMSafeParams) {\n const ms = new RawMultiSig(input);\n const msafeAddr = ms.suiAddress;\n\n const signingMsg = MessageHelper.createMSafeMessage(msafeAddr);\n const targetAddr = input.ownerWithWeight[0].address;\n const verifyResult = await SignatureVerifier.verifyPersonalSignature({\n messageStr: signingMsg,\n signature: input.signature,\n targetAddress: targetAddr,\n });\n if (!verifyResult) {\n throw new Error('Signature verification failed');\n }\n // TODO: In production, we will also need to verify whether the\n // JWT token align with the creator (targetAddr)\n // Check and verify the creation message.\n if (input.name.length > 128) {\n throw new Error('Name too long');\n }\n if (input.description && input.description.length > 512) {\n throw new Error('Description too long');\n }\n const creatorAddress = input.ownerWithWeight[0].address;\n const creator = await this.getUser(creatorAddress);\n if (creator === null) {\n throw new Error('Creator not found');\n }\n if (creator.nonce !== input.creationNonce) {\n throw new Error('Nonce not match');\n }\n const msafeExistCheck = await this.model.msafe.findOneBy({\n address: msafeAddr,\n });\n if (msafeExistCheck !== null) {\n throw new Error('MSafe already exist in database');\n }\n input.ownerWithWeight.forEach((ownerInfo) => {\n if (!Formatter.isSuiAddressEqual(ownerInfo.address, ownerInfo.publicKey.toSuiAddress())) {\n throw new Error('Sui address public key not match');\n }\n });\n\n // For each manager, add user info if not exist. Add userMSafe entry.\n for (let i = 0; i !== input.ownerWithWeight.length; i++) {\n const ownerInfo = input.ownerWithWeight[i];\n // Creator has been verified and already exist in database\n if (i !== 0) {\n const coManager = await this.getUser(ownerInfo.address);\n const serPK = PublicKeySerde.ser(ownerInfo.publicKey);\n // Add user with public key if not exist\n if (coManager === null) {\n const user: User = {\n address: ownerInfo.address,\n publicKey: serPK.publicKey,\n schema: serPK.scheme,\n nonce: 0,\n lastLogin: new Date(),\n };\n await this.model.user.save(user);\n }\n }\n\n // Add userMSafe record\n const userMSafe: UserMSafe = {\n userAddress: ownerInfo.address,\n msafeAddress: msafeAddr,\n index: i,\n weight: ownerInfo.weight,\n status: i === 0 ? 'active' : 'pending',\n };\n await this.model.userMSafe.save(userMSafe);\n }\n\n // Increment the creator nonce\n const creationNonce = creator.nonce;\n creator.nonce++;\n await this.model.user.save(creator);\n\n // Add MSafe record\n const msafe: MSafe = {\n address: msafeAddr,\n creationNonce,\n creator: creatorAddress,\n name: input.name,\n description: input.description,\n threshold: input.threshold,\n };\n await this.model.msafe.save(msafe);\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n // TODO: In production, we need verify whether the msafe\n // account belongs to the single signer from JWT token.\n\n const msafe = await this.model.msafe.findOneBy({ address: msafeAddress });\n if (msafe === null) {\n throw new Error('MSafe not found');\n }\n const userMSafes = await this.model.userMSafe.find({\n where: {\n msafeAddress,\n },\n order: {\n index: 'asc',\n },\n });\n if (userMSafes.length === 0) {\n throw new Error('MSafe does not have user info.');\n }\n const users = await Promise.all(userMSafes.map((um) => this.getUser(um.userAddress)));\n users.forEach((user) => {\n if (user === null) {\n throw new Error('User not found');\n }\n });\n const ownersWithWeightPK = userMSafes.map((userMSafe, i) => ({\n address: userMSafe.userAddress,\n weight: userMSafe.weight,\n publicKey: PublicKeySerde.de({ publicKey: users[i]!.publicKey, scheme: users[i]!.schema as SignatureScheme }),\n }));\n return {\n address: msafeAddress,\n ownersWithWeightPK,\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n // TODO: Do permission check on user JWT token.\n const user = await this.getUser(userAddress);\n if (user === null) {\n throw new Error('404: user not found');\n }\n // TODO: Add invitation status as well.\n const msafeAccounts = await this.model.userMSafe.findBy({ userAddress });\n const ownedMSafe = await Promise.all(\n msafeAccounts.map(async (msafeAccount) => this.getMSafeAccountInfo(msafeAccount.msafeAddress)),\n );\n return {\n address: userAddress,\n publicKey: user.publicKey,\n schema: user.schema,\n creationNonce: user.nonce,\n ownedMSafe,\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const pendings = await this.db.coreModel.pendingTransaction.findBy({\n msafeAddress,\n });\n if (pendings.length === 0) {\n return [];\n }\n const votes = await Promise.all(\n pendings.map((pending) => this.db.coreModel.userVote.findBy({ txDigest: pending.digest, isValid: true })),\n );\n const intention = await this.model.transactionIntention.findOneBy({\n msafeAddress,\n sequenceNumber: pendings[0].sequenceNumber,\n });\n if (intention === null) {\n throw new Error('Intention not found');\n }\n const intent = IntentionHelper.de(intention.data);\n return pendings.map((pending, i) => ({\n digest: pending.digest,\n payload: pending.payload,\n msafeAddress: pending.msafeAddress,\n isRejectTx: pending.isRejectTx,\n creator: pending.creator,\n createdAt: pending.createdAt as Date,\n votes: votes[i].map((vote) => ({\n userAddress: vote.userAddress,\n signature: vote.signature,\n timestamp: vote.updatedAt as Date,\n })),\n sequenceNumber: pending.sequenceNumber,\n intention: pending.isRejectTx ? undefined : intent,\n }));\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n // TODO: validate user permission\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n return maxSNHistory === null ? 0 : maxSNHistory.sequenceNumber + 1;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n // TODO: validate user permission\n const maxSNIntention = await this.model.transactionIntention.findOne({\n where: { msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n return maxSNIntention === null ? 0 : maxSNIntention.sequenceNumber + 1;\n }\n\n async getHistoryTransactions(msafeAddress: string): Promise<HistorySendTx[]> {\n // TODO: Add pagination options. Filter by sequence number based\n // on pagination options.\n // Notice there can be multiple transactions with the same sequence\n // number.\n // TODO: Add permission validation\n const transactions = await this.db.coreModel.historyTransaction.find({\n where: {\n msafeAddress,\n },\n order: { sequenceNumber: 'desc' },\n });\n const votes = await Promise.all(\n transactions.map((tx) =>\n this.db.coreModel.userVote.findBy({\n txDigest: tx.digest,\n isValid: true,\n }),\n ),\n );\n return transactions.map((tx, i) => ({\n digest: tx.digest,\n payload: tx.payload,\n msafeAddress: tx.msafeAddress,\n isRejectTx: tx.isRejectTx,\n status: tx.status,\n creator: tx.creator,\n createdAt: tx.createdAt as Date,\n sequenceNumber: tx.sequenceNumber,\n votes: votes[i].map((vote) => ({\n userAddress: vote.userAddress,\n timestamp: vote.updatedAt as Date,\n })),\n }));\n }\n\n async getFutureIntentions(msafeAddress: string): Promise<FutureIntention[]> {\n // TODO: Add pagination options, add user permission validation\n const currentSequenceNumber = await this.getCurrentSequenceNumber(msafeAddress);\n const hasPending = (await this.model.pendingTransaction.findOneBy({ msafeAddress })) !== null;\n const futureSNStart = hasPending ? currentSequenceNumber + 1 : currentSequenceNumber;\n\n const futureTxs = await this.model.transactionIntention.find({\n where: { msafeAddress, sequenceNumber: MoreThanOrEqual(futureSNStart) },\n order: { sequenceNumber: 'asc' },\n });\n return futureTxs.map((tx) => ({\n intention: IntentionHelper.de(tx.data),\n msafeAddress: tx.msafeAddress,\n sequenceNumber: tx.sequenceNumber,\n rawData: tx.data,\n txType: tx.txType,\n txSubType: tx.txSubType,\n processed: tx.processed,\n status: tx.status,\n statusRemark: tx.statusRemark,\n creator: tx.creator,\n createdAt: tx.createdAt as Date,\n }));\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }) {\n // Validation:\n // 1. Whether the current wallet have permission\n // 2. Verify signature\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (!userMSafe) {\n throw new Error('User does not have permission to propose intention');\n }\n const verified = await SignatureVerifier.verifyPersonalSignature({\n messageStr: MessageHelper.proposeIntentionMessage({ intention: input.intention, sn: input.sequenceNumber }),\n signature: input.signature,\n targetAddress: input.userAddress,\n });\n if (!verified) {\n throw new Error('Invalid signature');\n }\n\n const sequenceNumber = await this.model.transactionIntention.count({\n where: {\n msafeAddress: input.msafeAddress,\n },\n });\n if (sequenceNumber !== input.sequenceNumber) {\n throw new Error('Sequence number not expected');\n }\n const intention: TransactionIntention = {\n msafeAddress: input.msafeAddress,\n sequenceNumber,\n processed: false,\n ...IntentionHelper.getTxType(input.intention),\n data: IntentionHelper.ser(input.intention),\n status: 'NEW',\n creator: input.userAddress,\n };\n await this.model.transactionIntention.save(intention);\n }\n\n // Propose a pending transaction. Require the msafe account\n // Does not have any pending transactions.\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (userMSafe === null) {\n throw new Error('Unauthorized');\n }\n\n const msafePendings = await this.model.pendingTransaction.findBy({\n msafeAddress: input.msafeAddress,\n });\n if (msafePendings.length !== 0) {\n throw new Error('Still have pending transaction');\n }\n\n const txb = await IntentionHelper.buildTxb({\n suiClient: this._suiClient,\n intention: input.intention,\n sender: input.msafeAddress,\n });\n const payload = await txb.build({ client: this._suiClient });\n const txDigest = await txb.getDigest({ client: this._suiClient });\n if (txDigest !== input.digest) {\n throw new Error('Transaction digest un-match');\n }\n\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Failed to verify signature');\n }\n\n // Write intention\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const sequenceNumber = maxSNHistory === null ? 0 : maxSNHistory.sequenceNumber + 1;\n const intention: TransactionIntention = {\n msafeAddress: input.msafeAddress,\n sequenceNumber,\n processed: false,\n ...IntentionHelper.getTxType(input.intention),\n data: IntentionHelper.ser(input.intention),\n status: 'SUCCESS',\n creator: input.userAddress,\n };\n await this.model.transactionIntention.save(intention);\n\n // Write pending transaction\n const pendingTx: PendingTransaction = {\n digest: txDigest,\n msafeAddress: input.msafeAddress,\n payload: Uint8ArrayToHex(payload),\n sequenceNumber,\n isRejectTx: false,\n creator: input.userAddress,\n };\n await this.model.pendingTransaction.save(pendingTx);\n\n // Write user vote\n const userVote: UserVote = {\n userAddress: input.userAddress,\n txDigest,\n msafeAddress: input.msafeAddress,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(userVote);\n }\n\n // Calls for the first reject transaction\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n });\n if (userMSafe === null) {\n throw new Error('User does not have permission to MSafe');\n }\n\n const currentPending = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n isRejectTx: false,\n });\n if (currentPending === null) {\n throw new Error('No active pending transaction');\n }\n\n const txb = await IntentionHelper.buildRejectTransaction({\n msafeAddress: input.msafeAddress,\n payloadToReject: currentPending.payload,\n });\n const payload = await txb.build({ client: this._suiClient });\n const digest = await txb.getDigest({ client: this._suiClient });\n if (input.digest !== digest) {\n throw new Error('Digest not match');\n }\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Signature unverified');\n }\n\n const existPendingReject = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n isRejectTx: true,\n });\n if (existPendingReject !== null) {\n await this.voteForTransaction({\n txDigest: existPendingReject.digest,\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n signature: input.signature,\n });\n return;\n }\n\n const rejectPayloadStr = Uint8ArrayToHex(payload);\n const rejectDigest = await txb.getDigest({ client: this._suiClient });\n const rejectPending: PendingTransaction = {\n msafeAddress: input.msafeAddress,\n digest: rejectDigest,\n payload: rejectPayloadStr,\n sequenceNumber: currentPending.sequenceNumber,\n isRejectTx: true,\n creator: input.userAddress,\n };\n await this.model.pendingTransaction.save(rejectPending);\n\n // Vote for the transaction\n const rejectVote: UserVote = {\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n txDigest: rejectDigest,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(rejectVote);\n\n // If user has previously voted in the other way, revoke the vote\n const existVote = await this.model.userVote.findOneBy({\n txDigest: currentPending.digest,\n userAddress: input.userAddress,\n });\n if (existVote !== null) {\n await this.model.userVote.update(\n { userAddress: input.userAddress, txDigest: currentPending.digest },\n { isValid: false },\n );\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const pendingTx = await this.model.pendingTransaction.findOneBy({ digest: input.txDigest });\n if (!pendingTx) {\n throw new Error(`Pending transaction not found: ${input.txDigest}`);\n }\n if (pendingTx.msafeAddress !== input.msafeAddress) {\n throw new Error('MSafe address not match');\n }\n\n // Ensure user owns the msafe address\n const userMSafe = await this.model.userMSafe.findOneBy({\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n });\n if (userMSafe === null) {\n throw new Error(`User (${input.userAddress}) does not have permission on MSafe account (${input.msafeAddress})`);\n }\n\n // Verify the signature\n const payload = HexToUint8Array(pendingTx.payload);\n const verified = await SignatureVerifier.verifyTransactionSignature({\n payload,\n targetAddress: input.userAddress,\n signature: input.signature,\n });\n if (!verified) {\n throw new Error('Invalid signature');\n }\n\n // If user has other vote on the reject transaction, Add the user vote.\n const rejectPendingTx = await this.model.pendingTransaction.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: pendingTx.sequenceNumber,\n isRejectTx: !pendingTx.isRejectTx,\n });\n if (rejectPendingTx !== null) {\n await this.model.userVote.update(\n {\n userAddress: input.userAddress,\n txDigest: rejectPendingTx.digest,\n isValid: true,\n },\n { isValid: false },\n );\n }\n const existVote = await this.model.userVote.exist({\n where: {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n },\n });\n if (!existVote) {\n const userVote: UserVote = {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n msafeAddress: input.msafeAddress,\n signature: input.signature,\n isValid: true,\n };\n await this.model.userVote.save(userVote);\n } else {\n await this.model.userVote.update(\n {\n txDigest: input.txDigest,\n userAddress: input.userAddress,\n },\n { isValid: true },\n );\n }\n }\n\n // Mock the process of an executed transaction\n // Here only the essential logic of transaction processing logic\n // is implemented. Need more transaction parsing from the fetcher\n // module.\n //\n // TODO: User queryRunner to make the transaction atomic.\n async processExecutedTransaction(digest: string) {\n // TODO: Process the transaction result from blockchain.\n const historyTx = await this.model.historyTransaction.findOneBy({ digest });\n if (historyTx) {\n // Already processed, directly return\n return;\n }\n const pendingTx = await this.model.pendingTransaction.findOneBy({ digest });\n if (!pendingTx) {\n throw new Error('Transaction digest not found');\n }\n // Mark the intention as processed.\n await this.model.transactionIntention.update(\n { msafeAddress: pendingTx.msafeAddress, sequenceNumber: pendingTx.sequenceNumber },\n { processed: true },\n );\n // Delete the current pending transaction.\n // There can be multiple transactions. mark one as executed, other as rejected\n const pendings = await this.model.pendingTransaction.findBy({\n msafeAddress: pendingTx.msafeAddress,\n sequenceNumber: pendingTx.sequenceNumber,\n });\n if (pendings.length === 0) {\n throw new Error('Pending transaction not found');\n }\n // Add to transaction history and delete the pending transaction.\n const executionResult: 'success' | 'failed' = 'success';\n for (let i = 0; i !== pendings.length; i++) {\n const pending = pendings[i];\n const history: HistoryTransaction = {\n digest: pending.digest,\n payload: pending.payload,\n msafeAddress: pending.msafeAddress,\n sequenceNumber: pending.sequenceNumber,\n isRejectTx: pending.isRejectTx,\n creator: pending.creator,\n createdAt: pending.createdAt as Date,\n // TODO: Fill in this field based on transaction processing result\n status: pending.digest === digest ? executionResult : 'rejected',\n };\n await this.model.historyTransaction.save(history);\n await this.model.pendingTransaction.delete({ digest: pending.digest });\n }\n }\n\n /**\n * Build the next transaction intention, and add the built transaction to pendings.\n * @param input\n */\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const maxSNHistory = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const nextSequenceNumber = maxSNHistory ? maxSNHistory.sequenceNumber + 1 : 0;\n\n const currentPendings = await this.model.pendingTransaction.findBy({\n msafeAddress: input.msafeAddress,\n });\n if (currentPendings.length !== 0) {\n throw new Error('Still have pendings');\n }\n\n const nextTx = await this.model.transactionIntention.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n });\n if (nextTx === null) {\n throw new Error('No future intentions to build');\n }\n\n const nextIntention = IntentionHelper.de(nextTx.data);\n try {\n const newTxb = await IntentionHelper.buildTxb({\n suiClient: this._suiClient,\n sender: input.msafeAddress,\n intention: nextIntention,\n });\n const payload = await newTxb.build({ client: this._suiClient });\n const newDigest = await newTxb.getDigest({ client: this._suiClient });\n const newPending: PendingTransaction = {\n digest: newDigest,\n payload: Uint8ArrayToHex(payload),\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextTx.sequenceNumber,\n isRejectTx: false,\n creator: nextTx.creator,\n };\n await this.model.pendingTransaction.save(newPending);\n await this.model.transactionIntention.update(\n {\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n },\n {\n status: 'SUCCESS',\n },\n );\n } catch (e: unknown) {\n // Build failed. Mark the intention as failed.\n await this.model.transactionIntention.update(\n {\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n },\n {\n status: 'FAILED',\n statusRemark: (e as any).toString(),\n },\n );\n throw new Error(`Intention build failed: {sequenceNumber: ${nextSequenceNumber}}`);\n }\n }\n\n /**\n * Skip next failed transaction if build of the intention has been failed before.\n */\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const userMSafe = await this.model.userMSafe.findOneBy({\n msafeAddress: input.msafeAddress,\n userAddress: input.userAddress,\n });\n if (userMSafe === null) {\n throw new Error('user does not have permission to MSafe');\n }\n\n const curSequenceNumber = await this.model.historyTransaction.findOne({\n where: { msafeAddress: input.msafeAddress },\n order: { sequenceNumber: 'desc' },\n });\n const nextSequenceNumber = curSequenceNumber ? curSequenceNumber.sequenceNumber + 1 : 0;\n\n const failedIntention = await this.model.transactionIntention.findOneBy({\n msafeAddress: input.msafeAddress,\n sequenceNumber: nextSequenceNumber,\n });\n if (failedIntention === null) {\n throw new Error('Next intention not found');\n }\n if (failedIntention.status !== 'FAILED') {\n throw new Error('Next intention not failed');\n }\n\n const history: HistoryTransaction = {\n msafeAddress: input.msafeAddress,\n digest: '0x0', // Special case for build has been failed,\n payload: '',\n sequenceNumber: nextSequenceNumber,\n creator: failedIntention.creator,\n isRejectTx: false,\n status: 'build-failed',\n };\n await this.model.historyTransaction.save(history);\n\n await this.model.transactionIntention.update(\n { msafeAddress: input.msafeAddress, sequenceNumber: nextSequenceNumber },\n { processed: true },\n );\n }\n\n private async getUser(address: string): Promise<User | null> {\n return this.model.user.findOneBy({ address });\n }\n\n private get model() {\n return this.db.coreModel;\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport 'reflect-metadata';\n\nimport { CoreModel, User, UserSetting } from '@msafe/sui3-model/core';\nimport { PublicKey } from '@mysten/sui.js/cryptography';\n\nimport { DBConfig } from '@/globals/const';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport const WALLET_TYPE_KEY = 'wallet_type';\n\nexport class CoreDB {\n private constructor(public readonly coreModel: CoreModel) {}\n\n static async New(dbConfig: DBConfig) {\n const core = await CoreModel.New(dbConfig);\n return new CoreDB(core);\n }\n\n async upsertUser(input: { address: string; publicKey: PublicKey; lastLogin: Date }) {\n const currentUser = await this.coreModel.user.findOneBy({\n address: input.address,\n });\n if (currentUser !== null) {\n currentUser.lastLogin = input.lastLogin;\n await this.coreModel.user.save(currentUser);\n } else {\n const serializedPublicKey = PublicKeySerde.ser(input.publicKey);\n const user: User = {\n address: input.address,\n publicKey: serializedPublicKey.publicKey,\n schema: serializedPublicKey.scheme,\n nonce: 0,\n lastLogin: new Date(),\n };\n await this.coreModel.user.save(user);\n }\n }\n\n async updateUserWalletType(input: { address: string; walletType: string }) {\n const exist = await this.coreModel.userSetting.findOneBy({\n userAddress: input.address,\n key: WALLET_TYPE_KEY,\n });\n const walletType = input.walletType.trim();\n if (exist === null || exist.value !== walletType) {\n const userSetting: UserSetting = {\n userAddress: input.address,\n key: WALLET_TYPE_KEY,\n value: walletType,\n };\n await this.coreModel.userSetting.save(userSetting);\n }\n }\n}\n","import { ModelConfig } from '@msafe/sui3-model/common';\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 };\n backend: DBConfig;\n}\n\nexport interface MSafeConfigOptions {\n suiClient?: {\n url?: string;\n };\n backend?: DBConfig;\n}\n\n// Use pseudo backend for now.\nexport type DBConfig = ModelConfig;\n\nexport const UNIT_DATABASE_CONFIG: DBConfig = {\n type: 'sqlite',\n database: ':memory:',\n logging: false,\n};\n\nexport const LOCAL_DATABASE_CONFIG: DBConfig = {\n type: 'mysql',\n host: '127.0.0.1',\n port: 3306,\n username: 'msafe',\n password: 'msafe',\n database: 'msafe_sui_local',\n logging: false,\n};\n\nexport const DEV_DATABASE_CONFIG: DBConfig = {\n type: 'mysql',\n host: 'msafe-dev-database.cluster-caos3ssocrx6.us-west-1.rds.amazonaws.com',\n port: 3306,\n username: 'msafe',\n password: 'Momentum.Safe2022',\n database: 'msafe_sui_dev',\n logging: false,\n};\n\nexport const TESTNET_RPC_URL = 'https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD';\nexport const MAINNET_RPC_URL = 'https://sui-mainnet.blockvision.org/v1/2Sgk7NPvqkd7mESYkxF01yX15l7';\n\nexport const ENV_CONFIGS = new Map<MSafeEnv, MSafeConfig>([\n [\n MSafeEnv.unit,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: UNIT_DATABASE_CONFIG,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\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?.backend) {\n config.backend = options.backend;\n }\n return config;\n}\n\nexport const AUTH_SIGN_MESSAGE = 'Welcome to MSafe';\n","import { JWTToken } from '@/backend/types';\nimport { CreateHelper } from '@/core/CreateHelper';\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeAccount } from '@/core/MSafeAccount';\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeConfigOptions, MSafeEnv } from '@/globals/const';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo } from '@/types/creation';\nimport { MSafeAccountInfo } from '@/types/msafe';\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 this.globals.wallet = input.wallet;\n const isValidJWT = input.jwtToken && (await this.backend.isJWTTokenValid(input.jwtToken));\n if (isValidJWT) {\n this.backend.setJWTToken(input.jwtToken as JWTToken);\n return input.jwtToken as JWTToken;\n }\n const messageStr = MessageHelper.welcomeMessage(new Date().toUTCString());\n const sig = await input.wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await input.wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: input.wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo(await this.walletAddress());\n }\n\n async createAccount(info: CreateMSafeAccountInfo) {\n return this.creationHelper.submitMSafeCreation(info);\n }\n\n getMSafeAccount(info: MSafeAccountInfo) {\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 private async walletAddress() {\n return this.wallet.address();\n }\n}\n"],"mappings":"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","names":["import_utils","import_cryptography","coin","import_transactions","import_transactions","import_ed25519","import_multisig","import_reflect_metadata","MSafeEnv"]}
package/dist/index.d.cts CHANGED
@@ -104,6 +104,7 @@ interface FutureIntention {
104
104
  txType: string;
105
105
  txSubType: string;
106
106
  rawData: string;
107
+ processed: boolean;
107
108
  status: string;
108
109
  statusRemark?: string;
109
110
  createdAt: Date;
@@ -201,6 +202,7 @@ interface MSafeConfigOptions {
201
202
  backend?: DBConfig;
202
203
  }
203
204
  type DBConfig = ModelConfig;
205
+ declare const UNIT_DATABASE_CONFIG: DBConfig;
204
206
  declare const LOCAL_DATABASE_CONFIG: DBConfig;
205
207
  declare const DEV_DATABASE_CONFIG: DBConfig;
206
208
  declare const TESTNET_RPC_URL = "https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD";
@@ -451,4 +453,4 @@ declare class Coin {
451
453
  static getBalance(data: SuiObjectData): bigint | undefined;
452
454
  }
453
455
 
454
- export { AUTH_SIGN_MESSAGE, COIN_TYPE_ARG_REGEX, Coin, CoinHelper, CreateHelper, type CreateMSafeAccountInfo, type CreatePermissionInfo, type DBConfig, DEV_DATABASE_CONFIG, ENV_CONFIGS, Formatter, type FutureIntention, HexToUint8Array, type HistorySendTx, type HistoryVote, type IWallet, IntentionHelper, LOCAL_DATABASE_CONFIG, MAINNET_RPC_URL, MAX_OWNER_WITHOUT_NONCE, MAX_OWNER_WITH_NONCE, MAX_WEIGHT, MIN_THRESHOLD, MIN_WEIGHT, MSafeAccount, type MSafeAccountInfo, MSafeClient, type MSafeConfig, type MSafeConfigOptions, MSafeEnv, MSafeGlobals, MessageHelper, type MultiSigConfig, NONCE_PK_PREFIX, NONCE_PK_WEIGHT, NONCE_PREFIX_MAX_SIZE, type OwnerWithWeight, type OwnerWithWeightPK, type PendingTx, type PendingVote, PublicKeySerde, type PublicKeyWithWeight, RawMultiSig, type ReceiveTransaction, SUI_COIN, SignatureVerifier, TESTNET_RPC_URL, type TxIntention, Uint8ArrayToHex, getAllCoins, getMSafeConfig, getMultiSigPublicKey, getPublicKeyFromChain, makeNoncePublicKey, stringToBuffer, validateMultiSigConfig };
456
+ export { AUTH_SIGN_MESSAGE, COIN_TYPE_ARG_REGEX, Coin, CoinHelper, CreateHelper, type CreateMSafeAccountInfo, type CreatePermissionInfo, type DBConfig, DEV_DATABASE_CONFIG, ENV_CONFIGS, Formatter, type FutureIntention, HexToUint8Array, type HistorySendTx, type HistoryVote, type IWallet, IntentionHelper, LOCAL_DATABASE_CONFIG, MAINNET_RPC_URL, MAX_OWNER_WITHOUT_NONCE, MAX_OWNER_WITH_NONCE, MAX_WEIGHT, MIN_THRESHOLD, MIN_WEIGHT, MSafeAccount, type MSafeAccountInfo, MSafeClient, type MSafeConfig, type MSafeConfigOptions, MSafeEnv, MSafeGlobals, MessageHelper, type MultiSigConfig, NONCE_PK_PREFIX, NONCE_PK_WEIGHT, NONCE_PREFIX_MAX_SIZE, type OwnerWithWeight, type OwnerWithWeightPK, type PendingTx, type PendingVote, PublicKeySerde, type PublicKeyWithWeight, RawMultiSig, type ReceiveTransaction, SUI_COIN, SignatureVerifier, TESTNET_RPC_URL, type TxIntention, UNIT_DATABASE_CONFIG, Uint8ArrayToHex, getAllCoins, getMSafeConfig, getMultiSigPublicKey, getPublicKeyFromChain, makeNoncePublicKey, stringToBuffer, validateMultiSigConfig };
package/dist/index.d.ts CHANGED
@@ -104,6 +104,7 @@ interface FutureIntention {
104
104
  txType: string;
105
105
  txSubType: string;
106
106
  rawData: string;
107
+ processed: boolean;
107
108
  status: string;
108
109
  statusRemark?: string;
109
110
  createdAt: Date;
@@ -201,6 +202,7 @@ interface MSafeConfigOptions {
201
202
  backend?: DBConfig;
202
203
  }
203
204
  type DBConfig = ModelConfig;
205
+ declare const UNIT_DATABASE_CONFIG: DBConfig;
204
206
  declare const LOCAL_DATABASE_CONFIG: DBConfig;
205
207
  declare const DEV_DATABASE_CONFIG: DBConfig;
206
208
  declare const TESTNET_RPC_URL = "https://sui-testnet.blockvision.org/v1/2Sgk89ivT64MnKdcGzjmyjY2ndD";
@@ -451,4 +453,4 @@ declare class Coin {
451
453
  static getBalance(data: SuiObjectData): bigint | undefined;
452
454
  }
453
455
 
454
- export { AUTH_SIGN_MESSAGE, COIN_TYPE_ARG_REGEX, Coin, CoinHelper, CreateHelper, type CreateMSafeAccountInfo, type CreatePermissionInfo, type DBConfig, DEV_DATABASE_CONFIG, ENV_CONFIGS, Formatter, type FutureIntention, HexToUint8Array, type HistorySendTx, type HistoryVote, type IWallet, IntentionHelper, LOCAL_DATABASE_CONFIG, MAINNET_RPC_URL, MAX_OWNER_WITHOUT_NONCE, MAX_OWNER_WITH_NONCE, MAX_WEIGHT, MIN_THRESHOLD, MIN_WEIGHT, MSafeAccount, type MSafeAccountInfo, MSafeClient, type MSafeConfig, type MSafeConfigOptions, MSafeEnv, MSafeGlobals, MessageHelper, type MultiSigConfig, NONCE_PK_PREFIX, NONCE_PK_WEIGHT, NONCE_PREFIX_MAX_SIZE, type OwnerWithWeight, type OwnerWithWeightPK, type PendingTx, type PendingVote, PublicKeySerde, type PublicKeyWithWeight, RawMultiSig, type ReceiveTransaction, SUI_COIN, SignatureVerifier, TESTNET_RPC_URL, type TxIntention, Uint8ArrayToHex, getAllCoins, getMSafeConfig, getMultiSigPublicKey, getPublicKeyFromChain, makeNoncePublicKey, stringToBuffer, validateMultiSigConfig };
456
+ export { AUTH_SIGN_MESSAGE, COIN_TYPE_ARG_REGEX, Coin, CoinHelper, CreateHelper, type CreateMSafeAccountInfo, type CreatePermissionInfo, type DBConfig, DEV_DATABASE_CONFIG, ENV_CONFIGS, Formatter, type FutureIntention, HexToUint8Array, type HistorySendTx, type HistoryVote, type IWallet, IntentionHelper, LOCAL_DATABASE_CONFIG, MAINNET_RPC_URL, MAX_OWNER_WITHOUT_NONCE, MAX_OWNER_WITH_NONCE, MAX_WEIGHT, MIN_THRESHOLD, MIN_WEIGHT, MSafeAccount, type MSafeAccountInfo, MSafeClient, type MSafeConfig, type MSafeConfigOptions, MSafeEnv, MSafeGlobals, MessageHelper, type MultiSigConfig, NONCE_PK_PREFIX, NONCE_PK_WEIGHT, NONCE_PREFIX_MAX_SIZE, type OwnerWithWeight, type OwnerWithWeightPK, type PendingTx, type PendingVote, PublicKeySerde, type PublicKeyWithWeight, RawMultiSig, type ReceiveTransaction, SUI_COIN, SignatureVerifier, TESTNET_RPC_URL, type TxIntention, UNIT_DATABASE_CONFIG, Uint8ArrayToHex, getAllCoins, getMSafeConfig, getMultiSigPublicKey, getPublicKeyFromChain, makeNoncePublicKey, stringToBuffer, validateMultiSigConfig };