@scallop-io/sui-kit 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Tookit for interacting with SUI network
1
+ # Toolkit for interacting with SUI network
2
2
 
3
3
  ## Features
4
4
 
package/dist/index.js CHANGED
@@ -502,9 +502,6 @@ var SuiTxBlock = class {
502
502
  }
503
503
  };
504
504
 
505
- // src/libs/suiInteractor/suiInteractor.ts
506
- var import_client = require("@mysten/sui/client");
507
-
508
505
  // src/libs/suiModel/suiOwnedObject.ts
509
506
  var SuiOwnedObject = class {
510
507
  constructor(param) {
@@ -584,19 +581,26 @@ var SuiSharedObject = class {
584
581
  var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
585
582
 
586
583
  // src/libs/suiInteractor/suiInteractor.ts
584
+ var import_client = require("@mysten/sui/client");
587
585
  var SuiInteractor = class {
588
- constructor(fullNodeUrls) {
589
- if (fullNodeUrls.length === 0)
590
- throw new Error("fullNodeUrls must not be empty");
591
- this.fullNodes = fullNodeUrls;
592
- this.clients = fullNodeUrls.map((url) => new import_client.SuiClient({ url }));
593
- this.currentFullNode = fullNodeUrls[0];
586
+ constructor(params) {
587
+ this.clients = [];
588
+ this.fullNodes = [];
589
+ if ("fullnodeUrls" in params) {
590
+ this.fullNodes = params.fullnodeUrls;
591
+ this.clients = this.fullNodes.map((url) => new import_client.SuiClient({ url }));
592
+ } else if ("suiClients" in params) {
593
+ this.clients = params.suiClients;
594
+ } else {
595
+ throw new Error(
596
+ "Invalid params, must provide fullNodeUrls or suiClients"
597
+ );
598
+ }
594
599
  this.currentClient = this.clients[0];
595
600
  }
596
601
  switchToNextClient() {
597
602
  const currentClientIdx = this.clients.indexOf(this.currentClient);
598
603
  this.currentClient = this.clients[(currentClientIdx + 1) % this.clients.length];
599
- this.currentFullNode = this.fullNodes[(currentClientIdx + 1) % this.clients.length];
600
604
  }
601
605
  async sendTx(transactionBlock, signature) {
602
606
  const txResOptions = {
@@ -740,17 +744,22 @@ var SuiKit = class {
740
744
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
741
745
  * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored
742
746
  * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'
743
- * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type
747
+ * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type
744
748
  */
745
- constructor({
746
- mnemonics,
747
- secretKey,
748
- networkType,
749
- fullnodeUrls
750
- } = {}) {
749
+ constructor(params) {
750
+ const { mnemonics, secretKey, networkType } = params;
751
751
  this.accountManager = new SuiAccountManager({ mnemonics, secretKey });
752
- fullnodeUrls = fullnodeUrls || [(0, import_client2.getFullnodeUrl)(networkType ?? "mainnet")];
753
- this.suiInteractor = new SuiInteractor(fullnodeUrls);
752
+ let suiInteractorParams;
753
+ if ("fullnodeUrls" in params) {
754
+ suiInteractorParams = { fullnodeUrls: params.fullnodeUrls };
755
+ } else if ("suiClients" in params) {
756
+ suiInteractorParams = { suiClients: params.suiClients };
757
+ } else {
758
+ suiInteractorParams = {
759
+ fullnodeUrls: [(0, import_client2.getFullnodeUrl)(networkType ?? "mainnet")]
760
+ };
761
+ }
762
+ this.suiInteractor = new SuiInteractor(suiInteractorParams);
754
763
  }
755
764
  /**
756
765
  * Create SuiTxBlock with sender set to the current signer
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/suiKit.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/multiSig/client.ts","../src/libs/multiSig/publickey.ts"],"sourcesContent":["export * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport { SuiKit } from './suiKit';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTxBlock } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiInteractor } from './libs/suiInteractor';\nexport type * from './types';\n","/**\n * @description This file is used to aggregate the tools that used to interact with SUI network.\n */\nimport { getFullnodeUrl } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTxBlock } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiObjectDataOptions,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport type { SuiSharedObject, SuiOwnedObject } from './libs/suiModel';\nimport type {\n SuiKitParams,\n DerivePathParams,\n SuiTxArg,\n SuiVecTxArg,\n SuiKitReturnType,\n SuiObjectArg,\n} from './types';\n\n/**\n * @class SuiKit\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class SuiKit {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\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, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'\n * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type\n */\n constructor({\n mnemonics,\n secretKey,\n networkType,\n fullnodeUrls,\n }: SuiKitParams = {}) {\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n // Init the sui interactor\n fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType ?? 'mainnet')];\n this.suiInteractor = new SuiInteractor(fullnodeUrls);\n }\n\n /**\n * Create SuiTxBlock with sender set to the current signer\n * @returns SuiTxBlock with sender set to the current signer\n */\n createTxBlock(): SuiTxBlock {\n const txb = new SuiTxBlock();\n txb.setSender(this.accountManager.currentAddress);\n return txb;\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the keypair.\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 getKeypair(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 async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObjects(objectIds: string[], options?: SuiObjectDataOptions) {\n return this.suiInteractor.getObjects(objectIds, options);\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiSharedObject | SuiOwnedObject)[]) {\n return this.suiInteractor.updateObjects(suiObjects);\n }\n\n async signTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ) {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n const keyPair = this.getKeypair(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse> {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n return this.suiInteractor.sendTx(bytes, signature);\n }\n\n async dryRunTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DryRunTransactionBlockResponse> {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n return this.suiInteractor.dryRunTx(txBytes);\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(\n recipient: string,\n amount: number,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSui(recipient, amount);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSuiToMany(recipients, amounts);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(\n owner,\n totalAmount,\n coinType\n );\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany(\n [recipient],\n [amount],\n coinType,\n sign,\n derivePathParams\n );\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferObjects(objects, recipient);\n return sign ? await this.signAndSendTxn(tx, derivePathParams) : tx;\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const {\n target,\n arguments: args = [],\n typeArguments = [],\n derivePathParams,\n } = callParams;\n const tx = new SuiTxBlock();\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(\n amount: number,\n coinType: string,\n owner?: string\n ) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins;\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 sign whether to sign and send the transaction, default is true\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(\n amount: number,\n validatorAddr: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.stakeSui(amount, validatorAddr);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams),\n });\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 {\n SUI_PRIVATE_KEY_PREFIX,\n decodeSuiPrivateKey,\n} 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(\n normalizePrivateKey(uint8ArraySecretKey)\n );\n }\n\n return Ed25519Keypair.fromSecretKey(\n normalizePrivateKey(hexOrBase64ToUint8Array(secretKey))\n );\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)\n .getPublicKey()\n .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 'src/types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (\n derivePathParams: DerivePathParams = {}\n) => {\n const {\n accountIndex = 0,\n isExternal = false,\n addressIndex = 0,\n } = 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 = (\n mnemonics: string,\n derivePathParams: DerivePathParams = {}\n) => {\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) =>\n /^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, TransactionObjectInput } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n convertArgs,\n convertAddressArg,\n convertObjArg,\n convertAmounts,\n} from './util';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { Keypair } from '@mysten/sui/cryptography';\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg,\n} from 'src/types';\nimport type { bcs } from '@mysten/sui/bcs';\n\nexport class SuiTxBlock {\n public txBlock: Transaction;\n\n constructor(transaction?: Transaction) {\n this.txBlock = transaction\n ? Transaction.from(transaction)\n : new Transaction();\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.txBlock.gas;\n }\n /** @deprecated Use `getData()` instead. */\n get blockData() {\n return this.txBlock.blockData;\n }\n\n get getData() {\n return this.txBlock.getData();\n }\n\n address(value: string) {\n return this.txBlock.pure.address(value);\n }\n\n get pure(): typeof this.txBlock.pure {\n return this.txBlock.pure;\n }\n\n object(value: string | TransactionObjectInput) {\n return this.txBlock.object(value);\n }\n\n objectRef(ref: SuiObjectRef) {\n return this.txBlock.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.txBlock.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.txBlock.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.txBlock.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.txBlock.setExpiration>[0]) {\n return this.txBlock.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.txBlock.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.txBlock.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.txBlock.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.txBlock.setGasPayment(payments);\n }\n /**\n * @deprecated Use toJSON instead.\n * For synchronous serialization, you can use `getData()`\n * */\n serialize() {\n return this.txBlock.serialize();\n }\n\n toJSON() {\n return this.txBlock.toJSON();\n }\n\n sign(params: {\n signer: Keypair;\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n }) {\n return this.txBlock.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.txBlock.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.txBlock.getDigest(params);\n }\n add(...args: Parameters<typeof this.txBlock.add>) {\n return this.txBlock.add(...args);\n }\n publish({\n modules,\n dependencies,\n }: {\n modules: number[][] | string[];\n dependencies: string[];\n }) {\n return this.txBlock.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.txBlock.upgrade>) {\n return this.txBlock.upgrade(...args);\n }\n\n makeMoveVec(...args: Parameters<typeof this.txBlock.makeMoveVec>) {\n return this.txBlock.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.txBlock.transferObjects(\n objects.map((object) => convertObjArg(this.txBlock, object)),\n convertAddressArg(this.txBlock, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.txBlock.splitCoins(\n convertObjArg(this.txBlock, coin),\n convertAmounts(this.txBlock, amounts)\n );\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.txBlock, destination);\n const sourceObjects = sources.map((source) =>\n convertObjArg(this.txBlock, source)\n );\n return this.txBlock.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(\n target: string,\n args: (SuiTxArg | SuiVecTxArg)[] = [],\n typeArgs: string[] = []\n ) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex =\n /(?<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(\n 'Invalid target format. Expected `${string}::${string}::${string}`'\n );\n const convertedArgs = convertArgs(this.txBlock, args);\n return this.txBlock.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs,\n });\n }\n\n /* Enhance methods of TransactionBlock */\n transferSuiToMany(recipients: SuiAddressArg[], amounts: SuiAmountsArg[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coins = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiAmountsArg) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiAmountsArg) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, [amount])\n );\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, amounts)\n );\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(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(\n coinObjects,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([splitedCoins[index]], address);\n });\n this.txBlock.transferObjects(\n [mergedCoin],\n convertAddressArg(this.txBlock, sender)\n );\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: SuiAmountsArg, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, [amount])\n );\n return this.txBlock.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.txBlock, [\n this.txBlock.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.txBlock, 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';\nimport type { SuiObjectRef } from '@mysten/sui/client';\n\nexport const getDefaultSuiInputType = (\n value: SuiTxArg\n): '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// =========== TYPE GUARD ============\n/**\n * Check whether it is an valid input amount;\n *\n * @param arg\n * @returns boolean.\n */\nfunction isAmountArg(arg: any): arg is bigint | number | string {\n return (\n typeof arg === 'number' ||\n typeof arg === 'bigint' ||\n (typeof arg === 'string' && !isValidSuiAddress(arg) && !isNaN(Number(arg)))\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 */\nfunction 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 * Check whether it is an valid object reference.\n * @param arg The argument to check\n * @returns boolean\n */\nfunction isObjectRef(arg: SuiObjectArg): arg is SuiObjectRef {\n return (\n typeof arg === 'object' &&\n 'digest' in arg &&\n 'version' in arg &&\n 'objectId' in arg\n );\n}\n\n/**\n * Check whether it is an valid shared object reference.\n * @param arg The argument to check\n * @returns\n */\nfunction isSharedObjectRef(\n arg: SuiObjectArg\n): arg is Parameters<typeof Inputs.SharedObjectRef>[0] {\n return (\n typeof arg === 'object' &&\n 'objectId' in arg &&\n 'initialSharedVersion' in arg &&\n 'mutable' in arg\n );\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)\n 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 (\n typeof type === 'string' &&\n !VECTOR_REGEX.test(type) &&\n !STRUCT_REGEX.test(type)\n ) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) =>\n convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements, type });\n }\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\n ? makeVecParam(txBlock, arg.value, arg.vecType)\n : makeVecParam(txBlock, arg);\n }\n\n if (isAmountArg(arg)) {\n return convertAmounts(txBlock, [arg])[0];\n }\n\n return convertObjArg(txBlock, 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(\n txBlock: Transaction,\n arg: SuiAddressArg\n): SuiTxArg {\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(\n txb: Transaction,\n arg: SuiObjectArg\n): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if (isObjectRef(arg)) {\n return txb.objectRef(arg);\n }\n\n if (isSharedObjectRef(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 (\n 'GasCoin' in arg ||\n 'Input' in arg ||\n 'Result' in arg ||\n 'NestedResult' in arg\n ) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(\n txBlock: Transaction,\n amounts: SuiAmountsArg[]\n): TransactionArgument[] {\n return amounts.map((amount) => {\n if (isAmountArg(amount)) {\n return txBlock.pure.u64(amount);\n } else {\n return convertArgs(txBlock, [amount])[0];\n }\n });\n}\n","import { SuiClient } from '@mysten/sui/client';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\nimport type {\n SuiTransactionBlockResponseOptions,\n SuiTransactionBlockResponse,\n SuiObjectDataOptions,\n SuiObjectData,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\n\n/**\n * Encapsulates all functions that interact with the sui sdk\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[];\n public currentClient: SuiClient;\n public readonly fullNodes: string[];\n public currentFullNode: string;\n\n constructor(fullNodeUrls: string[]) {\n if (fullNodeUrls.length === 0)\n 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 }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient =\n this.clients[(currentClientIdx + 1) % this.clients.length];\n this.currentFullNode =\n 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 showRawEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true,\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 dryRunTx(\n transactionBlock: Uint8Array\n ): Promise<DryRunTransactionBlockResponse> {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].dryRunTransactionBlock({\n transactionBlock,\n });\n } catch (err) {\n console.warn(\n `Failed to dry run transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to dry run transaction with all fullnodes');\n }\n\n async getObjects(\n ids: string[],\n options?: SuiObjectDataOptions\n ): 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(\n `Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string, options?: SuiObjectDataOptions) {\n const objects = await this.getObjects([id], options);\n return objects[0];\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(\n (obj) => obj.objectId === object?.objectId\n );\n if (suiObject instanceof SuiSharedObject) {\n if (\n object.owner &&\n typeof object.owner === 'object' &&\n 'Shared' in object.owner\n ) {\n suiObject.initialSharedVersion =\n 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(\n addr: string,\n amount: number,\n coinType: string = '0x2::SUI::SUI'\n ) {\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","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: {\n objectId: string;\n initialSharedVersion?: string;\n mutable?: boolean;\n }) {\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) =>\n new Promise((resolve) => setTimeout(resolve, ms));\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"],"mappings":"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","names":["import_client","import_transactions","import_ed25519","genMnemonic","import_transactions","import_utils","import_utils","import_ed25519","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/suiKit.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/suiModel/suiOwnedObject.ts","../src/libs/suiModel/suiSharedObject.ts","../src/libs/suiInteractor/util.ts","../src/libs/suiInteractor/suiInteractor.ts","../src/libs/multiSig/client.ts","../src/libs/multiSig/publickey.ts"],"sourcesContent":["export * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport { SuiKit } from './suiKit';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTxBlock } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiInteractor } from './libs/suiInteractor';\nexport type * from './types';\n","/**\n * @description This file is used to aggregate the tools that used to interact with SUI network.\n */\nimport { getFullnodeUrl } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTxBlock } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiObjectDataOptions,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport type { SuiSharedObject, SuiOwnedObject } from './libs/suiModel';\nimport type {\n SuiKitParams,\n DerivePathParams,\n SuiTxArg,\n SuiVecTxArg,\n SuiKitReturnType,\n SuiObjectArg,\n} from './types';\n\n/**\n * @class SuiKit\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class SuiKit {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\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, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'\n * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type\n */\n constructor(params: SuiKitParams) {\n const { mnemonics, secretKey, networkType } = params;\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n\n let suiInteractorParams;\n if ('fullnodeUrls' in params) {\n suiInteractorParams = { fullnodeUrls: params.fullnodeUrls };\n } else if ('suiClients' in params) {\n suiInteractorParams = { suiClients: params.suiClients };\n } else {\n suiInteractorParams = {\n fullnodeUrls: [getFullnodeUrl(networkType ?? 'mainnet')],\n };\n }\n\n this.suiInteractor = new SuiInteractor(suiInteractorParams);\n }\n\n /**\n * Create SuiTxBlock with sender set to the current signer\n * @returns SuiTxBlock with sender set to the current signer\n */\n createTxBlock(): SuiTxBlock {\n const txb = new SuiTxBlock();\n txb.setSender(this.accountManager.currentAddress);\n return txb;\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the keypair.\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 getKeypair(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 async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObjects(objectIds: string[], options?: SuiObjectDataOptions) {\n return this.suiInteractor.getObjects(objectIds, options);\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiSharedObject | SuiOwnedObject)[]) {\n return this.suiInteractor.updateObjects(suiObjects);\n }\n\n async signTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ) {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n const keyPair = this.getKeypair(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse> {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n return this.suiInteractor.sendTx(bytes, signature);\n }\n\n async dryRunTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DryRunTransactionBlockResponse> {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n return this.suiInteractor.dryRunTx(txBytes);\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(\n recipient: string,\n amount: number,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSui(recipient, amount);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSuiToMany(recipients, amounts);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(\n owner,\n totalAmount,\n coinType\n );\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany(\n [recipient],\n [amount],\n coinType,\n sign,\n derivePathParams\n );\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferObjects(objects, recipient);\n return sign ? await this.signAndSendTxn(tx, derivePathParams) : tx;\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const {\n target,\n arguments: args = [],\n typeArguments = [],\n derivePathParams,\n } = callParams;\n const tx = new SuiTxBlock();\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(\n amount: number,\n coinType: string,\n owner?: string\n ) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins;\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 sign whether to sign and send the transaction, default is true\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(\n amount: number,\n validatorAddr: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.stakeSui(amount, validatorAddr);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams),\n });\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 { AccountManagerParams, DerivePathParams } from 'src/types';\nimport {\n SUI_PRIVATE_KEY_PREFIX,\n decodeSuiPrivateKey,\n} 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 }: AccountManagerParams = {}) {\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(\n normalizePrivateKey(uint8ArraySecretKey)\n );\n }\n\n return Ed25519Keypair.fromSecretKey(\n normalizePrivateKey(hexOrBase64ToUint8Array(secretKey))\n );\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)\n .getPublicKey()\n .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 'src/types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (\n derivePathParams: DerivePathParams = {}\n) => {\n const {\n accountIndex = 0,\n isExternal = false,\n addressIndex = 0,\n } = 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 = (\n mnemonics: string,\n derivePathParams: DerivePathParams = {}\n) => {\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) =>\n /^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, TransactionObjectInput } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n convertArgs,\n convertAddressArg,\n convertObjArg,\n convertAmounts,\n} from './util';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { Keypair } from '@mysten/sui/cryptography';\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg,\n} from 'src/types';\nimport type { bcs } from '@mysten/sui/bcs';\n\nexport class SuiTxBlock {\n public txBlock: Transaction;\n\n constructor(transaction?: Transaction) {\n this.txBlock = transaction\n ? Transaction.from(transaction)\n : new Transaction();\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.txBlock.gas;\n }\n /** @deprecated Use `getData()` instead. */\n get blockData() {\n return this.txBlock.blockData;\n }\n\n get getData() {\n return this.txBlock.getData();\n }\n\n address(value: string) {\n return this.txBlock.pure.address(value);\n }\n\n get pure(): typeof this.txBlock.pure {\n return this.txBlock.pure;\n }\n\n object(value: string | TransactionObjectInput) {\n return this.txBlock.object(value);\n }\n\n objectRef(ref: SuiObjectRef) {\n return this.txBlock.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.txBlock.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.txBlock.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.txBlock.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.txBlock.setExpiration>[0]) {\n return this.txBlock.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.txBlock.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.txBlock.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.txBlock.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.txBlock.setGasPayment(payments);\n }\n /**\n * @deprecated Use toJSON instead.\n * For synchronous serialization, you can use `getData()`\n * */\n serialize() {\n return this.txBlock.serialize();\n }\n\n toJSON() {\n return this.txBlock.toJSON();\n }\n\n sign(params: {\n signer: Keypair;\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n }) {\n return this.txBlock.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.txBlock.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.txBlock.getDigest(params);\n }\n add(...args: Parameters<typeof this.txBlock.add>) {\n return this.txBlock.add(...args);\n }\n publish({\n modules,\n dependencies,\n }: {\n modules: number[][] | string[];\n dependencies: string[];\n }) {\n return this.txBlock.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.txBlock.upgrade>) {\n return this.txBlock.upgrade(...args);\n }\n\n makeMoveVec(...args: Parameters<typeof this.txBlock.makeMoveVec>) {\n return this.txBlock.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.txBlock.transferObjects(\n objects.map((object) => convertObjArg(this.txBlock, object)),\n convertAddressArg(this.txBlock, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.txBlock.splitCoins(\n convertObjArg(this.txBlock, coin),\n convertAmounts(this.txBlock, amounts)\n );\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.txBlock, destination);\n const sourceObjects = sources.map((source) =>\n convertObjArg(this.txBlock, source)\n );\n return this.txBlock.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(\n target: string,\n args: (SuiTxArg | SuiVecTxArg)[] = [],\n typeArgs: string[] = []\n ) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex =\n /(?<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(\n 'Invalid target format. Expected `${string}::${string}::${string}`'\n );\n const convertedArgs = convertArgs(this.txBlock, args);\n return this.txBlock.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs,\n });\n }\n\n /* Enhance methods of TransactionBlock */\n transferSuiToMany(recipients: SuiAddressArg[], amounts: SuiAmountsArg[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coins = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiAmountsArg) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiAmountsArg) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, [amount])\n );\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, amounts)\n );\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(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(\n coinObjects,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([splitedCoins[index]], address);\n });\n this.txBlock.transferObjects(\n [mergedCoin],\n convertAddressArg(this.txBlock, sender)\n );\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: SuiAmountsArg, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, [amount])\n );\n return this.txBlock.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.txBlock, [\n this.txBlock.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.txBlock, 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';\nimport type { SuiObjectRef } from '@mysten/sui/client';\n\nexport const getDefaultSuiInputType = (\n value: SuiTxArg\n): '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// =========== TYPE GUARD ============\n/**\n * Check whether it is an valid input amount;\n *\n * @param arg\n * @returns boolean.\n */\nfunction isAmountArg(arg: any): arg is bigint | number | string {\n return (\n typeof arg === 'number' ||\n typeof arg === 'bigint' ||\n (typeof arg === 'string' && !isValidSuiAddress(arg) && !isNaN(Number(arg)))\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 */\nfunction 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 * Check whether it is an valid object reference.\n * @param arg The argument to check\n * @returns boolean\n */\nfunction isObjectRef(arg: SuiObjectArg): arg is SuiObjectRef {\n return (\n typeof arg === 'object' &&\n 'digest' in arg &&\n 'version' in arg &&\n 'objectId' in arg\n );\n}\n\n/**\n * Check whether it is an valid shared object reference.\n * @param arg The argument to check\n * @returns\n */\nfunction isSharedObjectRef(\n arg: SuiObjectArg\n): arg is Parameters<typeof Inputs.SharedObjectRef>[0] {\n return (\n typeof arg === 'object' &&\n 'objectId' in arg &&\n 'initialSharedVersion' in arg &&\n 'mutable' in arg\n );\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)\n 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 (\n typeof type === 'string' &&\n !VECTOR_REGEX.test(type) &&\n !STRUCT_REGEX.test(type)\n ) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) =>\n convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements, type });\n }\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\n ? makeVecParam(txBlock, arg.value, arg.vecType)\n : makeVecParam(txBlock, arg);\n }\n\n if (isAmountArg(arg)) {\n return convertAmounts(txBlock, [arg])[0];\n }\n\n return convertObjArg(txBlock, 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(\n txBlock: Transaction,\n arg: SuiAddressArg\n): SuiTxArg {\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(\n txb: Transaction,\n arg: SuiObjectArg\n): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if (isObjectRef(arg)) {\n return txb.objectRef(arg);\n }\n\n if (isSharedObjectRef(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 (\n 'GasCoin' in arg ||\n 'Input' in arg ||\n 'Result' in arg ||\n 'NestedResult' in arg\n ) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(\n txBlock: Transaction,\n amounts: SuiAmountsArg[]\n): TransactionArgument[] {\n return amounts.map((amount) => {\n if (isAmountArg(amount)) {\n return txBlock.pure.u64(amount);\n } else {\n return convertArgs(txBlock, [amount])[0];\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: {\n objectId: string;\n initialSharedVersion?: string;\n mutable?: boolean;\n }) {\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) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { SuiInteractorParams } from 'src/types';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\nimport {\n type SuiTransactionBlockResponseOptions,\n type SuiTransactionBlockResponse,\n type SuiObjectDataOptions,\n type SuiObjectData,\n type DryRunTransactionBlockResponse,\n SuiClient,\n} from '@mysten/sui/client';\n\n/**\n * Encapsulates all functions that interact with the sui sdk\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[] = [];\n public currentClient: SuiClient;\n public readonly fullNodes: string[] = [];\n\n constructor(params: SuiInteractorParams) {\n if ('fullnodeUrls' in params) {\n this.fullNodes = params.fullnodeUrls;\n this.clients = this.fullNodes.map((url) => new SuiClient({ url }));\n } else if ('suiClients' in params) {\n this.clients = params.suiClients;\n } else {\n throw new Error(\n 'Invalid params, must provide fullNodeUrls or suiClients'\n );\n }\n this.currentClient = this.clients[0];\n }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient =\n this.clients[(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 showRawEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true,\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 dryRunTx(\n transactionBlock: Uint8Array\n ): Promise<DryRunTransactionBlockResponse> {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].dryRunTransactionBlock({\n transactionBlock,\n });\n } catch (err) {\n console.warn(\n `Failed to dry run transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to dry run transaction with all fullnodes');\n }\n\n async getObjects(\n ids: string[],\n options?: SuiObjectDataOptions\n ): 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(\n `Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string, options?: SuiObjectDataOptions) {\n const objects = await this.getObjects([id], options);\n return objects[0];\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(\n (obj) => obj.objectId === object?.objectId\n );\n if (suiObject instanceof SuiSharedObject) {\n if (\n object.owner &&\n typeof object.owner === 'object' &&\n 'Shared' in object.owner\n ) {\n suiObject.initialSharedVersion =\n 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(\n addr: string,\n amount: number,\n coinType: string = '0x2::SUI::SUI'\n ) {\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","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"],"mappings":"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","names":["import_client","import_transactions","import_ed25519","genMnemonic","import_transactions","import_utils","import_utils","import_ed25519","import_utils"]}
package/dist/index.mjs CHANGED
@@ -481,9 +481,6 @@ var SuiTxBlock = class {
481
481
  }
482
482
  };
483
483
 
484
- // src/libs/suiInteractor/suiInteractor.ts
485
- import { SuiClient } from "@mysten/sui/client";
486
-
487
484
  // src/libs/suiModel/suiOwnedObject.ts
488
485
  var SuiOwnedObject = class {
489
486
  constructor(param) {
@@ -563,19 +560,28 @@ var SuiSharedObject = class {
563
560
  var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
564
561
 
565
562
  // src/libs/suiInteractor/suiInteractor.ts
563
+ import {
564
+ SuiClient
565
+ } from "@mysten/sui/client";
566
566
  var SuiInteractor = class {
567
- constructor(fullNodeUrls) {
568
- if (fullNodeUrls.length === 0)
569
- throw new Error("fullNodeUrls must not be empty");
570
- this.fullNodes = fullNodeUrls;
571
- this.clients = fullNodeUrls.map((url) => new SuiClient({ url }));
572
- this.currentFullNode = fullNodeUrls[0];
567
+ constructor(params) {
568
+ this.clients = [];
569
+ this.fullNodes = [];
570
+ if ("fullnodeUrls" in params) {
571
+ this.fullNodes = params.fullnodeUrls;
572
+ this.clients = this.fullNodes.map((url) => new SuiClient({ url }));
573
+ } else if ("suiClients" in params) {
574
+ this.clients = params.suiClients;
575
+ } else {
576
+ throw new Error(
577
+ "Invalid params, must provide fullNodeUrls or suiClients"
578
+ );
579
+ }
573
580
  this.currentClient = this.clients[0];
574
581
  }
575
582
  switchToNextClient() {
576
583
  const currentClientIdx = this.clients.indexOf(this.currentClient);
577
584
  this.currentClient = this.clients[(currentClientIdx + 1) % this.clients.length];
578
- this.currentFullNode = this.fullNodes[(currentClientIdx + 1) % this.clients.length];
579
585
  }
580
586
  async sendTx(transactionBlock, signature) {
581
587
  const txResOptions = {
@@ -719,17 +725,22 @@ var SuiKit = class {
719
725
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
720
726
  * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored
721
727
  * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'
722
- * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type
728
+ * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type
723
729
  */
724
- constructor({
725
- mnemonics,
726
- secretKey,
727
- networkType,
728
- fullnodeUrls
729
- } = {}) {
730
+ constructor(params) {
731
+ const { mnemonics, secretKey, networkType } = params;
730
732
  this.accountManager = new SuiAccountManager({ mnemonics, secretKey });
731
- fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType ?? "mainnet")];
732
- this.suiInteractor = new SuiInteractor(fullnodeUrls);
733
+ let suiInteractorParams;
734
+ if ("fullnodeUrls" in params) {
735
+ suiInteractorParams = { fullnodeUrls: params.fullnodeUrls };
736
+ } else if ("suiClients" in params) {
737
+ suiInteractorParams = { suiClients: params.suiClients };
738
+ } else {
739
+ suiInteractorParams = {
740
+ fullnodeUrls: [getFullnodeUrl(networkType ?? "mainnet")]
741
+ };
742
+ }
743
+ this.suiInteractor = new SuiInteractor(suiInteractorParams);
733
744
  }
734
745
  /**
735
746
  * Create SuiTxBlock with sender set to the current signer
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/suiKit.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/multiSig/client.ts","../src/libs/multiSig/publickey.ts"],"sourcesContent":["export * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport { SuiKit } from './suiKit';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTxBlock } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiInteractor } from './libs/suiInteractor';\nexport type * from './types';\n","/**\n * @description This file is used to aggregate the tools that used to interact with SUI network.\n */\nimport { getFullnodeUrl } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTxBlock } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiObjectDataOptions,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport type { SuiSharedObject, SuiOwnedObject } from './libs/suiModel';\nimport type {\n SuiKitParams,\n DerivePathParams,\n SuiTxArg,\n SuiVecTxArg,\n SuiKitReturnType,\n SuiObjectArg,\n} from './types';\n\n/**\n * @class SuiKit\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class SuiKit {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\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, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'\n * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type\n */\n constructor({\n mnemonics,\n secretKey,\n networkType,\n fullnodeUrls,\n }: SuiKitParams = {}) {\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n // Init the sui interactor\n fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType ?? 'mainnet')];\n this.suiInteractor = new SuiInteractor(fullnodeUrls);\n }\n\n /**\n * Create SuiTxBlock with sender set to the current signer\n * @returns SuiTxBlock with sender set to the current signer\n */\n createTxBlock(): SuiTxBlock {\n const txb = new SuiTxBlock();\n txb.setSender(this.accountManager.currentAddress);\n return txb;\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the keypair.\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 getKeypair(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 async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObjects(objectIds: string[], options?: SuiObjectDataOptions) {\n return this.suiInteractor.getObjects(objectIds, options);\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiSharedObject | SuiOwnedObject)[]) {\n return this.suiInteractor.updateObjects(suiObjects);\n }\n\n async signTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ) {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n const keyPair = this.getKeypair(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse> {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n return this.suiInteractor.sendTx(bytes, signature);\n }\n\n async dryRunTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DryRunTransactionBlockResponse> {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n return this.suiInteractor.dryRunTx(txBytes);\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(\n recipient: string,\n amount: number,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSui(recipient, amount);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSuiToMany(recipients, amounts);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(\n owner,\n totalAmount,\n coinType\n );\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany(\n [recipient],\n [amount],\n coinType,\n sign,\n derivePathParams\n );\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferObjects(objects, recipient);\n return sign ? await this.signAndSendTxn(tx, derivePathParams) : tx;\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const {\n target,\n arguments: args = [],\n typeArguments = [],\n derivePathParams,\n } = callParams;\n const tx = new SuiTxBlock();\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(\n amount: number,\n coinType: string,\n owner?: string\n ) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins;\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 sign whether to sign and send the transaction, default is true\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(\n amount: number,\n validatorAddr: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.stakeSui(amount, validatorAddr);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams),\n });\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 {\n SUI_PRIVATE_KEY_PREFIX,\n decodeSuiPrivateKey,\n} 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(\n normalizePrivateKey(uint8ArraySecretKey)\n );\n }\n\n return Ed25519Keypair.fromSecretKey(\n normalizePrivateKey(hexOrBase64ToUint8Array(secretKey))\n );\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)\n .getPublicKey()\n .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 'src/types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (\n derivePathParams: DerivePathParams = {}\n) => {\n const {\n accountIndex = 0,\n isExternal = false,\n addressIndex = 0,\n } = 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 = (\n mnemonics: string,\n derivePathParams: DerivePathParams = {}\n) => {\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) =>\n /^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, TransactionObjectInput } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n convertArgs,\n convertAddressArg,\n convertObjArg,\n convertAmounts,\n} from './util';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { Keypair } from '@mysten/sui/cryptography';\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg,\n} from 'src/types';\nimport type { bcs } from '@mysten/sui/bcs';\n\nexport class SuiTxBlock {\n public txBlock: Transaction;\n\n constructor(transaction?: Transaction) {\n this.txBlock = transaction\n ? Transaction.from(transaction)\n : new Transaction();\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.txBlock.gas;\n }\n /** @deprecated Use `getData()` instead. */\n get blockData() {\n return this.txBlock.blockData;\n }\n\n get getData() {\n return this.txBlock.getData();\n }\n\n address(value: string) {\n return this.txBlock.pure.address(value);\n }\n\n get pure(): typeof this.txBlock.pure {\n return this.txBlock.pure;\n }\n\n object(value: string | TransactionObjectInput) {\n return this.txBlock.object(value);\n }\n\n objectRef(ref: SuiObjectRef) {\n return this.txBlock.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.txBlock.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.txBlock.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.txBlock.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.txBlock.setExpiration>[0]) {\n return this.txBlock.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.txBlock.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.txBlock.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.txBlock.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.txBlock.setGasPayment(payments);\n }\n /**\n * @deprecated Use toJSON instead.\n * For synchronous serialization, you can use `getData()`\n * */\n serialize() {\n return this.txBlock.serialize();\n }\n\n toJSON() {\n return this.txBlock.toJSON();\n }\n\n sign(params: {\n signer: Keypair;\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n }) {\n return this.txBlock.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.txBlock.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.txBlock.getDigest(params);\n }\n add(...args: Parameters<typeof this.txBlock.add>) {\n return this.txBlock.add(...args);\n }\n publish({\n modules,\n dependencies,\n }: {\n modules: number[][] | string[];\n dependencies: string[];\n }) {\n return this.txBlock.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.txBlock.upgrade>) {\n return this.txBlock.upgrade(...args);\n }\n\n makeMoveVec(...args: Parameters<typeof this.txBlock.makeMoveVec>) {\n return this.txBlock.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.txBlock.transferObjects(\n objects.map((object) => convertObjArg(this.txBlock, object)),\n convertAddressArg(this.txBlock, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.txBlock.splitCoins(\n convertObjArg(this.txBlock, coin),\n convertAmounts(this.txBlock, amounts)\n );\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.txBlock, destination);\n const sourceObjects = sources.map((source) =>\n convertObjArg(this.txBlock, source)\n );\n return this.txBlock.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(\n target: string,\n args: (SuiTxArg | SuiVecTxArg)[] = [],\n typeArgs: string[] = []\n ) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex =\n /(?<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(\n 'Invalid target format. Expected `${string}::${string}::${string}`'\n );\n const convertedArgs = convertArgs(this.txBlock, args);\n return this.txBlock.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs,\n });\n }\n\n /* Enhance methods of TransactionBlock */\n transferSuiToMany(recipients: SuiAddressArg[], amounts: SuiAmountsArg[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coins = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiAmountsArg) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiAmountsArg) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, [amount])\n );\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, amounts)\n );\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(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(\n coinObjects,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([splitedCoins[index]], address);\n });\n this.txBlock.transferObjects(\n [mergedCoin],\n convertAddressArg(this.txBlock, sender)\n );\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: SuiAmountsArg, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, [amount])\n );\n return this.txBlock.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.txBlock, [\n this.txBlock.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.txBlock, 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';\nimport type { SuiObjectRef } from '@mysten/sui/client';\n\nexport const getDefaultSuiInputType = (\n value: SuiTxArg\n): '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// =========== TYPE GUARD ============\n/**\n * Check whether it is an valid input amount;\n *\n * @param arg\n * @returns boolean.\n */\nfunction isAmountArg(arg: any): arg is bigint | number | string {\n return (\n typeof arg === 'number' ||\n typeof arg === 'bigint' ||\n (typeof arg === 'string' && !isValidSuiAddress(arg) && !isNaN(Number(arg)))\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 */\nfunction 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 * Check whether it is an valid object reference.\n * @param arg The argument to check\n * @returns boolean\n */\nfunction isObjectRef(arg: SuiObjectArg): arg is SuiObjectRef {\n return (\n typeof arg === 'object' &&\n 'digest' in arg &&\n 'version' in arg &&\n 'objectId' in arg\n );\n}\n\n/**\n * Check whether it is an valid shared object reference.\n * @param arg The argument to check\n * @returns\n */\nfunction isSharedObjectRef(\n arg: SuiObjectArg\n): arg is Parameters<typeof Inputs.SharedObjectRef>[0] {\n return (\n typeof arg === 'object' &&\n 'objectId' in arg &&\n 'initialSharedVersion' in arg &&\n 'mutable' in arg\n );\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)\n 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 (\n typeof type === 'string' &&\n !VECTOR_REGEX.test(type) &&\n !STRUCT_REGEX.test(type)\n ) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) =>\n convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements, type });\n }\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\n ? makeVecParam(txBlock, arg.value, arg.vecType)\n : makeVecParam(txBlock, arg);\n }\n\n if (isAmountArg(arg)) {\n return convertAmounts(txBlock, [arg])[0];\n }\n\n return convertObjArg(txBlock, 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(\n txBlock: Transaction,\n arg: SuiAddressArg\n): SuiTxArg {\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(\n txb: Transaction,\n arg: SuiObjectArg\n): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if (isObjectRef(arg)) {\n return txb.objectRef(arg);\n }\n\n if (isSharedObjectRef(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 (\n 'GasCoin' in arg ||\n 'Input' in arg ||\n 'Result' in arg ||\n 'NestedResult' in arg\n ) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(\n txBlock: Transaction,\n amounts: SuiAmountsArg[]\n): TransactionArgument[] {\n return amounts.map((amount) => {\n if (isAmountArg(amount)) {\n return txBlock.pure.u64(amount);\n } else {\n return convertArgs(txBlock, [amount])[0];\n }\n });\n}\n","import { SuiClient } from '@mysten/sui/client';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\nimport type {\n SuiTransactionBlockResponseOptions,\n SuiTransactionBlockResponse,\n SuiObjectDataOptions,\n SuiObjectData,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\n\n/**\n * Encapsulates all functions that interact with the sui sdk\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[];\n public currentClient: SuiClient;\n public readonly fullNodes: string[];\n public currentFullNode: string;\n\n constructor(fullNodeUrls: string[]) {\n if (fullNodeUrls.length === 0)\n 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 }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient =\n this.clients[(currentClientIdx + 1) % this.clients.length];\n this.currentFullNode =\n 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 showRawEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true,\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 dryRunTx(\n transactionBlock: Uint8Array\n ): Promise<DryRunTransactionBlockResponse> {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].dryRunTransactionBlock({\n transactionBlock,\n });\n } catch (err) {\n console.warn(\n `Failed to dry run transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to dry run transaction with all fullnodes');\n }\n\n async getObjects(\n ids: string[],\n options?: SuiObjectDataOptions\n ): 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(\n `Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string, options?: SuiObjectDataOptions) {\n const objects = await this.getObjects([id], options);\n return objects[0];\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(\n (obj) => obj.objectId === object?.objectId\n );\n if (suiObject instanceof SuiSharedObject) {\n if (\n object.owner &&\n typeof object.owner === 'object' &&\n 'Shared' in object.owner\n ) {\n suiObject.initialSharedVersion =\n 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(\n addr: string,\n amount: number,\n coinType: string = '0x2::SUI::SUI'\n ) {\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","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: {\n objectId: string;\n initialSharedVersion?: string;\n mutable?: boolean;\n }) {\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) =>\n new Promise((resolve) => setTimeout(resolve, ms));\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"],"mappings":"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","names":["Transaction","Ed25519Keypair","Ed25519Keypair","Transaction","fromB64"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/suiKit.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/suiModel/suiOwnedObject.ts","../src/libs/suiModel/suiSharedObject.ts","../src/libs/suiInteractor/util.ts","../src/libs/suiInteractor/suiInteractor.ts","../src/libs/multiSig/client.ts","../src/libs/multiSig/publickey.ts"],"sourcesContent":["export * from '@mysten/sui/utils';\nexport * from '@mysten/sui/transactions';\nexport { SuiKit } from './suiKit';\nexport { SuiAccountManager } from './libs/suiAccountManager';\nexport { SuiTxBlock } from './libs/suiTxBuilder';\nexport { MultiSigClient } from './libs/multiSig';\nexport { SuiInteractor } from './libs/suiInteractor';\nexport type * from './types';\n","/**\n * @description This file is used to aggregate the tools that used to interact with SUI network.\n */\nimport { getFullnodeUrl } from '@mysten/sui/client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { SuiAccountManager } from './libs/suiAccountManager';\nimport { SuiTxBlock } from './libs/suiTxBuilder';\nimport { SuiInteractor } from './libs/suiInteractor';\nimport type {\n SuiTransactionBlockResponse,\n DevInspectResults,\n SuiObjectDataOptions,\n DryRunTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport type { SuiSharedObject, SuiOwnedObject } from './libs/suiModel';\nimport type {\n SuiKitParams,\n DerivePathParams,\n SuiTxArg,\n SuiVecTxArg,\n SuiKitReturnType,\n SuiObjectArg,\n} from './types';\n\n/**\n * @class SuiKit\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class SuiKit {\n public accountManager: SuiAccountManager;\n public suiInteractor: SuiInteractor;\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, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'\n * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type\n */\n constructor(params: SuiKitParams) {\n const { mnemonics, secretKey, networkType } = params;\n // Init the account manager\n this.accountManager = new SuiAccountManager({ mnemonics, secretKey });\n\n let suiInteractorParams;\n if ('fullnodeUrls' in params) {\n suiInteractorParams = { fullnodeUrls: params.fullnodeUrls };\n } else if ('suiClients' in params) {\n suiInteractorParams = { suiClients: params.suiClients };\n } else {\n suiInteractorParams = {\n fullnodeUrls: [getFullnodeUrl(networkType ?? 'mainnet')],\n };\n }\n\n this.suiInteractor = new SuiInteractor(suiInteractorParams);\n }\n\n /**\n * Create SuiTxBlock with sender set to the current signer\n * @returns SuiTxBlock with sender set to the current signer\n */\n createTxBlock(): SuiTxBlock {\n const txb = new SuiTxBlock();\n txb.setSender(this.accountManager.currentAddress);\n return txb;\n }\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the keypair.\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 getKeypair(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 async getBalance(coinType?: string, derivePathParams?: DerivePathParams) {\n const owner = this.accountManager.getAddress(derivePathParams);\n return this.suiInteractor.currentClient.getBalance({ owner, coinType });\n }\n\n client() {\n return this.suiInteractor.currentClient;\n }\n\n async getObjects(objectIds: string[], options?: SuiObjectDataOptions) {\n return this.suiInteractor.getObjects(objectIds, options);\n }\n\n /**\n * @description Update objects in a batch\n * @param suiObjects\n */\n async updateObjects(suiObjects: (SuiSharedObject | SuiOwnedObject)[]) {\n return this.suiInteractor.updateObjects(suiObjects);\n }\n\n async signTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ) {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n const keyPair = this.getKeypair(derivePathParams);\n return await keyPair.signTransaction(txBytes);\n }\n\n async signAndSendTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse> {\n const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n return this.suiInteractor.sendTx(bytes, signature);\n }\n\n async dryRunTxn(\n tx: Uint8Array | Transaction | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DryRunTransactionBlockResponse> {\n if (tx instanceof SuiTxBlock) {\n tx.setSender(this.getAddress(derivePathParams));\n }\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n const txBytes =\n txBlock instanceof Transaction\n ? await txBlock.build({ client: this.client() })\n : txBlock;\n return this.suiInteractor.dryRunTx(txBytes);\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(\n recipient: string,\n amount: number,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSui<S extends boolean>(\n recipient: string,\n amount: number,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSui(recipient, amount);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferSuiToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferSuiToMany(recipients, amounts);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 ): Promise<SuiTransactionBlockResponse>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoinToMany<S extends boolean>(\n recipients: string[],\n amounts: number[],\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n const owner = this.accountManager.getAddress(derivePathParams);\n const totalAmount = amounts.reduce((a, b) => a + b, 0);\n const coins = await this.suiInteractor.selectCoins(\n owner,\n totalAmount,\n coinType\n );\n tx.transferCoinToMany(\n coins.map((c) => c.objectId),\n owner,\n recipients,\n amounts\n );\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\n }\n\n async transferCoin(\n recipient: string,\n amount: number,\n coinType: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferCoin<S extends boolean>(\n recipient: string,\n amount: number,\n coinType: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n return this.transferCoinToMany(\n [recipient],\n [amount],\n coinType,\n sign,\n derivePathParams\n );\n }\n\n async transferObjects(\n objects: SuiObjectArg[],\n recipient: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async transferObjects<S extends boolean>(\n objects: SuiObjectArg[],\n recipient: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.transferObjects(objects, recipient);\n return sign ? await this.signAndSendTxn(tx, derivePathParams) : tx;\n }\n\n async moveCall(callParams: {\n target: string;\n arguments?: (SuiTxArg | SuiVecTxArg)[];\n typeArguments?: string[];\n derivePathParams?: DerivePathParams;\n }) {\n const {\n target,\n arguments: args = [],\n typeArguments = [],\n derivePathParams,\n } = callParams;\n const tx = new SuiTxBlock();\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(\n amount: number,\n coinType: string,\n owner?: string\n ) {\n owner = owner || this.accountManager.currentAddress;\n const coins = await this.suiInteractor.selectCoins(owner, amount, coinType);\n return coins;\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 sign whether to sign and send the transaction, default is true\n * @param derivePathParams the derive path params for the current signer\n */\n async stakeSui(\n amount: number,\n validatorAddr: string,\n derivePathParams?: DerivePathParams\n ): Promise<SuiTransactionBlockResponse>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign?: S,\n derivePathParams?: DerivePathParams\n ): Promise<SuiKitReturnType<S>>;\n async stakeSui<S extends boolean>(\n amount: number,\n validatorAddr: string,\n sign: S = true as S,\n derivePathParams?: DerivePathParams\n ) {\n const tx = new SuiTxBlock();\n tx.stakeSui(amount, validatorAddr);\n return sign\n ? ((await this.signAndSendTxn(\n tx,\n derivePathParams\n )) as SuiKitReturnType<S>)\n : (tx as SuiKitReturnType<S>);\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 | SuiTxBlock,\n derivePathParams?: DerivePathParams\n ): Promise<DevInspectResults> {\n const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n return this.suiInteractor.currentClient.devInspectTransactionBlock({\n transactionBlock: txBlock,\n sender: this.getAddress(derivePathParams),\n });\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 { AccountManagerParams, DerivePathParams } from 'src/types';\nimport {\n SUI_PRIVATE_KEY_PREFIX,\n decodeSuiPrivateKey,\n} 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 }: AccountManagerParams = {}) {\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(\n normalizePrivateKey(uint8ArraySecretKey)\n );\n }\n\n return Ed25519Keypair.fromSecretKey(\n normalizePrivateKey(hexOrBase64ToUint8Array(secretKey))\n );\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)\n .getPublicKey()\n .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 'src/types';\n\n/**\n * @description Get ed25519 derive path for SUI\n * @param derivePathParams\n */\nexport const getDerivePathForSUI = (\n derivePathParams: DerivePathParams = {}\n) => {\n const {\n accountIndex = 0,\n isExternal = false,\n addressIndex = 0,\n } = 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 = (\n mnemonics: string,\n derivePathParams: DerivePathParams = {}\n) => {\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) =>\n /^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, TransactionObjectInput } from '@mysten/sui/transactions';\nimport { SUI_SYSTEM_STATE_OBJECT_ID } from '@mysten/sui/utils';\nimport {\n convertArgs,\n convertAddressArg,\n convertObjArg,\n convertAmounts,\n} from './util';\nimport type { SuiClient, SuiObjectRef } from '@mysten/sui/client';\nimport type { Keypair } from '@mysten/sui/cryptography';\nimport type {\n SuiTxArg,\n SuiAddressArg,\n SuiObjectArg,\n SuiVecTxArg,\n SuiAmountsArg,\n} from 'src/types';\nimport type { bcs } from '@mysten/sui/bcs';\n\nexport class SuiTxBlock {\n public txBlock: Transaction;\n\n constructor(transaction?: Transaction) {\n this.txBlock = transaction\n ? Transaction.from(transaction)\n : new Transaction();\n }\n\n /* Directly wrap methods and properties of TransactionBlock */\n get gas() {\n return this.txBlock.gas;\n }\n /** @deprecated Use `getData()` instead. */\n get blockData() {\n return this.txBlock.blockData;\n }\n\n get getData() {\n return this.txBlock.getData();\n }\n\n address(value: string) {\n return this.txBlock.pure.address(value);\n }\n\n get pure(): typeof this.txBlock.pure {\n return this.txBlock.pure;\n }\n\n object(value: string | TransactionObjectInput) {\n return this.txBlock.object(value);\n }\n\n objectRef(ref: SuiObjectRef) {\n return this.txBlock.objectRef(ref);\n }\n sharedObjectRef(ref: typeof bcs.SharedObjectRef.$inferType) {\n return this.txBlock.sharedObjectRef(ref);\n }\n setSender(sender: string) {\n return this.txBlock.setSender(sender);\n }\n setSenderIfNotSet(sender: string) {\n return this.txBlock.setSenderIfNotSet(sender);\n }\n setExpiration(expiration?: Parameters<typeof this.txBlock.setExpiration>[0]) {\n return this.txBlock.setExpiration(expiration);\n }\n setGasPrice(price: number | bigint) {\n return this.txBlock.setGasPrice(price);\n }\n setGasBudget(budget: number | bigint) {\n return this.txBlock.setGasBudget(budget);\n }\n setGasOwner(owner: string) {\n return this.txBlock.setGasOwner(owner);\n }\n setGasPayment(payments: SuiObjectRef[]) {\n return this.txBlock.setGasPayment(payments);\n }\n /**\n * @deprecated Use toJSON instead.\n * For synchronous serialization, you can use `getData()`\n * */\n serialize() {\n return this.txBlock.serialize();\n }\n\n toJSON() {\n return this.txBlock.toJSON();\n }\n\n sign(params: {\n signer: Keypair;\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n }) {\n return this.txBlock.sign(params);\n }\n build(\n params: {\n client?: SuiClient;\n onlyTransactionKind?: boolean;\n } = {}\n ) {\n return this.txBlock.build(params);\n }\n getDigest(params: { client?: SuiClient } = {}) {\n return this.txBlock.getDigest(params);\n }\n add(...args: Parameters<typeof this.txBlock.add>) {\n return this.txBlock.add(...args);\n }\n publish({\n modules,\n dependencies,\n }: {\n modules: number[][] | string[];\n dependencies: string[];\n }) {\n return this.txBlock.publish({ modules, dependencies });\n }\n upgrade(...args: Parameters<typeof this.txBlock.upgrade>) {\n return this.txBlock.upgrade(...args);\n }\n\n makeMoveVec(...args: Parameters<typeof this.txBlock.makeMoveVec>) {\n return this.txBlock.makeMoveVec(...args);\n }\n\n /* Override methods of TransactionBlock */\n\n transferObjects(objects: SuiObjectArg[], address: SuiAddressArg) {\n return this.txBlock.transferObjects(\n objects.map((object) => convertObjArg(this.txBlock, object)),\n convertAddressArg(this.txBlock, address)\n );\n }\n\n splitCoins(coin: SuiObjectArg, amounts: SuiAmountsArg[]) {\n const res = this.txBlock.splitCoins(\n convertObjArg(this.txBlock, coin),\n convertAmounts(this.txBlock, amounts)\n );\n return amounts.map((_, i) => res[i]);\n }\n\n mergeCoins(destination: SuiObjectArg, sources: SuiObjectArg[]) {\n const destinationObject = convertObjArg(this.txBlock, destination);\n const sourceObjects = sources.map((source) =>\n convertObjArg(this.txBlock, source)\n );\n return this.txBlock.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(\n target: string,\n args: (SuiTxArg | SuiVecTxArg)[] = [],\n typeArgs: string[] = []\n ) {\n // a regex for pattern `${string}::${string}::${string}`\n const regex =\n /(?<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(\n 'Invalid target format. Expected `${string}::${string}::${string}`'\n );\n const convertedArgs = convertArgs(this.txBlock, args);\n return this.txBlock.moveCall({\n target: target as `${string}::${string}::${string}`,\n arguments: convertedArgs,\n typeArguments: typeArgs,\n });\n }\n\n /* Enhance methods of TransactionBlock */\n transferSuiToMany(recipients: SuiAddressArg[], amounts: SuiAmountsArg[]) {\n // require recipients.length === amounts.length\n if (recipients.length !== amounts.length) {\n throw new Error(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coins = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([coins[index]], address);\n });\n return this;\n }\n\n transferSui(address: SuiAddressArg, amount: SuiAmountsArg) {\n return this.transferSuiToMany([address], [amount]);\n }\n\n takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiAmountsArg) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const [sendCoin] = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, [amount])\n );\n return [sendCoin, mergedCoin];\n }\n\n splitSUIFromGas(amounts: SuiAmountsArg[]) {\n return this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, amounts)\n );\n }\n\n splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]) {\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const mergedCoin = coinObjects[0];\n if (coins.length > 1) {\n this.txBlock.mergeCoins(mergedCoin, coinObjects.slice(1));\n }\n const splitedCoins = this.txBlock.splitCoins(\n mergedCoin,\n convertAmounts(this.txBlock, amounts)\n );\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(\n 'transferSuiToMany: recipients.length !== amounts.length'\n );\n }\n const coinObjects = coins.map((coin) => convertObjArg(this.txBlock, coin));\n const { splitedCoins, mergedCoin } = this.splitMultiCoins(\n coinObjects,\n convertAmounts(this.txBlock, amounts)\n );\n const recipientObjects = recipients.map((recipient) =>\n convertAddressArg(this.txBlock, recipient)\n );\n recipientObjects.forEach((address, index) => {\n this.txBlock.transferObjects([splitedCoins[index]], address);\n });\n this.txBlock.transferObjects(\n [mergedCoin],\n convertAddressArg(this.txBlock, sender)\n );\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: SuiAmountsArg, validatorAddr: SuiAddressArg) {\n const [stakeCoin] = this.txBlock.splitCoins(\n this.txBlock.gas,\n convertAmounts(this.txBlock, [amount])\n );\n return this.txBlock.moveCall({\n target: '0x3::sui_system::request_add_stake',\n arguments: convertArgs(this.txBlock, [\n this.txBlock.object(SUI_SYSTEM_STATE_OBJECT_ID),\n stakeCoin,\n convertAddressArg(this.txBlock, 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';\nimport type { SuiObjectRef } from '@mysten/sui/client';\n\nexport const getDefaultSuiInputType = (\n value: SuiTxArg\n): '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// =========== TYPE GUARD ============\n/**\n * Check whether it is an valid input amount;\n *\n * @param arg\n * @returns boolean.\n */\nfunction isAmountArg(arg: any): arg is bigint | number | string {\n return (\n typeof arg === 'number' ||\n typeof arg === 'bigint' ||\n (typeof arg === 'string' && !isValidSuiAddress(arg) && !isNaN(Number(arg)))\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 */\nfunction 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 * Check whether it is an valid object reference.\n * @param arg The argument to check\n * @returns boolean\n */\nfunction isObjectRef(arg: SuiObjectArg): arg is SuiObjectRef {\n return (\n typeof arg === 'object' &&\n 'digest' in arg &&\n 'version' in arg &&\n 'objectId' in arg\n );\n}\n\n/**\n * Check whether it is an valid shared object reference.\n * @param arg The argument to check\n * @returns\n */\nfunction isSharedObjectRef(\n arg: SuiObjectArg\n): arg is Parameters<typeof Inputs.SharedObjectRef>[0] {\n return (\n typeof arg === 'object' &&\n 'objectId' in arg &&\n 'initialSharedVersion' in arg &&\n 'mutable' in arg\n );\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)\n 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 (\n typeof type === 'string' &&\n !VECTOR_REGEX.test(type) &&\n !STRUCT_REGEX.test(type)\n ) {\n const bcsSchema = getPureBcsSchema(type)!;\n return txBlock.pure(bcs.vector(bcsSchema).serialize(args));\n } else {\n const elements = args.map((arg) =>\n convertObjArg(txBlock, arg as SuiObjectArg)\n );\n return txBlock.makeMoveVec({ elements, type });\n }\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\n ? makeVecParam(txBlock, arg.value, arg.vecType)\n : makeVecParam(txBlock, arg);\n }\n\n if (isAmountArg(arg)) {\n return convertAmounts(txBlock, [arg])[0];\n }\n\n return convertObjArg(txBlock, 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(\n txBlock: Transaction,\n arg: SuiAddressArg\n): SuiTxArg {\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(\n txb: Transaction,\n arg: SuiObjectArg\n): TransactionObjectArgument {\n if (typeof arg === 'string') {\n return txb.object(arg);\n }\n\n if (isObjectRef(arg)) {\n return txb.objectRef(arg);\n }\n\n if (isSharedObjectRef(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 (\n 'GasCoin' in arg ||\n 'Input' in arg ||\n 'Result' in arg ||\n 'NestedResult' in arg\n ) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport function convertAmounts(\n txBlock: Transaction,\n amounts: SuiAmountsArg[]\n): TransactionArgument[] {\n return amounts.map((amount) => {\n if (isAmountArg(amount)) {\n return txBlock.pure.u64(amount);\n } else {\n return convertArgs(txBlock, [amount])[0];\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: {\n objectId: string;\n initialSharedVersion?: string;\n mutable?: boolean;\n }) {\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) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { SuiInteractorParams } from 'src/types';\nimport { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\nimport {\n type SuiTransactionBlockResponseOptions,\n type SuiTransactionBlockResponse,\n type SuiObjectDataOptions,\n type SuiObjectData,\n type DryRunTransactionBlockResponse,\n SuiClient,\n} from '@mysten/sui/client';\n\n/**\n * Encapsulates all functions that interact with the sui sdk\n */\nexport class SuiInteractor {\n public readonly clients: SuiClient[] = [];\n public currentClient: SuiClient;\n public readonly fullNodes: string[] = [];\n\n constructor(params: SuiInteractorParams) {\n if ('fullnodeUrls' in params) {\n this.fullNodes = params.fullnodeUrls;\n this.clients = this.fullNodes.map((url) => new SuiClient({ url }));\n } else if ('suiClients' in params) {\n this.clients = params.suiClients;\n } else {\n throw new Error(\n 'Invalid params, must provide fullNodeUrls or suiClients'\n );\n }\n this.currentClient = this.clients[0];\n }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient =\n this.clients[(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 showRawEffects: true,\n showObjectChanges: true,\n showBalanceChanges: true,\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 dryRunTx(\n transactionBlock: Uint8Array\n ): Promise<DryRunTransactionBlockResponse> {\n for (const clientIdx in this.clients) {\n try {\n return await this.clients[clientIdx].dryRunTransactionBlock({\n transactionBlock,\n });\n } catch (err) {\n console.warn(\n `Failed to dry run transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to dry run transaction with all fullnodes');\n }\n\n async getObjects(\n ids: string[],\n options?: SuiObjectDataOptions\n ): 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(\n `Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n }\n }\n throw new Error('Failed to get objects with all fullnodes');\n }\n\n async getObject(id: string, options?: SuiObjectDataOptions) {\n const objects = await this.getObjects([id], options);\n return objects[0];\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(\n (obj) => obj.objectId === object?.objectId\n );\n if (suiObject instanceof SuiSharedObject) {\n if (\n object.owner &&\n typeof object.owner === 'object' &&\n 'Shared' in object.owner\n ) {\n suiObject.initialSharedVersion =\n 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(\n addr: string,\n amount: number,\n coinType: string = '0x2::SUI::SUI'\n ) {\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","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"],"mappings":"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","names":["Transaction","Ed25519Keypair","Ed25519Keypair","Transaction","fromB64"]}
@@ -1,5 +1,5 @@
1
1
  import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
2
- import type { AccountMangerParams, DerivePathParams } from 'src/types';
2
+ import type { AccountManagerParams, DerivePathParams } from 'src/types';
3
3
  export declare class SuiAccountManager {
4
4
  private mnemonics;
5
5
  private secretKey;
@@ -14,7 +14,7 @@ export declare class SuiAccountManager {
14
14
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
15
15
  * @param secretKey, base64 or hex string or Bech32 string, when mnemonics is provided, secretKey will be ignored
16
16
  */
17
- constructor({ mnemonics, secretKey }?: AccountMangerParams);
17
+ constructor({ mnemonics, secretKey }?: AccountManagerParams);
18
18
  /**
19
19
  * Check if the secretKey starts with bench32 format
20
20
  */
@@ -1,6 +1,6 @@
1
- import { SuiClient } from '@mysten/sui/client';
1
+ import { SuiInteractorParams } from 'src/types';
2
2
  import { SuiOwnedObject, SuiSharedObject } from '../suiModel';
3
- import type { SuiTransactionBlockResponse, SuiObjectDataOptions, SuiObjectData, DryRunTransactionBlockResponse } from '@mysten/sui/client';
3
+ import { type SuiTransactionBlockResponse, type SuiObjectDataOptions, type SuiObjectData, type DryRunTransactionBlockResponse, SuiClient } from '@mysten/sui/client';
4
4
  /**
5
5
  * Encapsulates all functions that interact with the sui sdk
6
6
  */
@@ -8,8 +8,7 @@ export declare class SuiInteractor {
8
8
  readonly clients: SuiClient[];
9
9
  currentClient: SuiClient;
10
10
  readonly fullNodes: string[];
11
- currentFullNode: string;
12
- constructor(fullNodeUrls: string[]);
11
+ constructor(params: SuiInteractorParams);
13
12
  switchToNextClient(): void;
14
13
  sendTx(transactionBlock: Uint8Array | string, signature: string | string[]): Promise<SuiTransactionBlockResponse>;
15
14
  dryRunTx(transactionBlock: Uint8Array): Promise<DryRunTransactionBlockResponse>;
@@ -614,9 +614,21 @@ export declare class SuiTxBlock {
614
614
  transferSuiToMany(recipients: SuiAddressArg[], amounts: SuiAmountsArg[]): this;
615
615
  transferSui(address: SuiAddressArg, amount: SuiAmountsArg): this;
616
616
  takeAmountFromCoins(coins: SuiObjectArg[], amount: SuiAmountsArg): import("@mysten/sui/transactions").TransactionObjectArgument[];
617
- splitSUIFromGas(amounts: SuiAmountsArg[]): import("@mysten/sui/transactions").TransactionResult;
617
+ splitSUIFromGas(amounts: SuiAmountsArg[]): {
618
+ $kind: "Result";
619
+ Result: number;
620
+ } & {
621
+ $kind: "NestedResult";
622
+ NestedResult: [number, number];
623
+ }[];
618
624
  splitMultiCoins(coins: SuiObjectArg[], amounts: SuiAmountsArg[]): {
619
- splitedCoins: import("@mysten/sui/transactions").TransactionResult;
625
+ splitedCoins: {
626
+ $kind: "Result";
627
+ Result: number;
628
+ } & {
629
+ $kind: "NestedResult";
630
+ NestedResult: [number, number];
631
+ }[];
620
632
  mergedCoin: import("@mysten/sui/transactions").TransactionObjectArgument;
621
633
  };
622
634
  transferCoinToMany(coins: SuiObjectArg[], sender: SuiAddressArg, recipients: SuiAddressArg[], amounts: SuiAmountsArg[]): this;
package/dist/suiKit.d.ts CHANGED
@@ -21,9 +21,9 @@ export declare class SuiKit {
21
21
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
22
22
  * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored
23
23
  * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'
24
- * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type
24
+ * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type
25
25
  */
26
- constructor({ mnemonics, secretKey, networkType, fullnodeUrls, }?: SuiKitParams);
26
+ constructor(params: SuiKitParams);
27
27
  /**
28
28
  * Create SuiTxBlock with sender set to the current signer
29
29
  * @returns SuiTxBlock with sender set to the current signer
@@ -1,14 +1,18 @@
1
1
  import type { Transaction, TransactionObjectArgument, Argument, Inputs, TransactionArgument } from '@mysten/sui/transactions';
2
2
  import type { SerializedBcs } from '@mysten/bcs';
3
- import { SuiTransactionBlockResponse } from '@mysten/sui/client';
3
+ import { SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client';
4
4
  import { SuiTxBlock } from 'src/libs/suiTxBuilder';
5
- export type SuiKitParams = AccountMangerParams & {
6
- fullnodeUrls?: string[];
5
+ export type SuiKitParams = (AccountManagerParams & {
7
6
  faucetUrl?: string;
8
7
  networkType?: NetworkType;
8
+ }) & SuiInteractorParams;
9
+ export type SuiInteractorParams = {
10
+ fullnodeUrls: string[];
11
+ } | {
12
+ suiClients: SuiClient[];
9
13
  };
10
14
  export type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';
11
- export type AccountMangerParams = {
15
+ export type AccountManagerParams = {
12
16
  mnemonics?: string;
13
17
  secretKey?: string;
14
18
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@scallop-io/sui-kit",
3
- "version": "1.3.2",
4
- "description": "Tookit for interacting with SUI network",
3
+ "version": "1.3.3",
4
+ "description": "Toolkit for interacting with SUI network",
5
5
  "keywords": [
6
6
  "sui",
7
7
  "scallop labs",
@@ -39,7 +39,7 @@
39
39
  ],
40
40
  "dependencies": {
41
41
  "@mysten/bcs": "^1.2.0",
42
- "@mysten/sui": "^1.3.1",
42
+ "@mysten/sui": "^1.18.0",
43
43
  "@noble/curves": "^1.4.2",
44
44
  "@noble/hashes": "^1.4.0",
45
45
  "@scure/bip39": "^1.3.0",
@@ -146,7 +146,7 @@
146
146
  "test:typecheck": "tsc -p ./test",
147
147
  "test:unit": "vitest run --test-timeout=60000",
148
148
  "test:watch": "vitest",
149
- "format:fix": "prettier --ignore-path 'dist/* docs/*' --write '**/*.{ts,json,md}'",
149
+ "format:fix": "prettier --ignore-path 'dist/* docs/' --write '**/*.{ts,json,md}'",
150
150
  "lint:fix": "eslint . --ignore-pattern dist --ext .ts --fix",
151
151
  "commit": "commit",
152
152
  "release": "standard-version -f",
@@ -2,7 +2,7 @@ import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
2
2
  import { getKeyPair } from './keypair';
3
3
  import { hexOrBase64ToUint8Array, normalizePrivateKey } from './util';
4
4
  import { generateMnemonic } from './crypto';
5
- import type { AccountMangerParams, DerivePathParams } from 'src/types';
5
+ import type { AccountManagerParams, DerivePathParams } from 'src/types';
6
6
  import {
7
7
  SUI_PRIVATE_KEY_PREFIX,
8
8
  decodeSuiPrivateKey,
@@ -23,7 +23,7 @@ export class SuiAccountManager {
23
23
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
24
24
  * @param secretKey, base64 or hex string or Bech32 string, when mnemonics is provided, secretKey will be ignored
25
25
  */
26
- constructor({ mnemonics, secretKey }: AccountMangerParams = {}) {
26
+ constructor({ mnemonics, secretKey }: AccountManagerParams = {}) {
27
27
  // If the mnemonics or secretKey is provided, use it
28
28
  // Otherwise, generate a random mnemonics with 24 words
29
29
  this.mnemonics = mnemonics || '';
@@ -1,29 +1,34 @@
1
- import { SuiClient } from '@mysten/sui/client';
1
+ import { SuiInteractorParams } from 'src/types';
2
2
  import { SuiOwnedObject, SuiSharedObject } from '../suiModel';
3
3
  import { delay } from './util';
4
- import type {
5
- SuiTransactionBlockResponseOptions,
6
- SuiTransactionBlockResponse,
7
- SuiObjectDataOptions,
8
- SuiObjectData,
9
- DryRunTransactionBlockResponse,
4
+ import {
5
+ type SuiTransactionBlockResponseOptions,
6
+ type SuiTransactionBlockResponse,
7
+ type SuiObjectDataOptions,
8
+ type SuiObjectData,
9
+ type DryRunTransactionBlockResponse,
10
+ SuiClient,
10
11
  } from '@mysten/sui/client';
11
12
 
12
13
  /**
13
14
  * Encapsulates all functions that interact with the sui sdk
14
15
  */
15
16
  export class SuiInteractor {
16
- public readonly clients: SuiClient[];
17
+ public readonly clients: SuiClient[] = [];
17
18
  public currentClient: SuiClient;
18
- public readonly fullNodes: string[];
19
- public currentFullNode: string;
19
+ public readonly fullNodes: string[] = [];
20
20
 
21
- constructor(fullNodeUrls: string[]) {
22
- if (fullNodeUrls.length === 0)
23
- throw new Error('fullNodeUrls must not be empty');
24
- this.fullNodes = fullNodeUrls;
25
- this.clients = fullNodeUrls.map((url) => new SuiClient({ url }));
26
- this.currentFullNode = fullNodeUrls[0];
21
+ constructor(params: SuiInteractorParams) {
22
+ if ('fullnodeUrls' in params) {
23
+ this.fullNodes = params.fullnodeUrls;
24
+ this.clients = this.fullNodes.map((url) => new SuiClient({ url }));
25
+ } else if ('suiClients' in params) {
26
+ this.clients = params.suiClients;
27
+ } else {
28
+ throw new Error(
29
+ 'Invalid params, must provide fullNodeUrls or suiClients'
30
+ );
31
+ }
27
32
  this.currentClient = this.clients[0];
28
33
  }
29
34
 
@@ -31,8 +36,6 @@ export class SuiInteractor {
31
36
  const currentClientIdx = this.clients.indexOf(this.currentClient);
32
37
  this.currentClient =
33
38
  this.clients[(currentClientIdx + 1) % this.clients.length];
34
- this.currentFullNode =
35
- this.fullNodes[(currentClientIdx + 1) % this.clients.length];
36
39
  }
37
40
 
38
41
  async sendTx(
package/src/suiKit.ts CHANGED
@@ -39,19 +39,25 @@ export class SuiKit {
39
39
  * @param mnemonics, 12 or 24 mnemonics words, separated by space
40
40
  * @param secretKey, base64 or hex string or bech32, when mnemonics is provided, secretKey will be ignored
41
41
  * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'mainnet'
42
- * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type
42
+ * @param fullnodeUrls, the fullnode url, default is the preconfig fullnode url for the given network type
43
43
  */
44
- constructor({
45
- mnemonics,
46
- secretKey,
47
- networkType,
48
- fullnodeUrls,
49
- }: SuiKitParams = {}) {
44
+ constructor(params: SuiKitParams) {
45
+ const { mnemonics, secretKey, networkType } = params;
50
46
  // Init the account manager
51
47
  this.accountManager = new SuiAccountManager({ mnemonics, secretKey });
52
- // Init the sui interactor
53
- fullnodeUrls = fullnodeUrls || [getFullnodeUrl(networkType ?? 'mainnet')];
54
- this.suiInteractor = new SuiInteractor(fullnodeUrls);
48
+
49
+ let suiInteractorParams;
50
+ if ('fullnodeUrls' in params) {
51
+ suiInteractorParams = { fullnodeUrls: params.fullnodeUrls };
52
+ } else if ('suiClients' in params) {
53
+ suiInteractorParams = { suiClients: params.suiClients };
54
+ } else {
55
+ suiInteractorParams = {
56
+ fullnodeUrls: [getFullnodeUrl(networkType ?? 'mainnet')],
57
+ };
58
+ }
59
+
60
+ this.suiInteractor = new SuiInteractor(suiInteractorParams);
55
61
  }
56
62
 
57
63
  /**
@@ -6,18 +6,26 @@ import type {
6
6
  TransactionArgument,
7
7
  } from '@mysten/sui/transactions';
8
8
  import type { SerializedBcs } from '@mysten/bcs';
9
- import { SuiTransactionBlockResponse } from '@mysten/sui/client';
9
+ import { SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client';
10
10
  import { SuiTxBlock } from 'src/libs/suiTxBuilder';
11
11
 
12
- export type SuiKitParams = AccountMangerParams & {
13
- fullnodeUrls?: string[];
12
+ export type SuiKitParams = (AccountManagerParams & {
14
13
  faucetUrl?: string;
15
14
  networkType?: NetworkType;
16
- };
15
+ }) &
16
+ SuiInteractorParams;
17
+
18
+ export type SuiInteractorParams =
19
+ | {
20
+ fullnodeUrls: string[];
21
+ }
22
+ | {
23
+ suiClients: SuiClient[];
24
+ };
17
25
 
18
26
  export type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';
19
27
 
20
- export type AccountMangerParams = {
28
+ export type AccountManagerParams = {
21
29
  mnemonics?: string;
22
30
  secretKey?: string;
23
31
  };