@msafe/sui3-sdk 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -876,6 +876,14 @@ var BackendImpl = class {
876
876
  this._token = res.data.accessToken;
877
877
  return this._token;
878
878
  }
879
+ async verifyToken(jwt) {
880
+ try {
881
+ const res = await import_axios.default.get(`${this.apiURL}/auth`, { headers: this.headers(jwt) });
882
+ return res.status === 200;
883
+ } catch (_) {
884
+ return false;
885
+ }
886
+ }
879
887
  setJWTToken(token) {
880
888
  this._token = token;
881
889
  }
@@ -1104,8 +1112,8 @@ var BackendImpl = class {
1104
1112
  }
1105
1113
  async processExecutedTransaction(digest) {
1106
1114
  }
1107
- headers() {
1108
- return { Authorization: `Bearer ${this._token}` };
1115
+ headers(token) {
1116
+ return { Authorization: `Bearer ${token || this._token}` };
1109
1117
  }
1110
1118
  };
1111
1119
 
@@ -1156,22 +1164,31 @@ var MSafeClient = class _MSafeClient {
1156
1164
  return new _MSafeClient(globals);
1157
1165
  }
1158
1166
  async connectWallet(input) {
1167
+ if (input.jwtToken) {
1168
+ const verified = await this.backend.verifyToken(input.jwtToken);
1169
+ if (verified) {
1170
+ this.globals.wallet = input.wallet;
1171
+ this.backend.setJWTToken(input.jwtToken);
1172
+ return input.jwtToken;
1173
+ }
1174
+ }
1175
+ const jwt = await this.authSign(input.wallet);
1159
1176
  this.globals.wallet = input.wallet;
1177
+ this.backend.setJWTToken(jwt);
1178
+ return jwt;
1179
+ }
1180
+ async authSign(wallet) {
1160
1181
  const messageStr = MessageHelper.welcomeMessage((/* @__PURE__ */ new Date()).toUTCString());
1161
- const sig = await input.wallet.signPersonalMessage({
1182
+ const sig = await wallet.signPersonalMessage({
1162
1183
  messageStr
1163
1184
  });
1164
1185
  return this.backend.authSign({
1165
- address: await input.wallet.address(),
1186
+ address: await wallet.address(),
1166
1187
  message: messageStr,
1167
1188
  signature: sig.signature,
1168
- walletType: input.wallet.walletType
1189
+ walletType: wallet.walletType
1169
1190
  });
1170
1191
  }
1171
- async setWallet(input) {
1172
- this.globals.wallet = input.wallet;
1173
- this.backend.setJWTToken(input.jwtToken);
1174
- }
1175
1192
  async userInfo() {
1176
1193
  return this.globals.backend.getUserInfo(await this.walletAddress());
1177
1194
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/CreateHelper.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/transactions/coin-transfer.ts","../src/utils/sui.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/globals/const.ts","../src/backend/BackendImpl.ts","../src/core/MSafeClient.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './transactions';\nexport * from './types';\nexport * from './utils';\n","import {\n createAccountCreationMessage,\n MultisigAccountManager,\n MultiSigConfig,\n OwnerWithWeightPKEncoded,\n validateCreateAccountRequest,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { PublicKeySerde } from '@/utils/crypto';\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 MultisigAccountManager(msConfig);\n return ms.address;\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 validateCreateAccountRequest(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 = createAccountCreationMessage(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 ownersWithWeight: 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 ownersWithWeightPKEncoded: createInfo.ownerWithWeight.map((owner, i): OwnerWithWeightPKEncoded => {\n const publicKeySer = PublicKeySerde.ser(pks[i] as PublicKey);\n return {\n address: owner.address,\n weight: owner.weight,\n publicKeyEncoded: publicKeySer.publicKey,\n schema: publicKeySer.scheme,\n };\n }),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n 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 { 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 } 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 { 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 { 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 { MSafeAccountInfo, MultisigAccountManager, verifyTransactionSignature } from \"@msafe/sui3-utils\";\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { PaginationOption } from \"@/backend/types\";\nimport { SignatureVerifier } from \"@/utils\";\n\nexport class MSafeAccount {\n public multisigManager: MultisigAccountManager;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.multisigManager = new MultisigAccountManager({\n threshold: info.threshold,\n ownersWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n });\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(paginationOption?: PaginationOption) {\n const paginatedHistoryTransactions = await this.backend.getHistoryTransactions(this.address, paginationOption);\n return paginatedHistoryTransactions.items;\n }\n\n async futureIntentions(paginationOption?: PaginationOption) {\n const paginatedIntentions = await this.backend.getFutureIntentions(this.address, paginationOption);\n return paginatedIntentions.items;\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.multisigManager.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';\nimport { BackendImpl } from \"@/backend/BackendImpl\";\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 = new BackendImpl(config.apiURL);\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 { 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 apiURL: string;\n syncingURL: string;\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 LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'http://13.56.226.148';\nexport const DEV_SYNCING_URL = 'http://52.53.228.20';\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 apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\n apiURL: DEV_API_URL,\n syncingURL: DEV_SYNCING_URL,\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 {\n AuthLoginRequest,\n AuthLoginResponse,\n CreateMSafeAccountInfoRequest,\n GetMSafeAccountInfoResponse,\n MSafeAccountInfo,\n OwnerWithWeightPK,\n PublicKeyWithScheme,\n UserWithOwnedMSafe,\n UserWithOwnedMSafeResponse,\n HistoryTransaction,\n} from '@msafe/sui3-utils';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { PublicKey } from '@mysten/sui.js/src/cryptography';\nimport axios from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { JWTToken, PaginationOption, PaginationResponse } from '@/backend/types';\nimport { TxIntention } from '@/transactions/intention';\nimport { FutureIntention, PendingTx } from '@/types/msafe';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(private readonly apiURL: string) {}\n\n async authSign(input: AuthLoginRequest): Promise<JWTToken> {\n const res = await axios.post<AuthLoginResponse>(`${this.apiURL}/auth/login`, input);\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid authSign return: ${res}`);\n }\n this._token = res.data.accessToken;\n return this._token;\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res = await axios.post<(PublicKeyWithScheme | undefined)[]>(\n `${this.apiURL}/account/getPublicKeyBatch`,\n addresses,\n {\n headers: this.headers(),\n },\n );\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de({ ...publicKeyWithSchema }) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n const res = await axios.get<GetMSafeAccountInfoResponse>(\n `${this.apiURL}/account/getMSafeAccountInfo/${msafeAddress}`,\n {\n headers: this.headers(),\n },\n );\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n const msafeResp = res.data;\n return {\n address: msafeResp.address,\n ownersWithWeightPK: msafeResp.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafeResp.threshold,\n name: msafeResp.name,\n description: msafeResp.description,\n creationNonce: msafeResp.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n const res = await axios.get<UserWithOwnedMSafeResponse>(`${this.apiURL}/account/user/${userAddress}`, {\n headers: this.headers(),\n });\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return {\n address: res.data.address,\n publicKey: res.data.publicKey,\n schema: res.data.schema,\n creationNonce: res.data.creationNonce,\n ownedMSafe: res.data.ownedMSafe.map(\n (msafe): MSafeAccountInfo => ({\n address: msafe.address,\n ownersWithWeightPK: msafe.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n }),\n ),\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const res = await axios.get<PendingTx[]>(`${this.apiURL}/transaction/pending/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n return res.data;\n }\n\n async getHistoryTransactions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<HistoryTransaction>> {\n const res = await axios.get<PaginationResponse<HistoryTransaction>>(\n `${this.apiURL}/transaction/history?address=${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getFutureIntentions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<FutureIntention>> {\n const res = await axios.get<PaginationResponse<FutureIntention>>(\n `${this.apiURL}/transaction/intention/${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/current/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/next/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getNextSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async createMSafeAccount(input: CreateMSafeAccountInfoRequest): Promise<void> {\n const res = await axios.post(`${this.apiURL}/account`, input, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid createMSafeAccount return: ${res}`);\n }\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }): Promise<void> {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/intention`,\n {\n intention: input.intention,\n sequenceNumber: input.sequenceNumber,\n address: input.msafeAddress,\n signature: input.signature,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid proposeIntention return: ${res}`);\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n // TODO later\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }): Promise<void> {}\n\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/reject`,\n {\n address: input.msafeAddress,\n digest: input.digest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n } catch (e) {\n console.log('e:', e);\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/vote`,\n {\n address: input.msafeAddress,\n digest: input.txDigest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n }\n\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/build`,\n {\n address: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid buildNextIntentionAndAddToPending return: ${res}`);\n }\n }\n\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/skip`,\n {\n msafeAddress: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid skipNextFailedIntention return: ${res}`);\n }\n }\n\n async processExecutedTransaction(digest: string) {}\n\n private headers() {\n return { Authorization: `Bearer ${this._token}` };\n }\n}\n","import { MSafeAccountInfo } from '@msafe/sui3-utils';\n\nimport { 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 { 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 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 setWallet(input: { wallet: IWallet; jwtToken: JWTToken }) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\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_sui3_utils","MSafeEnv","axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/CreateHelper.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/transactions/coin-transfer.ts","../src/utils/sui.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/globals/const.ts","../src/backend/BackendImpl.ts","../src/core/MSafeClient.ts"],"sourcesContent":["export * from './core';\nexport * from './globals';\nexport * from './transactions';\nexport * from './types';\nexport * from './utils';\n","import {\n createAccountCreationMessage,\n MultisigAccountManager,\n MultiSigConfig,\n OwnerWithWeightPKEncoded,\n validateCreateAccountRequest,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { PublicKeySerde } from '@/utils/crypto';\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 MultisigAccountManager(msConfig);\n return ms.address;\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 validateCreateAccountRequest(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 = createAccountCreationMessage(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 ownersWithWeight: 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 ownersWithWeightPKEncoded: createInfo.ownerWithWeight.map((owner, i): OwnerWithWeightPKEncoded => {\n const publicKeySer = PublicKeySerde.ser(pks[i] as PublicKey);\n return {\n address: owner.address,\n weight: owner.weight,\n publicKeyEncoded: publicKeySer.publicKey,\n schema: publicKeySer.scheme,\n };\n }),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n 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 { 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 } 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 { 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 { 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 { MSafeAccountInfo, MultisigAccountManager, verifyTransactionSignature } from \"@msafe/sui3-utils\";\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { PaginationOption } from \"@/backend/types\";\nimport { SignatureVerifier } from \"@/utils\";\n\nexport class MSafeAccount {\n public multisigManager: MultisigAccountManager;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.multisigManager = new MultisigAccountManager({\n threshold: info.threshold,\n ownersWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n });\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(paginationOption?: PaginationOption) {\n const paginatedHistoryTransactions = await this.backend.getHistoryTransactions(this.address, paginationOption);\n return paginatedHistoryTransactions.items;\n }\n\n async futureIntentions(paginationOption?: PaginationOption) {\n const paginatedIntentions = await this.backend.getFutureIntentions(this.address, paginationOption);\n return paginatedIntentions.items;\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.multisigManager.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';\nimport { BackendImpl } from \"@/backend/BackendImpl\";\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 = new BackendImpl(config.apiURL);\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 { 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 apiURL: string;\n syncingURL: string;\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 LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'http://13.56.226.148';\nexport const DEV_SYNCING_URL = 'http://52.53.228.20';\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 apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\n apiURL: DEV_API_URL,\n syncingURL: DEV_SYNCING_URL,\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 {\n AuthLoginRequest,\n AuthLoginResponse,\n CreateMSafeAccountInfoRequest,\n GetMSafeAccountInfoResponse,\n MSafeAccountInfo,\n OwnerWithWeightPK,\n PublicKeyWithScheme,\n UserWithOwnedMSafe,\n UserWithOwnedMSafeResponse,\n HistoryTransaction,\n} from '@msafe/sui3-utils';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { PublicKey } from '@mysten/sui.js/src/cryptography';\nimport axios from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { JWTToken, PaginationOption, PaginationResponse } from '@/backend/types';\nimport { TxIntention } from '@/transactions/intention';\nimport { FutureIntention, PendingTx } from '@/types/msafe';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(private readonly apiURL: string) {}\n\n async authSign(input: AuthLoginRequest): Promise<JWTToken> {\n const res = await axios.post<AuthLoginResponse>(`${this.apiURL}/auth/login`, input);\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid authSign return: ${res}`);\n }\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await axios.get(`${this.apiURL}/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res = await axios.post<(PublicKeyWithScheme | undefined)[]>(\n `${this.apiURL}/account/getPublicKeyBatch`,\n addresses,\n {\n headers: this.headers(),\n },\n );\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de({ ...publicKeyWithSchema }) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n const res = await axios.get<GetMSafeAccountInfoResponse>(\n `${this.apiURL}/account/getMSafeAccountInfo/${msafeAddress}`,\n {\n headers: this.headers(),\n },\n );\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n const msafeResp = res.data;\n return {\n address: msafeResp.address,\n ownersWithWeightPK: msafeResp.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafeResp.threshold,\n name: msafeResp.name,\n description: msafeResp.description,\n creationNonce: msafeResp.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n const res = await axios.get<UserWithOwnedMSafeResponse>(`${this.apiURL}/account/user/${userAddress}`, {\n headers: this.headers(),\n });\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return {\n address: res.data.address,\n publicKey: res.data.publicKey,\n schema: res.data.schema,\n creationNonce: res.data.creationNonce,\n ownedMSafe: res.data.ownedMSafe.map(\n (msafe): MSafeAccountInfo => ({\n address: msafe.address,\n ownersWithWeightPK: msafe.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n }),\n ),\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const res = await axios.get<PendingTx[]>(`${this.apiURL}/transaction/pending/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n return res.data;\n }\n\n async getHistoryTransactions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<HistoryTransaction>> {\n const res = await axios.get<PaginationResponse<HistoryTransaction>>(\n `${this.apiURL}/transaction/history?address=${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getFutureIntentions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<FutureIntention>> {\n const res = await axios.get<PaginationResponse<FutureIntention>>(\n `${this.apiURL}/transaction/intention/${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/current/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/next/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getNextSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async createMSafeAccount(input: CreateMSafeAccountInfoRequest): Promise<void> {\n const res = await axios.post(`${this.apiURL}/account`, input, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid createMSafeAccount return: ${res}`);\n }\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }): Promise<void> {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/intention`,\n {\n intention: input.intention,\n sequenceNumber: input.sequenceNumber,\n address: input.msafeAddress,\n signature: input.signature,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid proposeIntention return: ${res}`);\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n // TODO later\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }): Promise<void> {}\n\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/reject`,\n {\n address: input.msafeAddress,\n digest: input.digest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n } catch (e) {\n console.log('e:', e);\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/vote`,\n {\n address: input.msafeAddress,\n digest: input.txDigest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n }\n\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/build`,\n {\n address: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid buildNextIntentionAndAddToPending return: ${res}`);\n }\n }\n\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/skip`,\n {\n msafeAddress: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid skipNextFailedIntention return: ${res}`);\n }\n }\n\n async processExecutedTransaction(digest: string) {}\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}` };\n }\n}\n","import { MSafeAccountInfo } from '@msafe/sui3-utils';\n\nimport { 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 { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = MessageHelper.welcomeMessage(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo(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_sui3_utils","MSafeEnv","axios"]}
package/dist/index.d.cts CHANGED
@@ -114,6 +114,7 @@ interface FutureIntention {
114
114
 
115
115
  interface IBackend {
116
116
  authSign(input: AuthLoginRequest): Promise<JWTToken>;
117
+ verifyToken(jwt?: JWTToken): Promise<boolean>;
117
118
  setJWTToken(token: JWTToken): void;
118
119
  getPublicKey(address: string): Promise<PublicKey | undefined>;
119
120
  getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]>;
@@ -322,10 +323,7 @@ declare class MSafeClient {
322
323
  wallet: IWallet;
323
324
  jwtToken?: JWTToken;
324
325
  }): Promise<JWTToken>;
325
- setWallet(input: {
326
- wallet: IWallet;
327
- jwtToken: JWTToken;
328
- }): Promise<void>;
326
+ private authSign;
329
327
  userInfo(): Promise<_msafe_sui3_utils.UserWithOwnedMSafe>;
330
328
  createAccount(info: CreateMSafeAccountInfo): Promise<string>;
331
329
  getMSafeAccount(info: MSafeAccountInfo): MSafeAccount;
package/dist/index.d.ts CHANGED
@@ -114,6 +114,7 @@ interface FutureIntention {
114
114
 
115
115
  interface IBackend {
116
116
  authSign(input: AuthLoginRequest): Promise<JWTToken>;
117
+ verifyToken(jwt?: JWTToken): Promise<boolean>;
117
118
  setJWTToken(token: JWTToken): void;
118
119
  getPublicKey(address: string): Promise<PublicKey | undefined>;
119
120
  getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]>;
@@ -322,10 +323,7 @@ declare class MSafeClient {
322
323
  wallet: IWallet;
323
324
  jwtToken?: JWTToken;
324
325
  }): Promise<JWTToken>;
325
- setWallet(input: {
326
- wallet: IWallet;
327
- jwtToken: JWTToken;
328
- }): Promise<void>;
326
+ private authSign;
329
327
  userInfo(): Promise<_msafe_sui3_utils.UserWithOwnedMSafe>;
330
328
  createAccount(info: CreateMSafeAccountInfo): Promise<string>;
331
329
  getMSafeAccount(info: MSafeAccountInfo): MSafeAccount;
package/dist/index.js CHANGED
@@ -816,6 +816,14 @@ var BackendImpl = class {
816
816
  this._token = res.data.accessToken;
817
817
  return this._token;
818
818
  }
819
+ async verifyToken(jwt) {
820
+ try {
821
+ const res = await axios.get(`${this.apiURL}/auth`, { headers: this.headers(jwt) });
822
+ return res.status === 200;
823
+ } catch (_) {
824
+ return false;
825
+ }
826
+ }
819
827
  setJWTToken(token) {
820
828
  this._token = token;
821
829
  }
@@ -1044,8 +1052,8 @@ var BackendImpl = class {
1044
1052
  }
1045
1053
  async processExecutedTransaction(digest) {
1046
1054
  }
1047
- headers() {
1048
- return { Authorization: `Bearer ${this._token}` };
1055
+ headers(token) {
1056
+ return { Authorization: `Bearer ${token || this._token}` };
1049
1057
  }
1050
1058
  };
1051
1059
 
@@ -1096,22 +1104,31 @@ var MSafeClient = class _MSafeClient {
1096
1104
  return new _MSafeClient(globals);
1097
1105
  }
1098
1106
  async connectWallet(input) {
1107
+ if (input.jwtToken) {
1108
+ const verified = await this.backend.verifyToken(input.jwtToken);
1109
+ if (verified) {
1110
+ this.globals.wallet = input.wallet;
1111
+ this.backend.setJWTToken(input.jwtToken);
1112
+ return input.jwtToken;
1113
+ }
1114
+ }
1115
+ const jwt = await this.authSign(input.wallet);
1099
1116
  this.globals.wallet = input.wallet;
1117
+ this.backend.setJWTToken(jwt);
1118
+ return jwt;
1119
+ }
1120
+ async authSign(wallet) {
1100
1121
  const messageStr = MessageHelper.welcomeMessage((/* @__PURE__ */ new Date()).toUTCString());
1101
- const sig = await input.wallet.signPersonalMessage({
1122
+ const sig = await wallet.signPersonalMessage({
1102
1123
  messageStr
1103
1124
  });
1104
1125
  return this.backend.authSign({
1105
- address: await input.wallet.address(),
1126
+ address: await wallet.address(),
1106
1127
  message: messageStr,
1107
1128
  signature: sig.signature,
1108
- walletType: input.wallet.walletType
1129
+ walletType: wallet.walletType
1109
1130
  });
1110
1131
  }
1111
- async setWallet(input) {
1112
- this.globals.wallet = input.wallet;
1113
- this.backend.setJWTToken(input.jwtToken);
1114
- }
1115
1132
  async userInfo() {
1116
1133
  return this.globals.backend.getUserInfo(await this.walletAddress());
1117
1134
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/CreateHelper.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/transactions/coin-transfer.ts","../src/utils/sui.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/globals/const.ts","../src/backend/BackendImpl.ts","../src/core/MSafeClient.ts"],"sourcesContent":["import {\n createAccountCreationMessage,\n MultisigAccountManager,\n MultiSigConfig,\n OwnerWithWeightPKEncoded,\n validateCreateAccountRequest,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { PublicKeySerde } from '@/utils/crypto';\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 MultisigAccountManager(msConfig);\n return ms.address;\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 validateCreateAccountRequest(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 = createAccountCreationMessage(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 ownersWithWeight: 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 ownersWithWeightPKEncoded: createInfo.ownerWithWeight.map((owner, i): OwnerWithWeightPKEncoded => {\n const publicKeySer = PublicKeySerde.ser(pks[i] as PublicKey);\n return {\n address: owner.address,\n weight: owner.weight,\n publicKeyEncoded: publicKeySer.publicKey,\n schema: publicKeySer.scheme,\n };\n }),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n 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 { 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 } 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 { 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 { 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 { MSafeAccountInfo, MultisigAccountManager, verifyTransactionSignature } from \"@msafe/sui3-utils\";\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { PaginationOption } from \"@/backend/types\";\nimport { SignatureVerifier } from \"@/utils\";\n\nexport class MSafeAccount {\n public multisigManager: MultisigAccountManager;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.multisigManager = new MultisigAccountManager({\n threshold: info.threshold,\n ownersWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n });\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(paginationOption?: PaginationOption) {\n const paginatedHistoryTransactions = await this.backend.getHistoryTransactions(this.address, paginationOption);\n return paginatedHistoryTransactions.items;\n }\n\n async futureIntentions(paginationOption?: PaginationOption) {\n const paginatedIntentions = await this.backend.getFutureIntentions(this.address, paginationOption);\n return paginatedIntentions.items;\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.multisigManager.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';\nimport { BackendImpl } from \"@/backend/BackendImpl\";\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 = new BackendImpl(config.apiURL);\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 { 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 apiURL: string;\n syncingURL: string;\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 LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'http://13.56.226.148';\nexport const DEV_SYNCING_URL = 'http://52.53.228.20';\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 apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\n apiURL: DEV_API_URL,\n syncingURL: DEV_SYNCING_URL,\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 {\n AuthLoginRequest,\n AuthLoginResponse,\n CreateMSafeAccountInfoRequest,\n GetMSafeAccountInfoResponse,\n MSafeAccountInfo,\n OwnerWithWeightPK,\n PublicKeyWithScheme,\n UserWithOwnedMSafe,\n UserWithOwnedMSafeResponse,\n HistoryTransaction,\n} from '@msafe/sui3-utils';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { PublicKey } from '@mysten/sui.js/src/cryptography';\nimport axios from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { JWTToken, PaginationOption, PaginationResponse } from '@/backend/types';\nimport { TxIntention } from '@/transactions/intention';\nimport { FutureIntention, PendingTx } from '@/types/msafe';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(private readonly apiURL: string) {}\n\n async authSign(input: AuthLoginRequest): Promise<JWTToken> {\n const res = await axios.post<AuthLoginResponse>(`${this.apiURL}/auth/login`, input);\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid authSign return: ${res}`);\n }\n this._token = res.data.accessToken;\n return this._token;\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res = await axios.post<(PublicKeyWithScheme | undefined)[]>(\n `${this.apiURL}/account/getPublicKeyBatch`,\n addresses,\n {\n headers: this.headers(),\n },\n );\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de({ ...publicKeyWithSchema }) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n const res = await axios.get<GetMSafeAccountInfoResponse>(\n `${this.apiURL}/account/getMSafeAccountInfo/${msafeAddress}`,\n {\n headers: this.headers(),\n },\n );\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n const msafeResp = res.data;\n return {\n address: msafeResp.address,\n ownersWithWeightPK: msafeResp.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafeResp.threshold,\n name: msafeResp.name,\n description: msafeResp.description,\n creationNonce: msafeResp.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n const res = await axios.get<UserWithOwnedMSafeResponse>(`${this.apiURL}/account/user/${userAddress}`, {\n headers: this.headers(),\n });\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return {\n address: res.data.address,\n publicKey: res.data.publicKey,\n schema: res.data.schema,\n creationNonce: res.data.creationNonce,\n ownedMSafe: res.data.ownedMSafe.map(\n (msafe): MSafeAccountInfo => ({\n address: msafe.address,\n ownersWithWeightPK: msafe.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n }),\n ),\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const res = await axios.get<PendingTx[]>(`${this.apiURL}/transaction/pending/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n return res.data;\n }\n\n async getHistoryTransactions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<HistoryTransaction>> {\n const res = await axios.get<PaginationResponse<HistoryTransaction>>(\n `${this.apiURL}/transaction/history?address=${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getFutureIntentions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<FutureIntention>> {\n const res = await axios.get<PaginationResponse<FutureIntention>>(\n `${this.apiURL}/transaction/intention/${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/current/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/next/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getNextSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async createMSafeAccount(input: CreateMSafeAccountInfoRequest): Promise<void> {\n const res = await axios.post(`${this.apiURL}/account`, input, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid createMSafeAccount return: ${res}`);\n }\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }): Promise<void> {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/intention`,\n {\n intention: input.intention,\n sequenceNumber: input.sequenceNumber,\n address: input.msafeAddress,\n signature: input.signature,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid proposeIntention return: ${res}`);\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n // TODO later\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }): Promise<void> {}\n\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/reject`,\n {\n address: input.msafeAddress,\n digest: input.digest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n } catch (e) {\n console.log('e:', e);\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/vote`,\n {\n address: input.msafeAddress,\n digest: input.txDigest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n }\n\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/build`,\n {\n address: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid buildNextIntentionAndAddToPending return: ${res}`);\n }\n }\n\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/skip`,\n {\n msafeAddress: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid skipNextFailedIntention return: ${res}`);\n }\n }\n\n async processExecutedTransaction(digest: string) {}\n\n private headers() {\n return { Authorization: `Bearer ${this._token}` };\n }\n}\n","import { MSafeAccountInfo } from '@msafe/sui3-utils';\n\nimport { 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 { 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 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 setWallet(input: { wallet: IWallet; jwtToken: JWTToken }) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\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":["normalizeStructTag","normalizeStructTag","coin","TransactionBlock","TransactionBlock","TransactionBlock","TransactionBlock","MultisigAccountManager","MultisigAccountManager","MSafeEnv"]}
1
+ {"version":3,"sources":["../src/core/CreateHelper.ts","../src/utils/crypto.ts","../src/utils/buffer.ts","../src/utils/format.ts","../src/utils/coin.ts","../src/transactions/coin-transfer.ts","../src/utils/sui.ts","../src/transactions/object-transfer.ts","../src/transactions/reject.ts","../src/transactions/intention.ts","../src/core/MessageHelper.ts","../src/core/MSafeAccount.ts","../src/core/PublicKeyHelper.ts","../src/globals/MSafeGlobals.ts","../src/globals/const.ts","../src/backend/BackendImpl.ts","../src/core/MSafeClient.ts"],"sourcesContent":["import {\n createAccountCreationMessage,\n MultisigAccountManager,\n MultiSigConfig,\n OwnerWithWeightPKEncoded,\n validateCreateAccountRequest,\n} from '@msafe/sui3-utils';\nimport { PublicKey, SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { PublicKeyHelper } from '@/core/PublicKeyHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { CreateMSafeAccountInfo, CreatePermissionInfo } from '@/types/creation';\nimport { PublicKeySerde } from '@/utils/crypto';\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 MultisigAccountManager(msConfig);\n return ms.address;\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 validateCreateAccountRequest(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 = createAccountCreationMessage(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 ownersWithWeight: 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 ownersWithWeightPKEncoded: createInfo.ownerWithWeight.map((owner, i): OwnerWithWeightPKEncoded => {\n const publicKeySer = PublicKeySerde.ser(pks[i] as PublicKey);\n return {\n address: owner.address,\n weight: owner.weight,\n publicKeyEncoded: publicKeySer.publicKey,\n schema: publicKeySer.scheme,\n };\n }),\n threshold: createInfo.threshold,\n name: createInfo.name, // name validation is deferred to backend\n description: createInfo.description, // description validation is deferred to backend\n creationNonce: createInfo.creationNonce,\n signature,\n });\n }\n}\n","import {\n 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 { 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 } 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 { 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 { 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 { MSafeAccountInfo, MultisigAccountManager, verifyTransactionSignature } from \"@msafe/sui3-utils\";\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\n\nimport { MessageHelper } from '@/core/MessageHelper';\nimport { MSafeGlobals } from '@/globals/MSafeGlobals';\nimport { IntentionHelper, TxIntention } from '@/transactions/intention';\nimport { PendingTx } from '@/types/msafe';\nimport { HexToUint8Array } from '@/utils/buffer';\nimport { PaginationOption } from \"@/backend/types\";\nimport { SignatureVerifier } from \"@/utils\";\n\nexport class MSafeAccount {\n public multisigManager: MultisigAccountManager;\n\n constructor(\n public readonly globals: MSafeGlobals,\n public readonly info: MSafeAccountInfo,\n ) {\n this.multisigManager = new MultisigAccountManager({\n threshold: info.threshold,\n ownersWithWeight: info.ownersWithWeightPK,\n creationNonce: info.creationNonce,\n });\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(paginationOption?: PaginationOption) {\n const paginatedHistoryTransactions = await this.backend.getHistoryTransactions(this.address, paginationOption);\n return paginatedHistoryTransactions.items;\n }\n\n async futureIntentions(paginationOption?: PaginationOption) {\n const paginatedIntentions = await this.backend.getFutureIntentions(this.address, paginationOption);\n return paginatedIntentions.items;\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.multisigManager.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';\nimport { BackendImpl } from \"@/backend/BackendImpl\";\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 = new BackendImpl(config.apiURL);\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 { 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 apiURL: string;\n syncingURL: string;\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 LOCAL_API_URL = 'http://127.0.0.1:3000';\nexport const LOCAL_SYNCING_URL = 'http://127.0.0.1:3001';\n\nexport const DEV_API_URL = 'http://13.56.226.148';\nexport const DEV_SYNCING_URL = 'http://52.53.228.20';\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 apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.local,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: LOCAL_DATABASE_CONFIG,\n apiURL: LOCAL_API_URL,\n syncingURL: LOCAL_SYNCING_URL,\n },\n ],\n [\n MSafeEnv.dev,\n {\n suiClient: {\n url: TESTNET_RPC_URL,\n },\n backend: DEV_DATABASE_CONFIG,\n apiURL: DEV_API_URL,\n syncingURL: DEV_SYNCING_URL,\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 {\n AuthLoginRequest,\n AuthLoginResponse,\n CreateMSafeAccountInfoRequest,\n GetMSafeAccountInfoResponse,\n MSafeAccountInfo,\n OwnerWithWeightPK,\n PublicKeyWithScheme,\n UserWithOwnedMSafe,\n UserWithOwnedMSafeResponse,\n HistoryTransaction,\n} from '@msafe/sui3-utils';\nimport { SerializedSignature } from '@mysten/sui.js/cryptography';\nimport { PublicKey } from '@mysten/sui.js/src/cryptography';\nimport axios from 'axios';\n\nimport { IBackend } from '@/backend/interface';\nimport { JWTToken, PaginationOption, PaginationResponse } from '@/backend/types';\nimport { TxIntention } from '@/transactions/intention';\nimport { FutureIntention, PendingTx } from '@/types/msafe';\nimport { PublicKeySerde } from '@/utils/crypto';\n\nexport class BackendImpl implements IBackend {\n private _token: JWTToken;\n\n constructor(private readonly apiURL: string) {}\n\n async authSign(input: AuthLoginRequest): Promise<JWTToken> {\n const res = await axios.post<AuthLoginResponse>(`${this.apiURL}/auth/login`, input);\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid authSign return: ${res}`);\n }\n this._token = res.data.accessToken;\n return this._token;\n }\n\n async verifyToken(jwt: JWTToken): Promise<boolean> {\n try {\n const res = await axios.get(`${this.apiURL}/auth`, { headers: this.headers(jwt) });\n return res.status === 200;\n } catch (_) {\n return false;\n }\n }\n\n setJWTToken(token: JWTToken) {\n this._token = token;\n }\n\n async getPublicKey(address: string): Promise<PublicKey | undefined> {\n return (await this.getPublicKeyBatch([address]))[0];\n }\n\n async getPublicKeyBatch(addresses: string[]): Promise<(PublicKey | undefined)[]> {\n const res = await axios.post<(PublicKeyWithScheme | undefined)[]>(\n `${this.apiURL}/account/getPublicKeyBatch`,\n addresses,\n {\n headers: this.headers(),\n },\n );\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return res.data?.map((publicKeyWithSchema) =>\n publicKeyWithSchema ? PublicKeySerde.de({ ...publicKeyWithSchema }) : undefined,\n );\n }\n\n async getMSafeAccountInfo(msafeAddress: string): Promise<MSafeAccountInfo> {\n const res = await axios.get<GetMSafeAccountInfoResponse>(\n `${this.apiURL}/account/getMSafeAccountInfo/${msafeAddress}`,\n {\n headers: this.headers(),\n },\n );\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n const msafeResp = res.data;\n return {\n address: msafeResp.address,\n ownersWithWeightPK: msafeResp.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafeResp.threshold,\n name: msafeResp.name,\n description: msafeResp.description,\n creationNonce: msafeResp.creationNonce,\n };\n }\n\n async getUserInfo(userAddress: string): Promise<UserWithOwnedMSafe> {\n const res = await axios.get<UserWithOwnedMSafeResponse>(`${this.apiURL}/account/user/${userAddress}`, {\n headers: this.headers(),\n });\n\n // TODO unify response struct\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n\n return {\n address: res.data.address,\n publicKey: res.data.publicKey,\n schema: res.data.schema,\n creationNonce: res.data.creationNonce,\n ownedMSafe: res.data.ownedMSafe.map(\n (msafe): MSafeAccountInfo => ({\n address: msafe.address,\n ownersWithWeightPK: msafe.ownersWithWeightPKEncoded.map(\n (owner): OwnerWithWeightPK => ({\n publicKey: PublicKeySerde.de({ publicKey: owner.publicKeyEncoded, scheme: owner.schema }),\n address: owner.address,\n weight: owner.weight,\n }),\n ),\n threshold: msafe.threshold,\n name: msafe.name,\n description: msafe.description,\n creationNonce: msafe.creationNonce,\n }),\n ),\n };\n }\n\n async getPendingTransactions(msafeAddress: string): Promise<PendingTx[]> {\n const res = await axios.get<PendingTx[]>(`${this.apiURL}/transaction/pending/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getPublicKeyBatch return: ${res}`);\n }\n return res.data;\n }\n\n async getHistoryTransactions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<HistoryTransaction>> {\n const res = await axios.get<PaginationResponse<HistoryTransaction>>(\n `${this.apiURL}/transaction/history?address=${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getFutureIntentions(\n msafeAddress: string,\n paginationOption?: PaginationOption,\n ): Promise<PaginationResponse<FutureIntention>> {\n const res = await axios.get<PaginationResponse<FutureIntention>>(\n `${this.apiURL}/transaction/intention/${msafeAddress}`,\n {\n params: {\n page: paginationOption?.page,\n limit: paginationOption?.pageSize,\n },\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getCurrentSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/current/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getCurrentSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async getNextSequenceNumber(msafeAddress: string): Promise<number> {\n const res = await axios.get<number>(`${this.apiURL}/transaction/sn/next/${msafeAddress}`, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid getNextSequenceNumber return: ${res}`);\n }\n return res.data;\n }\n\n async createMSafeAccount(input: CreateMSafeAccountInfoRequest): Promise<void> {\n const res = await axios.post(`${this.apiURL}/account`, input, {\n headers: this.headers(),\n });\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid createMSafeAccount return: ${res}`);\n }\n }\n\n async proposeIntention(input: {\n intention: TxIntention;\n sequenceNumber: number;\n userAddress: string;\n msafeAddress: string;\n signature: SerializedSignature;\n }): Promise<void> {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/intention`,\n {\n intention: input.intention,\n sequenceNumber: input.sequenceNumber,\n address: input.msafeAddress,\n signature: input.signature,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid proposeIntention return: ${res}`);\n }\n } catch (e) {\n console.log(e);\n }\n }\n\n // TODO later\n async proposePendingTransaction(input: {\n intention: TxIntention;\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }): Promise<void> {}\n\n async rejectCurrentTx(input: {\n userAddress: string;\n msafeAddress: string;\n digest: string;\n signature: SerializedSignature;\n }) {\n try {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/reject`,\n {\n address: input.msafeAddress,\n digest: input.digest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n } catch (e) {\n console.log('e:', e);\n }\n }\n\n async voteForTransaction(input: {\n txDigest: string;\n msafeAddress: string;\n userAddress: string;\n signature: SerializedSignature;\n }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/vote`,\n {\n address: input.msafeAddress,\n digest: input.txDigest,\n signature: input.signature,\n },\n {\n headers: this.headers(),\n },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid voteForTransaction return: ${res}`);\n }\n }\n\n async buildNextIntentionAndAddToPending(input: { msafeAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/build`,\n {\n address: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid buildNextIntentionAndAddToPending return: ${res}`);\n }\n }\n\n async skipNextFailedIntention(input: { msafeAddress: string; userAddress: string }) {\n const res = await axios.post(\n `${this.apiURL}/transaction/pending/skip`,\n {\n msafeAddress: input.msafeAddress,\n },\n { headers: this.headers() },\n );\n if (res.status !== 200 && res.status !== 201) {\n throw new Error(`invalid skipNextFailedIntention return: ${res}`);\n }\n }\n\n async processExecutedTransaction(digest: string) {}\n\n private headers(token?: string) {\n return { Authorization: `Bearer ${token || this._token}` };\n }\n}\n","import { MSafeAccountInfo } from '@msafe/sui3-utils';\n\nimport { 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 { IWallet } from '@/types/wallet';\n\nexport class MSafeClient {\n private _creationHelper: CreateHelper | undefined;\n\n private _publicKeyHelper: PublicKeyHelper | undefined;\n\n constructor(public readonly globals: MSafeGlobals) {}\n\n static async New(env: MSafeEnv, options?: MSafeConfigOptions) {\n const globals = await MSafeGlobals.New(env, options);\n return new MSafeClient(globals);\n }\n\n async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {\n if (input.jwtToken) {\n const verified = await this.backend.verifyToken(input.jwtToken);\n if (verified) {\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(input.jwtToken);\n return input.jwtToken;\n }\n }\n const jwt = await this.authSign(input.wallet);\n this.globals.wallet = input.wallet;\n this.backend.setJWTToken(jwt);\n return jwt;\n }\n\n private async authSign(wallet: IWallet): Promise<JWTToken> {\n const messageStr = MessageHelper.welcomeMessage(new Date().toUTCString());\n const sig = await wallet.signPersonalMessage({\n messageStr,\n });\n return this.backend.authSign({\n address: await wallet.address(),\n message: messageStr,\n signature: sig.signature,\n walletType: wallet.walletType,\n });\n }\n\n async userInfo() {\n return this.globals.backend.getUserInfo(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":["normalizeStructTag","normalizeStructTag","coin","TransactionBlock","TransactionBlock","TransactionBlock","TransactionBlock","MultisigAccountManager","MultisigAccountManager","MSafeEnv"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@msafe/sui3-sdk",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "description": "SDK for MSafe SUI V3",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -35,6 +35,15 @@ export class BackendImpl implements IBackend {
35
35
  return this._token;
36
36
  }
37
37
 
38
+ async verifyToken(jwt: JWTToken): Promise<boolean> {
39
+ try {
40
+ const res = await axios.get(`${this.apiURL}/auth`, { headers: this.headers(jwt) });
41
+ return res.status === 200;
42
+ } catch (_) {
43
+ return false;
44
+ }
45
+ }
46
+
38
47
  setJWTToken(token: JWTToken) {
39
48
  this._token = token;
40
49
  }
@@ -315,7 +324,7 @@ export class BackendImpl implements IBackend {
315
324
 
316
325
  async processExecutedTransaction(digest: string) {}
317
326
 
318
- private headers() {
319
- return { Authorization: `Bearer ${this._token}` };
327
+ private headers(token?: string) {
328
+ return { Authorization: `Bearer ${token || this._token}` };
320
329
  }
321
330
  }
@@ -97,6 +97,10 @@ export class PseudoBackend implements IBackend {
97
97
  return this._token;
98
98
  }
99
99
 
100
+ async verifyToken(jwt?: JWTToken): Promise<boolean> {
101
+ return true;
102
+ }
103
+
100
104
  setJWTToken(token: JWTToken) {
101
105
  this._token = token;
102
106
  }
@@ -13,6 +13,7 @@ import { FutureIntention, PendingTx } from '@/types/msafe';
13
13
 
14
14
  export interface IBackend {
15
15
  authSign(input: AuthLoginRequest): Promise<JWTToken>;
16
+ verifyToken(jwt?: JWTToken): Promise<boolean>;
16
17
  setJWTToken(token: JWTToken): void;
17
18
 
18
19
  getPublicKey(address: string): Promise<PublicKey | undefined>;
@@ -23,24 +23,33 @@ export class MSafeClient {
23
23
  }
24
24
 
25
25
  async connectWallet(input: { wallet: IWallet; jwtToken?: JWTToken }): Promise<JWTToken> {
26
+ if (input.jwtToken) {
27
+ const verified = await this.backend.verifyToken(input.jwtToken);
28
+ if (verified) {
29
+ this.globals.wallet = input.wallet;
30
+ this.backend.setJWTToken(input.jwtToken);
31
+ return input.jwtToken;
32
+ }
33
+ }
34
+ const jwt = await this.authSign(input.wallet);
26
35
  this.globals.wallet = input.wallet;
36
+ this.backend.setJWTToken(jwt);
37
+ return jwt;
38
+ }
39
+
40
+ private async authSign(wallet: IWallet): Promise<JWTToken> {
27
41
  const messageStr = MessageHelper.welcomeMessage(new Date().toUTCString());
28
- const sig = await input.wallet.signPersonalMessage({
42
+ const sig = await wallet.signPersonalMessage({
29
43
  messageStr,
30
44
  });
31
45
  return this.backend.authSign({
32
- address: await input.wallet.address(),
46
+ address: await wallet.address(),
33
47
  message: messageStr,
34
48
  signature: sig.signature,
35
- walletType: input.wallet.walletType,
49
+ walletType: wallet.walletType,
36
50
  });
37
51
  }
38
52
 
39
- async setWallet(input: { wallet: IWallet; jwtToken: JWTToken }) {
40
- this.globals.wallet = input.wallet;
41
- this.backend.setJWTToken(input.jwtToken);
42
- }
43
-
44
53
  async userInfo() {
45
54
  return this.globals.backend.getUserInfo(await this.walletAddress());
46
55
  }