@0xobelisk/sui-client 1.2.0-pre.98 → 2.0.0
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/LICENSE +92 -0
- package/dist/dubhe.d.ts +417 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.js +838 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +832 -26
- package/dist/index.mjs.map +1 -1
- package/dist/libs/suiInteractor/defaultConfig.d.ts +26 -0
- package/dist/libs/suiInteractor/index.d.ts +1 -1
- package/dist/types/index.d.ts +14 -0
- package/dist/utils/index.d.ts +19 -1
- package/package.json +21 -21
- package/src/dubhe.ts +1058 -23
- package/src/index.ts +9 -0
- package/src/libs/suiInteractor/defaultConfig.ts +53 -8
- package/src/libs/suiInteractor/index.ts +1 -1
- package/src/types/index.ts +14 -0
- package/src/utils/index.ts +24 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/dubhe.ts","../src/libs/suiAccountManager/index.ts","../src/libs/suiAccountManager/keypair.ts","../src/libs/suiAccountManager/util.ts","../src/libs/suiAccountManager/crypto.ts","../src/libs/suiTxBuilder/index.ts","../src/libs/suiTxBuilder/util.ts","../src/libs/suiInteractor/suiInteractor.ts","../src/libs/suiModel/suiOwnedObject.ts","../src/libs/suiModel/suiSharedObject.ts","../src/libs/suiInteractor/util.ts","../src/libs/suiInteractor/defaultConfig.ts","../src/libs/suiContractFactory/index.ts","../src/utils/const.ts","../src/utils/index.ts","../src/errors/index.ts","../src/libs/dubheChannel/client.ts","../src/libs/multiSig/client.ts","../src/libs/multiSig/publickey.ts","../src/metadata/index.ts"],"sourcesContent":["export * from '@mysten/sui/client';\nexport * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport * from '@mysten/sui/bcs';\nexport * from '@mysten/sui/keypairs/passkey';\nexport * from '@mysten/sui/keypairs/ed25519';\nexport * from '@mysten/sui/keypairs/secp256k1';\nexport * from '@mysten/sui/keypairs/secp256r1';\nexport { bcs, BcsType } from '@mysten/bcs';\nexport { Dubhe } from './dubhe';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTx } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiContractFactory } from './libs/suiContractFactory';\nexport { loadMetadata } from './metadata';\nexport type * from './types';\n","import keccak256 from 'keccak256';\nimport { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport { BcsType, fromHex, SerializedBcs, toHex, bcs } from '@mysten/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiMoveNormalizedModules,\n SuiMoveNormalizedType,\n SuiObjectData,\n SuiMoveNormalizedModule\n} from '@mysten/sui/client';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTx } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport { MapObjectStruct, MoveStructType, MoveEnumType } from './types';\nimport { SuiContractFactory } from './libs/suiContractFactory';\nimport { SuiMoveMoudleFuncType } from './libs/suiContractFactory/types';\nimport { getDefaultURL, NetworkConfig } from './libs/suiInteractor';\nimport {\n ContractQuery,\n ContractTx,\n DerivePathParams,\n FaucetNetworkType,\n MapMoudleFuncQuery,\n MapMoudleFuncTx,\n DubheParams,\n SuiTxArg,\n SuiObjectArg,\n SuiVecTxArg\n} from './types';\nimport {\n BasicBcsTypes,\n normalizeHexAddress,\n normalizePackageId,\n numberToAddressHex\n} from './utils';\nimport { ContractDataParsingError } from './errors';\nimport { DubheChannelClient } from './libs/dubheChannel';\n\nexport function isUndefined(value?: unknown): value is undefined {\n return value === undefined;\n}\n\nexport function withMeta<T extends { meta: SuiMoveMoudleFuncType }>(\n meta: SuiMoveMoudleFuncType,\n creator: Omit<T, 'meta'>\n): T {\n (creator as T).meta = meta;\n\n return creator as T;\n}\n\nfunction createQuery(\n meta: SuiMoveMoudleFuncType,\n fn: (\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean\n ) => Promise<DevInspectResults | TransactionResult>\n): ContractQuery {\n return withMeta(\n meta,\n async ({\n tx,\n params,\n typeArguments,\n isRaw\n }: {\n tx: Transaction;\n params?: (TransactionArgument | SerializedBcs<any>)[];\n typeArguments?: string[];\n isRaw?: boolean;\n }): Promise<DevInspectResults | TransactionResult> => {\n const result = await fn(tx, params, typeArguments, isRaw);\n return result;\n }\n );\n}\n\nfunction createTx(\n meta: SuiMoveMoudleFuncType,\n fn: (\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean,\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>,\n onError?: (error: Error) => void | Promise<void>\n ) => Promise<SuiTransactionBlockResponse | TransactionResult>\n): ContractTx {\n return withMeta(\n meta,\n async ({\n tx,\n params,\n typeArguments,\n isRaw,\n onSuccess,\n onError\n }: {\n tx: Transaction;\n params?: (TransactionArgument | SerializedBcs<any>)[];\n typeArguments?: string[];\n isRaw?: boolean;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse | TransactionResult> => {\n return await fn(tx, params, typeArguments, isRaw, onSuccess, onError);\n }\n );\n}\n\n/**\n * @class Dubhe\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class Dubhe {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\n public contractFactory: SuiContractFactory;\n public dubheChannelClient: DubheChannelClient;\n\n public packageId: string | undefined;\n public metadata: SuiMoveNormalizedModules | undefined;\n public projectName: string | undefined;\n\n readonly #query: MapMoudleFuncQuery = {};\n readonly #tx: MapMoudleFuncTx = {};\n readonly #object: MapObjectStruct = BasicBcsTypes;\n\n /**\n * Support the following ways to init the DubheClient:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'devnet'\n * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type\n * @param packageId\n * @param metadata\n * @param channelUrl, the base URL for Dubhe Channel API, optional\n */\n constructor({\n mnemonics,\n secretKey,\n networkType,\n fullnodeUrls,\n packageId,\n metadata,\n channelUrl\n }: DubheParams = {}) {\n networkType = networkType ?? 'mainnet';\n\n const defaultParams = getDefaultURL(networkType);\n\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n // Init the rpc provider\n fullnodeUrls = fullnodeUrls || [defaultParams.fullNode];\n this.suiInteractor = new SuiInteractor(fullnodeUrls, networkType);\n\n // Init the dubhe channel client\n this.dubheChannelClient = new DubheChannelClient({\n baseUrl: channelUrl || defaultParams.channelUrl\n });\n\n this.packageId = packageId ? normalizePackageId(packageId) : undefined;\n if (metadata !== undefined) {\n this.metadata = metadata as SuiMoveNormalizedModules;\n\n const maxLoopNum = 5;\n let loopNum = 0;\n let stillNeedFormat = true;\n while (stillNeedFormat === true && loopNum <= maxLoopNum) {\n let loopFlag = false;\n Object.values(metadata as SuiMoveNormalizedModules).forEach((moudlevalue) => {\n const data = moudlevalue as SuiMoveNormalizedModule;\n const moduleName = data.name;\n\n const itemModuleName = moduleName;\n if (itemModuleName.endsWith('_genesis')) {\n this.projectName = itemModuleName.replace('_genesis', '');\n }\n\n const objMoudleId = `${this.packageId}::${moduleName}`;\n\n if (data.enums) {\n Object.entries(data.enums).forEach(([enumName, enumType]) => {\n const objectId = `${objMoudleId}::${enumName}`;\n const bcsmeta: MoveEnumType = {\n objectId,\n objectName: enumName,\n objectType: enumType\n };\n // console.log('--------');\n // console.log(JSON.stringify(bcsmeta, null, 2));\n // if (isUndefined(this.#object[objectId])) {\n let bcsObj = this.#bcsenum(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n if (this.#object[objectId] === undefined) {\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`vector<vector<${objectId}>>`] = bcs.vector(bcs.vector(bcsObj.bcs));\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n }\n });\n }\n\n Object.entries(data.structs).forEach(([objectName, objectType]) => {\n const objectId = `${objMoudleId}::${objectName}`;\n const bcsmeta: MoveStructType = {\n objectId,\n objectName,\n objectType\n };\n // if (isUndefined(this.#object[objectId])) {\n let bcsObj = this.#bcs(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n\n this.#object[objectId] = bcsObj.bcs;\n\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n });\n\n Object.entries(data.exposedFunctions).forEach(([funcName, funcvalue]) => {\n const meta = funcvalue as SuiMoveMoudleFuncType;\n meta.moduleName = moduleName;\n meta.funcName = funcName;\n if (isUndefined(this.#query[moduleName])) {\n this.#query[moduleName] = {};\n }\n if (isUndefined(this.#query[moduleName][funcName])) {\n this.#query[moduleName][funcName] = createQuery(meta, (tx, p, typeArguments, isRaw) =>\n this.#read(meta, tx, p, typeArguments, isRaw)\n );\n }\n\n if (isUndefined(this.#tx[moduleName])) {\n this.#tx[moduleName] = {};\n }\n if (isUndefined(this.#tx[moduleName][funcName])) {\n this.#tx[moduleName][funcName] = createTx(\n meta,\n (tx, p, typeArguments, isRaw, onSuccess, onError) =>\n this.#exec(meta, tx, p, typeArguments, isRaw, onSuccess, onError)\n );\n }\n });\n });\n\n stillNeedFormat = loopFlag;\n loopNum++;\n }\n }\n this.contractFactory = new SuiContractFactory({\n packageId: this.packageId,\n metadata\n });\n }\n\n public get query(): MapMoudleFuncQuery {\n return this.#query;\n }\n\n public get tx(): MapMoudleFuncTx {\n return this.#tx;\n }\n\n public get object(): MapObjectStruct {\n return this.#object;\n }\n\n #exec = async (\n meta: SuiMoveMoudleFuncType,\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean,\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>,\n onError?: (error: Error) => void | Promise<void>\n ) => {\n if (isRaw === true) {\n return tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n }\n\n tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n return await this.signAndSendTxn({ tx, onSuccess, onError });\n };\n\n #read = async (\n meta: SuiMoveMoudleFuncType,\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean\n ) => {\n if (isRaw === true) {\n return tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n }\n\n tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n\n return await this.inspectTxn(tx);\n };\n\n #getVectorDepth = (field: SuiMoveNormalizedType): number => {\n if (typeof field === 'object' && 'Vector' in field) {\n return 1 + this.#getVectorDepth(field.Vector);\n }\n return 0;\n };\n\n #bcs = (bcsmeta: MoveStructType) => {\n let loopFlag = false;\n const bcsJson: Record<string, BcsType<any, any>> = {};\n Object.entries(bcsmeta.objectType.fields).forEach(([_index, type]) => {\n const objName = type.name;\n const objType: SuiMoveNormalizedType = type.type;\n switch (typeof objType) {\n case 'object':\n for (const [key, value] of Object.entries(objType)) {\n switch (key) {\n case 'Struct':\n const structType = value as {\n address: string;\n module: string;\n name: string;\n typeArguments: SuiMoveNormalizedType[];\n };\n if (\n structType.address === '0x1' &&\n structType.module === 'ascii' &&\n structType.name === 'String'\n ) {\n bcsJson[objName] = bcs.string();\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'UID'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'ID'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'bag' &&\n structType.name === 'Bag'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x1' &&\n structType.module === 'option' &&\n structType.name === 'Option'\n ) {\n switch (structType.typeArguments[0]) {\n case 'U8':\n bcsJson[objName] = bcs.option(bcs.u8());\n return;\n case 'U16':\n bcsJson[objName] = bcs.option(bcs.u16());\n return;\n case 'U32':\n bcsJson[objName] = bcs.option(bcs.u32());\n return;\n case 'U64':\n bcsJson[objName] = bcs.option(bcs.u64());\n return;\n case 'U128':\n bcsJson[objName] = bcs.option(bcs.u128());\n return;\n case 'U256':\n bcsJson[objName] = bcs.option(bcs.u256());\n return;\n case 'Bool':\n bcsJson[objName] = bcs.option(bcs.bool());\n return;\n case 'Address':\n bcsJson[objName] = bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n } else {\n if (\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ] === undefined\n ) {\n loopFlag = true;\n } else {\n bcsJson[objName] =\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ];\n return;\n }\n }\n return;\n case 'Vector':\n if (typeof value === 'string') {\n switch (value) {\n case 'U8':\n bcsJson[objName] = bcs.vector(bcs.u8());\n return;\n case 'U16':\n bcsJson[objName] = bcs.vector(bcs.u16());\n return;\n case 'U32':\n bcsJson[objName] = bcs.vector(bcs.u32());\n return;\n case 'U64':\n bcsJson[objName] = bcs.vector(bcs.u64());\n return;\n case 'U128':\n bcsJson[objName] = bcs.vector(bcs.u128());\n return;\n case 'U256':\n bcsJson[objName] = bcs.vector(bcs.u256());\n return;\n case 'Bool':\n bcsJson[objName] = bcs.vector(bcs.bool());\n return;\n case 'Address':\n bcsJson[objName] = bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n }\n if (typeof value === 'object') {\n const vectorDepth = this.#getVectorDepth(value);\n let innerType = value;\n for (let i = 0; i < vectorDepth; i++) {\n innerType = innerType.Vector;\n }\n\n // Check if innerType is an object before using 'in' operator\n if (\n typeof innerType === 'object' &&\n innerType !== null &&\n 'Struct' in innerType\n ) {\n const structType = innerType.Struct;\n const structId = `${structType.address}::${structType.module}::${structType.name}`;\n\n let bcsType = this.#object[structId];\n if (!bcsType) {\n loopFlag = true;\n return;\n }\n let baseType = bcsType;\n for (let i = 0; i <= vectorDepth; i++) {\n baseType = bcs.vector(baseType);\n }\n\n bcsJson[objName] = baseType;\n return;\n }\n\n // Handle primitive types in nested vectors\n if (typeof innerType === 'string') {\n let baseType: BcsType<any, any>;\n switch (innerType) {\n case 'U8':\n baseType = bcs.u8();\n break;\n case 'U16':\n baseType = bcs.u16();\n break;\n case 'U32':\n baseType = bcs.u32();\n break;\n case 'U64':\n baseType = bcs.u64();\n break;\n case 'U128':\n baseType = bcs.u128();\n break;\n case 'U256':\n baseType = bcs.u256();\n break;\n case 'Bool':\n baseType = bcs.bool();\n break;\n case 'Address':\n baseType = bcs.bytes(32).transform({\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n break;\n default:\n return; // Unsupported primitive type\n }\n\n // Apply vector wrapping based on depth\n for (let i = 0; i <= vectorDepth; i++) {\n baseType = bcs.vector(baseType);\n }\n\n bcsJson[objName] = baseType;\n return;\n }\n }\n return;\n case 'TypeParameter':\n bcsJson[objName] = bcs.u128();\n return;\n // case 'Reference':\n\n // case 'MutableReference':\n\n default:\n throw new Error('Unsupported type');\n }\n }\n return;\n case 'string':\n switch (objType) {\n case 'U8':\n bcsJson[objName] = bcs.u8();\n return;\n case 'U16':\n bcsJson[objName] = bcs.u16();\n return;\n case 'U32':\n bcsJson[objName] = bcs.u32();\n return;\n case 'U64':\n bcsJson[objName] = bcs.u64();\n return;\n case 'U128':\n bcsJson[objName] = bcs.u128();\n return;\n case 'U256':\n bcsJson[objName] = bcs.u256();\n return;\n case 'Bool':\n bcsJson[objName] = bcs.bool();\n return;\n case 'Address':\n bcsJson[objName] = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n return;\n default:\n return;\n }\n default:\n throw new Error('Unsupported type');\n }\n });\n\n return {\n bcs: bcs.struct(bcsmeta.objectName, bcsJson),\n loopFlag\n };\n };\n\n #bcsenum = (bcsmeta: MoveEnumType) => {\n let loopFlag = false;\n const variantJson: Record<string, BcsType<any, any> | null> = {};\n\n // const databcs = bcs.vector(\n // bcs.struct('Account', {\n // balance: bcs.u64(),\n // status: bcs.enum('AccountStatus', {\n // Liquid: null,\n // Frozen: null,\n // Blocked: null,\n // }),\n // })\n // );\n\n Object.entries(bcsmeta.objectType.variants).forEach(([name, type]) => {\n if (type.length > 0) {\n Object.entries(type).forEach(([_index, value]) => {\n const objType: SuiMoveNormalizedType = value.type;\n const objName = value.name;\n switch (typeof objType) {\n case 'object':\n for (const [key, value] of Object.entries(objType)) {\n switch (key) {\n case 'Struct':\n const structType = value as {\n address: string;\n module: string;\n name: string;\n typeArguments: SuiMoveNormalizedType[];\n };\n if (\n structType.address === '0x1' &&\n structType.module === 'ascii' &&\n structType.name === 'String'\n ) {\n variantJson[objName] = bcs.string();\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'UID'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'ID'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'bag' &&\n structType.name === 'Bag'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x1' &&\n structType.module === 'option' &&\n structType.name === 'Option'\n ) {\n switch (structType.typeArguments[0]) {\n case 'U8':\n variantJson[objName] = bcs.option(bcs.u8());\n return;\n case 'U16':\n variantJson[objName] = bcs.option(bcs.u16());\n return;\n case 'U32':\n variantJson[objName] = bcs.option(bcs.u32());\n return;\n case 'U64':\n variantJson[objName] = bcs.option(bcs.u64());\n return;\n case 'U128':\n variantJson[objName] = bcs.option(bcs.u128());\n return;\n case 'U256':\n variantJson[objName] = bcs.option(bcs.u256());\n return;\n case 'Bool':\n variantJson[objName] = bcs.option(bcs.bool());\n return;\n case 'Address':\n variantJson[objName] = bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n } else {\n if (\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ] === undefined\n ) {\n loopFlag = true;\n } else {\n variantJson[objName] =\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ];\n return;\n }\n }\n return;\n case 'Vector':\n if (typeof value === 'string') {\n switch (value) {\n case 'U8':\n variantJson[objName] = bcs.vector(bcs.u8());\n return;\n case 'U16':\n variantJson[objName] = bcs.vector(bcs.u16());\n return;\n case 'U32':\n variantJson[objName] = bcs.vector(bcs.u32());\n return;\n case 'U64':\n variantJson[objName] = bcs.vector(bcs.u64());\n return;\n case 'U128':\n variantJson[objName] = bcs.vector(bcs.u128());\n return;\n case 'U256':\n variantJson[objName] = bcs.vector(bcs.u256());\n return;\n case 'Bool':\n variantJson[objName] = bcs.vector(bcs.bool());\n return;\n case 'Address':\n variantJson[objName] = bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n }\n // if (typeof value === 'object') {\n // }\n case 'TypeParameter':\n variantJson[objName] = bcs.u128();\n return;\n // case 'Reference':\n\n // case 'MutableReference':\n\n default:\n throw new Error('Unsupported type');\n }\n }\n return;\n case 'string':\n switch (objType) {\n case 'U8':\n variantJson[objName] = bcs.u8();\n return;\n case 'U16':\n variantJson[objName] = bcs.u16();\n return;\n case 'U32':\n variantJson[objName] = bcs.u32();\n return;\n case 'U64':\n variantJson[objName] = bcs.u64();\n return;\n case 'U128':\n variantJson[objName] = bcs.u128();\n return;\n case 'U256':\n variantJson[objName] = bcs.u256();\n return;\n case 'Bool':\n variantJson[objName] = bcs.bool();\n return;\n case 'Address':\n variantJson[objName] = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n return;\n default:\n return;\n }\n default:\n throw new Error('Unsupported type');\n }\n });\n } else {\n variantJson[name] = null;\n }\n });\n return {\n bcs: bcs.enum(bcsmeta.objectName, variantJson),\n loopFlag\n };\n };\n\n view(dryResult: DevInspectResults) {\n let returnValues = [];\n\n if (dryResult.effects.status.status === 'success') {\n const resultList = dryResult.results![0].returnValues!;\n\n for (const res of resultList) {\n let baseValue = res[0];\n let baseType = res[1];\n const value = Uint8Array.from(baseValue);\n\n const storageValueMatch = baseType.match(/^.*::storage_value::StorageValue<(.+)>$/);\n if (storageValueMatch) {\n const innerType = storageValueMatch[1];\n if (this.#object[innerType]) {\n const storageValueBcs = bcs.struct('StorageValue', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n value: this.#object[innerType]\n })\n )\n });\n returnValues.push(storageValueBcs.parse(value));\n continue;\n }\n }\n\n const storageMapMatch = baseType.match(/^.*::storage_map::StorageMap<(.+)>$/);\n if (storageMapMatch) {\n const innerType = storageMapMatch[1];\n const [keyType, valueType] = innerType.split(',').map((type) => type.trim());\n if (this.#object[keyType] && this.#object[valueType]) {\n const storageMapBcs = bcs.struct('StorageMap', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n key: this.#object[keyType],\n value: this.#object[valueType]\n })\n )\n });\n returnValues.push(storageMapBcs.parse(value));\n continue;\n }\n }\n\n const storageDoubleMapMatch = baseType.match(\n /^.*::storage_double_map::StorageDoubleMap<(.+)>$/\n );\n if (storageDoubleMapMatch) {\n const innerType = storageDoubleMapMatch[1];\n const [key1, key2, valueType] = innerType.split(',').map((type) => type.trim());\n if (this.#object[key1] && this.#object[key2] && this.#object[valueType]) {\n const storageDoubleMapBcs = bcs.struct('StorageDoubleMap', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n key1: this.#object[key1],\n key2: this.#object[key2],\n value: this.#object[valueType]\n })\n )\n });\n returnValues.push(storageDoubleMapBcs.parse(value));\n continue;\n }\n }\n\n if (this.#object[baseType]) {\n // console.log('=========== here');\n // console.log(baseType);\n // console.log(JSON.stringify(this.#object[baseType], null, 2));\n // console.log('-------------');\n returnValues.push(this.#object[baseType].parse(value));\n continue;\n }\n\n const genericMatch = baseType.match(/^([^<]+)<(.+)>$/);\n if (genericMatch) {\n const [_, genericBase, _genericParam] = genericMatch;\n const genericKey = `${genericBase}<T>`;\n\n if (this.#object[genericKey]) {\n returnValues.push(this.#object[genericKey].parse(value));\n continue;\n }\n }\n\n console.log('\\n\\x1b[41m\\x1b[37m ERROR \\x1b[0m \\x1b[31mUnsupported Type\\x1b[0m');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m');\n console.log(`\\x1b[95m•\\x1b[0m Type: \\x1b[33m\"${baseType}\"\\x1b[0m`);\n if (genericMatch) {\n console.log(`\\x1b[95m•\\x1b[0m Generic Base Type: \\x1b[33m\"${genericMatch[1]}<T>\"\\x1b[0m`);\n }\n console.log('\\x1b[95m\\n✨ Available Types:\\x1b[0m');\n Object.keys(this.#object).forEach((type) => {\n console.log(` \\x1b[36m◆\\x1b[0m ${type}`);\n });\n console.log('\\n\\x1b[34m💡 How to Add Custom Type:\\x1b[0m');\n console.log(` You can add custom type by extending the #object map in your code:`);\n console.log(\n ` \\x1b[32mdubhe.object[\"${baseType}\"] = bcs.struct(\"YourTypeName\", {\\n field1: bcs.string(),\\n field2: bcs.u64(),\\n // ... other fields\\n });\\x1b[0m`\n );\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m\\n');\n throw new Error(`Unsupported type: ${baseType}`);\n }\n return returnValues;\n } else {\n throw new ContractDataParsingError(dryResult);\n }\n }\n\n async state({\n tx,\n schema,\n params,\n customModuleName\n }: {\n tx: Transaction;\n schema: string;\n params: any[];\n customModuleName?: string;\n }): Promise<any[] | undefined> {\n if (!this.metadata) {\n throw new Error('Metadata is not loaded');\n }\n\n const moduleName = `${customModuleName ?? this.projectName}_schema`;\n const functionName = `get_${schema}`;\n\n let queryResponse = undefined;\n try {\n queryResponse = (await this.query[moduleName][functionName]({\n tx,\n params\n })) as DevInspectResults;\n\n if (queryResponse.effects.status.status !== 'success') {\n return undefined;\n }\n } catch {\n return undefined;\n }\n return this.view(queryResponse);\n }\n\n async parseState({\n schema,\n objectId,\n storageType,\n params,\n customModuleName\n }: {\n schema: string;\n objectId: string;\n storageType: string; // 'StorageValue<V>' | 'StorageMap<K, V>' | 'StorageDoubleMap<K1, K2, V>'\n params: any[];\n customModuleName?: string;\n }): Promise<any[] | undefined> {\n const tx = new Transaction();\n const schemaObject = tx.object(objectId);\n // Parse storage type\n const storageValueMatch = storageType.match(/^StorageValue<(.+)>$/);\n const storageMapMatch = storageType.match(/^StorageMap<(.+),\\s*(.+)>$/);\n const storageDoubleMapMatch = storageType.match(/^StorageDoubleMap<(.+),\\s*(.+),\\s*(.+)>$/);\n\n let processedParams: (TransactionArgument | SerializedBcs<any>)[] = [schemaObject];\n\n if (storageValueMatch) {\n // StorageValue only needs the object ID\n if (params.length > 0) {\n console.warn(\n 'StorageValue does not require additional parameters. Extra parameters will be ignored.'\n );\n }\n } else if (storageMapMatch) {\n // StorageMap needs one key\n if (params.length !== 1) {\n throw new Error('StorageMap requires exactly one key parameter');\n }\n const keyType = storageMapMatch[1].trim();\n processedParams.push(this.#processKeyParameter(tx, keyType, params[0]));\n } else if (storageDoubleMapMatch) {\n // StorageDoubleMap needs two keys\n if (params.length !== 2) {\n throw new Error('StorageDoubleMap requires exactly two key parameters');\n }\n const key1Type = storageDoubleMapMatch[1].trim();\n const key2Type = storageDoubleMapMatch[2].trim();\n processedParams.push(this.#processKeyParameter(tx, key1Type, params[0]));\n processedParams.push(this.#processKeyParameter(tx, key2Type, params[1]));\n } else {\n throw new Error(\n `Invalid storage type: ${storageType}. Must be StorageValue<V>, StorageMap<K,V>, or StorageDoubleMap<K1,K2,V>`\n );\n }\n return this.state({\n tx,\n schema,\n params: processedParams,\n customModuleName\n });\n }\n\n // async getTransactions({\n // first,\n // after,\n // sender,\n // digest,\n // checkpoint,\n // packageId,\n // module,\n // functionName,\n // orderBy,\n // showEvent,\n // }: {\n // first?: number;\n // after?: string;\n // sender?: string;\n // digest?: string;\n // checkpoint?: number;\n // packageId?: string;\n // module?: string;\n // functionName?: string[];\n // orderBy?: string[];\n // showEvent?: boolean;\n // }): Promise<ConnectionResponse<IndexerTransaction>> {\n // return await this.suiIndexerClient.getTransactions({\n // first,\n // after,\n // sender,\n // digest,\n // checkpoint,\n // packageId,\n // module,\n // functionName,\n // orderBy,\n // showEvent,\n // });\n // }\n\n // async getTransaction(\n // digest: string\n // ): Promise<IndexerTransaction | undefined> {\n // return await this.suiIndexerClient.getTransaction(digest);\n // }\n\n // /**\n // * Wait for the transaction to be processed by the indexer and return all transaction-related data\n // * @param digest transaction digest\n // * @param options option parameters\n // * @returns result object containing transaction, events and schema data\n // */\n // async waitForIndexerTransaction(\n // digest: string,\n // options?: {\n // checkInterval?: number;\n // timeout?: number;\n // maxRetries?: number;\n // pageSize?: number;\n // }\n // ): Promise<IndexerTransactionResult> {\n // const {\n // checkInterval = 100,\n // timeout = 30000,\n // maxRetries = 300,\n // pageSize = 100,\n // } = options ?? {};\n\n // const startTime = Date.now();\n // let retryCount = 0;\n\n // while (retryCount < maxRetries) {\n // try {\n // if (Date.now() - startTime > timeout) {\n // throw new Error(`Waiting for transaction ${digest} timed out`);\n // }\n\n // await new Promise((resolve) => setTimeout(resolve, checkInterval));\n\n // const tx = await this.getTransaction(digest);\n // if (tx) {\n // const events: IndexerEvent[] = [];\n // const schemaChanges: IndexerSchema[] = [];\n\n // let hasNextEventsPage = true;\n // let eventsCursor: string | undefined;\n\n // while (hasNextEventsPage) {\n // const eventsResponse = await this.getEvents({\n // digest,\n // first: pageSize,\n // after: eventsCursor,\n // });\n\n // events.push(...eventsResponse.edges.map((edge) => edge.node));\n\n // hasNextEventsPage = eventsResponse.pageInfo.hasNextPage;\n // eventsCursor = eventsResponse.pageInfo.endCursor;\n // }\n\n // let hasNextSchemasPage = true;\n // let schemasCursor: string | undefined;\n\n // while (hasNextSchemasPage) {\n // const schemasResponse = await this.getStorage({\n // last_update_digest: digest,\n // first: pageSize,\n // after: schemasCursor,\n // });\n\n // schemaChanges.push(...schemasResponse.data);\n\n // hasNextSchemasPage = schemasResponse.pageInfo.hasNextPage;\n // schemasCursor = schemasResponse.pageInfo.endCursor;\n // }\n\n // return {\n // tx,\n // events,\n // schemaChanges,\n // };\n // }\n\n // retryCount++;\n // } catch (error) {\n // throw new Error(\n // `Error while waiting for transaction ${digest}: ${error}`\n // );\n // }\n // }\n\n // throw new Error(\n // `Reached maximum retries (${maxRetries}), failed to wait for transaction ${digest}`\n // );\n // }\n\n // async getEvents({\n // first,\n // after,\n // names,\n // sender,\n // digest,\n // checkpoint,\n // orderBy,\n // }: {\n // first?: number;\n // after?: string;\n // names?: string[];\n // sender?: string;\n // digest?: string;\n // checkpoint?: string;\n // orderBy?: string[];\n // }): Promise<ConnectionResponse<IndexerEvent>> {\n // return await this.suiIndexerClient.getEvents({\n // first,\n // after,\n // names,\n // sender,\n // digest,\n // checkpoint,\n // orderBy,\n // });\n // }\n\n // async getSchemas({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // }: {\n // name?: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // first?: number;\n // after?: string;\n // orderBy?: string[];\n // jsonOrderBy?: JsonPathOrder[];\n // }): Promise<ConnectionResponse<IndexerSchema>> {\n // return await this.suiIndexerClient.getSchemas({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // });\n // }\n\n // async getStorage({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // }: {\n // name?: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // first?: number;\n // after?: string;\n // orderBy?: string[];\n // jsonOrderBy?: JsonPathOrder[];\n // }): Promise<StorageResponse<IndexerSchema>> {\n // return await this.suiIndexerClient.getStorage({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // });\n // }\n\n // async getStorageItem({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // }: {\n // name: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // }): Promise<StorageItemResponse<IndexerSchema> | undefined> {\n // const response = await this.suiIndexerClient.getStorageItem({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // });\n // return response;\n // }\n\n // async subscribe({\n // types,\n // handleData,\n // onOpen,\n // onClose,\n // }: {\n // types: SubscribableType[];\n // handleData: (data: any) => void;\n // onOpen?: () => void;\n // onClose?: () => void;\n // }): Promise<WebSocket> {\n // return this.suiIndexerClient.subscribe({\n // types,\n // handleData,\n // onOpen,\n // onClose,\n // });\n // }\n\n #processKeyParameter(tx: Transaction, keyType: string, value: any) {\n // Handle basic types\n switch (keyType.toLowerCase()) {\n case 'u8':\n return tx.pure.u8(value);\n case 'u16':\n return tx.pure.u16(value);\n case 'u32':\n return tx.pure.u32(value);\n case 'u64':\n return tx.pure.u64(value);\n case 'u128':\n return tx.pure.u128(value);\n case 'u256':\n return tx.pure.u256(value);\n case 'bool':\n return tx.pure.bool(value);\n case 'address':\n return tx.pure.address(value);\n default:\n // Check if it's an object type\n if (keyType.includes('::')) {\n // Assuming it's an object ID if the type contains '::'\n return tx.object(value);\n }\n\n // If we reach here, the key type is not supported\n console.log('\\n\\x1b[41m\\x1b[37m ERROR \\x1b[0m \\x1b[31mUnsupported Key Type\\x1b[0m');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m');\n console.log(`\\x1b[95m•\\x1b[0m Type: \\x1b[33m\"${keyType}\"\\x1b[0m`);\n console.log('\\x1b[95m•\\x1b[0m Supported Types:\\x1b[0m');\n console.log(' \\x1b[36m◆\\x1b[0m u8, u16, u32, u64, u128, u256');\n console.log(' \\x1b[36m◆\\x1b[0m bool');\n console.log(' \\x1b[36m◆\\x1b[0m address');\n console.log(' \\x1b[36m◆\\x1b[0m object (format: package::module::type)');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m\\n');\n throw new Error(`Unsupported key type: ${keyType}`);\n }\n }\n\n /**\n * else:\n * it will generate signer from the mnemonic with the given derivePathParams.\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getSigner(derivePathParams?: DerivePathParams) {\n return this.accountManager.getKeyPair(derivePathParams);\n }\n\n /**\n * @description Switch the current account with the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n switchAccount(derivePathParams: DerivePathParams) {\n this.accountManager.switchAccount(derivePathParams);\n }\n\n /**\n * @description Get the address of the account for the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getAddress(derivePathParams?: DerivePathParams) {\n return this.accountManager.getAddress(derivePathParams);\n }\n\n currentAddress() {\n return this.accountManager.currentAddress;\n }\n\n getPackageId() {\n return this.contractFactory.packageId;\n }\n\n getMetadata() {\n return this.contractFactory.metadata;\n }\n\n getNetwork() {\n return this.suiInteractor.network;\n }\n\n getNetworkConfig(): NetworkConfig {\n return getDefaultURL(this.getNetwork());\n }\n\n getTxExplorerUrl(txHash: string) {\n return this.getNetworkConfig().txExplorer.replace(':txHash', txHash);\n }\n\n getAccountExplorerUrl(address: string) {\n return this.getNetworkConfig().accountExplorer.replace(':address', address);\n }\n\n getExplorerUrl() {\n return this.getNetworkConfig().explorer;\n }\n\n /**\n * Update configuration dynamically without recreating the entire instance\n * @param config - Partial configuration to update (same type as constructor)\n */\n updateConfig(config: Partial<DubheParams>) {\n // Update account manager if credentials changed\n if (config.secretKey !== undefined || config.mnemonics !== undefined) {\n this.accountManager = new SuiAccountManager({\n mnemonics: config.mnemonics,\n secretKey: config.secretKey\n });\n }\n\n // Update sui interactor if network or fullnode URLs changed\n const networkChanged =\n config.networkType !== undefined && config.networkType !== this.suiInteractor.network;\n const fullnodeUrlsChanged = config.fullnodeUrls !== undefined;\n\n if (networkChanged || fullnodeUrlsChanged) {\n const newNetworkType = config.networkType ?? this.suiInteractor.network;\n const defaultParams = getDefaultURL(newNetworkType);\n const newFullnodeUrls = config.fullnodeUrls || [defaultParams.fullNode];\n\n this.suiInteractor = new SuiInteractor(newFullnodeUrls, newNetworkType);\n }\n\n // Update dubhe channel client if channelUrl changed\n if (config.channelUrl !== undefined) {\n this.dubheChannelClient.updateConfig({\n baseUrl: config.channelUrl\n });\n }\n\n // Update package ID and metadata, rebuild tx/query builders if needed\n const packageIdChanged = config.packageId !== undefined && config.packageId !== this.packageId;\n const metadataChanged = config.metadata !== undefined && config.metadata !== this.metadata;\n\n if (packageIdChanged || metadataChanged) {\n // Update packageId\n if (config.packageId !== undefined) {\n this.packageId = normalizePackageId(config.packageId);\n }\n\n // Update metadata and rebuild builders\n if (config.metadata !== undefined) {\n this.metadata = config.metadata as SuiMoveNormalizedModules;\n\n // Clear existing builders and object types\n Object.keys(this.#query).forEach((key) => delete this.#query[key]);\n Object.keys(this.#tx).forEach((key) => delete this.#tx[key]);\n Object.keys(this.#object).forEach((key) => delete this.#object[key]);\n\n // Re-initialize object with BasicBcsTypes\n Object.assign(this.#object, BasicBcsTypes);\n\n // Rebuild builders with new metadata\n const maxLoopNum = 5;\n let loopNum = 0;\n let stillNeedFormat = true;\n\n while (stillNeedFormat === true && loopNum <= maxLoopNum) {\n let loopFlag = false;\n Object.values(this.metadata).forEach((moudlevalue) => {\n const data = moudlevalue as SuiMoveNormalizedModule;\n const moduleName = data.name;\n\n const itemModuleName = moduleName;\n if (itemModuleName.endsWith('_genesis')) {\n this.projectName = itemModuleName.replace('_genesis', '');\n }\n\n const objMoudleId = `${this.packageId}::${moduleName}`;\n\n if (data.enums) {\n Object.entries(data.enums).forEach(([enumName, enumType]) => {\n const objectId = `${objMoudleId}::${enumName}`;\n const bcsmeta: MoveEnumType = {\n objectId,\n objectName: enumName,\n objectType: enumType\n };\n let bcsObj = this.#bcsenum(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n if (this.#object[objectId] === undefined) {\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`vector<vector<${objectId}>>`] = bcs.vector(bcs.vector(bcsObj.bcs));\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n }\n });\n }\n\n Object.entries(data.structs).forEach(([objectName, objectType]) => {\n const objectId = `${objMoudleId}::${objectName}`;\n const bcsmeta: MoveStructType = {\n objectId,\n objectName,\n objectType\n };\n let bcsObj = this.#bcs(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n });\n\n Object.entries(data.exposedFunctions).forEach(([funcName, funcvalue]) => {\n const meta = funcvalue as SuiMoveMoudleFuncType;\n meta.moduleName = moduleName;\n meta.funcName = funcName;\n if (isUndefined(this.#query[moduleName])) {\n this.#query[moduleName] = {};\n }\n if (isUndefined(this.#query[moduleName][funcName])) {\n this.#query[moduleName][funcName] = createQuery(\n meta,\n (tx, p, typeArguments, isRaw) => this.#read(meta, tx, p, typeArguments, isRaw)\n );\n }\n\n if (isUndefined(this.#tx[moduleName])) {\n this.#tx[moduleName] = {};\n }\n if (isUndefined(this.#tx[moduleName][funcName])) {\n this.#tx[moduleName][funcName] = createTx(\n meta,\n (tx, p, typeArguments, isRaw, onSuccess, onError) =>\n this.#exec(meta, tx, p, typeArguments, isRaw, onSuccess, onError)\n );\n }\n });\n });\n\n stillNeedFormat = loopFlag;\n loopNum++;\n }\n\n // Rebuild contract factory\n this.contractFactory = new SuiContractFactory({\n packageId: this.packageId,\n metadata: this.metadata\n });\n }\n }\n }\n\n /**\n * Request some SUI from faucet\n * @Returns {Promise<boolean>}, true if the request is successful, false otherwise.\n */\n async requestFaucet(\n address?: string,\n network?: FaucetNetworkType,\n derivePathParams?: DerivePathParams\n ) {\n if (address === undefined) {\n address = this.accountManager.getAddress(derivePathParams);\n }\n if (network === undefined) {\n network = this.getNetwork() as FaucetNetworkType | 'devnet' as FaucetNetworkType;\n }\n // const addr = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.requestFaucet(address, network);\n }\n\n async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n async balanceOf(accountAddress?: string, coinType?: string, derivePathParams?: DerivePathParams) {\n if (accountAddress === undefined) {\n accountAddress = this.accountManager.getAddress(derivePathParams);\n }\n const owner = accountAddress;\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObject(objectId: string) {\n return this.suiInteractor.getObject(objectId);\n }\n\n async getObjects(objectIds: string[]) {\n return this.suiInteractor.getObjects(objectIds);\n }\n\n async signTxn(tx: Uint8Array | Transaction | SuiTx, derivePathParams?: DerivePathParams) {\n if (tx instanceof SuiTx || tx instanceof Transaction) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTx ? tx.tx : tx;\n const txBytes =\n txBlock instanceof Transaction ? await txBlock.build({ client: this.client() }) : txBlock;\n const keyPair = this.getSigner(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }: {\n tx: Uint8Array | Transaction | SuiTx;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n try {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n const result = await this.sendTx(bytes, signature);\n\n if (result.effects?.status.status === 'success') {\n if (onSuccess) {\n await onSuccess(result);\n }\n } else {\n if (onError) {\n await onError(new Error(`Transaction failed: ${result.effects?.status.error}`));\n }\n }\n return result;\n } catch (error) {\n if (onError) {\n await onError(error as Error);\n }\n throw error;\n }\n }\n\n async sendTx(\n transaction: Uint8Array | string,\n signature: string | string[]\n ): Promise<SuiTransactionBlockResponse> {\n return this.suiInteractor.sendTx(transaction, signature);\n }\n\n async waitForTransaction(digest: string) {\n return this.suiInteractor.waitForTransaction({ digest });\n }\n\n async submitToChannel({\n tx,\n nonce,\n chainType\n }: {\n tx: Transaction;\n nonce: number;\n chainType?: string;\n }) {\n const payload = {\n chain: chainType || 'sui',\n sender: this.getAddress(),\n nonce,\n ptb: tx.getData(),\n signature: 'base64_encoded_signature_placeholder'\n };\n return this.dubheChannelClient.submit(payload);\n }\n\n async queryChannelTable({\n packageId,\n account,\n table,\n key\n }: {\n packageId?: string;\n account?: string;\n table: string;\n key: any[];\n }) {\n packageId = packageId || this.packageId;\n account = account || this.getAddress();\n // Remove 0x prefix if present\n if (account && account.startsWith('0x')) {\n account = account.slice(2);\n }\n if (packageId && packageId.startsWith('0x')) {\n packageId = packageId.slice(2);\n }\n const payload = {\n dapp_key: `${packageId}::dapp_key::DappKey`,\n account: account,\n table: table,\n key: key\n };\n\n // {\n // \"dapp_key\": \"8041ce715dc516da7e67fcc43c0acc853e8f091dae0fd7b11cc5b071016dd614::dapp_key::DappKey\",\n // \"account\": \"8041ce715dc516da7e67fcc43c0acc853e8f091dae0fd7b11cc5b071016dd614\",\n // \"table\": \"dapp_fee_config\",\n // \"key\": []\n // }\n return this.dubheChannelClient.getTable(payload);\n }\n\n /**\n * Subscribe to channel table updates via Server-Sent Events\n * @param params - Subscription parameters\n * @param options - Event handlers for the subscription\n * @returns Unsubscribe function\n *\n * @example\n * // Subscribe to all tables and accounts (only dapp_key)\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * {},\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to all tables for a specific account\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...' },\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to a specific table for a specific account\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...', table: 'position' },\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to a specific table, account, and key\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...', table: 'position', key: [] },\n * { onMessage: (data) => console.log(data) }\n * );\n */\n async subscribeChannelTable(\n {\n packageId,\n account,\n table,\n key\n }: {\n packageId?: string;\n account?: string;\n table?: string;\n key?: any[];\n } = {},\n options?: {\n onMessage?: (data: any) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n }\n ) {\n packageId = packageId || this.packageId;\n\n // Remove 0x prefix if present (required by the channel server)\n if (account !== undefined) {\n if (account.startsWith('0x')) {\n account = account.slice(2);\n }\n }\n if (packageId && packageId.startsWith('0x')) {\n packageId = packageId.slice(2);\n }\n\n const payload: any = {\n dapp_key: `${packageId}::dapp_key::DappKey`\n };\n\n // Only include account if specified\n if (account !== undefined) {\n payload.account = account;\n }\n\n // Only include table if specified\n if (table !== undefined) {\n payload.table = table;\n }\n\n // Only include key if specified\n if (key !== undefined) {\n payload.key = key;\n }\n\n return this.dubheChannelClient.subscribeTable(payload, options);\n }\n\n async latestNonce({\n account\n }: {\n account?: string;\n } = {}) {\n account = account || this.getAddress();\n const payload = {\n sender: account\n };\n const response = await this.dubheChannelClient.getNonce(payload);\n return response.nonce;\n }\n\n /**\n * Transfer the given amount of SUI to the recipient\n * @param recipient\n * @param amount\n * @param derivePathParams\n */\n async transferSui(recipient: string, amount: number, derivePathParams?: DerivePathParams) {\n const tx = new SuiTx();\n tx.transferSui(recipient, amount);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Transfer to mutliple recipients\n * @param recipients the recipients addresses\n * @param amounts the amounts of SUI to transfer to each recipient, the length of amounts should be the same as the length of recipients\n * @param derivePathParams\n */\n async transferSuiToMany(\n recipients: string[],\n amounts: number[],\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n tx.transferSuiToMany(recipients, amounts);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Transfer the given amounts of coin to multiple recipients\n * @param recipients the list of recipient address\n * @param amounts the amounts to transfer for each recipient\n * @param coinType any custom coin type but not SUI\n * @param derivePathParams the derive path params for the current signer\n */\n async transferCoinToMany(\n recipients: string[],\n amounts: number[],\n coinType: string,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(owner, totalAmount, coinType);\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany([recipient], [amount], coinType, derivePathParams);\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n tx.transferObjects(objects, recipient);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const { target, arguments: args = [], typeArguments = [], derivePathParams } = callParams;\n const tx = new SuiTx();\n tx.moveCall(target, args, typeArguments);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Select coins with the given amount and coin type, the total amount is greater than or equal to the given amount\n * @param amount\n * @param coinType\n * @param owner\n */\n async selectCoinsWithAmount(amount: number, coinType: string, owner?: string) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins.map((c) => c.objectId);\n }\n\n async selectObjectsWithType(objectType: string, owner?: string) {\n owner = owner || this.accountManager.currentAddress;\n const objects = await this.suiInteractor.selectObjects(owner, objectType);\n return objects.map((c) => c.objectId);\n }\n\n /**\n * stake the given amount of SUI to the validator\n * @param amount the amount of SUI to stake\n * @param validatorAddr the validator address\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(amount: number, validatorAddr: string, derivePathParams?: DerivePathParams) {\n const tx = new SuiTx();\n tx.stakeSui(amount, validatorAddr);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Execute the transaction with on-chain data but without really submitting. Useful for querying the effects of a transaction.\n * Since the transaction is not submitted, its gas cost is not charged.\n * @param tx the transaction to execute\n * @param derivePathParams the derive path params\n * @returns the effects and events of the transaction, such as object changes, gas cost, event emitted.\n */\n async inspectTxn(\n tx: Uint8Array | Transaction | SuiTx,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTx ? tx.tx : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams)\n });\n }\n\n async getOwnedObjects(owner: string, cursor?: string, limit?: number) {\n const ownedObjects = await this.suiInteractor.getOwnedObjects(owner, cursor, limit);\n const ownedObjectsRes: SuiObjectData[] = [];\n\n for (const object of ownedObjects.data) {\n const objectDetail = await this.getObject(object.data!.objectId);\n if (objectDetail.type!.split('::')[0] === this.contractFactory.packageId) {\n ownedObjectsRes.push(objectDetail);\n }\n }\n\n return ownedObjectsRes;\n }\n\n async entity_key_from_object(objectId: string) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n return objectId;\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_bytes(bytes: Uint8Array | Buffer | string) {\n const hashBytes = keccak256(bytes);\n const hashU8Array: number[] = Array.from(hashBytes);\n const value = Uint8Array.from(hashU8Array);\n const Address = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n const data = Address.parse(value);\n return '0x' + data;\n }\n\n async entity_key_from_address_with_seed(objectId: string, seed: string) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n const bytes = Buffer.from(objectId.slice(2), 'hex');\n const newBuffer = Buffer.concat([bytes, Buffer.from(seed, 'utf-8')]);\n return this.entity_key_from_bytes(newBuffer);\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_address_with_u256(objectId: string, x: number) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n const bytes = Buffer.from(objectId.slice(2), 'hex');\n\n const numberBytes = bcs.u256().serialize(x).toBytes();\n\n return this.entity_key_from_bytes(Buffer.concat([bytes, numberBytes]));\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_u256(x: number) {\n return numberToAddressHex(x);\n }\n\n // async formatData(type: string, value: Buffer | number[] | Uint8Array) {\n // const u8Value = Uint8Array.from(value);\n // return bcs.de(type, u8Value);\n // }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { getKeyPair } from './keypair';\nimport { hexOrBase64ToUint8Array, normalizePrivateKey } from './util';\nimport { generateMnemonic } from './crypto';\nimport type { AccountMangerParams, DerivePathParams } from 'src/types';\nimport { SUI_PRIVATE_KEY_PREFIX, decodeSuiPrivateKey } from '@mysten/sui/cryptography';\n\nexport class SuiAccountManager {\n private mnemonics: string;\n private secretKey: string;\n public currentKeyPair: Ed25519Keypair;\n public currentAddress: string;\n\n /**\n * Support the following ways to init the SuiToolkit:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string or Bech32 string, when mnemonics is provided, secretKey will be ignored\n */\n constructor({ mnemonics, secretKey }: AccountMangerParams = {}) {\n // If the mnemonics or secretKey is provided, use it\n // Otherwise, generate a random mnemonics with 24 words\n this.mnemonics = mnemonics || '';\n this.secretKey = secretKey || '';\n if (!this.mnemonics && !this.secretKey) {\n this.mnemonics = generateMnemonic(24);\n }\n\n // Init the current account\n this.currentKeyPair = this.secretKey\n ? this.parseSecretKey(this.secretKey)\n : getKeyPair(this.mnemonics);\n this.currentAddress = this.currentKeyPair.getPublicKey().toSuiAddress();\n }\n\n /**\n * Check if the secretKey starts with bench32 format\n */\n parseSecretKey(secretKey: string) {\n if (secretKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n const { secretKey: uint8ArraySecretKey } = decodeSuiPrivateKey(secretKey);\n return Ed25519Keypair.fromSecretKey(normalizePrivateKey(uint8ArraySecretKey));\n }\n\n return Ed25519Keypair.fromSecretKey(normalizePrivateKey(hexOrBase64ToUint8Array(secretKey)));\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the currentKeyPair.\n * else:\n * it will generate keyPair from the mnemonic with the given derivePathParams.\n */\n getKeyPair(derivePathParams?: DerivePathParams) {\n if (!derivePathParams || !this.mnemonics) return this.currentKeyPair;\n return getKeyPair(this.mnemonics, derivePathParams);\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the currentAddress.\n * else:\n * it will generate address from the mnemonic with the given derivePathParams.\n */\n getAddress(derivePathParams?: DerivePathParams) {\n if (!derivePathParams || !this.mnemonics) return this.currentAddress;\n return getKeyPair(this.mnemonics, derivePathParams).getPublicKey().toSuiAddress();\n }\n\n /**\n * Switch the current account with the given derivePathParams.\n * This is only useful when the mnemonics is provided. For secretKey mode, it will always use the same account.\n */\n switchAccount(derivePathParams: DerivePathParams) {\n if (this.mnemonics) {\n this.currentKeyPair = getKeyPair(this.mnemonics, derivePathParams);\n this.currentAddress = this.currentKeyPair.getPublicKey().toSuiAddress();\n }\n }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { DerivePathParams } from '../../types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (derivePathParams: DerivePathParams = {}) => {\n const { accountIndex = 0, isExternal = false, addressIndex = 0 } = derivePathParams;\n return `m/44'/784'/${accountIndex}'/${isExternal ? 1 : 0}'/${addressIndex}'`;\n};\n\n/**\n * the format is m/44'/784'/accountIndex'/${isExternal ? 1 : 0}'/addressIndex'\n *\n * accountIndex is the index of the account, default is 0.\n *\n * isExternal is the type of the address, default is false. Usually, the external address is used to receive coins. The internal address is used to change coins.\n *\n * addressIndex is the index of the address, default is 0. It's used to generate multiple addresses for one account.\n *\n * @description Get keypair from mnemonics and derive path\n * @param mnemonics\n * @param derivePathParams\n */\nexport const getKeyPair = (mnemonics: string, derivePathParams: DerivePathParams = {}) => {\n const derivePath = getDerivePathForSUI(derivePathParams);\n return Ed25519Keypair.deriveKeypair(mnemonics, derivePath);\n};\n","import { fromB64 } from '@mysten/sui/utils';\n\n/**\n * @description This regular expression matches any string that contains only hexadecimal digits (0-9, A-F, a-f).\n * @param str\n */\nexport const isHex = (str: string) => /^0x[0-9a-fA-F]+$|^[0-9a-fA-F]+$/.test(str);\n\n/**\n * @description This regular expression matches any string that contains only base64 digits (0-9, A-Z, a-z, +, /, =).\n * Note that the \"=\" signs at the end are optional padding characters that may be present in some base64 encoded strings.\n * @param str\n */\nexport const isBase64 = (str: string) => /^[a-zA-Z0-9+/]+={0,2}$/g.test(str);\n\n/**\n * Convert a hex string to Uint8Array\n * @param hexStr\n */\nexport const fromHEX = (hexStr: string): Uint8Array => {\n if (!hexStr) {\n throw new Error('cannot parse empty string to Uint8Array');\n }\n const intArr = hexStr\n .replace('0x', '')\n .match(/.{1,2}/g)\n ?.map((byte) => parseInt(byte, 16));\n\n if (!intArr || intArr.length === 0) {\n throw new Error(`Unable to parse HEX: ${hexStr}`);\n }\n return Uint8Array.from(intArr);\n};\n\n/**\n * @description Convert a hex or base64 string to Uint8Array\n */\nexport const hexOrBase64ToUint8Array = (str: string): Uint8Array => {\n if (isHex(str)) {\n return fromHEX(str);\n } else if (isBase64(str)) {\n return fromB64(str);\n } else {\n throw new Error('The string is not a valid hex or base64 string.');\n }\n};\n\nconst PRIVATE_KEY_SIZE = 32;\nconst LEGACY_PRIVATE_KEY_SIZE = 64;\n/**\n * normalize a private key\n * A private key is a 32-byte array.\n * But there are two different formats for private keys:\n * 1. A 32-byte array\n * 2. A 64-byte array with the first 32 bytes being the private key and the last 32 bytes being the public key\n * 3. A 33-byte array with the first byte being 0x00 (sui.keystore key is a Base64 string with scheme flag 0x00 at the beginning)\n */\nexport const normalizePrivateKey = (key: Uint8Array): Uint8Array => {\n if (key.length === LEGACY_PRIVATE_KEY_SIZE) {\n // This is a legacy secret key, we need to strip the public key bytes and only read the first 32 bytes\n key = key.slice(0, PRIVATE_KEY_SIZE);\n } else if (key.length === PRIVATE_KEY_SIZE + 1 && key[0] === 0) {\n // sui.keystore key is a Base64 string with scheme flag 0x00 at the beginning\n return key.slice(1);\n } else if (key.length === PRIVATE_KEY_SIZE) {\n return key;\n }\n throw new Error('invalid secret key');\n};\n","import { generateMnemonic as genMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\n\nexport const generateMnemonic = (numberOfWords: 12 | 24 = 24) => {\n const strength = numberOfWords === 12 ? 128 : 256;\n return genMnemonic(wordlist, strength);\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { TransactionArgument, TransactionObjectInput } from '@mysten/sui/transactions';\nimport type { Keypair } from '@mysten/sui/cryptography';\n\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg\n} from '../../types';\n\nimport type { bcs } from '@mysten/sui/bcs';\nimport { convertArgs, convertAddressArg, convertObjArg, convertAmounts } from './util';\nexport class SuiTx {\n public tx: Transaction;\n\n constructor(transaction?: Transaction) {\n if (transaction !== undefined) {\n this.tx = Transaction.from(transaction);\n } else {\n this.tx = new Transaction();\n }\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.tx.gas;\n }\n get blockData() {\n return this.tx.blockData;\n }\n address(value: string) {\n return this.tx.pure.address(value);\n }\n get pure(): {\n <T extends TransactionArgument>(value: T): TransactionArgument;\n address(value: string): TransactionArgument;\n u8(value: number | bigint): TransactionArgument;\n u16(value: number | bigint): TransactionArgument;\n u32(value: number | bigint): TransactionArgument;\n u64(value: number | bigint): TransactionArgument;\n u128(value: number | bigint): TransactionArgument;\n u256(value: number | bigint): TransactionArgument;\n bool(value: boolean): TransactionArgument;\n } {\n return this.tx.pure;\n }\n object(value: string | TransactionObjectInput) {\n return this.tx.object(value);\n }\n objectRef(ref: SuiObjectRef) {\n return this.tx.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.tx.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.tx.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.tx.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.tx.setExpiration>[0]) {\n return this.tx.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.tx.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.tx.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.tx.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.tx.setGasPayment(payments);\n }\n serialize() {\n return this.tx.serialize();\n }\n toJSON() {\n return this.tx.toJSON();\n }\n sign(params: { signer: Keypair; client?: SuiClient; onlyTransactionKind?: boolean }) {\n return this.tx.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.tx.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.tx.getDigest(params);\n }\n add(...args: Parameters<typeof this.tx.add>) {\n return this.tx.add(...args);\n }\n publish({ modules, dependencies }: { modules: number[][] | string[]; dependencies: string[] }) {\n return this.tx.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.tx.upgrade>) {\n return this.tx.upgrade(...args);\n }\n makeMoveVec(...args: Parameters<typeof this.tx.makeMoveVec>) {\n return this.tx.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.tx.transferObjects(\n objects.map((object) => convertObjArg(this.tx, object)),\n convertAddressArg(this.tx, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.tx.splitCoins(convertObjArg(this.tx, coin), convertAmounts(this.tx, amounts));\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.tx, destination);\n const sourceObjects = sources.map((source) => convertObjArg(this.tx, source));\n return this.tx.mergeCoins(destinationObject, sourceObjects);\n }\n\n /**\n * @description Move call\n * @param target `${string}::${string}::${string}`, e.g. `0x3::sui_system::request_add_stake`\n * @param args the arguments of the move call, such as `['0x1', '0x2']`\n * @param typeArgs the type arguments of the move call, such as `['0x2::sui::SUI']`\n */\n moveCall(target: string, args: (SuiTxArg | SuiVecTxArg)[] = [], typeArgs: string[] = []) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex = /(?<package>[a-zA-Z0-9]+)::(?<module>[a-zA-Z0-9_]+)::(?<function>[a-zA-Z0-9_]+)/;\n const match = target.match(regex);\n if (match === null)\n throw new Error('Invalid target format. Expected `${string}::${string}::${string}`');\n const convertedArgs = convertArgs(this.tx, args);\n return this.tx.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs\n });\n }\n\n /* Enhance methods of TransactionBlock */\n\n transferSuiToMany(recipients: SuiAddressArg[], amounts: (SuiTxArg | number | bigint)[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error('transferSuiToMany: recipients.length !== amounts.length');\n }\n const coins = this.tx.splitCoins(\n this.tx.gas,\n amounts.map((amount) =>\n typeof amount === 'number' || typeof amount === 'bigint'\n ? amount\n : convertArgs(this.tx, [amount])[0]\n )\n );\n const recipientObjects = recipients.map((recipient) => convertAddressArg(this.tx, recipient));\n recipientObjects.forEach((address, index) => {\n this.tx.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiTxArg | number | bigint) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiTxArg | number | bigint) {\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.tx.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.tx.splitCoins(mergedCoin, convertAmounts(this.tx, [amount]));\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.tx.splitCoins(this.tx.gas, convertAmounts(this.tx, amounts));\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.tx.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.tx.splitCoins(mergedCoin, convertAmounts(this.tx, amounts));\n return { splitedCoins, mergedCoin };\n }\n\n transferCoinToMany(\n coins: SuiObjectArg[],\n sender: SuiAddressArg,\n recipients: SuiAddressArg[],\n amounts: SuiAmountsArg[]\n ) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error('transferSuiToMany: recipients.length !== amounts.length');\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(coinObjects, amounts);\n const recipientObjects = recipients.map((recipient) => convertAddressArg(this.tx, recipient));\n recipientObjects.forEach((address, index) => {\n this.tx.transferObjects([splitedCoins[index]], address);\n });\n this.tx.transferObjects([mergedCoin], convertAddressArg(this.tx, sender));\n return this;\n }\n\n transferCoin(\n coins: SuiObjectArg[],\n sender: SuiAddressArg,\n recipient: SuiAddressArg,\n amount: SuiAmountsArg\n ) {\n return this.transferCoinToMany(coins, sender, [recipient], [amount]);\n }\n\n stakeSui(amount: SuiTxArg | number | bigint, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.tx.splitCoins(this.tx.gas, convertAmounts(this.tx, [amount]));\n return this.tx.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.tx, [\n this.tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.tx, validatorAddr)\n ])\n });\n }\n}\n","import {\n normalizeSuiObjectId,\n normalizeSuiAddress,\n isValidSuiObjectId,\n isValidSuiAddress\n} from '@mysten/sui/utils';\nimport { Inputs, getPureBcsSchema } from '@mysten/sui/transactions';\nimport { SerializedBcs, bcs, isSerializedBcs } from '@mysten/bcs';\nimport type {\n TransactionArgument,\n Transaction,\n TransactionObjectArgument\n} from '@mysten/sui/transactions';\nimport type {\n SuiObjectArg,\n SuiAddressArg,\n SuiTxArg,\n SuiVecTxArg,\n SuiInputTypes,\n SuiAmountsArg\n} from 'src/types';\n\nexport const getDefaultSuiInputType = (value: SuiTxArg): 'u64' | 'bool' | 'object' | undefined => {\n if (typeof value === 'string' && isValidSuiObjectId(value)) {\n return 'object';\n } else if (typeof value === 'number' || typeof value === 'bigint') {\n return 'u64';\n } else if (typeof value === 'boolean') {\n return 'bool';\n } else {\n return undefined;\n }\n};\n\n/**\n * Since we know the elements in the array are the same type\n * If type is not provided, we will try to infer the type from the first element\n * By default,\n *\n * string is hex and its length equal to 32 =====> object id\n * number, bigint ====> u64\n * boolean =====> bool\n *\n * If type is provided, we will use the type to convert the array\n * @param args\n * @param type 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256' | 'signer' | 'object' | string\n */\nexport function makeVecParam(\n txBlock: Transaction,\n args: SuiTxArg[],\n type?: SuiInputTypes\n): TransactionArgument {\n if (args.length === 0) throw new Error('Transaction builder error: Empty array is not allowed');\n // Using first element value as default type\n const defaultSuiType = getDefaultSuiInputType(args[0]);\n const VECTOR_REGEX = /^vector<(.+)>$/;\n const STRUCT_REGEX = /^([^:]+)::([^:]+)::([^<]+)(<(.+)>)?/;\n\n type = type || defaultSuiType;\n\n if (type === 'object') {\n const elements = args.map((arg) =>\n typeof arg === 'string' && isValidSuiObjectId(arg)\n ? txBlock.object(normalizeSuiObjectId(arg))\n : convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements });\n } else if (typeof type === 'string' && !VECTOR_REGEX.test(type) && !STRUCT_REGEX.test(type)) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) => convertObjArg(txBlock, arg as SuiObjectArg));\n return txBlock.makeMoveVec({ elements, type });\n }\n}\n\n/**\n * Check whether it is an valid move vec input.\n *\n * @param arg The argument to check.\n * @returns boolean.\n */\nexport function isMoveVecArg(arg: SuiTxArg | SuiVecTxArg): arg is SuiVecTxArg {\n if (typeof arg === 'object' && 'vecType' in arg && 'value' in arg) {\n return true;\n } else if (Array.isArray(arg)) {\n return true;\n }\n return false;\n}\n\n/**\n * Convert any valid input into array of TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param args The array of argument to convert.\n * @returns The converted array of TransactionArgument.\n */\nexport function convertArgs(\n txBlock: Transaction,\n args: (SuiTxArg | SuiVecTxArg)[]\n): TransactionArgument[] {\n return args.map((arg) => {\n if (arg instanceof SerializedBcs || isSerializedBcs(arg)) {\n return txBlock.pure(arg);\n }\n\n if (isMoveVecArg(arg)) {\n const vecType = 'vecType' in arg;\n return vecType ? makeVecParam(txBlock, arg.value, arg.vecType) : makeVecParam(txBlock, arg);\n }\n\n return arg;\n });\n}\n\n/**\n * Convert any valid address input into a TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param arg The address argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function convertAddressArg(txBlock: Transaction, arg: SuiAddressArg): TransactionArgument {\n if (typeof arg === 'string' && isValidSuiAddress(arg)) {\n return txBlock.pure.address(normalizeSuiAddress(arg));\n } else {\n return convertArgs(txBlock, [arg])[0];\n }\n}\n\n/**\n * Convert any valid object input into a TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param arg The object argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function convertObjArg(txb: Transaction, arg: SuiObjectArg): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return txb.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return txb.sharedObjectRef(arg);\n }\n\n if ('Object' in arg) {\n if ('ImmOrOwnedObject' in arg.Object) {\n return txb.object(Inputs.ObjectRef(arg.Object.ImmOrOwnedObject));\n } else if ('SharedObject' in arg.Object) {\n return txb.object(Inputs.SharedObjectRef(arg.Object.SharedObject));\n } else {\n throw new Error('Invalid argument type');\n }\n }\n\n if (typeof arg === 'function') {\n return arg;\n }\n\n if ('GasCoin' in arg || 'Input' in arg || 'Result' in arg || 'NestedResult' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(txBlock: Transaction, amounts: SuiAmountsArg[]) {\n return amounts.map((amount) => {\n if (typeof amount === 'number' || typeof amount === 'bigint') {\n return amount;\n } else {\n return convertArgs(txBlock, [amount])[0];\n }\n });\n}\n","import { SuiClient } from '@mysten/sui/client';\nimport type {\n SuiTransactionBlockResponseOptions,\n SuiTransactionBlockResponse,\n SuiObjectDataOptions,\n SuiObjectData\n} from '@mysten/sui/client';\nimport { requestSuiFromFaucetV2, getFaucetHost } from '@mysten/sui/faucet';\n\ninterface DynamicFieldName {\n type: string;\n value: unknown;\n}\nimport { FaucetNetworkType, NetworkType } from '../../types';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\n\n/**\n * `SuiTransactionSender` is used to send transaction with a given gas coin.\n * It always uses the gas coin to pay for the gas,\n * and update the gas coin after the transaction.\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[];\n public currentClient: SuiClient;\n public readonly fullNodes: string[];\n public currentFullNode: string;\n\n public network?: NetworkType;\n\n constructor(fullNodeUrls: string[], network?: NetworkType) {\n if (fullNodeUrls.length === 0) throw new Error('fullNodeUrls must not be empty');\n this.fullNodes = fullNodeUrls;\n this.clients = fullNodeUrls.map((url) => new SuiClient({ url }));\n this.currentFullNode = fullNodeUrls[0];\n this.currentClient = this.clients[0];\n this.network = network;\n }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient = this.clients[(currentClientIdx + 1) % this.clients.length];\n this.currentFullNode = this.fullNodes[(currentClientIdx + 1) % this.clients.length];\n }\n\n async sendTx(\n transactionBlock: Uint8Array | string,\n signature: string | string[]\n ): Promise<SuiTransactionBlockResponse> {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n // const currentProviderIdx = this.providers.indexOf(this.currentProvider);\n // const providers = [\n // ...this.providers.slice(currentProviderIdx, this.providers.length),\n // ...this.providers.slice(0, currentProviderIdx),\n // ]\n\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].executeTransactionBlock({\n transactionBlock,\n signature,\n options: txResOptions\n });\n } catch (err) {\n console.warn(\n `Failed to send transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to send transaction with all fullnodes');\n }\n\n async waitForTransaction({\n digest,\n timeout = 60 * 1000,\n pollInterval = 2 * 1000\n }: {\n digest: string;\n timeout?: number;\n pollInterval?: number;\n }) {\n for (const clientIdx in this.clients) {\n try {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n return await this.clients[clientIdx].waitForTransaction({\n digest,\n timeout,\n pollInterval,\n options: txResOptions\n });\n } catch (err) {\n console.warn(\n `Failed to wait for transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to wait for transaction with all fullnodes');\n }\n\n async getObjects(ids: string[], options?: SuiObjectDataOptions): Promise<SuiObjectData[]> {\n const opts: SuiObjectDataOptions = options ?? {\n showContent: true,\n showDisplay: true,\n showType: true,\n showOwner: true\n };\n\n for (const clientIdx in this.clients) {\n try {\n const objects = await this.clients[clientIdx].multiGetObjects({\n ids,\n options: opts\n });\n const parsedObjects = objects\n .map((object) => {\n return object.data;\n })\n .filter((object) => object !== null && object !== undefined);\n return parsedObjects as SuiObjectData[];\n } catch (err) {\n await delay(2000);\n console.warn(`Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`);\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string) {\n const objects = await this.getObjects([id]);\n return objects[0];\n }\n\n async getDynamicFieldObject(parentId: string, name: DynamicFieldName) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getDynamicFieldObject({\n parentId,\n name\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get DynamicFieldObject with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get DynamicFieldObject with all fullnodes');\n }\n\n async getDynamicFields(parentId: string, cursor?: string, limit?: number) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getDynamicFields({\n parentId,\n cursor,\n limit\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get DynamicFields with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get DynamicFields with all fullnodes');\n }\n\n async getTxDetails(digest: string) {\n for (const clientIdx in this.clients) {\n try {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n return await this.clients[clientIdx].getTransactionBlock({\n digest,\n options: txResOptions\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get TransactionBlocks with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get TransactionBlocks with all fullnodes');\n }\n\n async getOwnedObjects(owner: string, cursor?: string, limit?: number) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getOwnedObjects({\n owner,\n cursor,\n limit\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get OwnedObjects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get OwnedObjects with all fullnodes');\n }\n\n async getNormalizedMoveModulesByPackage(packageId: string) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getNormalizedMoveModulesByPackage({\n package: packageId\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get NormalizedMoveModules with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get NormalizedMoveModules with all fullnodes');\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiOwnedObject | SuiSharedObject)[]) {\n const objectIds = suiObjects.map((obj) => obj.objectId);\n const objects = await this.getObjects(objectIds);\n for (const object of objects) {\n const suiObject = suiObjects.find((obj) => obj.objectId === object?.objectId);\n if (suiObject instanceof SuiSharedObject) {\n if (object.owner && typeof object.owner === 'object' && 'Shared' in object.owner) {\n suiObject.initialSharedVersion = object.owner.Shared.initial_shared_version;\n } else {\n suiObject.initialSharedVersion = undefined;\n }\n } else if (suiObject instanceof SuiOwnedObject) {\n suiObject.version = object?.version;\n suiObject.digest = object?.digest;\n }\n }\n }\n\n /**\n * @description Select coins that add up to the given amount.\n * @param addr the address of the owner\n * @param amount the amount that is needed for the coin\n * @param coinType the coin type, default is '0x2::SUI::SUI'\n */\n async selectCoins(addr: string, amount: number, coinType: string = '0x2::SUI::SUI') {\n const selectedCoins: {\n objectId: string;\n digest: string;\n version: string;\n balance: string;\n }[] = [];\n let totalAmount = 0;\n let hasNext = true,\n nextCursor: string | null | undefined = null;\n while (hasNext && totalAmount < amount) {\n const coins = await this.currentClient.getCoins({\n owner: addr,\n coinType: coinType,\n cursor: nextCursor\n });\n // Sort the coins by balance in descending order\n coins.data.sort((a, b) => parseInt(b.balance) - parseInt(a.balance));\n for (const coinData of coins.data) {\n selectedCoins.push({\n objectId: coinData.coinObjectId,\n digest: coinData.digest,\n version: coinData.version,\n balance: coinData.balance\n });\n totalAmount = totalAmount + parseInt(coinData.balance);\n if (totalAmount >= amount) {\n break;\n }\n }\n\n nextCursor = coins.nextCursor;\n hasNext = coins.hasNextPage;\n }\n\n if (!selectedCoins.length) {\n throw new Error('No valid coins found for the transaction.');\n }\n return selectedCoins;\n }\n\n /**\n * @description Select owned objects with objectType.\n * @param addr the address of the owner\n * @param objectType the coin type, default is '0x2::SUI::SUI'\n */\n async selectObjects(addr: string, objectType: string) {\n const selectedObjects = [];\n let hasNext = true,\n nextCursor: string | null | undefined = null;\n while (hasNext) {\n const ownedObjects = await this.currentClient.getOwnedObjects({\n owner: addr,\n cursor: nextCursor\n });\n\n for (const objectData of ownedObjects.data) {\n const objectDetail = await this.getObject(objectData.data!.objectId);\n if (objectDetail.type === objectType) {\n selectedObjects.push(objectDetail);\n }\n }\n\n nextCursor = ownedObjects.nextCursor;\n hasNext = ownedObjects.hasNextPage;\n }\n\n if (!selectedObjects.length) {\n throw new Error('Not own this object found for the transaction.');\n }\n return selectedObjects;\n }\n\n async requestFaucet(address: string, network: FaucetNetworkType) {\n await requestSuiFromFaucetV2({\n host: getFaucetHost(network),\n recipient: address\n });\n }\n}\n","import type { SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { CallArg } from '@mysten/sui/transactions';\n\nexport class SuiOwnedObject {\n public readonly objectId: string;\n public version?: string;\n public digest?: string;\n\n constructor(param: { objectId: string; version?: string; digest?: string }) {\n this.objectId = param.objectId;\n this.version = param.version;\n this.digest = param.digest;\n }\n\n /**\n * Check if the object is fully initialized.\n * So that when it's used as an input, it won't be necessary to fetch from fullnode again.\n * Which can save time when sending transactions.\n */\n isFullObject(): boolean {\n return !!this.version && !!this.digest;\n }\n\n asCallArg(): CallArg | string {\n if (!this.version || !this.digest) {\n return this.objectId;\n }\n return {\n $kind: 'Object',\n Object: {\n $kind: 'ImmOrOwnedObject',\n ImmOrOwnedObject: {\n objectId: this.objectId,\n version: this.version,\n digest: this.digest\n }\n }\n };\n }\n\n /**\n * Update object version & digest based on the transaction response.\n * @param txResponse\n */\n updateFromTxResponse(txResponse: SuiTransactionBlockResponse) {\n const changes = txResponse.objectChanges;\n if (!changes) {\n throw new Error('Bad transaction response!');\n }\n for (const change of changes) {\n if (change.type === 'mutated' && change.objectId === this.objectId) {\n this.digest = change.digest;\n this.version = change.version;\n return;\n }\n }\n throw new Error('Could not find object in transaction response!');\n }\n}\n","import type { CallArg } from '@mysten/sui/transactions';\n\nexport class SuiSharedObject {\n public readonly objectId: string;\n public initialSharedVersion?: string;\n\n constructor(param: { objectId: string; initialSharedVersion?: string; mutable?: boolean }) {\n this.objectId = param.objectId;\n this.initialSharedVersion = param.initialSharedVersion;\n }\n\n asCallArg(mutable: boolean = false): CallArg | string {\n if (!this.initialSharedVersion) {\n return this.objectId;\n }\n return {\n $kind: 'Object',\n Object: {\n $kind: 'SharedObject',\n SharedObject: {\n objectId: this.objectId,\n initialSharedVersion: this.initialSharedVersion,\n mutable\n }\n }\n };\n }\n}\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { NetworkType } from 'src/types';\n\nexport interface NetworkConfig {\n fullNode: string;\n graphql?: string;\n network: string;\n txExplorer: string;\n accountExplorer: string;\n explorer: string;\n indexerUrl: string;\n channelUrl: string;\n}\n\nexport const getDefaultURL = (networkType: NetworkType = 'testnet'): NetworkConfig => {\n switch (networkType) {\n case 'localnet':\n return {\n fullNode: 'http://127.0.0.1:9000',\n graphql: 'http://127.0.0.1:9125',\n network: 'localnet',\n txExplorer: 'https://explorer.polymedia.app/txblock/:txHash?network=local',\n accountExplorer: 'https://explorer.polymedia.app/address/:address?network=local',\n explorer: 'https://explorer.polymedia.app?network=local',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n };\n case 'devnet':\n return {\n fullNode: 'https://fullnode.devnet.sui.io:443',\n network: 'devnet',\n txExplorer: 'https://suiscan.xyz/devnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/devnet/address/:address',\n explorer: 'https://suiscan.xyz/devnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n };\n case 'testnet':\n return {\n fullNode: 'https://fullnode.testnet.sui.io:443',\n graphql: 'https://sui-testnet.mystenlabs.com/graphql',\n network: 'testnet',\n txExplorer: 'https://suiscan.xyz/testnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/testnet/address/:address',\n explorer: 'https://suiscan.xyz/testnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n };\n case 'mainnet':\n return {\n fullNode: 'https://fullnode.mainnet.sui.io:443',\n graphql: 'https://sui-mainnet.mystenlabs.com/graphql',\n network: 'mainnet',\n txExplorer: 'https://suiscan.xyz/mainnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/mainnet/address/:address',\n explorer: 'https://suiscan.xyz/mainnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n };\n default:\n return {\n fullNode: 'https://fullnode.testnet.sui.io:443',\n graphql: 'https://sui-testnet.mystenlabs.com/graphql',\n network: 'testnet',\n txExplorer: 'https://suiscan.xyz/testnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/testnet/address/:address',\n explorer: 'https://suiscan.xyz/testnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n };\n }\n};\n","import type { SuiMoveNormalizedModules } from '@mysten/sui/client';\nimport type { ContractFactoryParams, SuiMoveMoudleValueType } from './types';\nexport type ApiTypes = 'promise' | 'rxjs';\n\n// export interface ContractQuery {\n// (origin: AccountId | string | Uint8Array, options: ContractOptions, ...params: unknown[]): SuiTransactionBlockResponse<ApiType, ContractCallOutcome>;\n// }\n\n// export type MapMessageQuery<ApiType extends ApiTypes> = Record<string, ContractQuery<ApiType>>;\n\n// // function createQuery <ApiType extends ApiTypes> (meta: AbiMessage, fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult<ApiType, ContractCallOutcome>): ContractQuery<ApiType> {\n// // return withMeta(meta, (origin: string | AccountId | Uint8Array, options: ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome> =>\n// // fn(origin, options, params)\n// // );\n// // }\n\n// export type MapMessageTx<ApiType extends ApiTypes> = Record<string, ContractTx<ApiType>>;\n\n// export interface ContractOptions {\n// gasLimit?: bigint | string | number | BN | WeightV2;\n// storageDepositLimit?: bigint | string | number | BN | null;\n// value?: bigint | BN | string | number;\n// }\n\n// export interface ContractTx {\n// (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType>;\n// }\nexport class SuiContractFactory {\n public packageId: string;\n public metadata: SuiMoveNormalizedModules | undefined;\n // readonly #query: MapMessageQuery<ApiTypes> = {};\n // readonly #tx: MapMessageTx<ApiTypes> = {};\n /**\n * Support the following ways to init the SuiToolkit:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string, when mnemonics is provided, secretKey will be ignored\n */\n constructor({ packageId, metadata }: ContractFactoryParams = {}) {\n // If the mnemonics or secretKey is provided, use it\n // Otherwise, generate a random mnemonics with 24 words\n this.packageId = packageId || '';\n this.metadata = metadata || undefined;\n }\n\n getFuncByModuleName(_moduleName: string) {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`moudle name: ${data.name}`);\n // console.log(data.exposedFunctions)\n Object.entries(data.exposedFunctions).forEach(([key, value]) => {\n console.log(`\\tfunc name: ${key}`);\n Object.values(value.parameters).forEach((_values) => {\n // console.log(values)\n });\n });\n });\n }\n\n getAllFunc() {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`moudle name: ${data.name}`);\n // console.log(data.exposedFunctions)\n Object.entries(data.exposedFunctions).forEach(([key, value]) => {\n console.log(`\\tfunc name: ${key}`);\n console.log(`\\t\\t${value.parameters.length}`);\n Object.values(value.parameters).forEach((values) => {\n // console.log(values)\n console.log(`\\t\\targs: ${values}`);\n });\n });\n });\n }\n\n getAllModule() {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value, index) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`${index}. ${data.name}`);\n });\n }\n\n // async call(arguments: ({\n // kind: \"Input\";\n // index: number;\n // type?: \"object\" | \"pure\" | undefined;\n // value?: any;\n // } | {\n // kind: \"GasCoin\";\n // } | {\n // kind: \"Result\";\n // index: number;\n // } | {\n // kind: \"NestedResult\";\n // index: number;\n // resultIndex: number;\n // })[], derivePathParams?: DerivePathParams) {\n // const tx = new TransactionBlock();\n // tx.moveCall({\n // target: `${this.packageId}::${}::${}`,\n // arguments,\n // })\n // return ;\n // }\n}\n\n// function createTx <ApiType extends ApiTypes> (meta: AbiMessage, fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic<ApiType>): ContractTx<ApiType> {\n// return withMeta(meta, (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType> =>\n// fn(options, params)\n// );\n// }\n","import { MapObjectStruct } from 'src/types';\nimport { fromHex, toHex, bcs } from '@mysten/bcs';\n\nexport const BasicBcsTypes: MapObjectStruct = {\n address: bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n }),\n u8: bcs.u8(),\n u16: bcs.u16(),\n u32: bcs.u32(),\n u64: bcs.u64(),\n u128: bcs.u128(),\n u256: bcs.u256(),\n bool: bcs.bool(),\n '0x1::ascii::String': bcs.string(),\n '0x1::string::String': bcs.string(),\n '0x1::option::Option<address>': bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n ),\n '0x1::option::Option<u8>': bcs.option(bcs.u8()),\n '0x1::option::Option<u16>': bcs.option(bcs.u16()),\n '0x1::option::Option<u32>': bcs.option(bcs.u32()),\n '0x1::option::Option<u64>': bcs.option(bcs.u64()),\n '0x1::option::Option<u128>': bcs.option(bcs.u128()),\n '0x1::option::Option<u256>': bcs.option(bcs.u256()),\n '0x1::option::Option<bool>': bcs.option(bcs.bool()),\n '0x1::option::Option<vector<address>>': bcs.option(\n bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n )\n ),\n '0x1::option::Option<vector<u8>>': bcs.option(bcs.vector(bcs.u8())),\n '0x1::option::Option<vector<u16>>': bcs.option(bcs.vector(bcs.u16())),\n '0x1::option::Option<vector<u32>>': bcs.option(bcs.vector(bcs.u32())),\n '0x1::option::Option<vector<u64>>': bcs.option(bcs.vector(bcs.u64())),\n '0x1::option::Option<vector<u128>>': bcs.option(bcs.vector(bcs.u128())),\n '0x1::option::Option<vector<u256>>': bcs.option(bcs.vector(bcs.u256())),\n '0x1::option::Option<vector<bool>>': bcs.option(bcs.vector(bcs.bool())),\n 'vector<address>': bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n ),\n 'vector<u8>': bcs.vector(bcs.u8()),\n 'vector<u16>': bcs.vector(bcs.u16()),\n 'vector<u32>': bcs.vector(bcs.u32()),\n 'vector<u64>': bcs.vector(bcs.u64()),\n 'vector<u128>': bcs.vector(bcs.u128()),\n 'vector<u256>': bcs.vector(bcs.u256()),\n 'vector<bool>': bcs.vector(bcs.bool()),\n 'vector<vector<address>>': bcs.vector(\n bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n )\n ),\n 'vector<vector<u8>>': bcs.vector(bcs.vector(bcs.u8())),\n 'vector<vector<u16>>': bcs.vector(bcs.vector(bcs.u16())),\n 'vector<vector<u32>>': bcs.vector(bcs.vector(bcs.u32())),\n 'vector<vector<u64>>': bcs.vector(bcs.vector(bcs.u64())),\n 'vector<vector<u128>>': bcs.vector(bcs.vector(bcs.u128())),\n 'vector<vector<u256>>': bcs.vector(bcs.vector(bcs.u256())),\n 'vector<vector<bool>>': bcs.vector(bcs.vector(bcs.bool())),\n '0x2::coin::Coin<T>': bcs.struct('Coin', {\n id: bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n }),\n balance: bcs.struct('Balance', {\n value: bcs.u64()\n })\n }),\n '0x2::balance::Balance<T>': bcs.struct('Balance', {\n value: bcs.u64()\n })\n};\n","import { BasicBcsTypes } from './const';\n\nfunction capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nfunction normalizeHexAddress(input: string): string | null {\n const hexRegex = /^(0x)?[0-9a-fA-F]{64}$/;\n\n if (hexRegex.test(input)) {\n if (input.startsWith('0x')) {\n return input;\n } else {\n return '0x' + input;\n }\n } else {\n return null;\n }\n}\n\nfunction numberToAddressHex(num: number): string {\n const hex = num.toString(16);\n const paddedHex = '0x' + hex.padStart(64, '0');\n return paddedHex;\n}\n\nfunction normalizePackageId(input: string): string {\n const withPrefix = input.startsWith('0x') ? input : '0x' + input;\n const withoutPrefix = withPrefix.slice(2);\n const normalized = withoutPrefix.replace(/^0+/, '');\n return '0x' + normalized;\n}\n\nfunction convertHttpToWebSocket(url: string): string {\n if (url.startsWith('https://')) {\n return url.replace('https://', 'wss://');\n } else if (url.startsWith('http://')) {\n return url.replace('http://', 'ws://');\n }\n return url;\n}\n\nexport {\n BasicBcsTypes,\n capitalizeFirstLetter,\n normalizeHexAddress,\n numberToAddressHex,\n normalizePackageId,\n convertHttpToWebSocket\n};\n","export class ContractDataParsingError extends Error {\n public readonly errorType: string;\n public readonly functionName: string;\n public readonly moduleAddress: string;\n public readonly errorMessage: string;\n\n constructor(dryResult: any) {\n const error = dryResult?.effects?.status?.error || '';\n const functionMatch = error ? error.match(/function_name: Some\\(\"([^\"]+)\"\\)/) : null;\n const moduleMatch = error ? error.match(/address: ([a-fA-F0-9]+)/) : null;\n\n const functionName = functionMatch ? functionMatch[1] : 'unknown';\n const moduleAddress = moduleMatch ? '0x' + moduleMatch[1] : 'unknown';\n const errorMessage = dryResult.error ? dryResult.error : 'UNKNOWN_ERROR';\n\n const message = [\n `\\n- Function: ${functionName}`,\n `- Module Address: ${moduleAddress}`,\n `- Error Message: ${errorMessage}`\n ].join('\\n');\n\n super(message);\n\n this.errorType = 'ContractDataParsingError';\n this.functionName = functionName;\n this.moduleAddress = moduleAddress;\n this.errorMessage = errorMessage;\n }\n}\n","import type {\n SubscribeTableParams,\n GetTableParams,\n SubmitTransactionParams,\n GetNonceParams,\n GetNonceResponse,\n TableEventData,\n ServerEventData,\n SubscriptionOptions,\n DubheChannelConfig\n} from './types';\n\n/**\n * DubheChannel Client\n * Provides methods to interact with Dubhe Channel API:\n * - subscribe_table: Subscribe to table updates via SSE\n * - get_table: Get table data\n * - submit: Submit transaction\n * - nonce: Get nonce for a sender\n */\nexport class DubheChannelClient {\n private baseUrl: string;\n private timeout: number;\n private activeSubscriptions: Map<string, AbortController>;\n\n constructor(config: DubheChannelConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = config.timeout || 30000;\n this.activeSubscriptions = new Map();\n }\n\n /**\n * Update client configuration\n * @param config - Partial configuration to update\n */\n updateConfig(config: Partial<DubheChannelConfig>): void {\n if (config.baseUrl !== undefined) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n }\n if (config.timeout !== undefined) {\n this.timeout = config.timeout;\n }\n }\n\n /**\n * Subscribe to table updates via Server-Sent Events (SSE)\n * @param params - Subscription parameters\n * @param options - Event handlers\n * @returns Unsubscribe function\n */\n async subscribeTable(\n params: SubscribeTableParams,\n options?: SubscriptionOptions\n ): Promise<() => void> {\n const subscriptionKey = this.generateSubscriptionKey(params);\n\n // Check if already subscribed\n if (this.activeSubscriptions.has(subscriptionKey)) {\n throw new Error(`Already subscribed to: ${subscriptionKey}`);\n }\n\n const controller = new AbortController();\n this.activeSubscriptions.set(subscriptionKey, controller);\n\n const url = `${this.baseUrl}/subscribe_table`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream'\n },\n body: JSON.stringify(params),\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Handle SSE stream asynchronously\n const streamPromise = this.handleSSEStream(response.body, options, controller.signal);\n\n // Ensure errors are caught\n streamPromise.catch((error) => {\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n });\n\n options?.onOpen?.();\n } catch (error: any) {\n this.activeSubscriptions.delete(subscriptionKey);\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n throw error;\n }\n\n // Return unsubscribe function\n return () => {\n controller.abort();\n this.activeSubscriptions.delete(subscriptionKey);\n options?.onClose?.();\n };\n }\n\n /**\n * Get table data\n * @param params - Query parameters\n * @returns Table data\n */\n async getTable<T = any>(params: GetTableParams): Promise<T> {\n const url = `${this.baseUrl}/get_table`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to get table data: ${error.message}`);\n }\n }\n\n /**\n * Submit transaction\n * @param params - Transaction parameters\n * @returns Transaction result\n */\n async submit<T = any>(params: SubmitTransactionParams): Promise<T> {\n const url = `${this.baseUrl}/submit`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to submit transaction: ${error.message}`);\n }\n }\n\n /**\n * Get nonce for a sender\n * @param params - Nonce query parameters\n * @returns Nonce response\n */\n async getNonce(params: GetNonceParams): Promise<GetNonceResponse> {\n const url = `${this.baseUrl}/nonce`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to get nonce: ${error.message}`);\n }\n }\n\n /**\n * Unsubscribe from specific subscription\n * @param params - Original subscription parameters\n */\n unsubscribe(params: SubscribeTableParams): void {\n const subscriptionKey = this.generateSubscriptionKey(params);\n const controller = this.activeSubscriptions.get(subscriptionKey);\n\n if (controller) {\n controller.abort();\n this.activeSubscriptions.delete(subscriptionKey);\n }\n }\n\n /**\n * Unsubscribe from all active subscriptions\n */\n unsubscribeAll(): void {\n for (const controller of this.activeSubscriptions.values()) {\n controller.abort();\n }\n this.activeSubscriptions.clear();\n }\n\n /**\n * Get number of active subscriptions\n */\n getActiveSubscriptionCount(): number {\n return this.activeSubscriptions.size;\n }\n\n /**\n * Handle Server-Sent Events stream\n */\n private async handleSSEStream(\n body: ReadableStream<Uint8Array>,\n options?: SubscriptionOptions,\n signal?: AbortSignal\n ): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n\n const result = await reader.read();\n\n if (result.done) {\n options?.onClose?.();\n break;\n }\n\n if (result.value) {\n const chunk = decoder.decode(result.value, { stream: true });\n buffer += chunk;\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n try {\n const data = line.substring(5).trim();\n if (data) {\n const serverData: ServerEventData = JSON.parse(data);\n // Transform server format to client format\n const eventData: TableEventData = {\n dapp_key: serverData.data_key.dapp_key,\n account: serverData.data_key.account,\n table: serverData.data_key.table,\n key: serverData.data_key.key,\n value: serverData.value\n };\n options?.onMessage?.(eventData);\n }\n } catch (error: any) {\n options?.onError?.(new Error(`Failed to parse SSE data: ${error.message}`));\n }\n }\n }\n }\n }\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate unique subscription key\n */\n private generateSubscriptionKey(params: SubscribeTableParams): string {\n const parts = [params.dapp_key];\n if (params.account) parts.push(params.account);\n if (params.table) parts.push(params.table);\n if (params.key) parts.push(JSON.stringify(params.key));\n return parts.join(':');\n }\n}\n","import { MultiSigPublicKey } from '@mysten/sui/multisig';\nimport type { PublicKey } from '@mysten/sui/cryptography';\nimport { ed25519PublicKeyFromBase64 } from './publickey';\n\nexport type PublicKeyWeightPair = {\n publicKey: PublicKey;\n weight: number;\n};\n\nexport class MultiSigClient {\n public readonly pksWeightPairs: PublicKeyWeightPair[];\n public readonly threshold: number;\n public readonly multiSigPublicKey: MultiSigPublicKey;\n constructor(pks: PublicKeyWeightPair[], threshold: number) {\n this.pksWeightPairs = pks;\n this.threshold = threshold;\n this.multiSigPublicKey = MultiSigPublicKey.fromPublicKeys({\n threshold: this.threshold,\n publicKeys: this.pksWeightPairs\n });\n }\n\n static fromRawEd25519PublicKeys(\n rawPublicKeys: string[],\n weights: number[],\n threshold: number\n ): MultiSigClient {\n const pks = rawPublicKeys.map((rawPublicKey, i) => {\n return {\n publicKey: ed25519PublicKeyFromBase64(rawPublicKey),\n weight: weights[i]\n };\n });\n return new MultiSigClient(pks, threshold);\n }\n\n multiSigAddress(): string {\n return this.multiSigPublicKey.toSuiAddress();\n }\n\n combinePartialSigs(sigs: string[]): string {\n return this.multiSigPublicKey.combinePartialSignatures(sigs);\n }\n}\n","import { PublicKey } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { fromB64 } from '@mysten/sui/utils';\n\nexport function ed25519PublicKeyFromBase64(rawPubkey: string): PublicKey {\n let bytes = fromB64(rawPubkey);\n // rawPubkeys should either be 32 bytes or 33 bytes (with the first byte being flag)\n if (bytes.length !== 32 && bytes.length !== 33) throw 'invalid pubkey length';\n bytes = bytes.length === 33 ? bytes.slice(1) : bytes;\n return new Ed25519PublicKey(bytes);\n}\n","import { SuiMoveNormalizedModules } from '@mysten/sui/client';\nimport { getFullnodeUrl } from '@mysten/sui/client';\n\nimport { SuiInteractor } from '../libs/suiInteractor';\nimport { NetworkType } from '../types';\n\nexport async function loadMetadata(\n networkType: NetworkType,\n packageId: string,\n fullnodeUrls?: string[]\n) {\n // Init the rpc provider\n fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType)];\n const suiInteractor = new SuiInteractor(fullnodeUrls);\n if (packageId !== undefined) {\n const jsonData = await suiInteractor.getNormalizedMoveModulesByPackage(packageId);\n\n return jsonData as SuiMoveNormalizedModules;\n } else {\n console.error('please set your package id.');\n }\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_bcs","import_transactions","import_bcs","import_ed25519","genMnemonic","import_transactions","import_utils","import_utils","value","import_bcs","structType","value","keccak256","import_ed25519","import_utils","import_client"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/dubhe.ts","../src/libs/suiAccountManager/index.ts","../src/libs/suiAccountManager/keypair.ts","../src/libs/suiAccountManager/util.ts","../src/libs/suiAccountManager/crypto.ts","../src/libs/suiTxBuilder/index.ts","../src/libs/suiTxBuilder/util.ts","../src/libs/suiInteractor/suiInteractor.ts","../src/libs/suiModel/suiOwnedObject.ts","../src/libs/suiModel/suiSharedObject.ts","../src/libs/suiInteractor/util.ts","../src/libs/suiInteractor/defaultConfig.ts","../src/libs/suiContractFactory/index.ts","../src/utils/const.ts","../src/utils/index.ts","../src/errors/index.ts","../src/libs/dubheChannel/client.ts","../src/libs/multiSig/client.ts","../src/libs/multiSig/publickey.ts","../src/metadata/index.ts"],"sourcesContent":["export * from '@mysten/sui/client';\nexport * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport * from '@mysten/sui/bcs';\nexport * from '@mysten/sui/keypairs/passkey';\nexport * from '@mysten/sui/keypairs/ed25519';\nexport * from '@mysten/sui/keypairs/secp256k1';\nexport * from '@mysten/sui/keypairs/secp256r1';\nexport { bcs, BcsType } from '@mysten/bcs';\nexport { Dubhe } from './dubhe';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTx } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiContractFactory } from './libs/suiContractFactory';\nexport { loadMetadata } from './metadata';\nexport type * from './types';\nexport {\n getDefaultConfig,\n getDefaultURL,\n TESTNET_DUBHE_FRAMEWORK_PACKAGE_ID,\n TESTNET_DUBHE_HUB_OBJECT_ID,\n MAINNET_DUBHE_FRAMEWORK_PACKAGE_ID,\n MAINNET_DUBHE_HUB_OBJECT_ID\n} from './libs/suiInteractor/defaultConfig';\nexport type { NetworkConfig } from './libs/suiInteractor/defaultConfig';\n","import keccak256 from 'keccak256';\nimport { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport { BcsType, fromHex, SerializedBcs, toHex, bcs } from '@mysten/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiMoveNormalizedModules,\n SuiMoveNormalizedType,\n SuiObjectData,\n SuiMoveNormalizedModule\n} from '@mysten/sui/client';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTx } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport { MapObjectStruct, MoveStructType, MoveEnumType } from './types';\nimport { SuiContractFactory } from './libs/suiContractFactory';\nimport { SuiMoveMoudleFuncType } from './libs/suiContractFactory/types';\nimport { getDefaultConfig, NetworkConfig } from './libs/suiInteractor';\nimport {\n ContractQuery,\n ContractTx,\n DerivePathParams,\n FaucetNetworkType,\n MapMoudleFuncQuery,\n MapMoudleFuncTx,\n DubheParams,\n SuiTxArg,\n SuiObjectArg,\n SuiVecTxArg,\n NetworkType\n} from './types';\nimport {\n BasicBcsTypes,\n normalizeDappKey,\n normalizeHexAddress,\n normalizePackageId,\n numberToAddressHex\n} from './utils';\nimport { ContractDataParsingError } from './errors';\nimport { DubheChannelClient } from './libs/dubheChannel';\n\nexport function isUndefined(value?: unknown): value is undefined {\n return value === undefined;\n}\n\nexport function withMeta<T extends { meta: SuiMoveMoudleFuncType }>(\n meta: SuiMoveMoudleFuncType,\n creator: Omit<T, 'meta'>\n): T {\n (creator as T).meta = meta;\n\n return creator as T;\n}\n\nfunction createQuery(\n meta: SuiMoveMoudleFuncType,\n fn: (\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean\n ) => Promise<DevInspectResults | TransactionResult>\n): ContractQuery {\n return withMeta(\n meta,\n async ({\n tx,\n params,\n typeArguments,\n isRaw\n }: {\n tx: Transaction;\n params?: (TransactionArgument | SerializedBcs<any>)[];\n typeArguments?: string[];\n isRaw?: boolean;\n }): Promise<DevInspectResults | TransactionResult> => {\n const result = await fn(tx, params, typeArguments, isRaw);\n return result;\n }\n );\n}\n\nfunction createTx(\n meta: SuiMoveMoudleFuncType,\n fn: (\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean,\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>,\n onError?: (error: Error) => void | Promise<void>\n ) => Promise<SuiTransactionBlockResponse | TransactionResult>\n): ContractTx {\n return withMeta(\n meta,\n async ({\n tx,\n params,\n typeArguments,\n isRaw,\n onSuccess,\n onError\n }: {\n tx: Transaction;\n params?: (TransactionArgument | SerializedBcs<any>)[];\n typeArguments?: string[];\n isRaw?: boolean;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse | TransactionResult> => {\n return await fn(tx, params, typeArguments, isRaw, onSuccess, onError);\n }\n );\n}\n\n/** Sui's well-known shared Clock object ID, available on all networks. */\nconst SUI_CLOCK_OBJECT_ID = '0x0000000000000000000000000000000000000000000000000000000000000006';\n\n/**\n * @class Dubhe\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class Dubhe {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\n public contractFactory: SuiContractFactory;\n public dubheChannelClient: DubheChannelClient;\n\n public packageId: string | undefined;\n /** Fully-qualified Move type string for this DApp's DappKey, e.g. `<64-hex>::dapp_key::DappKey`. */\n public dappKey: string | undefined;\n public metadata: SuiMoveNormalizedModules | undefined;\n public projectName: string | undefined;\n public frameworkPackageId: string | undefined;\n public dappStorageId: string | undefined;\n public dappHubId: string | undefined;\n\n readonly #query: MapMoudleFuncQuery = {};\n readonly #tx: MapMoudleFuncTx = {};\n readonly #object: MapObjectStruct = BasicBcsTypes;\n\n /**\n * Support the following ways to init the DubheClient:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'devnet'\n * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type\n * @param packageId\n * @param metadata\n * @param channelUrl, the base URL for Dubhe Channel API, optional\n * @param frameworkPackageId, the published package ID of the dubhe framework, required for proxy operations\n */\n constructor({\n mnemonics,\n secretKey,\n networkType,\n fullnodeUrls,\n packageId,\n dappKey: dappKeyParam,\n metadata,\n channelUrl,\n frameworkPackageId,\n dappStorageId,\n dappHubId\n }: DubheParams = {}) {\n networkType = networkType ?? 'mainnet';\n\n const defaultParams = getDefaultConfig(networkType);\n\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n // Init the rpc provider\n fullnodeUrls = fullnodeUrls || [defaultParams.fullNode];\n this.suiInteractor = new SuiInteractor(fullnodeUrls, networkType);\n\n // Init the dubhe channel client\n this.dubheChannelClient = new DubheChannelClient({\n baseUrl: channelUrl || defaultParams.channelUrl\n });\n\n this.packageId = packageId ? normalizePackageId(packageId) : undefined;\n // Prefer the explicitly passed dappKey (stable across upgrades); fall back to\n // computing it from packageId (only correct before the first upgrade).\n this.dappKey = dappKeyParam;\n // Prefer the explicitly provided frameworkPackageId; fall back to the\n // well-known constant for the current network (defined for testnet/mainnet).\n const networkDefault = defaultParams.frameworkPackageId;\n this.frameworkPackageId = frameworkPackageId\n ? normalizePackageId(frameworkPackageId)\n : networkDefault\n ? normalizePackageId(networkDefault)\n : undefined;\n this.dappStorageId = dappStorageId;\n this.dappHubId = dappHubId;\n if (metadata !== undefined) {\n this.metadata = metadata as SuiMoveNormalizedModules;\n\n const maxLoopNum = 5;\n let loopNum = 0;\n let stillNeedFormat = true;\n while (stillNeedFormat === true && loopNum <= maxLoopNum) {\n let loopFlag = false;\n Object.values(metadata as SuiMoveNormalizedModules).forEach((moudlevalue) => {\n const data = moudlevalue as SuiMoveNormalizedModule;\n const moduleName = data.name;\n\n const itemModuleName = moduleName;\n if (itemModuleName.endsWith('_genesis')) {\n this.projectName = itemModuleName.replace('_genesis', '');\n }\n\n const objMoudleId = `${this.packageId}::${moduleName}`;\n\n if (data.enums) {\n Object.entries(data.enums).forEach(([enumName, enumType]) => {\n const objectId = `${objMoudleId}::${enumName}`;\n const bcsmeta: MoveEnumType = {\n objectId,\n objectName: enumName,\n objectType: enumType\n };\n // console.log('--------');\n // console.log(JSON.stringify(bcsmeta, null, 2));\n // if (isUndefined(this.#object[objectId])) {\n let bcsObj = this.#bcsenum(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n if (this.#object[objectId] === undefined) {\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`vector<vector<${objectId}>>`] = bcs.vector(bcs.vector(bcsObj.bcs));\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n }\n });\n }\n\n Object.entries(data.structs).forEach(([objectName, objectType]) => {\n const objectId = `${objMoudleId}::${objectName}`;\n const bcsmeta: MoveStructType = {\n objectId,\n objectName,\n objectType\n };\n // if (isUndefined(this.#object[objectId])) {\n let bcsObj = this.#bcs(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n\n this.#object[objectId] = bcsObj.bcs;\n\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n });\n\n Object.entries(data.exposedFunctions).forEach(([funcName, funcvalue]) => {\n const meta = funcvalue as SuiMoveMoudleFuncType;\n meta.moduleName = moduleName;\n meta.funcName = funcName;\n if (isUndefined(this.#query[moduleName])) {\n this.#query[moduleName] = {};\n }\n if (isUndefined(this.#query[moduleName][funcName])) {\n this.#query[moduleName][funcName] = createQuery(meta, (tx, p, typeArguments, isRaw) =>\n this.#read(meta, tx, p, typeArguments, isRaw)\n );\n }\n\n if (isUndefined(this.#tx[moduleName])) {\n this.#tx[moduleName] = {};\n }\n if (isUndefined(this.#tx[moduleName][funcName])) {\n this.#tx[moduleName][funcName] = createTx(\n meta,\n (tx, p, typeArguments, isRaw, onSuccess, onError) =>\n this.#exec(meta, tx, p, typeArguments, isRaw, onSuccess, onError)\n );\n }\n });\n });\n\n stillNeedFormat = loopFlag;\n loopNum++;\n }\n }\n this.contractFactory = new SuiContractFactory({\n packageId: this.packageId,\n metadata\n });\n }\n\n public get query(): MapMoudleFuncQuery {\n return this.#query;\n }\n\n public get tx(): MapMoudleFuncTx {\n return this.#tx;\n }\n\n public get object(): MapObjectStruct {\n return this.#object;\n }\n\n #exec = async (\n meta: SuiMoveMoudleFuncType,\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean,\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>,\n onError?: (error: Error) => void | Promise<void>\n ) => {\n if (isRaw === true) {\n return tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n }\n\n tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n return await this.signAndSendTxn({ tx, onSuccess, onError });\n };\n\n #read = async (\n meta: SuiMoveMoudleFuncType,\n tx: Transaction,\n params?: (TransactionArgument | SerializedBcs<any>)[],\n typeArguments?: string[],\n isRaw?: boolean\n ) => {\n if (isRaw === true) {\n return tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n }\n\n tx.moveCall({\n target: `${this.contractFactory.packageId}::${meta.moduleName}::${meta.funcName}`,\n arguments: params,\n typeArguments\n });\n\n return await this.inspectTxn(tx);\n };\n\n #getVectorDepth = (field: SuiMoveNormalizedType): number => {\n if (typeof field === 'object' && 'Vector' in field) {\n return 1 + this.#getVectorDepth(field.Vector);\n }\n return 0;\n };\n\n #bcs = (bcsmeta: MoveStructType) => {\n let loopFlag = false;\n const bcsJson: Record<string, BcsType<any, any>> = {};\n Object.entries(bcsmeta.objectType.fields).forEach(([_index, type]) => {\n const objName = type.name;\n const objType: SuiMoveNormalizedType = type.type;\n switch (typeof objType) {\n case 'object':\n for (const [key, value] of Object.entries(objType)) {\n switch (key) {\n case 'Struct':\n const structType = value as {\n address: string;\n module: string;\n name: string;\n typeArguments: SuiMoveNormalizedType[];\n };\n if (\n structType.address === '0x1' &&\n structType.module === 'ascii' &&\n structType.name === 'String'\n ) {\n bcsJson[objName] = bcs.string();\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'UID'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'ID'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'bag' &&\n structType.name === 'Bag'\n ) {\n bcsJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x1' &&\n structType.module === 'option' &&\n structType.name === 'Option'\n ) {\n switch (structType.typeArguments[0]) {\n case 'U8':\n bcsJson[objName] = bcs.option(bcs.u8());\n return;\n case 'U16':\n bcsJson[objName] = bcs.option(bcs.u16());\n return;\n case 'U32':\n bcsJson[objName] = bcs.option(bcs.u32());\n return;\n case 'U64':\n bcsJson[objName] = bcs.option(bcs.u64());\n return;\n case 'U128':\n bcsJson[objName] = bcs.option(bcs.u128());\n return;\n case 'U256':\n bcsJson[objName] = bcs.option(bcs.u256());\n return;\n case 'Bool':\n bcsJson[objName] = bcs.option(bcs.bool());\n return;\n case 'Address':\n bcsJson[objName] = bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n } else {\n if (\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ] === undefined\n ) {\n loopFlag = true;\n } else {\n bcsJson[objName] =\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ];\n return;\n }\n }\n return;\n case 'Vector':\n if (typeof value === 'string') {\n switch (value) {\n case 'U8':\n bcsJson[objName] = bcs.vector(bcs.u8());\n return;\n case 'U16':\n bcsJson[objName] = bcs.vector(bcs.u16());\n return;\n case 'U32':\n bcsJson[objName] = bcs.vector(bcs.u32());\n return;\n case 'U64':\n bcsJson[objName] = bcs.vector(bcs.u64());\n return;\n case 'U128':\n bcsJson[objName] = bcs.vector(bcs.u128());\n return;\n case 'U256':\n bcsJson[objName] = bcs.vector(bcs.u256());\n return;\n case 'Bool':\n bcsJson[objName] = bcs.vector(bcs.bool());\n return;\n case 'Address':\n bcsJson[objName] = bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n }\n if (typeof value === 'object') {\n const vectorDepth = this.#getVectorDepth(value);\n let innerType = value;\n for (let i = 0; i < vectorDepth; i++) {\n innerType = innerType.Vector;\n }\n\n // Check if innerType is an object before using 'in' operator\n if (\n typeof innerType === 'object' &&\n innerType !== null &&\n 'Struct' in innerType\n ) {\n const structType = innerType.Struct;\n const structId = `${structType.address}::${structType.module}::${structType.name}`;\n\n let bcsType = this.#object[structId];\n if (!bcsType) {\n loopFlag = true;\n return;\n }\n let baseType = bcsType;\n for (let i = 0; i <= vectorDepth; i++) {\n baseType = bcs.vector(baseType);\n }\n\n bcsJson[objName] = baseType;\n return;\n }\n\n // Handle primitive types in nested vectors\n if (typeof innerType === 'string') {\n let baseType: BcsType<any, any>;\n switch (innerType) {\n case 'U8':\n baseType = bcs.u8();\n break;\n case 'U16':\n baseType = bcs.u16();\n break;\n case 'U32':\n baseType = bcs.u32();\n break;\n case 'U64':\n baseType = bcs.u64();\n break;\n case 'U128':\n baseType = bcs.u128();\n break;\n case 'U256':\n baseType = bcs.u256();\n break;\n case 'Bool':\n baseType = bcs.bool();\n break;\n case 'Address':\n baseType = bcs.bytes(32).transform({\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n break;\n default:\n return; // Unsupported primitive type\n }\n\n // Apply vector wrapping based on depth\n for (let i = 0; i <= vectorDepth; i++) {\n baseType = bcs.vector(baseType);\n }\n\n bcsJson[objName] = baseType;\n return;\n }\n }\n return;\n case 'TypeParameter':\n bcsJson[objName] = bcs.u128();\n return;\n // case 'Reference':\n\n // case 'MutableReference':\n\n default:\n throw new Error('Unsupported type');\n }\n }\n return;\n case 'string':\n switch (objType) {\n case 'U8':\n bcsJson[objName] = bcs.u8();\n return;\n case 'U16':\n bcsJson[objName] = bcs.u16();\n return;\n case 'U32':\n bcsJson[objName] = bcs.u32();\n return;\n case 'U64':\n bcsJson[objName] = bcs.u64();\n return;\n case 'U128':\n bcsJson[objName] = bcs.u128();\n return;\n case 'U256':\n bcsJson[objName] = bcs.u256();\n return;\n case 'Bool':\n bcsJson[objName] = bcs.bool();\n return;\n case 'Address':\n bcsJson[objName] = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n return;\n default:\n return;\n }\n default:\n throw new Error('Unsupported type');\n }\n });\n\n return {\n bcs: bcs.struct(bcsmeta.objectName, bcsJson),\n loopFlag\n };\n };\n\n #bcsenum = (bcsmeta: MoveEnumType) => {\n let loopFlag = false;\n const variantJson: Record<string, BcsType<any, any> | null> = {};\n\n // const databcs = bcs.vector(\n // bcs.struct('Account', {\n // balance: bcs.u64(),\n // status: bcs.enum('AccountStatus', {\n // Liquid: null,\n // Frozen: null,\n // Blocked: null,\n // }),\n // })\n // );\n\n Object.entries(bcsmeta.objectType.variants).forEach(([name, type]) => {\n if (type.length > 0) {\n Object.entries(type).forEach(([_index, value]) => {\n const objType: SuiMoveNormalizedType = value.type;\n const objName = value.name;\n switch (typeof objType) {\n case 'object':\n for (const [key, value] of Object.entries(objType)) {\n switch (key) {\n case 'Struct':\n const structType = value as {\n address: string;\n module: string;\n name: string;\n typeArguments: SuiMoveNormalizedType[];\n };\n if (\n structType.address === '0x1' &&\n structType.module === 'ascii' &&\n structType.name === 'String'\n ) {\n variantJson[objName] = bcs.string();\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'UID'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'object' &&\n structType.name === 'ID'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x2' &&\n structType.module === 'bag' &&\n structType.name === 'Bag'\n ) {\n variantJson[objName] = bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n });\n return;\n } else if (\n structType.address === '0x1' &&\n structType.module === 'option' &&\n structType.name === 'Option'\n ) {\n switch (structType.typeArguments[0]) {\n case 'U8':\n variantJson[objName] = bcs.option(bcs.u8());\n return;\n case 'U16':\n variantJson[objName] = bcs.option(bcs.u16());\n return;\n case 'U32':\n variantJson[objName] = bcs.option(bcs.u32());\n return;\n case 'U64':\n variantJson[objName] = bcs.option(bcs.u64());\n return;\n case 'U128':\n variantJson[objName] = bcs.option(bcs.u128());\n return;\n case 'U256':\n variantJson[objName] = bcs.option(bcs.u256());\n return;\n case 'Bool':\n variantJson[objName] = bcs.option(bcs.bool());\n return;\n case 'Address':\n variantJson[objName] = bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n } else {\n if (\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ] === undefined\n ) {\n loopFlag = true;\n } else {\n variantJson[objName] =\n this.object[\n `${structType.address}::${structType.module}::${structType.name}`\n ];\n return;\n }\n }\n return;\n case 'Vector':\n if (typeof value === 'string') {\n switch (value) {\n case 'U8':\n variantJson[objName] = bcs.vector(bcs.u8());\n return;\n case 'U16':\n variantJson[objName] = bcs.vector(bcs.u16());\n return;\n case 'U32':\n variantJson[objName] = bcs.vector(bcs.u32());\n return;\n case 'U64':\n variantJson[objName] = bcs.vector(bcs.u64());\n return;\n case 'U128':\n variantJson[objName] = bcs.vector(bcs.u128());\n return;\n case 'U256':\n variantJson[objName] = bcs.vector(bcs.u256());\n return;\n case 'Bool':\n variantJson[objName] = bcs.vector(bcs.bool());\n return;\n case 'Address':\n variantJson[objName] = bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n );\n return;\n default:\n // throw new Error('Unsupported type');\n }\n }\n // if (typeof value === 'object') {\n // }\n case 'TypeParameter':\n variantJson[objName] = bcs.u128();\n return;\n // case 'Reference':\n\n // case 'MutableReference':\n\n default:\n throw new Error('Unsupported type');\n }\n }\n return;\n case 'string':\n switch (objType) {\n case 'U8':\n variantJson[objName] = bcs.u8();\n return;\n case 'U16':\n variantJson[objName] = bcs.u16();\n return;\n case 'U32':\n variantJson[objName] = bcs.u32();\n return;\n case 'U64':\n variantJson[objName] = bcs.u64();\n return;\n case 'U128':\n variantJson[objName] = bcs.u128();\n return;\n case 'U256':\n variantJson[objName] = bcs.u256();\n return;\n case 'Bool':\n variantJson[objName] = bcs.bool();\n return;\n case 'Address':\n variantJson[objName] = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n return;\n default:\n return;\n }\n default:\n throw new Error('Unsupported type');\n }\n });\n } else {\n variantJson[name] = null;\n }\n });\n return {\n bcs: bcs.enum(bcsmeta.objectName, variantJson),\n loopFlag\n };\n };\n\n view(dryResult: DevInspectResults) {\n let returnValues = [];\n\n if (dryResult.effects.status.status === 'success') {\n const resultList = dryResult.results![0].returnValues!;\n\n for (const res of resultList) {\n let baseValue = res[0];\n let baseType = res[1];\n const value = Uint8Array.from(baseValue);\n\n const storageValueMatch = baseType.match(/^.*::storage_value::StorageValue<(.+)>$/);\n if (storageValueMatch) {\n const innerType = storageValueMatch[1];\n if (this.#object[innerType]) {\n const storageValueBcs = bcs.struct('StorageValue', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n value: this.#object[innerType]\n })\n )\n });\n returnValues.push(storageValueBcs.parse(value));\n continue;\n }\n }\n\n const storageMapMatch = baseType.match(/^.*::storage_map::StorageMap<(.+)>$/);\n if (storageMapMatch) {\n const innerType = storageMapMatch[1];\n const [keyType, valueType] = innerType.split(',').map((type) => type.trim());\n if (this.#object[keyType] && this.#object[valueType]) {\n const storageMapBcs = bcs.struct('StorageMap', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n key: this.#object[keyType],\n value: this.#object[valueType]\n })\n )\n });\n returnValues.push(storageMapBcs.parse(value));\n continue;\n }\n }\n\n const storageDoubleMapMatch = baseType.match(\n /^.*::storage_double_map::StorageDoubleMap<(.+)>$/\n );\n if (storageDoubleMapMatch) {\n const innerType = storageDoubleMapMatch[1];\n const [key1, key2, valueType] = innerType.split(',').map((type) => type.trim());\n if (this.#object[key1] && this.#object[key2] && this.#object[valueType]) {\n const storageDoubleMapBcs = bcs.struct('StorageDoubleMap', {\n contents: bcs.vector(\n bcs.struct('Entry', {\n key1: this.#object[key1],\n key2: this.#object[key2],\n value: this.#object[valueType]\n })\n )\n });\n returnValues.push(storageDoubleMapBcs.parse(value));\n continue;\n }\n }\n\n if (this.#object[baseType]) {\n // console.log('=========== here');\n // console.log(baseType);\n // console.log(JSON.stringify(this.#object[baseType], null, 2));\n // console.log('-------------');\n returnValues.push(this.#object[baseType].parse(value));\n continue;\n }\n\n const genericMatch = baseType.match(/^([^<]+)<(.+)>$/);\n if (genericMatch) {\n const [_, genericBase, _genericParam] = genericMatch;\n const genericKey = `${genericBase}<T>`;\n\n if (this.#object[genericKey]) {\n returnValues.push(this.#object[genericKey].parse(value));\n continue;\n }\n }\n\n console.log('\\n\\x1b[41m\\x1b[37m ERROR \\x1b[0m \\x1b[31mUnsupported Type\\x1b[0m');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m');\n console.log(`\\x1b[95m•\\x1b[0m Type: \\x1b[33m\"${baseType}\"\\x1b[0m`);\n if (genericMatch) {\n console.log(`\\x1b[95m•\\x1b[0m Generic Base Type: \\x1b[33m\"${genericMatch[1]}<T>\"\\x1b[0m`);\n }\n console.log('\\x1b[95m\\n✨ Available Types:\\x1b[0m');\n Object.keys(this.#object).forEach((type) => {\n console.log(` \\x1b[36m◆\\x1b[0m ${type}`);\n });\n console.log('\\n\\x1b[34m💡 How to Add Custom Type:\\x1b[0m');\n console.log(` You can add custom type by extending the #object map in your code:`);\n console.log(\n ` \\x1b[32mdubhe.object[\"${baseType}\"] = bcs.struct(\"YourTypeName\", {\\n field1: bcs.string(),\\n field2: bcs.u64(),\\n // ... other fields\\n });\\x1b[0m`\n );\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m\\n');\n throw new Error(`Unsupported type: ${baseType}`);\n }\n return returnValues;\n } else {\n throw new ContractDataParsingError(dryResult);\n }\n }\n\n async state({\n tx,\n schema,\n params,\n customModuleName\n }: {\n tx: Transaction;\n schema: string;\n params: any[];\n customModuleName?: string;\n }): Promise<any[] | undefined> {\n if (!this.metadata) {\n throw new Error('Metadata is not loaded');\n }\n\n const moduleName = `${customModuleName ?? this.projectName}_schema`;\n const functionName = `get_${schema}`;\n\n let queryResponse = undefined;\n try {\n queryResponse = (await this.query[moduleName][functionName]({\n tx,\n params\n })) as DevInspectResults;\n\n if (queryResponse.effects.status.status !== 'success') {\n return undefined;\n }\n } catch {\n return undefined;\n }\n return this.view(queryResponse);\n }\n\n async parseState({\n schema,\n objectId,\n storageType,\n params,\n customModuleName\n }: {\n schema: string;\n objectId: string;\n storageType: string; // 'StorageValue<V>' | 'StorageMap<K, V>' | 'StorageDoubleMap<K1, K2, V>'\n params: any[];\n customModuleName?: string;\n }): Promise<any[] | undefined> {\n const tx = new Transaction();\n const schemaObject = tx.object(objectId);\n // Parse storage type\n const storageValueMatch = storageType.match(/^StorageValue<(.+)>$/);\n const storageMapMatch = storageType.match(/^StorageMap<(.+),\\s*(.+)>$/);\n const storageDoubleMapMatch = storageType.match(/^StorageDoubleMap<(.+),\\s*(.+),\\s*(.+)>$/);\n\n let processedParams: (TransactionArgument | SerializedBcs<any>)[] = [schemaObject];\n\n if (storageValueMatch) {\n // StorageValue only needs the object ID\n if (params.length > 0) {\n console.warn(\n 'StorageValue does not require additional parameters. Extra parameters will be ignored.'\n );\n }\n } else if (storageMapMatch) {\n // StorageMap needs one key\n if (params.length !== 1) {\n throw new Error('StorageMap requires exactly one key parameter');\n }\n const keyType = storageMapMatch[1].trim();\n processedParams.push(this.#processKeyParameter(tx, keyType, params[0]));\n } else if (storageDoubleMapMatch) {\n // StorageDoubleMap needs two keys\n if (params.length !== 2) {\n throw new Error('StorageDoubleMap requires exactly two key parameters');\n }\n const key1Type = storageDoubleMapMatch[1].trim();\n const key2Type = storageDoubleMapMatch[2].trim();\n processedParams.push(this.#processKeyParameter(tx, key1Type, params[0]));\n processedParams.push(this.#processKeyParameter(tx, key2Type, params[1]));\n } else {\n throw new Error(\n `Invalid storage type: ${storageType}. Must be StorageValue<V>, StorageMap<K,V>, or StorageDoubleMap<K1,K2,V>`\n );\n }\n return this.state({\n tx,\n schema,\n params: processedParams,\n customModuleName\n });\n }\n\n // async getTransactions({\n // first,\n // after,\n // sender,\n // digest,\n // checkpoint,\n // packageId,\n // module,\n // functionName,\n // orderBy,\n // showEvent,\n // }: {\n // first?: number;\n // after?: string;\n // sender?: string;\n // digest?: string;\n // checkpoint?: number;\n // packageId?: string;\n // module?: string;\n // functionName?: string[];\n // orderBy?: string[];\n // showEvent?: boolean;\n // }): Promise<ConnectionResponse<IndexerTransaction>> {\n // return await this.suiIndexerClient.getTransactions({\n // first,\n // after,\n // sender,\n // digest,\n // checkpoint,\n // packageId,\n // module,\n // functionName,\n // orderBy,\n // showEvent,\n // });\n // }\n\n // async getTransaction(\n // digest: string\n // ): Promise<IndexerTransaction | undefined> {\n // return await this.suiIndexerClient.getTransaction(digest);\n // }\n\n // /**\n // * Wait for the transaction to be processed by the indexer and return all transaction-related data\n // * @param digest transaction digest\n // * @param options option parameters\n // * @returns result object containing transaction, events and schema data\n // */\n // async waitForIndexerTransaction(\n // digest: string,\n // options?: {\n // checkInterval?: number;\n // timeout?: number;\n // maxRetries?: number;\n // pageSize?: number;\n // }\n // ): Promise<IndexerTransactionResult> {\n // const {\n // checkInterval = 100,\n // timeout = 30000,\n // maxRetries = 300,\n // pageSize = 100,\n // } = options ?? {};\n\n // const startTime = Date.now();\n // let retryCount = 0;\n\n // while (retryCount < maxRetries) {\n // try {\n // if (Date.now() - startTime > timeout) {\n // throw new Error(`Waiting for transaction ${digest} timed out`);\n // }\n\n // await new Promise((resolve) => setTimeout(resolve, checkInterval));\n\n // const tx = await this.getTransaction(digest);\n // if (tx) {\n // const events: IndexerEvent[] = [];\n // const schemaChanges: IndexerSchema[] = [];\n\n // let hasNextEventsPage = true;\n // let eventsCursor: string | undefined;\n\n // while (hasNextEventsPage) {\n // const eventsResponse = await this.getEvents({\n // digest,\n // first: pageSize,\n // after: eventsCursor,\n // });\n\n // events.push(...eventsResponse.edges.map((edge) => edge.node));\n\n // hasNextEventsPage = eventsResponse.pageInfo.hasNextPage;\n // eventsCursor = eventsResponse.pageInfo.endCursor;\n // }\n\n // let hasNextSchemasPage = true;\n // let schemasCursor: string | undefined;\n\n // while (hasNextSchemasPage) {\n // const schemasResponse = await this.getStorage({\n // last_update_digest: digest,\n // first: pageSize,\n // after: schemasCursor,\n // });\n\n // schemaChanges.push(...schemasResponse.data);\n\n // hasNextSchemasPage = schemasResponse.pageInfo.hasNextPage;\n // schemasCursor = schemasResponse.pageInfo.endCursor;\n // }\n\n // return {\n // tx,\n // events,\n // schemaChanges,\n // };\n // }\n\n // retryCount++;\n // } catch (error) {\n // throw new Error(\n // `Error while waiting for transaction ${digest}: ${error}`\n // );\n // }\n // }\n\n // throw new Error(\n // `Reached maximum retries (${maxRetries}), failed to wait for transaction ${digest}`\n // );\n // }\n\n // async getEvents({\n // first,\n // after,\n // names,\n // sender,\n // digest,\n // checkpoint,\n // orderBy,\n // }: {\n // first?: number;\n // after?: string;\n // names?: string[];\n // sender?: string;\n // digest?: string;\n // checkpoint?: string;\n // orderBy?: string[];\n // }): Promise<ConnectionResponse<IndexerEvent>> {\n // return await this.suiIndexerClient.getEvents({\n // first,\n // after,\n // names,\n // sender,\n // digest,\n // checkpoint,\n // orderBy,\n // });\n // }\n\n // async getSchemas({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // }: {\n // name?: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // first?: number;\n // after?: string;\n // orderBy?: string[];\n // jsonOrderBy?: JsonPathOrder[];\n // }): Promise<ConnectionResponse<IndexerSchema>> {\n // return await this.suiIndexerClient.getSchemas({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // });\n // }\n\n // async getStorage({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // }: {\n // name?: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // first?: number;\n // after?: string;\n // orderBy?: string[];\n // jsonOrderBy?: JsonPathOrder[];\n // }): Promise<StorageResponse<IndexerSchema>> {\n // return await this.suiIndexerClient.getStorage({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // first,\n // after,\n // orderBy,\n // jsonOrderBy,\n // });\n // }\n\n // async getStorageItem({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // }: {\n // name: string;\n // key1?: any;\n // key2?: any;\n // is_removed?: boolean;\n // last_update_checkpoint?: string;\n // last_update_digest?: string;\n // value?: any;\n // }): Promise<StorageItemResponse<IndexerSchema> | undefined> {\n // const response = await this.suiIndexerClient.getStorageItem({\n // name,\n // key1,\n // key2,\n // is_removed,\n // last_update_checkpoint,\n // last_update_digest,\n // value,\n // });\n // return response;\n // }\n\n // async subscribe({\n // types,\n // handleData,\n // onOpen,\n // onClose,\n // }: {\n // types: SubscribableType[];\n // handleData: (data: any) => void;\n // onOpen?: () => void;\n // onClose?: () => void;\n // }): Promise<WebSocket> {\n // return this.suiIndexerClient.subscribe({\n // types,\n // handleData,\n // onOpen,\n // onClose,\n // });\n // }\n\n #processKeyParameter(tx: Transaction, keyType: string, value: any) {\n // Handle basic types\n switch (keyType.toLowerCase()) {\n case 'u8':\n return tx.pure.u8(value);\n case 'u16':\n return tx.pure.u16(value);\n case 'u32':\n return tx.pure.u32(value);\n case 'u64':\n return tx.pure.u64(value);\n case 'u128':\n return tx.pure.u128(value);\n case 'u256':\n return tx.pure.u256(value);\n case 'bool':\n return tx.pure.bool(value);\n case 'address':\n return tx.pure.address(value);\n default:\n // Check if it's an object type\n if (keyType.includes('::')) {\n // Assuming it's an object ID if the type contains '::'\n return tx.object(value);\n }\n\n // If we reach here, the key type is not supported\n console.log('\\n\\x1b[41m\\x1b[37m ERROR \\x1b[0m \\x1b[31mUnsupported Key Type\\x1b[0m');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m');\n console.log(`\\x1b[95m•\\x1b[0m Type: \\x1b[33m\"${keyType}\"\\x1b[0m`);\n console.log('\\x1b[95m•\\x1b[0m Supported Types:\\x1b[0m');\n console.log(' \\x1b[36m◆\\x1b[0m u8, u16, u32, u64, u128, u256');\n console.log(' \\x1b[36m◆\\x1b[0m bool');\n console.log(' \\x1b[36m◆\\x1b[0m address');\n console.log(' \\x1b[36m◆\\x1b[0m object (format: package::module::type)');\n console.log('\\x1b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\x1b[0m\\n');\n throw new Error(`Unsupported key type: ${keyType}`);\n }\n }\n\n /**\n * else:\n * it will generate signer from the mnemonic with the given derivePathParams.\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getSigner(derivePathParams?: DerivePathParams) {\n return this.accountManager.getKeyPair(derivePathParams);\n }\n\n /**\n * @description Switch the current account with the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n switchAccount(derivePathParams: DerivePathParams) {\n this.accountManager.switchAccount(derivePathParams);\n }\n\n /**\n * @description Get the address of the account for the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getAddress(derivePathParams?: DerivePathParams) {\n return this.accountManager.getAddress(derivePathParams);\n }\n\n currentAddress() {\n return this.accountManager.currentAddress;\n }\n\n getPackageId() {\n return this.contractFactory.packageId;\n }\n\n /**\n * Return the fully-qualified Move type string for this DApp's `DappKey`.\n *\n * The format matches what `std::type_name::get<DappKey>()` returns on-chain:\n * `<64-char-zero-padded-address>::dapp_key::DappKey`\n *\n * Use this whenever you need to pass a type argument or build a `target`\n * string that references the DApp's DappKey type.\n *\n * @example\n * ```typescript\n * tx.moveCall({\n * target: `${frameworkPackageId}::dapp_system::settle_writes`,\n * typeArguments: [contract.getDappKey()],\n * arguments: [...],\n * });\n * ```\n */\n getDappKey() {\n return this.dappKey;\n }\n\n getMetadata() {\n return this.contractFactory.metadata;\n }\n\n getNetwork() {\n return this.suiInteractor.network;\n }\n\n getNetworkConfig(): NetworkConfig {\n return getDefaultConfig(this.getNetwork());\n }\n\n getTxExplorerUrl(txHash: string) {\n return this.getNetworkConfig().txExplorer.replace(':txHash', txHash);\n }\n\n getAccountExplorerUrl(address: string) {\n return this.getNetworkConfig().accountExplorer.replace(':address', address);\n }\n\n getExplorerUrl() {\n return this.getNetworkConfig().explorer;\n }\n\n /**\n * Update configuration dynamically without recreating the entire instance\n * @param config - Partial configuration to update (same type as constructor)\n */\n updateConfig(config: Partial<DubheParams>) {\n // Update account manager if credentials changed\n if (config.secretKey !== undefined || config.mnemonics !== undefined) {\n this.accountManager = new SuiAccountManager({\n mnemonics: config.mnemonics,\n secretKey: config.secretKey\n });\n }\n\n // Update sui interactor if network or fullnode URLs changed\n const networkChanged =\n config.networkType !== undefined && config.networkType !== this.suiInteractor.network;\n const fullnodeUrlsChanged = config.fullnodeUrls !== undefined;\n\n if (networkChanged || fullnodeUrlsChanged) {\n const newNetworkType = config.networkType ?? this.suiInteractor.network;\n const defaultParams = getDefaultConfig(newNetworkType);\n const newFullnodeUrls = config.fullnodeUrls || [defaultParams.fullNode];\n\n this.suiInteractor = new SuiInteractor(newFullnodeUrls, newNetworkType);\n }\n\n // Update dubhe channel client if channelUrl changed\n if (config.channelUrl !== undefined) {\n this.dubheChannelClient.updateConfig({\n baseUrl: config.channelUrl\n });\n }\n\n // Update package ID and metadata, rebuild tx/query builders if needed\n const packageIdChanged = config.packageId !== undefined && config.packageId !== this.packageId;\n const metadataChanged = config.metadata !== undefined && config.metadata !== this.metadata;\n\n // dappKey is independent of packageId — update whenever explicitly provided.\n if (config.dappKey !== undefined) {\n this.dappKey = config.dappKey;\n }\n\n if (packageIdChanged || metadataChanged) {\n // Update packageId\n if (config.packageId !== undefined) {\n this.packageId = normalizePackageId(config.packageId);\n }\n\n // Update metadata and rebuild builders\n if (config.metadata !== undefined) {\n this.metadata = config.metadata as SuiMoveNormalizedModules;\n\n // Clear existing builders and object types\n Object.keys(this.#query).forEach((key) => delete this.#query[key]);\n Object.keys(this.#tx).forEach((key) => delete this.#tx[key]);\n Object.keys(this.#object).forEach((key) => delete this.#object[key]);\n\n // Re-initialize object with BasicBcsTypes\n Object.assign(this.#object, BasicBcsTypes);\n\n // Rebuild builders with new metadata\n const maxLoopNum = 5;\n let loopNum = 0;\n let stillNeedFormat = true;\n\n while (stillNeedFormat === true && loopNum <= maxLoopNum) {\n let loopFlag = false;\n Object.values(this.metadata).forEach((moudlevalue) => {\n const data = moudlevalue as SuiMoveNormalizedModule;\n const moduleName = data.name;\n\n const itemModuleName = moduleName;\n if (itemModuleName.endsWith('_genesis')) {\n this.projectName = itemModuleName.replace('_genesis', '');\n }\n\n const objMoudleId = `${this.packageId}::${moduleName}`;\n\n if (data.enums) {\n Object.entries(data.enums).forEach(([enumName, enumType]) => {\n const objectId = `${objMoudleId}::${enumName}`;\n const bcsmeta: MoveEnumType = {\n objectId,\n objectName: enumName,\n objectType: enumType\n };\n let bcsObj = this.#bcsenum(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n if (this.#object[objectId] === undefined) {\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`vector<vector<${objectId}>>`] = bcs.vector(bcs.vector(bcsObj.bcs));\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n }\n });\n }\n\n Object.entries(data.structs).forEach(([objectName, objectType]) => {\n const objectId = `${objMoudleId}::${objectName}`;\n const bcsmeta: MoveStructType = {\n objectId,\n objectName,\n objectType\n };\n let bcsObj = this.#bcs(bcsmeta);\n if (bcsObj.loopFlag === true) {\n loopFlag = bcsObj.loopFlag;\n }\n\n this.#object[objectId] = bcsObj.bcs;\n this.#object[`vector<${objectId}>`] = bcs.vector(bcsObj.bcs);\n this.#object[`0x1::option::Option<${objectId}>`] = bcs.option(bcsObj.bcs);\n });\n\n Object.entries(data.exposedFunctions).forEach(([funcName, funcvalue]) => {\n const meta = funcvalue as SuiMoveMoudleFuncType;\n meta.moduleName = moduleName;\n meta.funcName = funcName;\n if (isUndefined(this.#query[moduleName])) {\n this.#query[moduleName] = {};\n }\n if (isUndefined(this.#query[moduleName][funcName])) {\n this.#query[moduleName][funcName] = createQuery(\n meta,\n (tx, p, typeArguments, isRaw) => this.#read(meta, tx, p, typeArguments, isRaw)\n );\n }\n\n if (isUndefined(this.#tx[moduleName])) {\n this.#tx[moduleName] = {};\n }\n if (isUndefined(this.#tx[moduleName][funcName])) {\n this.#tx[moduleName][funcName] = createTx(\n meta,\n (tx, p, typeArguments, isRaw, onSuccess, onError) =>\n this.#exec(meta, tx, p, typeArguments, isRaw, onSuccess, onError)\n );\n }\n });\n });\n\n stillNeedFormat = loopFlag;\n loopNum++;\n }\n\n // Rebuild contract factory\n this.contractFactory = new SuiContractFactory({\n packageId: this.packageId,\n metadata: this.metadata\n });\n }\n }\n }\n\n /**\n * Request some SUI from faucet\n * @Returns {Promise<boolean>}, true if the request is successful, false otherwise.\n */\n async requestFaucet(\n address?: string,\n network?: FaucetNetworkType,\n derivePathParams?: DerivePathParams\n ) {\n if (address === undefined) {\n address = this.accountManager.getAddress(derivePathParams);\n }\n if (network === undefined) {\n network = this.getNetwork() as FaucetNetworkType | 'devnet' as FaucetNetworkType;\n }\n // const addr = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.requestFaucet(address, network);\n }\n\n async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n async balanceOf(accountAddress?: string, coinType?: string, derivePathParams?: DerivePathParams) {\n if (accountAddress === undefined) {\n accountAddress = this.accountManager.getAddress(derivePathParams);\n }\n const owner = accountAddress;\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObject(objectId: string) {\n return this.suiInteractor.getObject(objectId);\n }\n\n async getObjects(objectIds: string[]) {\n return this.suiInteractor.getObjects(objectIds);\n }\n\n async signTxn(tx: Uint8Array | Transaction | SuiTx, derivePathParams?: DerivePathParams) {\n if (tx instanceof SuiTx || tx instanceof Transaction) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTx ? tx.tx : tx;\n const txBytes =\n txBlock instanceof Transaction ? await txBlock.build({ client: this.client() }) : txBlock;\n const keyPair = this.getSigner(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }: {\n tx: Uint8Array | Transaction | SuiTx;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n try {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n const result = await this.sendTx(bytes, signature);\n\n if (result.effects?.status.status === 'success') {\n if (onSuccess) {\n await onSuccess(result);\n }\n } else {\n if (onError) {\n await onError(new Error(`Transaction failed: ${result.effects?.status.error}`));\n }\n }\n return result;\n } catch (error) {\n if (onError) {\n await onError(error as Error);\n }\n throw error;\n }\n }\n\n async sendTx(\n transaction: Uint8Array | string,\n signature: string | string[]\n ): Promise<SuiTransactionBlockResponse> {\n return this.suiInteractor.sendTx(transaction, signature);\n }\n\n async waitForTransaction(digest: string) {\n return this.suiInteractor.waitForTransaction({ digest });\n }\n\n async submitToChannel({\n tx,\n nonce,\n chainType\n }: {\n tx: Transaction;\n nonce: number;\n chainType?: string;\n }) {\n const payload = {\n chain: chainType || 'sui',\n sender: this.getAddress(),\n nonce,\n ptb: tx.getData(),\n signature: 'base64_encoded_signature_placeholder'\n };\n return this.dubheChannelClient.submit(payload);\n }\n\n async queryChannelTable({\n packageId,\n account,\n table,\n key\n }: {\n packageId?: string;\n account?: string;\n table: string;\n key: any[];\n }) {\n packageId = packageId || this.packageId;\n account = account || this.getAddress();\n // Remove 0x prefix from account if present (required by the channel server)\n if (account && account.startsWith('0x')) {\n account = account.slice(2);\n }\n const payload = {\n dapp_key: normalizeDappKey(packageId ?? ''),\n account: account,\n table: table,\n key: key\n };\n\n // {\n // \"dapp_key\": \"8041ce715dc516da7e67fcc43c0acc853e8f091dae0fd7b11cc5b071016dd614::dapp_key::DappKey\",\n // \"account\": \"8041ce715dc516da7e67fcc43c0acc853e8f091dae0fd7b11cc5b071016dd614\",\n // \"table\": \"dapp_fee_config\",\n // \"key\": []\n // }\n return this.dubheChannelClient.getTable(payload);\n }\n\n /**\n * Subscribe to channel table updates via Server-Sent Events\n * @param params - Subscription parameters\n * @param options - Event handlers for the subscription\n * @returns Unsubscribe function\n *\n * @example\n * // Subscribe to all tables and accounts (only dapp_key)\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * {},\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to all tables for a specific account\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...' },\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to a specific table for a specific account\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...', table: 'position' },\n * { onMessage: (data) => console.log(data) }\n * );\n *\n * // Subscribe to a specific table, account, and key\n * const unsubscribe = await dubhe.subscribeChannelTable(\n * { account: '0xabc...', table: 'position', key: [] },\n * { onMessage: (data) => console.log(data) }\n * );\n */\n async subscribeChannelTable(\n {\n packageId: _packageId,\n account,\n table,\n key\n }: {\n packageId?: string;\n account?: string;\n table?: string;\n key?: any[];\n } = {},\n options?: {\n onMessage?: (data: any) => void;\n onError?: (error: Error) => void;\n onOpen?: () => void;\n onClose?: () => void;\n }\n ) {\n // Remove 0x prefix from account if present (required by the channel server)\n if (account !== undefined && account.startsWith('0x')) {\n account = account.slice(2);\n }\n\n const payload: any = {\n dapp_key: this.dappKey\n };\n\n // Only include account if specified\n if (account !== undefined) {\n payload.account = account;\n }\n\n // Only include table if specified\n if (table !== undefined) {\n payload.table = table;\n }\n\n // Only include key if specified\n if (key !== undefined) {\n payload.key = key;\n }\n\n return this.dubheChannelClient.subscribeTable(payload, options);\n }\n\n async latestNonce({\n account\n }: {\n account?: string;\n } = {}) {\n account = account || this.getAddress();\n const payload = {\n sender: account\n };\n const response = await this.dubheChannelClient.getNonce(payload);\n return response.nonce;\n }\n\n /**\n * Transfer the given amount of SUI to the recipient\n * @param recipient\n * @param amount\n * @param derivePathParams\n */\n async transferSui(recipient: string, amount: number, derivePathParams?: DerivePathParams) {\n const tx = new SuiTx();\n tx.transferSui(recipient, amount);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Transfer to mutliple recipients\n * @param recipients the recipients addresses\n * @param amounts the amounts of SUI to transfer to each recipient, the length of amounts should be the same as the length of recipients\n * @param derivePathParams\n */\n async transferSuiToMany(\n recipients: string[],\n amounts: number[],\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n tx.transferSuiToMany(recipients, amounts);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Transfer the given amounts of coin to multiple recipients\n * @param recipients the list of recipient address\n * @param amounts the amounts to transfer for each recipient\n * @param coinType any custom coin type but not SUI\n * @param derivePathParams the derive path params for the current signer\n */\n async transferCoinToMany(\n recipients: string[],\n amounts: number[],\n coinType: string,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(owner, totalAmount, coinType);\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany([recipient], [amount], coinType, derivePathParams);\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTx();\n tx.transferObjects(objects, recipient);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const { target, arguments: args = [], typeArguments = [], derivePathParams } = callParams;\n const tx = new SuiTx();\n tx.moveCall(target, args, typeArguments);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Select coins with the given amount and coin type, the total amount is greater than or equal to the given amount\n * @param amount\n * @param coinType\n * @param owner\n */\n async selectCoinsWithAmount(amount: number, coinType: string, owner?: string) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins.map((c) => c.objectId);\n }\n\n async selectObjectsWithType(objectType: string, owner?: string) {\n owner = owner || this.accountManager.currentAddress;\n const objects = await this.suiInteractor.selectObjects(owner, objectType);\n return objects.map((c) => c.objectId);\n }\n\n /**\n * stake the given amount of SUI to the validator\n * @param amount the amount of SUI to stake\n * @param validatorAddr the validator address\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(amount: number, validatorAddr: string, derivePathParams?: DerivePathParams) {\n const tx = new SuiTx();\n tx.stakeSui(amount, validatorAddr);\n return this.signAndSendTxn({ tx, derivePathParams });\n }\n\n /**\n * Execute the transaction with on-chain data but without really submitting. Useful for querying the effects of a transaction.\n * Since the transaction is not submitted, its gas cost is not charged.\n * @param tx the transaction to execute\n * @param derivePathParams the derive path params\n * @returns the effects and events of the transaction, such as object changes, gas cost, event emitted.\n */\n async inspectTxn(\n tx: Uint8Array | Transaction | SuiTx,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTx ? tx.tx : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams)\n });\n }\n\n async getOwnedObjects(owner: string, cursor?: string, limit?: number) {\n const ownedObjects = await this.suiInteractor.getOwnedObjects(owner, cursor, limit);\n const ownedObjectsRes: SuiObjectData[] = [];\n\n for (const object of ownedObjects.data) {\n const objectDetail = await this.getObject(object.data!.objectId);\n if (objectDetail.type!.split('::')[0] === this.contractFactory.packageId) {\n ownedObjectsRes.push(objectDetail);\n }\n }\n\n return ownedObjectsRes;\n }\n\n async entity_key_from_object(objectId: string) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n return objectId;\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_bytes(bytes: Uint8Array | Buffer | string) {\n const hashBytes = keccak256(bytes);\n const hashU8Array: number[] = Array.from(hashBytes);\n const value = Uint8Array.from(hashU8Array);\n const Address = bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n });\n const data = Address.parse(value);\n return '0x' + data;\n }\n\n async entity_key_from_address_with_seed(objectId: string, seed: string) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n const bytes = Buffer.from(objectId.slice(2), 'hex');\n const newBuffer = Buffer.concat([bytes, Buffer.from(seed, 'utf-8')]);\n return this.entity_key_from_bytes(newBuffer);\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_address_with_u256(objectId: string, x: number) {\n const checkObjectId = normalizeHexAddress(objectId);\n if (checkObjectId !== null) {\n objectId = checkObjectId;\n const bytes = Buffer.from(objectId.slice(2), 'hex');\n\n const numberBytes = bcs.u256().serialize(x).toBytes();\n\n return this.entity_key_from_bytes(Buffer.concat([bytes, numberBytes]));\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_u256(x: number) {\n return numberToAddressHex(x);\n }\n\n // ─── UserStorage helpers ────────────────────────────────────────────────────\n\n /**\n * Call the DApp's generated `user_storage_init::init_user_storage` entry function,\n * which creates and shares a `UserStorage` object for the signer.\n *\n * Each DApp exposes this entry point under its own package ID.\n * On Sui, the `UserStorage` object is shared immediately so all transactions\n * can reference it without knowing the object ID in advance.\n *\n * @param dappHubId Object ID of the DappHub shared object\n * @param dappStorageId Object ID of the DApp's DappStorage shared object\n */\n async initUserStorage({\n dappHubId,\n dappStorageId: dappStorageIdParam,\n derivePathParams,\n onSuccess,\n onError\n }: {\n dappHubId: string;\n dappStorageId?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for initUserStorage. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const pkg = this.packageId;\n if (!pkg) throw new Error('packageId is required for initUserStorage.');\n const tx = new Transaction();\n tx.moveCall({\n target: `${pkg}::user_storage_init::init_user_storage`,\n arguments: [tx.object(dappHubId), tx.object(storageId)]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Activate a session key for the signer's `UserStorage`.\n *\n * The signer must be the `canonical_owner` of the `UserStorage` object.\n * Calls `<frameworkPackageId>::dapp_system::activate_session<DappKey>`.\n *\n * @param userStorageId Object ID of the UserStorage to activate a session for\n * @param sessionWallet Sui address of the session wallet\n * @param durationMs Session duration in milliseconds ([60_000, 604_800_000])\n * @param clockObjectId Object ID of the Sui Clock (default: 0x6)\n */\n async activateSession({\n userStorageId,\n sessionWallet,\n durationMs,\n dappHubId: dappHubIdParam,\n clockObjectId,\n derivePathParams,\n onSuccess,\n onError\n }: {\n userStorageId: string;\n sessionWallet: string;\n durationMs: number;\n dappHubId?: string;\n clockObjectId?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for activateSession. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const typeArg = this.dappKey;\n\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for activateSession. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n\n const hubId = dappHubIdParam ?? this.dappHubId;\n if (!hubId) {\n throw new Error(\n 'dappHubId is required for activateSession. ' +\n 'Pass it directly or set it in the Dubhe constructor ({ dappHubId: \"0x...\" }).'\n );\n }\n\n const clockId = clockObjectId ?? SUI_CLOCK_OBJECT_ID;\n const tx = new Transaction();\n tx.moveCall({\n target: `${fwPkg}::dapp_system::activate_session`,\n typeArguments: [typeArg],\n arguments: [\n tx.object(hubId),\n tx.object(userStorageId),\n tx.pure.address(sessionWallet),\n tx.pure.u64(durationMs),\n tx.object(clockId)\n ]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Deactivate the current session key on a `UserStorage`.\n *\n * Allowed callers:\n * - The `canonical_owner` (revoke at any time).\n * - The session key itself (voluntary sign-out).\n * - Anyone, once the session has expired.\n *\n * Calls `<frameworkPackageId>::dapp_system::deactivate_session<DappKey>`.\n *\n * @param userStorageId Object ID of the UserStorage to deactivate the session on\n */\n async deactivateSession({\n userStorageId,\n dappHubId: dappHubIdParam,\n derivePathParams,\n onSuccess,\n onError\n }: {\n userStorageId: string;\n dappHubId?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for deactivateSession. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const typeArg = this.dappKey;\n\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for deactivateSession. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n\n const hubId = dappHubIdParam ?? this.dappHubId;\n if (!hubId) {\n throw new Error(\n 'dappHubId is required for deactivateSession. ' +\n 'Pass it directly or set it in the Dubhe constructor ({ dappHubId: \"0x...\" }).'\n );\n }\n\n const tx = new Transaction();\n tx.moveCall({\n target: `${fwPkg}::dapp_system::deactivate_session`,\n typeArguments: [typeArg],\n arguments: [tx.object(hubId), tx.object(userStorageId)]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Look up the `UserStorage` object ID for the given address in this DApp.\n *\n * Scans the transaction history for `user_storage_init::init_user_storage`\n * calls from the given address and extracts the created `UserStorage` object\n * ID from the transaction's object changes.\n *\n * Returns the object ID on success, or `null` when:\n * - `packageId` or `frameworkPackageId` is not set.\n * - The user has not yet called `initUserStorage`.\n *\n * @param userAddress Sui address to look up (with or without 0x prefix).\n */\n async getUserStorageId(userAddress: string): Promise<string | null> {\n const pkg = this.packageId;\n const fwPkg = this.frameworkPackageId;\n if (!pkg || !fwPkg) return null;\n\n // Normalize to the 0x-prefixed form used in on-chain JSON.\n const normalizedUser = userAddress.startsWith('0x') ? userAddress : `0x${userAddress}`;\n // objectType includes the full framework package address prefix.\n const expectedType = `${fwPkg}::dapp_service::UserStorage`;\n\n let cursor: string | null | undefined = null;\n let hasNextPage = true;\n while (hasNextPage) {\n const result = await this.suiInteractor.currentClient.queryTransactionBlocks({\n filter: {\n MoveFunction: {\n package: pkg,\n module: 'user_storage_init',\n function: 'init_user_storage'\n }\n },\n options: { showObjectChanges: true },\n ...(cursor !== null && cursor !== undefined ? { cursor } : {}),\n limit: 50\n });\n\n for (const tx of result.data) {\n if (!tx.objectChanges) continue;\n // Each SuiObjectChangeCreated carries a `sender` field that equals the\n // transaction sender, which is the canonical_owner of the UserStorage.\n const created = (tx.objectChanges as any[]).find(\n (c: any) =>\n c.type === 'created' &&\n typeof c.objectType === 'string' &&\n c.objectType === expectedType &&\n c.sender === normalizedUser\n );\n if (created?.objectId) return created.objectId as string;\n }\n\n hasNextPage = result.hasNextPage;\n cursor = result.nextCursor ?? null;\n }\n\n return null;\n }\n\n /**\n * Fetch and return the on-chain fields of a `UserStorage` shared object.\n *\n * The returned object mirrors Move's `UserStorage` struct plus two\n * convenience fields computed from the raw counters:\n * - `unsettled_count` = write_count − settled_count\n * - `unsettled_bytes` = write_bytes − settled_bytes\n *\n * @param userStorageId Object ID of the UserStorage to inspect.\n */\n async getUserStorageFields(userStorageId: string): Promise<{\n objectId: string;\n dapp_key: string;\n canonical_owner: string;\n session_key: string;\n session_expires_at: bigint;\n write_count: bigint;\n settled_count: bigint;\n write_bytes: bigint;\n settled_bytes: bigint;\n unsettled_count: bigint;\n unsettled_bytes: bigint;\n }> {\n const obj = await this.suiInteractor.getObject(userStorageId);\n const fields = (obj?.content as any)?.fields ?? {};\n const writeCount = BigInt(fields.write_count ?? 0);\n const settledCount = BigInt(fields.settled_count ?? 0);\n const writeBytes = BigInt(fields.write_bytes ?? 0);\n const settledBytes = BigInt(fields.settled_bytes ?? 0);\n return {\n objectId: userStorageId,\n dapp_key: fields.dapp_key ?? '',\n canonical_owner: fields.canonical_owner ?? '',\n session_key: fields.session_key ?? '',\n session_expires_at: BigInt(fields.session_expires_at ?? 0),\n write_count: writeCount,\n settled_count: settledCount,\n write_bytes: writeBytes,\n settled_bytes: settledBytes,\n unsettled_count: writeCount - settledCount,\n unsettled_bytes: writeBytes - settledBytes\n };\n }\n\n /**\n * Fetch and return the on-chain fields of a `DappStorage` shared object.\n *\n * Covers the full metadata + fee/credit subset of the Move struct.\n *\n * @param dappStorageId Object ID of the DappStorage to inspect.\n */\n /**\n * Read the framework-level fields from the DappHub shared object.\n *\n * Key fields:\n * - `treasury` — address that directly receives framework fee income\n * - `pending_treasury` — queued treasury address during two-step rotation\n * - `framework_admin` — address that can update framework configuration\n * - `version` — current framework version\n */\n async getDappHubFields(dappHubId: string): Promise<{\n objectId: string;\n version: number;\n framework_admin: string;\n treasury: string;\n pending_treasury: string;\n }> {\n const obj = await this.suiInteractor.getObject(dappHubId);\n const fields = (obj?.content as any)?.fields ?? {};\n // fee_config is a nested object; its fields contain treasury etc.\n const feeConfig = fields.fee_config?.fields ?? fields.fee_config ?? {};\n const adminConfig = fields.admin_config?.fields ?? fields.admin_config ?? {};\n return {\n objectId: dappHubId,\n version: Number(fields.version ?? 0),\n framework_admin: adminConfig.admin ?? fields.framework_admin ?? '',\n treasury: feeConfig.treasury ?? fields.treasury ?? '',\n pending_treasury: feeConfig.pending_treasury ?? fields.pending_treasury ?? ''\n };\n }\n\n async getDappStorageFields(dappStorageId: string): Promise<{\n objectId: string;\n dapp_key: string;\n name: string;\n description: string;\n website_url: string;\n admin: string;\n version: number;\n paused: boolean;\n free_credit: bigint;\n free_credit_expires_at: bigint;\n credit_pool: bigint;\n min_credit_to_unsuspend: bigint;\n suspended: boolean;\n total_settled: bigint;\n base_fee_per_write: bigint;\n bytes_fee_per_byte: bigint;\n /**\n * Settlement mode: 0 = DAPP_SUBSIDIZES (operator pays from credit_pool),\n * 1 = USER_PAYS (user provides Coin via settle_writes_user_pays).\n * Only `settle_writes` (no-coin variant) is safe to auto-call in mode 0.\n */\n settlement_mode: number;\n /**\n * BPS (0-10000) of each write-fee payment that flows into the DApp's\n * revenue pool. The remainder goes to the framework treasury.\n * Set exclusively by the framework admin via set_dapp_write_fee_share.\n * Default: 0 (100% to framework treasury).\n */\n write_fee_dapp_share_bps: number;\n }> {\n const obj = await this.suiInteractor.getObject(dappStorageId);\n const fields = (obj?.content as any)?.fields ?? {};\n return {\n objectId: dappStorageId,\n dapp_key: fields.dapp_key ?? '',\n name: fields.name ?? '',\n description: fields.description ?? '',\n website_url: fields.website_url ?? '',\n admin: fields.admin ?? '',\n version: Number(fields.version ?? 0),\n paused: Boolean(fields.paused),\n free_credit: BigInt(fields.free_credit ?? 0),\n free_credit_expires_at: BigInt(fields.free_credit_expires_at ?? 0),\n credit_pool: BigInt(fields.credit_pool ?? 0),\n min_credit_to_unsuspend: BigInt(fields.min_credit_to_unsuspend ?? 0),\n suspended: Boolean(fields.suspended),\n total_settled: BigInt(fields.total_settled ?? 0),\n base_fee_per_write: BigInt(fields.base_fee_per_write ?? 0),\n bytes_fee_per_byte: BigInt(fields.bytes_fee_per_byte ?? 0),\n settlement_mode: Number(fields.settlement_mode ?? 0),\n write_fee_dapp_share_bps: Number(fields.write_fee_dapp_share_bps ?? 0)\n };\n }\n\n /**\n * Append a `dapp_system::settle_writes` moveCall to an existing PTB.\n *\n * Does NOT send the transaction — call this before your own moveCall(s) to\n * settle any accumulated write debt within the same PTB at no extra round-trip.\n *\n * The framework function never aborts due to insufficient credit (it silently\n * skips or partially settles), so prepending this to any PTB is always safe.\n *\n * @param tx The Transaction object to append the moveCall to.\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage (falls back to constructor value).\n * @param userStorageId Object ID of the user's UserStorage shared object.\n */\n buildSettleWritesTx(\n tx: Transaction,\n {\n dappHubId,\n dappStorageId: dappStorageIdParam,\n userStorageId\n }: { dappHubId: string; dappStorageId?: string; userStorageId: string }\n ): void {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for buildSettleWritesTx. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for buildSettleWritesTx. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const typeArg = this.dappKey;\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for buildSettleWritesTx. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n tx.moveCall({\n target: `${fwPkg}::dapp_system::settle_writes`,\n typeArguments: [typeArg],\n arguments: [tx.object(dappHubId), tx.object(storageId), tx.object(userStorageId)]\n });\n }\n\n /**\n * Settle accumulated write debt for a user (standalone transaction).\n *\n * Builds a PTB containing a single `dapp_system::settle_writes` call and\n * sends it. For embedding settlement into an existing PTB, use\n * `buildSettleWritesTx` instead.\n *\n * This is safe to call at any time — the framework function never aborts\n * due to insufficient credit; it silently skips or partially settles.\n *\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage shared object.\n * @param userStorageId Object ID of the user's UserStorage shared object.\n */\n async settleWrites({\n dappHubId,\n dappStorageId,\n userStorageId,\n derivePathParams,\n onSuccess,\n onError\n }: {\n dappHubId: string;\n dappStorageId?: string;\n userStorageId: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const tx = new Transaction();\n this.buildSettleWritesTx(tx, { dappHubId, dappStorageId, userStorageId });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Recharge a DApp's credit pool by paying with the framework's accepted coin type.\n *\n * Wraps `dapp_system::recharge_credit<DappKey, CoinType>`. Any account may call\n * this — no admin restriction. Payment is forwarded to the framework treasury and\n * the DApp's `credit_pool` is increased by the coin value.\n *\n * Only valid in DAPP_SUBSIDIZES settlement mode. Aborts with\n * `wrong_settlement_mode` if the DApp is in USER_PAYS mode.\n *\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage shared object.\n * @param coinObjectId Object ID of the Coin to use as payment.\n * @param coinType Move type of the coin (default: \"0x2::sui::SUI\").\n */\n async rechargeCredit({\n dappHubId,\n dappStorageId: dappStorageIdParam,\n coinObjectId,\n coinType = '0x2::sui::SUI',\n derivePathParams,\n onSuccess,\n onError\n }: {\n dappHubId: string;\n dappStorageId?: string;\n coinObjectId: string;\n coinType?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for rechargeCredit. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for rechargeCredit. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const typeArg = this.dappKey;\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for rechargeCredit. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n const tx = new Transaction();\n tx.moveCall({\n target: `${fwPkg}::dapp_system::recharge_credit`,\n typeArguments: [typeArg, coinType],\n arguments: [tx.object(dappHubId), tx.object(storageId), tx.object(coinObjectId)]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Append a `dapp_system::settle_writes_user_pays` moveCall to an existing PTB.\n *\n * Splits `maxPaymentMist` MIST from `tx.gas` as the payment coin, then calls\n * `settle_writes_user_pays`. The framework returns any overpayment automatically,\n * so it is safe to over-estimate. This lets a session key pay for settlement\n * inline without requiring a separate owned Coin object.\n *\n * @param tx The Transaction object to append the moveCall to.\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage (falls back to constructor value).\n * @param userStorageId Object ID of the user's UserStorage shared object.\n * @param maxPaymentMist Upper bound for the payment in MIST (default: 50_000_000 = 0.05 SUI).\n * @param coinType Move type of the payment coin (default: \"0x2::sui::SUI\").\n */\n buildSettleWritesUserPaysTx(\n tx: Transaction,\n {\n dappHubId,\n dappStorageId: dappStorageIdParam,\n userStorageId,\n maxPaymentMist = 50_000_000n,\n coinType = '0x2::sui::SUI'\n }: {\n dappHubId: string;\n dappStorageId?: string;\n userStorageId: string;\n maxPaymentMist?: bigint;\n coinType?: string;\n }\n ): void {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for buildSettleWritesUserPaysTx. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for buildSettleWritesUserPaysTx. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const typeArg = this.dappKey;\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for buildSettleWritesUserPaysTx. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n // Split payment from the PTB's gas coin — no separate Coin object needed.\n const [paymentCoin] = tx.splitCoins(tx.gas, [tx.pure.u64(maxPaymentMist)]);\n // settle_writes_user_pays returns the change Coin (overpayment refund).\n // Coin<T> has no `drop` ability, so the returned value MUST be consumed.\n // Merge it back into tx.gas — it belongs to whoever is paying (the signer).\n const changeCoin = tx.moveCall({\n target: `${fwPkg}::dapp_system::settle_writes_user_pays`,\n typeArguments: [typeArg, coinType],\n arguments: [tx.object(dappHubId), tx.object(storageId), tx.object(userStorageId), paymentCoin]\n });\n tx.mergeCoins(tx.gas, [changeCoin]);\n }\n\n /**\n * Settle accumulated write debt where the user pays directly (USER_PAYS mode).\n *\n * Wraps `dapp_system::settle_writes_user_pays<DappKey, CoinType>`. The exact\n * cost is computed on-chain; any overpayment from the coin is returned to the\n * sender after settlement.\n *\n * Aborts if:\n * - The DApp is not in USER_PAYS mode (`wrong_settlement_mode`)\n * - The coin type does not match the accepted type (`wrong_payment_coin_type`)\n * - The coin value is less than the total cost (`insufficient_credit`)\n *\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage shared object.\n * @param userStorageId Object ID of the user's UserStorage shared object.\n * @param coinObjectId Object ID of the Coin to use as payment.\n * @param coinType Move type of the coin (default: \"0x2::sui::SUI\").\n */\n async settleWritesUserPays({\n dappHubId,\n dappStorageId: dappStorageIdParam,\n userStorageId,\n coinObjectId,\n coinType = '0x2::sui::SUI',\n derivePathParams,\n onSuccess,\n onError\n }: {\n dappHubId: string;\n dappStorageId?: string;\n userStorageId: string;\n coinObjectId: string;\n coinType?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for settleWritesUserPays. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for settleWritesUserPays. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const typeArg = this.dappKey;\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for settleWritesUserPays. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n const tx = new Transaction();\n tx.moveCall({\n target: `${fwPkg}::dapp_system::settle_writes_user_pays`,\n typeArguments: [typeArg, coinType],\n arguments: [\n tx.object(dappHubId),\n tx.object(storageId),\n tx.object(userStorageId),\n tx.object(coinObjectId)\n ]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Query `WritesSettled` events from the Sui full node.\n *\n * Returns the most recent settlement events across ALL users of this DApp.\n * Each event captures one user's write debt settlement: number of writes,\n * bytes, and the amount charged (`paid_cost`).\n *\n * Note: Sui full nodes may prune old events. For long-term history use a\n * dedicated indexer table (`writes_settled_history`).\n *\n * @param limit Max events to return (default: 30, max: 50).\n * @param cursor Pagination cursor from a previous response.\n */\n async queryWritesSettledEvents(\n limit = 30,\n cursor?: { txDigest: string; eventSeq: string }\n ): Promise<\n Array<{\n txDigest: string;\n eventSeq: string;\n timestampMs: number;\n dappKey: string;\n account: string;\n writes: number;\n bytes: string;\n freeCost: string;\n paidCost: string;\n }>\n > {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) return [];\n try {\n const resp = await this.suiInteractor.currentClient.queryEvents({\n query: { MoveEventType: `${fwPkg}::dubhe_events::WritesSettled` },\n cursor,\n limit: Math.min(limit, 50),\n order: 'descending'\n });\n return (resp.data ?? []).map((ev: any) => {\n const p = ev.parsedJson ?? {};\n return {\n txDigest: ev.id?.txDigest ?? '',\n eventSeq: ev.id?.eventSeq ?? '',\n timestampMs: Number(ev.timestampMs ?? 0),\n dappKey: p.dapp_key ?? '',\n account: p.account ?? '',\n writes: Number(p.writes ?? 0),\n bytes: String(p.bytes ?? '0'),\n freeCost: String(p.free_cost ?? '0'),\n paidCost: String(p.paid_cost ?? '0')\n };\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Query `MarketplaceFeeSettled` events from the Sui full node.\n *\n * Each event records the fee split for a completed marketplace purchase:\n * total fee, framework treasury share, and DApp revenue share.\n *\n * @param limit Max events to return (default: 30, max: 50).\n * @param cursor Pagination cursor from a previous response.\n */\n async queryMarketplaceFeeSettledEvents(\n limit = 30,\n cursor?: { txDigest: string; eventSeq: string }\n ): Promise<\n Array<{\n txDigest: string;\n eventSeq: string;\n timestampMs: number;\n dappKey: string;\n listingId: string;\n coinType: string;\n totalFee: string;\n treasuryAmount: string;\n dappAmount: string;\n }>\n > {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) return [];\n try {\n const resp = await this.suiInteractor.currentClient.queryEvents({\n query: { MoveEventType: `${fwPkg}::dubhe_events::MarketplaceFeeSettled` },\n cursor,\n limit: Math.min(limit, 50),\n order: 'descending'\n });\n return (resp.data ?? []).map((ev: any) => {\n const p = ev.parsedJson ?? {};\n return {\n txDigest: ev.id?.txDigest ?? '',\n eventSeq: ev.id?.eventSeq ?? '',\n timestampMs: Number(ev.timestampMs ?? 0),\n dappKey: p.dapp_key ?? '',\n listingId: p.listing_id ?? '',\n coinType: p.coin_type ?? '',\n totalFee: String(p.total_fee ?? '0'),\n treasuryAmount: String(p.treasury_amount ?? '0'),\n dappAmount: String(p.dapp_amount ?? '0')\n };\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Read the DApp's accumulated revenue balance directly from the chain.\n *\n * `dapp_revenue` is stored as a dynamic field (`DappRevenueKey<CoinType>`)\n * on the DappStorage object — it is NOT a top-level field, so `getObject`\n * alone cannot return it. This method calls `getDynamicFields` to locate\n * the correct child object and returns its balance.\n *\n * Returns 0n when the dynamic field has never been created (no revenue yet).\n *\n * @param dappStorageId Object ID of the DApp's DappStorage shared object.\n * @param coinType Move type of the revenue coin (default: \"0x2::sui::SUI\").\n */\n async getDappRevenueBalance(dappStorageId: string, coinType = '0x2::sui::SUI'): Promise<bigint> {\n const client = this.suiInteractor.currentClient;\n // Normalise coinType to the bare module::name part for matching\n const coinTail = coinType.split('::').slice(-2).join('::'); // e.g. \"sui::SUI\"\n try {\n let cursor: string | null | undefined = undefined;\n do {\n const page = await client.getDynamicFields({\n parentId: dappStorageId,\n cursor,\n limit: 50\n });\n for (const field of page.data) {\n // The dynamic field type contains DappRevenueKey and the coin type\n const nameType: string = field.name?.type ?? '';\n if (nameType.includes('DappRevenueKey') && nameType.includes(coinTail)) {\n const fieldObj = await client.getDynamicFieldObject({\n parentId: dappStorageId,\n name: field.name\n });\n const innerFields = (fieldObj?.data?.content as any)?.fields ?? {};\n // Balance<T> is stored as { value: u64 }\n const balValue =\n innerFields?.value?.fields?.value ?? // nested Balance struct\n innerFields?.value ??\n 0;\n return BigInt(balValue);\n }\n }\n cursor = page.nextCursor;\n if (!page.hasNextPage) break;\n } while (cursor);\n } catch {\n // best-effort; return 0 on any RPC error\n }\n return 0n;\n }\n\n /**\n * Withdraw all accumulated DApp revenue to the DApp admin address.\n *\n * Wraps `dapp_system::withdraw_dapp_revenue<DappKey, CoinType>`.\n * The entire revenue balance is transferred to the DApp admin on-chain.\n * Aborts if the balance is zero (`no_revenue_to_withdraw`).\n *\n * @param dappHubId Object ID of the DappHub shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage shared object.\n * @param coinType Move type of the revenue coin (default: \"0x2::sui::SUI\").\n */\n async withdrawDappRevenue({\n dappHubId,\n dappStorageId: dappStorageIdParam,\n coinType = '0x2::sui::SUI',\n derivePathParams,\n onSuccess,\n onError\n }: {\n dappHubId: string;\n dappStorageId?: string;\n coinType?: string;\n derivePathParams?: DerivePathParams;\n onSuccess?: (result: SuiTransactionBlockResponse) => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n }): Promise<SuiTransactionBlockResponse> {\n const fwPkg = this.frameworkPackageId;\n if (!fwPkg) {\n throw new Error(\n 'frameworkPackageId is required for withdrawDappRevenue. ' +\n 'Set it in the Dubhe constructor ({ frameworkPackageId: \"0x...\" }).'\n );\n }\n const storageId = dappStorageIdParam ?? this.dappStorageId;\n if (!storageId) {\n throw new Error(\n 'dappStorageId is required for withdrawDappRevenue. ' +\n 'Pass it directly or set it in the Dubhe constructor.'\n );\n }\n const typeArg = this.dappKey;\n if (!typeArg) {\n throw new Error(\n 'dappKey is required for withdrawDappRevenue. ' +\n 'Set it in the Dubhe constructor ({ packageId: \"0x...\" }).'\n );\n }\n const tx = new Transaction();\n tx.moveCall({\n target: `${fwPkg}::dapp_system::withdraw_dapp_revenue`,\n typeArguments: [typeArg, coinType],\n arguments: [tx.object(dappHubId), tx.object(storageId)]\n });\n return this.signAndSendTxn({\n tx,\n derivePathParams,\n onSuccess,\n onError\n }) as Promise<SuiTransactionBlockResponse>;\n }\n\n /**\n * Return a combined settlement health snapshot for a user.\n *\n * Fetches `UserStorage` fields (always) and optionally `DappStorage` fields\n * (when `dappStorageId` is supplied) to produce high-level diagnostic values:\n *\n * - `utilizationPct` — how close the user is to the 2 000-write hard limit\n * - `isAtRisk` — utilization >= 80 % (settlement recommended soon)\n * - `isBlocked` — utilization >= 100 % (writes will be rejected)\n * - `estimatedWritesAffordable` — writes the credit pool can still cover\n * - `creditAtRisk` — fewer than 500 writes of credit remaining\n *\n * @param userStorageId Object ID of the user's UserStorage shared object.\n * @param dappStorageId Object ID of the DApp's DappStorage (optional).\n */\n async getSettlementHealth({\n userStorageId,\n dappStorageId\n }: {\n userStorageId: string;\n dappStorageId?: string;\n }): Promise<{\n unsettledCount: bigint;\n writeLimit: bigint;\n utilizationPct: number;\n isAtRisk: boolean;\n isBlocked: boolean;\n creditPool?: bigint;\n baseFeePerWrite?: bigint;\n estimatedWritesAffordable?: bigint;\n creditAtRisk?: boolean;\n }> {\n const WRITE_LIMIT = 2000n;\n const userFields = await this.getUserStorageFields(userStorageId);\n const unsettledCount = userFields.unsettled_count;\n const utilizationPct = Number((unsettledCount * 100n) / WRITE_LIMIT);\n\n const result: {\n unsettledCount: bigint;\n writeLimit: bigint;\n utilizationPct: number;\n isAtRisk: boolean;\n isBlocked: boolean;\n creditPool?: bigint;\n baseFeePerWrite?: bigint;\n estimatedWritesAffordable?: bigint;\n creditAtRisk?: boolean;\n } = {\n unsettledCount,\n writeLimit: WRITE_LIMIT,\n utilizationPct,\n isAtRisk: utilizationPct >= 80,\n isBlocked: utilizationPct >= 100\n };\n\n if (dappStorageId) {\n const dappFields = await this.getDappStorageFields(dappStorageId);\n const creditPool = dappFields.credit_pool;\n const baseFeePerWrite = dappFields.base_fee_per_write;\n const estimatedWritesAffordable =\n baseFeePerWrite > 0n ? creditPool / baseFeePerWrite : BigInt(Number.MAX_SAFE_INTEGER);\n\n result.creditPool = creditPool;\n result.baseFeePerWrite = baseFeePerWrite;\n result.estimatedWritesAffordable = estimatedWritesAffordable;\n result.creditAtRisk = estimatedWritesAffordable < 500n;\n }\n\n return result;\n }\n\n // ─── Private helpers ─────────────────────────────────────────────────────────\n\n /**\n * Return the default network configuration for the given network type.\n *\n * Useful for reading `frameworkPackageId` without instantiating a full client:\n *\n * ```ts\n * const { frameworkPackageId } = Dubhe.getDefaultConfig('testnet');\n * // → '0x8817b...' (known constant for testnet/mainnet)\n * // → undefined (for localnet/devnet — supply after local deployment)\n * ```\n */\n static getDefaultConfig(networkType: NetworkType): NetworkConfig {\n return getDefaultConfig(networkType);\n }\n\n // async formatData(type: string, value: Buffer | number[] | Uint8Array) {\n // const u8Value = Uint8Array.from(value);\n // return bcs.de(type, u8Value);\n // }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { getKeyPair } from './keypair';\nimport { hexOrBase64ToUint8Array, normalizePrivateKey } from './util';\nimport { generateMnemonic } from './crypto';\nimport type { AccountMangerParams, DerivePathParams } from 'src/types';\nimport { SUI_PRIVATE_KEY_PREFIX, decodeSuiPrivateKey } from '@mysten/sui/cryptography';\n\nexport class SuiAccountManager {\n private mnemonics: string;\n private secretKey: string;\n public currentKeyPair: Ed25519Keypair;\n public currentAddress: string;\n\n /**\n * Support the following ways to init the SuiToolkit:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string or Bech32 string, when mnemonics is provided, secretKey will be ignored\n */\n constructor({ mnemonics, secretKey }: AccountMangerParams = {}) {\n // If the mnemonics or secretKey is provided, use it\n // Otherwise, generate a random mnemonics with 24 words\n this.mnemonics = mnemonics || '';\n this.secretKey = secretKey || '';\n if (!this.mnemonics && !this.secretKey) {\n this.mnemonics = generateMnemonic(24);\n }\n\n // Init the current account\n this.currentKeyPair = this.secretKey\n ? this.parseSecretKey(this.secretKey)\n : getKeyPair(this.mnemonics);\n this.currentAddress = this.currentKeyPair.getPublicKey().toSuiAddress();\n }\n\n /**\n * Check if the secretKey starts with bench32 format\n */\n parseSecretKey(secretKey: string) {\n if (secretKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n const { secretKey: uint8ArraySecretKey } = decodeSuiPrivateKey(secretKey);\n return Ed25519Keypair.fromSecretKey(normalizePrivateKey(uint8ArraySecretKey));\n }\n\n return Ed25519Keypair.fromSecretKey(normalizePrivateKey(hexOrBase64ToUint8Array(secretKey)));\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the currentKeyPair.\n * else:\n * it will generate keyPair from the mnemonic with the given derivePathParams.\n */\n getKeyPair(derivePathParams?: DerivePathParams) {\n if (!derivePathParams || !this.mnemonics) return this.currentKeyPair;\n return getKeyPair(this.mnemonics, derivePathParams);\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the currentAddress.\n * else:\n * it will generate address from the mnemonic with the given derivePathParams.\n */\n getAddress(derivePathParams?: DerivePathParams) {\n if (!derivePathParams || !this.mnemonics) return this.currentAddress;\n return getKeyPair(this.mnemonics, derivePathParams).getPublicKey().toSuiAddress();\n }\n\n /**\n * Switch the current account with the given derivePathParams.\n * This is only useful when the mnemonics is provided. For secretKey mode, it will always use the same account.\n */\n switchAccount(derivePathParams: DerivePathParams) {\n if (this.mnemonics) {\n this.currentKeyPair = getKeyPair(this.mnemonics, derivePathParams);\n this.currentAddress = this.currentKeyPair.getPublicKey().toSuiAddress();\n }\n }\n}\n","import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport type { DerivePathParams } from '../../types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (derivePathParams: DerivePathParams = {}) => {\n const { accountIndex = 0, isExternal = false, addressIndex = 0 } = derivePathParams;\n return `m/44'/784'/${accountIndex}'/${isExternal ? 1 : 0}'/${addressIndex}'`;\n};\n\n/**\n * the format is m/44'/784'/accountIndex'/${isExternal ? 1 : 0}'/addressIndex'\n *\n * accountIndex is the index of the account, default is 0.\n *\n * isExternal is the type of the address, default is false. Usually, the external address is used to receive coins. The internal address is used to change coins.\n *\n * addressIndex is the index of the address, default is 0. It's used to generate multiple addresses for one account.\n *\n * @description Get keypair from mnemonics and derive path\n * @param mnemonics\n * @param derivePathParams\n */\nexport const getKeyPair = (mnemonics: string, derivePathParams: DerivePathParams = {}) => {\n const derivePath = getDerivePathForSUI(derivePathParams);\n return Ed25519Keypair.deriveKeypair(mnemonics, derivePath);\n};\n","import { fromB64 } from '@mysten/sui/utils';\n\n/**\n * @description This regular expression matches any string that contains only hexadecimal digits (0-9, A-F, a-f).\n * @param str\n */\nexport const isHex = (str: string) => /^0x[0-9a-fA-F]+$|^[0-9a-fA-F]+$/.test(str);\n\n/**\n * @description This regular expression matches any string that contains only base64 digits (0-9, A-Z, a-z, +, /, =).\n * Note that the \"=\" signs at the end are optional padding characters that may be present in some base64 encoded strings.\n * @param str\n */\nexport const isBase64 = (str: string) => /^[a-zA-Z0-9+/]+={0,2}$/g.test(str);\n\n/**\n * Convert a hex string to Uint8Array\n * @param hexStr\n */\nexport const fromHEX = (hexStr: string): Uint8Array => {\n if (!hexStr) {\n throw new Error('cannot parse empty string to Uint8Array');\n }\n const intArr = hexStr\n .replace('0x', '')\n .match(/.{1,2}/g)\n ?.map((byte) => parseInt(byte, 16));\n\n if (!intArr || intArr.length === 0) {\n throw new Error(`Unable to parse HEX: ${hexStr}`);\n }\n return Uint8Array.from(intArr);\n};\n\n/**\n * @description Convert a hex or base64 string to Uint8Array\n */\nexport const hexOrBase64ToUint8Array = (str: string): Uint8Array => {\n if (isHex(str)) {\n return fromHEX(str);\n } else if (isBase64(str)) {\n return fromB64(str);\n } else {\n throw new Error('The string is not a valid hex or base64 string.');\n }\n};\n\nconst PRIVATE_KEY_SIZE = 32;\nconst LEGACY_PRIVATE_KEY_SIZE = 64;\n/**\n * normalize a private key\n * A private key is a 32-byte array.\n * But there are two different formats for private keys:\n * 1. A 32-byte array\n * 2. A 64-byte array with the first 32 bytes being the private key and the last 32 bytes being the public key\n * 3. A 33-byte array with the first byte being 0x00 (sui.keystore key is a Base64 string with scheme flag 0x00 at the beginning)\n */\nexport const normalizePrivateKey = (key: Uint8Array): Uint8Array => {\n if (key.length === LEGACY_PRIVATE_KEY_SIZE) {\n // This is a legacy secret key, we need to strip the public key bytes and only read the first 32 bytes\n key = key.slice(0, PRIVATE_KEY_SIZE);\n } else if (key.length === PRIVATE_KEY_SIZE + 1 && key[0] === 0) {\n // sui.keystore key is a Base64 string with scheme flag 0x00 at the beginning\n return key.slice(1);\n } else if (key.length === PRIVATE_KEY_SIZE) {\n return key;\n }\n throw new Error('invalid secret key');\n};\n","import { generateMnemonic as genMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\n\nexport const generateMnemonic = (numberOfWords: 12 | 24 = 24) => {\n const strength = numberOfWords === 12 ? 128 : 256;\n return genMnemonic(wordlist, strength);\n};\n","import { Transaction } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { TransactionArgument, TransactionObjectInput } from '@mysten/sui/transactions';\nimport type { Keypair } from '@mysten/sui/cryptography';\n\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg\n} from '../../types';\n\nimport type { bcs } from '@mysten/sui/bcs';\nimport { convertArgs, convertAddressArg, convertObjArg, convertAmounts } from './util';\nexport class SuiTx {\n public tx: Transaction;\n\n constructor(transaction?: Transaction) {\n if (transaction !== undefined) {\n this.tx = Transaction.from(transaction);\n } else {\n this.tx = new Transaction();\n }\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.tx.gas;\n }\n get blockData() {\n return this.tx.blockData;\n }\n address(value: string) {\n return this.tx.pure.address(value);\n }\n get pure(): {\n <T extends TransactionArgument>(value: T): TransactionArgument;\n address(value: string): TransactionArgument;\n u8(value: number | bigint): TransactionArgument;\n u16(value: number | bigint): TransactionArgument;\n u32(value: number | bigint): TransactionArgument;\n u64(value: number | bigint): TransactionArgument;\n u128(value: number | bigint): TransactionArgument;\n u256(value: number | bigint): TransactionArgument;\n bool(value: boolean): TransactionArgument;\n } {\n return this.tx.pure;\n }\n object(value: string | TransactionObjectInput) {\n return this.tx.object(value);\n }\n objectRef(ref: SuiObjectRef) {\n return this.tx.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.tx.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.tx.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.tx.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.tx.setExpiration>[0]) {\n return this.tx.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.tx.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.tx.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.tx.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.tx.setGasPayment(payments);\n }\n serialize() {\n return this.tx.serialize();\n }\n toJSON() {\n return this.tx.toJSON();\n }\n sign(params: { signer: Keypair; client?: SuiClient; onlyTransactionKind?: boolean }) {\n return this.tx.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.tx.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.tx.getDigest(params);\n }\n add(...args: Parameters<typeof this.tx.add>) {\n return this.tx.add(...args);\n }\n publish({ modules, dependencies }: { modules: number[][] | string[]; dependencies: string[] }) {\n return this.tx.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.tx.upgrade>) {\n return this.tx.upgrade(...args);\n }\n makeMoveVec(...args: Parameters<typeof this.tx.makeMoveVec>) {\n return this.tx.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.tx.transferObjects(\n objects.map((object) => convertObjArg(this.tx, object)),\n convertAddressArg(this.tx, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.tx.splitCoins(convertObjArg(this.tx, coin), convertAmounts(this.tx, amounts));\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.tx, destination);\n const sourceObjects = sources.map((source) => convertObjArg(this.tx, source));\n return this.tx.mergeCoins(destinationObject, sourceObjects);\n }\n\n /**\n * @description Move call\n * @param target `${string}::${string}::${string}`, e.g. `0x3::sui_system::request_add_stake`\n * @param args the arguments of the move call, such as `['0x1', '0x2']`\n * @param typeArgs the type arguments of the move call, such as `['0x2::sui::SUI']`\n */\n moveCall(target: string, args: (SuiTxArg | SuiVecTxArg)[] = [], typeArgs: string[] = []) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex = /(?<package>[a-zA-Z0-9]+)::(?<module>[a-zA-Z0-9_]+)::(?<function>[a-zA-Z0-9_]+)/;\n const match = target.match(regex);\n if (match === null)\n throw new Error('Invalid target format. Expected `${string}::${string}::${string}`');\n const convertedArgs = convertArgs(this.tx, args);\n return this.tx.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs\n });\n }\n\n /* Enhance methods of TransactionBlock */\n\n transferSuiToMany(recipients: SuiAddressArg[], amounts: (SuiTxArg | number | bigint)[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error('transferSuiToMany: recipients.length !== amounts.length');\n }\n const coins = this.tx.splitCoins(\n this.tx.gas,\n amounts.map((amount) =>\n typeof amount === 'number' || typeof amount === 'bigint'\n ? amount\n : convertArgs(this.tx, [amount])[0]\n )\n );\n const recipientObjects = recipients.map((recipient) => convertAddressArg(this.tx, recipient));\n recipientObjects.forEach((address, index) => {\n this.tx.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiTxArg | number | bigint) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiTxArg | number | bigint) {\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.tx.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.tx.splitCoins(mergedCoin, convertAmounts(this.tx, [amount]));\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.tx.splitCoins(this.tx.gas, convertAmounts(this.tx, amounts));\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.tx.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.tx.splitCoins(mergedCoin, convertAmounts(this.tx, amounts));\n return { splitedCoins, mergedCoin };\n }\n\n transferCoinToMany(\n coins: SuiObjectArg[],\n sender: SuiAddressArg,\n recipients: SuiAddressArg[],\n amounts: SuiAmountsArg[]\n ) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error('transferSuiToMany: recipients.length !== amounts.length');\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.tx, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(coinObjects, amounts);\n const recipientObjects = recipients.map((recipient) => convertAddressArg(this.tx, recipient));\n recipientObjects.forEach((address, index) => {\n this.tx.transferObjects([splitedCoins[index]], address);\n });\n this.tx.transferObjects([mergedCoin], convertAddressArg(this.tx, sender));\n return this;\n }\n\n transferCoin(\n coins: SuiObjectArg[],\n sender: SuiAddressArg,\n recipient: SuiAddressArg,\n amount: SuiAmountsArg\n ) {\n return this.transferCoinToMany(coins, sender, [recipient], [amount]);\n }\n\n stakeSui(amount: SuiTxArg | number | bigint, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.tx.splitCoins(this.tx.gas, convertAmounts(this.tx, [amount]));\n return this.tx.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.tx, [\n this.tx.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.tx, validatorAddr)\n ])\n });\n }\n}\n","import {\n normalizeSuiObjectId,\n normalizeSuiAddress,\n isValidSuiObjectId,\n isValidSuiAddress\n} from '@mysten/sui/utils';\nimport { Inputs, getPureBcsSchema } from '@mysten/sui/transactions';\nimport { SerializedBcs, bcs, isSerializedBcs } from '@mysten/bcs';\nimport type {\n TransactionArgument,\n Transaction,\n TransactionObjectArgument\n} from '@mysten/sui/transactions';\nimport type {\n SuiObjectArg,\n SuiAddressArg,\n SuiTxArg,\n SuiVecTxArg,\n SuiInputTypes,\n SuiAmountsArg\n} from 'src/types';\n\nexport const getDefaultSuiInputType = (value: SuiTxArg): 'u64' | 'bool' | 'object' | undefined => {\n if (typeof value === 'string' && isValidSuiObjectId(value)) {\n return 'object';\n } else if (typeof value === 'number' || typeof value === 'bigint') {\n return 'u64';\n } else if (typeof value === 'boolean') {\n return 'bool';\n } else {\n return undefined;\n }\n};\n\n/**\n * Since we know the elements in the array are the same type\n * If type is not provided, we will try to infer the type from the first element\n * By default,\n *\n * string is hex and its length equal to 32 =====> object id\n * number, bigint ====> u64\n * boolean =====> bool\n *\n * If type is provided, we will use the type to convert the array\n * @param args\n * @param type 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256' | 'signer' | 'object' | string\n */\nexport function makeVecParam(\n txBlock: Transaction,\n args: SuiTxArg[],\n type?: SuiInputTypes\n): TransactionArgument {\n if (args.length === 0) throw new Error('Transaction builder error: Empty array is not allowed');\n // Using first element value as default type\n const defaultSuiType = getDefaultSuiInputType(args[0]);\n const VECTOR_REGEX = /^vector<(.+)>$/;\n const STRUCT_REGEX = /^([^:]+)::([^:]+)::([^<]+)(<(.+)>)?/;\n\n type = type || defaultSuiType;\n\n if (type === 'object') {\n const elements = args.map((arg) =>\n typeof arg === 'string' && isValidSuiObjectId(arg)\n ? txBlock.object(normalizeSuiObjectId(arg))\n : convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements });\n } else if (typeof type === 'string' && !VECTOR_REGEX.test(type) && !STRUCT_REGEX.test(type)) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) => convertObjArg(txBlock, arg as SuiObjectArg));\n return txBlock.makeMoveVec({ elements, type });\n }\n}\n\n/**\n * Check whether it is an valid move vec input.\n *\n * @param arg The argument to check.\n * @returns boolean.\n */\nexport function isMoveVecArg(arg: SuiTxArg | SuiVecTxArg): arg is SuiVecTxArg {\n if (typeof arg === 'object' && 'vecType' in arg && 'value' in arg) {\n return true;\n } else if (Array.isArray(arg)) {\n return true;\n }\n return false;\n}\n\n/**\n * Convert any valid input into array of TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param args The array of argument to convert.\n * @returns The converted array of TransactionArgument.\n */\nexport function convertArgs(\n txBlock: Transaction,\n args: (SuiTxArg | SuiVecTxArg)[]\n): TransactionArgument[] {\n return args.map((arg) => {\n if (arg instanceof SerializedBcs || isSerializedBcs(arg)) {\n return txBlock.pure(arg);\n }\n\n if (isMoveVecArg(arg)) {\n const vecType = 'vecType' in arg;\n return vecType ? makeVecParam(txBlock, arg.value, arg.vecType) : makeVecParam(txBlock, arg);\n }\n\n return arg;\n });\n}\n\n/**\n * Convert any valid address input into a TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param arg The address argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function convertAddressArg(txBlock: Transaction, arg: SuiAddressArg): TransactionArgument {\n if (typeof arg === 'string' && isValidSuiAddress(arg)) {\n return txBlock.pure.address(normalizeSuiAddress(arg));\n } else {\n return convertArgs(txBlock, [arg])[0];\n }\n}\n\n/**\n * Convert any valid object input into a TransactionArgument.\n *\n * @param txb The Transaction Block\n * @param arg The object argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function convertObjArg(txb: Transaction, arg: SuiObjectArg): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return txb.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return txb.sharedObjectRef(arg);\n }\n\n if ('Object' in arg) {\n if ('ImmOrOwnedObject' in arg.Object) {\n return txb.object(Inputs.ObjectRef(arg.Object.ImmOrOwnedObject));\n } else if ('SharedObject' in arg.Object) {\n return txb.object(Inputs.SharedObjectRef(arg.Object.SharedObject));\n } else {\n throw new Error('Invalid argument type');\n }\n }\n\n if (typeof arg === 'function') {\n return arg;\n }\n\n if ('GasCoin' in arg || 'Input' in arg || 'Result' in arg || 'NestedResult' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(txBlock: Transaction, amounts: SuiAmountsArg[]) {\n return amounts.map((amount) => {\n if (typeof amount === 'number' || typeof amount === 'bigint') {\n return amount;\n } else {\n return convertArgs(txBlock, [amount])[0];\n }\n });\n}\n","import { SuiClient } from '@mysten/sui/client';\nimport type {\n SuiTransactionBlockResponseOptions,\n SuiTransactionBlockResponse,\n SuiObjectDataOptions,\n SuiObjectData\n} from '@mysten/sui/client';\nimport { requestSuiFromFaucetV2, getFaucetHost } from '@mysten/sui/faucet';\n\ninterface DynamicFieldName {\n type: string;\n value: unknown;\n}\nimport { FaucetNetworkType, NetworkType } from '../../types';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\n\n/**\n * `SuiTransactionSender` is used to send transaction with a given gas coin.\n * It always uses the gas coin to pay for the gas,\n * and update the gas coin after the transaction.\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[];\n public currentClient: SuiClient;\n public readonly fullNodes: string[];\n public currentFullNode: string;\n\n public network?: NetworkType;\n\n constructor(fullNodeUrls: string[], network?: NetworkType) {\n if (fullNodeUrls.length === 0) throw new Error('fullNodeUrls must not be empty');\n this.fullNodes = fullNodeUrls;\n this.clients = fullNodeUrls.map((url) => new SuiClient({ url }));\n this.currentFullNode = fullNodeUrls[0];\n this.currentClient = this.clients[0];\n this.network = network;\n }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient = this.clients[(currentClientIdx + 1) % this.clients.length];\n this.currentFullNode = this.fullNodes[(currentClientIdx + 1) % this.clients.length];\n }\n\n async sendTx(\n transactionBlock: Uint8Array | string,\n signature: string | string[]\n ): Promise<SuiTransactionBlockResponse> {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n // const currentProviderIdx = this.providers.indexOf(this.currentProvider);\n // const providers = [\n // ...this.providers.slice(currentProviderIdx, this.providers.length),\n // ...this.providers.slice(0, currentProviderIdx),\n // ]\n\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].executeTransactionBlock({\n transactionBlock,\n signature,\n options: txResOptions\n });\n } catch (err) {\n console.warn(\n `Failed to send transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to send transaction with all fullnodes');\n }\n\n async waitForTransaction({\n digest,\n timeout = 60 * 1000,\n pollInterval = 2 * 1000\n }: {\n digest: string;\n timeout?: number;\n pollInterval?: number;\n }) {\n for (const clientIdx in this.clients) {\n try {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n return await this.clients[clientIdx].waitForTransaction({\n digest,\n timeout,\n pollInterval,\n options: txResOptions\n });\n } catch (err) {\n console.warn(\n `Failed to wait for transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to wait for transaction with all fullnodes');\n }\n\n async getObjects(ids: string[], options?: SuiObjectDataOptions): Promise<SuiObjectData[]> {\n const opts: SuiObjectDataOptions = options ?? {\n showContent: true,\n showDisplay: true,\n showType: true,\n showOwner: true\n };\n\n for (const clientIdx in this.clients) {\n try {\n const objects = await this.clients[clientIdx].multiGetObjects({\n ids,\n options: opts\n });\n const parsedObjects = objects\n .map((object) => {\n return object.data;\n })\n .filter((object) => object !== null && object !== undefined);\n return parsedObjects as SuiObjectData[];\n } catch (err) {\n await delay(2000);\n console.warn(`Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`);\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string) {\n const objects = await this.getObjects([id]);\n return objects[0];\n }\n\n async getDynamicFieldObject(parentId: string, name: DynamicFieldName) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getDynamicFieldObject({\n parentId,\n name\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get DynamicFieldObject with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get DynamicFieldObject with all fullnodes');\n }\n\n async getDynamicFields(parentId: string, cursor?: string, limit?: number) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getDynamicFields({\n parentId,\n cursor,\n limit\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get DynamicFields with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get DynamicFields with all fullnodes');\n }\n\n async getTxDetails(digest: string) {\n for (const clientIdx in this.clients) {\n try {\n const txResOptions: SuiTransactionBlockResponseOptions = {\n showEvents: true,\n showEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true\n };\n\n return await this.clients[clientIdx].getTransactionBlock({\n digest,\n options: txResOptions\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get TransactionBlocks with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get TransactionBlocks with all fullnodes');\n }\n\n async getOwnedObjects(owner: string, cursor?: string, limit?: number) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getOwnedObjects({\n owner,\n cursor,\n limit\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get OwnedObjects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get OwnedObjects with all fullnodes');\n }\n\n async getNormalizedMoveModulesByPackage(packageId: string) {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].getNormalizedMoveModulesByPackage({\n package: packageId\n });\n } catch (err) {\n await delay(2000);\n console.warn(\n `Failed to get NormalizedMoveModules with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get NormalizedMoveModules with all fullnodes');\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiOwnedObject | SuiSharedObject)[]) {\n const objectIds = suiObjects.map((obj) => obj.objectId);\n const objects = await this.getObjects(objectIds);\n for (const object of objects) {\n const suiObject = suiObjects.find((obj) => obj.objectId === object?.objectId);\n if (suiObject instanceof SuiSharedObject) {\n if (object.owner && typeof object.owner === 'object' && 'Shared' in object.owner) {\n suiObject.initialSharedVersion = object.owner.Shared.initial_shared_version;\n } else {\n suiObject.initialSharedVersion = undefined;\n }\n } else if (suiObject instanceof SuiOwnedObject) {\n suiObject.version = object?.version;\n suiObject.digest = object?.digest;\n }\n }\n }\n\n /**\n * @description Select coins that add up to the given amount.\n * @param addr the address of the owner\n * @param amount the amount that is needed for the coin\n * @param coinType the coin type, default is '0x2::SUI::SUI'\n */\n async selectCoins(addr: string, amount: number, coinType: string = '0x2::SUI::SUI') {\n const selectedCoins: {\n objectId: string;\n digest: string;\n version: string;\n balance: string;\n }[] = [];\n let totalAmount = 0;\n let hasNext = true,\n nextCursor: string | null | undefined = null;\n while (hasNext && totalAmount < amount) {\n const coins = await this.currentClient.getCoins({\n owner: addr,\n coinType: coinType,\n cursor: nextCursor\n });\n // Sort the coins by balance in descending order\n coins.data.sort((a, b) => parseInt(b.balance) - parseInt(a.balance));\n for (const coinData of coins.data) {\n selectedCoins.push({\n objectId: coinData.coinObjectId,\n digest: coinData.digest,\n version: coinData.version,\n balance: coinData.balance\n });\n totalAmount = totalAmount + parseInt(coinData.balance);\n if (totalAmount >= amount) {\n break;\n }\n }\n\n nextCursor = coins.nextCursor;\n hasNext = coins.hasNextPage;\n }\n\n if (!selectedCoins.length) {\n throw new Error('No valid coins found for the transaction.');\n }\n return selectedCoins;\n }\n\n /**\n * @description Select owned objects with objectType.\n * @param addr the address of the owner\n * @param objectType the coin type, default is '0x2::SUI::SUI'\n */\n async selectObjects(addr: string, objectType: string) {\n const selectedObjects = [];\n let hasNext = true,\n nextCursor: string | null | undefined = null;\n while (hasNext) {\n const ownedObjects = await this.currentClient.getOwnedObjects({\n owner: addr,\n cursor: nextCursor\n });\n\n for (const objectData of ownedObjects.data) {\n const objectDetail = await this.getObject(objectData.data!.objectId);\n if (objectDetail.type === objectType) {\n selectedObjects.push(objectDetail);\n }\n }\n\n nextCursor = ownedObjects.nextCursor;\n hasNext = ownedObjects.hasNextPage;\n }\n\n if (!selectedObjects.length) {\n throw new Error('Not own this object found for the transaction.');\n }\n return selectedObjects;\n }\n\n async requestFaucet(address: string, network: FaucetNetworkType) {\n await requestSuiFromFaucetV2({\n host: getFaucetHost(network),\n recipient: address\n });\n }\n}\n","import type { SuiTransactionBlockResponse } from '@mysten/sui/client';\nimport type { CallArg } from '@mysten/sui/transactions';\n\nexport class SuiOwnedObject {\n public readonly objectId: string;\n public version?: string;\n public digest?: string;\n\n constructor(param: { objectId: string; version?: string; digest?: string }) {\n this.objectId = param.objectId;\n this.version = param.version;\n this.digest = param.digest;\n }\n\n /**\n * Check if the object is fully initialized.\n * So that when it's used as an input, it won't be necessary to fetch from fullnode again.\n * Which can save time when sending transactions.\n */\n isFullObject(): boolean {\n return !!this.version && !!this.digest;\n }\n\n asCallArg(): CallArg | string {\n if (!this.version || !this.digest) {\n return this.objectId;\n }\n return {\n $kind: 'Object',\n Object: {\n $kind: 'ImmOrOwnedObject',\n ImmOrOwnedObject: {\n objectId: this.objectId,\n version: this.version,\n digest: this.digest\n }\n }\n };\n }\n\n /**\n * Update object version & digest based on the transaction response.\n * @param txResponse\n */\n updateFromTxResponse(txResponse: SuiTransactionBlockResponse) {\n const changes = txResponse.objectChanges;\n if (!changes) {\n throw new Error('Bad transaction response!');\n }\n for (const change of changes) {\n if (change.type === 'mutated' && change.objectId === this.objectId) {\n this.digest = change.digest;\n this.version = change.version;\n return;\n }\n }\n throw new Error('Could not find object in transaction response!');\n }\n}\n","import type { CallArg } from '@mysten/sui/transactions';\n\nexport class SuiSharedObject {\n public readonly objectId: string;\n public initialSharedVersion?: string;\n\n constructor(param: { objectId: string; initialSharedVersion?: string; mutable?: boolean }) {\n this.objectId = param.objectId;\n this.initialSharedVersion = param.initialSharedVersion;\n }\n\n asCallArg(mutable: boolean = false): CallArg | string {\n if (!this.initialSharedVersion) {\n return this.objectId;\n }\n return {\n $kind: 'Object',\n Object: {\n $kind: 'SharedObject',\n SharedObject: {\n objectId: this.objectId,\n initialSharedVersion: this.initialSharedVersion,\n mutable\n }\n }\n };\n }\n}\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { NetworkType } from 'src/types';\n\n/**\n * Testnet deployment of the Dubhe framework.\n * Update these constants whenever the framework is redeployed to testnet.\n */\nexport const TESTNET_DUBHE_FRAMEWORK_PACKAGE_ID =\n '0xae33be6675639d6f1a5c468ae6bbc457ae4e22e57cd7526741d6143ce219d995';\n\nexport const TESTNET_DUBHE_HUB_OBJECT_ID =\n '0x80391929a8772aba091156fd1f099bf79240d2cf4471a14026b4aa68e3a240cc';\n\n/**\n * Mainnet deployment of the Dubhe framework.\n * Update these constants whenever the framework is redeployed to mainnet.\n */\nexport const MAINNET_DUBHE_FRAMEWORK_PACKAGE_ID =\n '0x5bc40de124588b1e3514ca50f5e7109869351c4d9544e5f0cb9d30dd47bf8de7';\n\nexport const MAINNET_DUBHE_HUB_OBJECT_ID =\n '0x96e92d9baccfd0a2927b4f209756e1edbc18904bff34e486e4bb4a151320e1e5';\n\nexport interface NetworkConfig {\n fullNode: string;\n graphql?: string;\n network: string;\n txExplorer: string;\n accountExplorer: string;\n explorer: string;\n indexerUrl: string;\n channelUrl: string;\n /**\n * Published package ID of the Dubhe framework for this network.\n * Defined for testnet and mainnet (known constants).\n * Undefined for localnet/devnet — supply after deploying dubhe locally.\n */\n frameworkPackageId?: string;\n /**\n * Shared DappHub object ID for this network.\n * Defined for testnet and mainnet (known constants).\n * Undefined for localnet/devnet — read from the deployment JSON after publishing.\n */\n dappHubId?: string;\n}\n\nexport const getDefaultConfig = (networkType: NetworkType = 'testnet'): NetworkConfig => {\n switch (networkType) {\n case 'localnet': {\n const localRpc = encodeURIComponent('http://127.0.0.1:9000');\n return {\n fullNode: 'http://127.0.0.1:9000',\n graphql: 'http://127.0.0.1:9125',\n network: 'localnet',\n txExplorer: `https://custom.suiscan.xyz/custom/tx/:txHash?network=${localRpc}`,\n accountExplorer: `https://custom.suiscan.xyz/custom/account/:address?network=${localRpc}`,\n explorer: `https://custom.suiscan.xyz/custom?network=${localRpc}`,\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n // frameworkPackageId: undefined — set after deploying dubhe locally\n };\n }\n case 'devnet':\n return {\n fullNode: 'https://fullnode.devnet.sui.io:443',\n network: 'devnet',\n txExplorer: 'https://suiscan.xyz/devnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/devnet/address/:address',\n explorer: 'https://suiscan.xyz/devnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080'\n // frameworkPackageId: undefined — no persistent deployment on devnet\n };\n case 'testnet':\n return {\n fullNode: 'https://fullnode.testnet.sui.io:443',\n graphql: 'https://sui-testnet.mystenlabs.com/graphql',\n network: 'testnet',\n txExplorer: 'https://suiscan.xyz/testnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/testnet/address/:address',\n explorer: 'https://suiscan.xyz/testnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080',\n frameworkPackageId: TESTNET_DUBHE_FRAMEWORK_PACKAGE_ID,\n dappHubId: TESTNET_DUBHE_HUB_OBJECT_ID\n };\n case 'mainnet':\n return {\n fullNode: 'https://fullnode.mainnet.sui.io:443',\n graphql: 'https://sui-mainnet.mystenlabs.com/graphql',\n network: 'mainnet',\n txExplorer: 'https://suiscan.xyz/mainnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/mainnet/address/:address',\n explorer: 'https://suiscan.xyz/mainnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080',\n frameworkPackageId: MAINNET_DUBHE_FRAMEWORK_PACKAGE_ID || undefined,\n dappHubId: MAINNET_DUBHE_HUB_OBJECT_ID || undefined\n };\n default:\n return {\n fullNode: 'https://fullnode.testnet.sui.io:443',\n graphql: 'https://sui-testnet.mystenlabs.com/graphql',\n network: 'testnet',\n txExplorer: 'https://suiscan.xyz/testnet/tx/:txHash',\n accountExplorer: 'https://suiscan.xyz/testnet/address/:address',\n explorer: 'https://suiscan.xyz/testnet',\n indexerUrl: 'http://127.0.0.1:3001',\n channelUrl: 'http://127.0.0.1:8080',\n frameworkPackageId: TESTNET_DUBHE_FRAMEWORK_PACKAGE_ID,\n dappHubId: TESTNET_DUBHE_HUB_OBJECT_ID\n };\n }\n};\n\n/** @deprecated Use `getDefaultConfig` instead. */\nexport const getDefaultURL = getDefaultConfig;\n","import type { SuiMoveNormalizedModules } from '@mysten/sui/client';\nimport type { ContractFactoryParams, SuiMoveMoudleValueType } from './types';\nexport type ApiTypes = 'promise' | 'rxjs';\n\n// export interface ContractQuery {\n// (origin: AccountId | string | Uint8Array, options: ContractOptions, ...params: unknown[]): SuiTransactionBlockResponse<ApiType, ContractCallOutcome>;\n// }\n\n// export type MapMessageQuery<ApiType extends ApiTypes> = Record<string, ContractQuery<ApiType>>;\n\n// // function createQuery <ApiType extends ApiTypes> (meta: AbiMessage, fn: (origin: string | AccountId | Uint8Array, options: ContractOptions, params: unknown[]) => ContractCallResult<ApiType, ContractCallOutcome>): ContractQuery<ApiType> {\n// // return withMeta(meta, (origin: string | AccountId | Uint8Array, options: ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome> =>\n// // fn(origin, options, params)\n// // );\n// // }\n\n// export type MapMessageTx<ApiType extends ApiTypes> = Record<string, ContractTx<ApiType>>;\n\n// export interface ContractOptions {\n// gasLimit?: bigint | string | number | BN | WeightV2;\n// storageDepositLimit?: bigint | string | number | BN | null;\n// value?: bigint | BN | string | number;\n// }\n\n// export interface ContractTx {\n// (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType>;\n// }\nexport class SuiContractFactory {\n public packageId: string;\n public metadata: SuiMoveNormalizedModules | undefined;\n // readonly #query: MapMessageQuery<ApiTypes> = {};\n // readonly #tx: MapMessageTx<ApiTypes> = {};\n /**\n * Support the following ways to init the SuiToolkit:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string, when mnemonics is provided, secretKey will be ignored\n */\n constructor({ packageId, metadata }: ContractFactoryParams = {}) {\n // If the mnemonics or secretKey is provided, use it\n // Otherwise, generate a random mnemonics with 24 words\n this.packageId = packageId || '';\n this.metadata = metadata || undefined;\n }\n\n getFuncByModuleName(_moduleName: string) {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`moudle name: ${data.name}`);\n // console.log(data.exposedFunctions)\n Object.entries(data.exposedFunctions).forEach(([key, value]) => {\n console.log(`\\tfunc name: ${key}`);\n Object.values(value.parameters).forEach((_values) => {\n // console.log(values)\n });\n });\n });\n }\n\n getAllFunc() {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`moudle name: ${data.name}`);\n // console.log(data.exposedFunctions)\n Object.entries(data.exposedFunctions).forEach(([key, value]) => {\n console.log(`\\tfunc name: ${key}`);\n console.log(`\\t\\t${value.parameters.length}`);\n Object.values(value.parameters).forEach((values) => {\n // console.log(values)\n console.log(`\\t\\targs: ${values}`);\n });\n });\n });\n }\n\n getAllModule() {\n Object.values(this.metadata as SuiMoveNormalizedModules).forEach((value, index) => {\n const data = value as SuiMoveMoudleValueType;\n console.log(`${index}. ${data.name}`);\n });\n }\n\n // async call(arguments: ({\n // kind: \"Input\";\n // index: number;\n // type?: \"object\" | \"pure\" | undefined;\n // value?: any;\n // } | {\n // kind: \"GasCoin\";\n // } | {\n // kind: \"Result\";\n // index: number;\n // } | {\n // kind: \"NestedResult\";\n // index: number;\n // resultIndex: number;\n // })[], derivePathParams?: DerivePathParams) {\n // const tx = new TransactionBlock();\n // tx.moveCall({\n // target: `${this.packageId}::${}::${}`,\n // arguments,\n // })\n // return ;\n // }\n}\n\n// function createTx <ApiType extends ApiTypes> (meta: AbiMessage, fn: (options: ContractOptions, params: unknown[]) => SubmittableExtrinsic<ApiType>): ContractTx<ApiType> {\n// return withMeta(meta, (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType> =>\n// fn(options, params)\n// );\n// }\n","import { MapObjectStruct } from 'src/types';\nimport { fromHex, toHex, bcs } from '@mysten/bcs';\n\nexport const BasicBcsTypes: MapObjectStruct = {\n address: bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n }),\n u8: bcs.u8(),\n u16: bcs.u16(),\n u32: bcs.u32(),\n u64: bcs.u64(),\n u128: bcs.u128(),\n u256: bcs.u256(),\n bool: bcs.bool(),\n '0x1::ascii::String': bcs.string(),\n '0x1::string::String': bcs.string(),\n '0x1::option::Option<address>': bcs.option(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n ),\n '0x1::option::Option<u8>': bcs.option(bcs.u8()),\n '0x1::option::Option<u16>': bcs.option(bcs.u16()),\n '0x1::option::Option<u32>': bcs.option(bcs.u32()),\n '0x1::option::Option<u64>': bcs.option(bcs.u64()),\n '0x1::option::Option<u128>': bcs.option(bcs.u128()),\n '0x1::option::Option<u256>': bcs.option(bcs.u256()),\n '0x1::option::Option<bool>': bcs.option(bcs.bool()),\n '0x1::option::Option<vector<address>>': bcs.option(\n bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n )\n ),\n '0x1::option::Option<vector<u8>>': bcs.option(bcs.vector(bcs.u8())),\n '0x1::option::Option<vector<u16>>': bcs.option(bcs.vector(bcs.u16())),\n '0x1::option::Option<vector<u32>>': bcs.option(bcs.vector(bcs.u32())),\n '0x1::option::Option<vector<u64>>': bcs.option(bcs.vector(bcs.u64())),\n '0x1::option::Option<vector<u128>>': bcs.option(bcs.vector(bcs.u128())),\n '0x1::option::Option<vector<u256>>': bcs.option(bcs.vector(bcs.u256())),\n '0x1::option::Option<vector<bool>>': bcs.option(bcs.vector(bcs.bool())),\n 'vector<address>': bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n ),\n 'vector<u8>': bcs.vector(bcs.u8()),\n 'vector<u16>': bcs.vector(bcs.u16()),\n 'vector<u32>': bcs.vector(bcs.u32()),\n 'vector<u64>': bcs.vector(bcs.u64()),\n 'vector<u128>': bcs.vector(bcs.u128()),\n 'vector<u256>': bcs.vector(bcs.u256()),\n 'vector<bool>': bcs.vector(bcs.bool()),\n 'vector<vector<address>>': bcs.vector(\n bcs.vector(\n bcs.bytes(32).transform({\n // To change the input type, you need to provide a type definition for the input\n input: (val: string) => fromHex(val),\n output: (val) => toHex(val)\n })\n )\n ),\n 'vector<vector<u8>>': bcs.vector(bcs.vector(bcs.u8())),\n 'vector<vector<u16>>': bcs.vector(bcs.vector(bcs.u16())),\n 'vector<vector<u32>>': bcs.vector(bcs.vector(bcs.u32())),\n 'vector<vector<u64>>': bcs.vector(bcs.vector(bcs.u64())),\n 'vector<vector<u128>>': bcs.vector(bcs.vector(bcs.u128())),\n 'vector<vector<u256>>': bcs.vector(bcs.vector(bcs.u256())),\n 'vector<vector<bool>>': bcs.vector(bcs.vector(bcs.bool())),\n '0x2::coin::Coin<T>': bcs.struct('Coin', {\n id: bcs.fixedArray(32, bcs.u8()).transform({\n input: (id: string) => fromHex(id),\n output: (id) => toHex(Uint8Array.from(id))\n }),\n balance: bcs.struct('Balance', {\n value: bcs.u64()\n })\n }),\n '0x2::balance::Balance<T>': bcs.struct('Balance', {\n value: bcs.u64()\n })\n};\n","import { BasicBcsTypes } from './const';\n\nfunction capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nfunction normalizeHexAddress(input: string): string | null {\n const hexRegex = /^(0x)?[0-9a-fA-F]{64}$/;\n\n if (hexRegex.test(input)) {\n if (input.startsWith('0x')) {\n return input;\n } else {\n return '0x' + input;\n }\n } else {\n return null;\n }\n}\n\nfunction numberToAddressHex(num: number): string {\n const hex = num.toString(16);\n const paddedHex = '0x' + hex.padStart(64, '0');\n return paddedHex;\n}\n\nfunction normalizePackageId(input: string): string {\n const withPrefix = input.startsWith('0x') ? input : '0x' + input;\n const withoutPrefix = withPrefix.slice(2);\n const normalized = withoutPrefix.replace(/^0+/, '');\n return '0x' + normalized;\n}\n\nfunction convertHttpToWebSocket(url: string): string {\n if (url.startsWith('https://')) {\n return url.replace('https://', 'wss://');\n } else if (url.startsWith('http://')) {\n return url.replace('http://', 'ws://');\n }\n return url;\n}\n\n/**\n * Build the fully-qualified Move type string for a DApp's `DappKey`.\n *\n * The format matches what `std::type_name::get<DappKey>()` returns on-chain:\n * `<64-char-zero-padded-address>::dapp_key::DappKey`\n *\n * @param packageId - The DApp's published package ID (with or without 0x prefix).\n *\n * @example\n * ```typescript\n * tx.moveCall({\n * target: `${frameworkPackageId}::dapp_system::settle_writes`,\n * typeArguments: [normalizeDappKey(packageId)],\n * arguments: [...],\n * });\n * ```\n */\nfunction normalizeDappKey(packageId: string): string {\n const raw = packageId.replace(/^0x/, '');\n return `${raw.padStart(64, '0')}::dapp_key::DappKey`;\n}\n\nexport {\n BasicBcsTypes,\n capitalizeFirstLetter,\n normalizeHexAddress,\n numberToAddressHex,\n normalizePackageId,\n convertHttpToWebSocket,\n normalizeDappKey\n};\n","export class ContractDataParsingError extends Error {\n public readonly errorType: string;\n public readonly functionName: string;\n public readonly moduleAddress: string;\n public readonly errorMessage: string;\n\n constructor(dryResult: any) {\n const error = dryResult?.effects?.status?.error || '';\n const functionMatch = error ? error.match(/function_name: Some\\(\"([^\"]+)\"\\)/) : null;\n const moduleMatch = error ? error.match(/address: ([a-fA-F0-9]+)/) : null;\n\n const functionName = functionMatch ? functionMatch[1] : 'unknown';\n const moduleAddress = moduleMatch ? '0x' + moduleMatch[1] : 'unknown';\n const errorMessage = dryResult.error ? dryResult.error : 'UNKNOWN_ERROR';\n\n const message = [\n `\\n- Function: ${functionName}`,\n `- Module Address: ${moduleAddress}`,\n `- Error Message: ${errorMessage}`\n ].join('\\n');\n\n super(message);\n\n this.errorType = 'ContractDataParsingError';\n this.functionName = functionName;\n this.moduleAddress = moduleAddress;\n this.errorMessage = errorMessage;\n }\n}\n","import type {\n SubscribeTableParams,\n GetTableParams,\n SubmitTransactionParams,\n GetNonceParams,\n GetNonceResponse,\n TableEventData,\n ServerEventData,\n SubscriptionOptions,\n DubheChannelConfig\n} from './types';\n\n/**\n * DubheChannel Client\n * Provides methods to interact with Dubhe Channel API:\n * - subscribe_table: Subscribe to table updates via SSE\n * - get_table: Get table data\n * - submit: Submit transaction\n * - nonce: Get nonce for a sender\n */\nexport class DubheChannelClient {\n private baseUrl: string;\n private timeout: number;\n private activeSubscriptions: Map<string, AbortController>;\n\n constructor(config: DubheChannelConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = config.timeout || 30000;\n this.activeSubscriptions = new Map();\n }\n\n /**\n * Update client configuration\n * @param config - Partial configuration to update\n */\n updateConfig(config: Partial<DubheChannelConfig>): void {\n if (config.baseUrl !== undefined) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n }\n if (config.timeout !== undefined) {\n this.timeout = config.timeout;\n }\n }\n\n /**\n * Subscribe to table updates via Server-Sent Events (SSE)\n * @param params - Subscription parameters\n * @param options - Event handlers\n * @returns Unsubscribe function\n */\n async subscribeTable(\n params: SubscribeTableParams,\n options?: SubscriptionOptions\n ): Promise<() => void> {\n const subscriptionKey = this.generateSubscriptionKey(params);\n\n // Check if already subscribed\n if (this.activeSubscriptions.has(subscriptionKey)) {\n throw new Error(`Already subscribed to: ${subscriptionKey}`);\n }\n\n const controller = new AbortController();\n this.activeSubscriptions.set(subscriptionKey, controller);\n\n const url = `${this.baseUrl}/subscribe_table`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream'\n },\n body: JSON.stringify(params),\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Handle SSE stream asynchronously\n const streamPromise = this.handleSSEStream(response.body, options, controller.signal);\n\n // Ensure errors are caught\n streamPromise.catch((error) => {\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n });\n\n options?.onOpen?.();\n } catch (error: any) {\n this.activeSubscriptions.delete(subscriptionKey);\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n throw error;\n }\n\n // Return unsubscribe function\n return () => {\n controller.abort();\n this.activeSubscriptions.delete(subscriptionKey);\n options?.onClose?.();\n };\n }\n\n /**\n * Get table data\n * @param params - Query parameters\n * @returns Table data\n */\n async getTable<T = any>(params: GetTableParams): Promise<T> {\n const url = `${this.baseUrl}/get_table`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to get table data: ${error.message}`);\n }\n }\n\n /**\n * Submit transaction\n * @param params - Transaction parameters\n * @returns Transaction result\n */\n async submit<T = any>(params: SubmitTransactionParams): Promise<T> {\n const url = `${this.baseUrl}/submit`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to submit transaction: ${error.message}`);\n }\n }\n\n /**\n * Get nonce for a sender\n * @param params - Nonce query parameters\n * @returns Nonce response\n */\n async getNonce(params: GetNonceParams): Promise<GetNonceResponse> {\n const url = `${this.baseUrl}/nonce`;\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json'\n },\n body: JSON.stringify(params)\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);\n }\n\n return await response.json();\n } catch (error: any) {\n throw new Error(`Failed to get nonce: ${error.message}`);\n }\n }\n\n /**\n * Unsubscribe from specific subscription\n * @param params - Original subscription parameters\n */\n unsubscribe(params: SubscribeTableParams): void {\n const subscriptionKey = this.generateSubscriptionKey(params);\n const controller = this.activeSubscriptions.get(subscriptionKey);\n\n if (controller) {\n controller.abort();\n this.activeSubscriptions.delete(subscriptionKey);\n }\n }\n\n /**\n * Unsubscribe from all active subscriptions\n */\n unsubscribeAll(): void {\n for (const controller of this.activeSubscriptions.values()) {\n controller.abort();\n }\n this.activeSubscriptions.clear();\n }\n\n /**\n * Get number of active subscriptions\n */\n getActiveSubscriptionCount(): number {\n return this.activeSubscriptions.size;\n }\n\n /**\n * Handle Server-Sent Events stream\n */\n private async handleSSEStream(\n body: ReadableStream<Uint8Array>,\n options?: SubscriptionOptions,\n signal?: AbortSignal\n ): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n\n const result = await reader.read();\n\n if (result.done) {\n options?.onClose?.();\n break;\n }\n\n if (result.value) {\n const chunk = decoder.decode(result.value, { stream: true });\n buffer += chunk;\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n try {\n const data = line.substring(5).trim();\n if (data) {\n const serverData: ServerEventData = JSON.parse(data);\n // Transform server format to client format\n const eventData: TableEventData = {\n dapp_key: serverData.data_key.dapp_key,\n account: serverData.data_key.account,\n table: serverData.data_key.table,\n key: serverData.data_key.key,\n value: serverData.value\n };\n options?.onMessage?.(eventData);\n }\n } catch (error: any) {\n options?.onError?.(new Error(`Failed to parse SSE data: ${error.message}`));\n }\n }\n }\n }\n }\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n options?.onError?.(error);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate unique subscription key\n */\n private generateSubscriptionKey(params: SubscribeTableParams): string {\n const parts = [params.dapp_key];\n if (params.account) parts.push(params.account);\n if (params.table) parts.push(params.table);\n if (params.key) parts.push(JSON.stringify(params.key));\n return parts.join(':');\n }\n}\n","import { MultiSigPublicKey } from '@mysten/sui/multisig';\nimport type { PublicKey } from '@mysten/sui/cryptography';\nimport { ed25519PublicKeyFromBase64 } from './publickey';\n\nexport type PublicKeyWeightPair = {\n publicKey: PublicKey;\n weight: number;\n};\n\nexport class MultiSigClient {\n public readonly pksWeightPairs: PublicKeyWeightPair[];\n public readonly threshold: number;\n public readonly multiSigPublicKey: MultiSigPublicKey;\n constructor(pks: PublicKeyWeightPair[], threshold: number) {\n this.pksWeightPairs = pks;\n this.threshold = threshold;\n this.multiSigPublicKey = MultiSigPublicKey.fromPublicKeys({\n threshold: this.threshold,\n publicKeys: this.pksWeightPairs\n });\n }\n\n static fromRawEd25519PublicKeys(\n rawPublicKeys: string[],\n weights: number[],\n threshold: number\n ): MultiSigClient {\n const pks = rawPublicKeys.map((rawPublicKey, i) => {\n return {\n publicKey: ed25519PublicKeyFromBase64(rawPublicKey),\n weight: weights[i]\n };\n });\n return new MultiSigClient(pks, threshold);\n }\n\n multiSigAddress(): string {\n return this.multiSigPublicKey.toSuiAddress();\n }\n\n combinePartialSigs(sigs: string[]): string {\n return this.multiSigPublicKey.combinePartialSignatures(sigs);\n }\n}\n","import { PublicKey } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { fromB64 } from '@mysten/sui/utils';\n\nexport function ed25519PublicKeyFromBase64(rawPubkey: string): PublicKey {\n let bytes = fromB64(rawPubkey);\n // rawPubkeys should either be 32 bytes or 33 bytes (with the first byte being flag)\n if (bytes.length !== 32 && bytes.length !== 33) throw 'invalid pubkey length';\n bytes = bytes.length === 33 ? bytes.slice(1) : bytes;\n return new Ed25519PublicKey(bytes);\n}\n","import { SuiMoveNormalizedModules } from '@mysten/sui/client';\nimport { getFullnodeUrl } from '@mysten/sui/client';\n\nimport { SuiInteractor } from '../libs/suiInteractor';\nimport { NetworkType } from '../types';\n\nexport async function loadMetadata(\n networkType: NetworkType,\n packageId: string,\n fullnodeUrls?: string[]\n) {\n // Init the rpc provider\n fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType)];\n const suiInteractor = new SuiInteractor(fullnodeUrls);\n if (packageId !== undefined) {\n const jsonData = await suiInteractor.getNormalizedMoveModulesByPackage(packageId);\n\n return jsonData as SuiMoveNormalizedModules;\n } else {\n console.error('please set your package id.');\n }\n}\n"],"mappings":"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","names":["import_bcs","import_transactions","import_bcs","import_ed25519","genMnemonic","import_transactions","import_utils","import_utils","value","import_bcs","structType","value","keccak256","import_ed25519","import_utils","import_client"]}
|