{"version":3,"sources":["../src/wallets.ts","../src/account.ts","../src/utils.ts","../src/base-unlocked-wallet.ts","../src/keystore-wallet.ts","../src/wallet.ts","../src/test-utils/seedTestWallet.ts","../src/test-utils/generateTestWallet.ts","../src/test-utils/launchNode.ts"],"sourcesContent":["//\n// Because WalletLocked and WalletUnlocked has a cycle dependency\n// it's not possible to split the two classes in different files\n//\n/* eslint-disable max-classes-per-file */\nimport { HDWallet } from '@fuel-ts/hdwallet';\nimport { Mnemonic } from '@fuel-ts/mnemonic';\nimport type { Provider } from '@fuel-ts/providers';\nimport { Signer } from '@fuel-ts/signer';\nimport type { BytesLike } from 'ethers';\n\nimport { Account } from './account';\nimport { BaseWalletUnlocked } from './base-unlocked-wallet';\nimport { decryptKeystoreWallet } from './keystore-wallet';\nimport type { GenerateOptions } from './types/GenerateOptions';\n\n/**\n * `WalletLocked` provides the functionalities for a locked  wallet.\n */\nexport class WalletLocked extends Account {\n  /**\n   * Unlocks the wallet using the provided private key and returns an instance of WalletUnlocked.\n   *\n   * @param privateKey - The private key used to unlock the wallet.\n   * @returns An instance of WalletUnlocked.\n   */\n  unlock(privateKey: BytesLike): WalletUnlocked {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return new WalletUnlocked(privateKey, this._provider);\n  }\n}\n\n/**\n * `WalletUnlocked` provides the functionalities for an unlocked wallet.\n */\nexport class WalletUnlocked extends BaseWalletUnlocked {\n  /**\n   * Locks the wallet and returns an instance of WalletLocked.\n   *\n   * @returns An instance of WalletLocked.\n   */\n  lock(): WalletLocked {\n    this.signer = () => new Signer('0x00');\n    return new WalletLocked(this.address, this._provider);\n  }\n\n  /**\n   * Generate a new Wallet Unlocked with a random key pair.\n   *\n   * @param generateOptions - Options to customize the generation process (optional).\n   * @returns An instance of WalletUnlocked.\n   */\n  static generate(generateOptions?: GenerateOptions): WalletUnlocked {\n    const privateKey = Signer.generatePrivateKey(generateOptions?.entropy);\n\n    return new WalletUnlocked(privateKey, generateOptions?.provider);\n  }\n\n  /**\n   * Create a Wallet Unlocked from a seed.\n   *\n   * @param seed - The seed phrase.\n   * @param provider - A Provider instance (optional).\n   * @param path - The derivation path (optional).\n   * @returns An instance of WalletUnlocked.\n   */\n  static fromSeed(seed: string, provider?: Provider, path?: string): WalletUnlocked {\n    const hdWallet = HDWallet.fromSeed(seed);\n    const childWallet = hdWallet.derivePath(path || WalletUnlocked.defaultPath);\n\n    return new WalletUnlocked(<string>childWallet.privateKey, provider);\n  }\n\n  /**\n   * Create a Wallet Unlocked from a mnemonic phrase.\n   *\n   * @param mnemonic - The mnemonic phrase.\n   * @param provider - A Provider instance (optional).\n   * @param path - The derivation path (optional).\n   * @param passphrase - The passphrase for the mnemonic (optional).\n   * @returns An instance of WalletUnlocked.\n   */\n  static fromMnemonic(\n    mnemonic: string,\n    provider?: Provider,\n    path?: string,\n    passphrase?: BytesLike\n  ): WalletUnlocked {\n    const seed = Mnemonic.mnemonicToSeed(mnemonic, passphrase);\n    const hdWallet = HDWallet.fromSeed(seed);\n    const childWallet = hdWallet.derivePath(path || WalletUnlocked.defaultPath);\n\n    return new WalletUnlocked(<string>childWallet.privateKey, provider);\n  }\n\n  /**\n   * Create a Wallet Unlocked from an extended key.\n   *\n   * @param extendedKey - The extended key.\n   * @param provider - A Provider instance (optional).\n   * @returns An instance of WalletUnlocked.\n   */\n  static fromExtendedKey(extendedKey: string, provider?: Provider): WalletUnlocked {\n    const hdWallet = HDWallet.fromExtendedKey(extendedKey);\n\n    return new WalletUnlocked(<string>hdWallet.privateKey, provider);\n  }\n\n  /**\n   * Create a Wallet Unlocked from an encrypted JSON.\n   *\n   * @param jsonWallet - The encrypted JSON keystore.\n   * @param password - The password to decrypt the JSON.\n   * @param provider - A Provider instance (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static async fromEncryptedJson(\n    jsonWallet: string,\n    password: string,\n    provider?: Provider\n  ): Promise<WalletUnlocked> {\n    const privateKey = await decryptKeystoreWallet(jsonWallet, password);\n\n    return new WalletUnlocked(privateKey, provider);\n  }\n}\n","import { Address } from '@fuel-ts/address';\nimport { BaseAssetId } from '@fuel-ts/address/configs';\nimport { ErrorCode, FuelError } from '@fuel-ts/errors';\nimport { AbstractAccount } from '@fuel-ts/interfaces';\nimport type { AbstractAddress } from '@fuel-ts/interfaces';\nimport type { BigNumberish, BN } from '@fuel-ts/math';\nimport { bn } from '@fuel-ts/math';\nimport type {\n  TransactionRequestLike,\n  CallResult,\n  TransactionRequest,\n  Coin,\n  CoinQuantityLike,\n  CoinQuantity,\n  Message,\n  Resource,\n  ExcludeResourcesOption,\n  TransactionResponse,\n  Provider,\n  ScriptTransactionRequestLike,\n  ProviderSendTxParams,\n} from '@fuel-ts/providers';\nimport {\n  withdrawScript,\n  ScriptTransactionRequest,\n  transactionRequestify,\n  addAmountToAsset,\n} from '@fuel-ts/providers';\nimport { getBytesCopy } from 'ethers';\nimport type { BytesLike } from 'ethers';\n\nimport {\n  composeScriptForTransferringToContract,\n  formatScriptDataForTransferringToContract,\n} from './utils';\n\nexport type TxParamsType = Pick<\n  ScriptTransactionRequestLike,\n  'gasLimit' | 'gasPrice' | 'maturity' | 'maxFee' | 'witnessLimit'\n>;\n\n/**\n * `Account` provides an abstraction for interacting with accounts or wallets on the network.\n */\nexport class Account extends AbstractAccount {\n  /**\n   * The address associated with the account.\n   */\n  readonly address: AbstractAddress;\n\n  /**\n   * The provider used to interact with the network.\n   */\n  protected _provider?: Provider;\n\n  /**\n   * Creates a new Account instance.\n   *\n   * @param address - The address of the account.\n   * @param provider - A Provider instance  (optional).\n   */\n  constructor(address: string | AbstractAddress, provider?: Provider) {\n    super();\n    this._provider = provider;\n    this.address = Address.fromDynamicInput(address);\n  }\n\n  /**\n   * The provider used to interact with the network.\n   *\n   * @returns A Provider instance.\n   *\n   * @throws `FuelError` if the provider is not set.\n   */\n  get provider(): Provider {\n    if (!this._provider) {\n      throw new FuelError(ErrorCode.MISSING_PROVIDER, 'Provider not set');\n    }\n\n    return this._provider;\n  }\n\n  /**\n   * Sets the provider for the account.\n   *\n   * @param provider - A Provider instance.\n   */\n  set provider(provider: Provider) {\n    this._provider = provider;\n  }\n\n  /**\n   * Changes the provider connection for the account.\n   *\n   * @param provider - A Provider instance.\n   * @returns The updated Provider instance.\n   */\n  connect(provider: Provider): Provider {\n    this._provider = provider;\n    return this.provider;\n  }\n\n  /**\n   * Retrieves resources satisfying the spend query for the account.\n   *\n   * @param quantities - IDs of coins to exclude.\n   * @param excludedIds - IDs of resources to be excluded from the query.\n   * @returns A promise that resolves to an array of Resources.\n   */\n  async getResourcesToSpend(\n    quantities: CoinQuantityLike[] /** IDs of coins to exclude */,\n    excludedIds?: ExcludeResourcesOption\n  ): Promise<Resource[]> {\n    return this.provider.getResourcesToSpend(this.address, quantities, excludedIds);\n  }\n\n  /**\n   * Retrieves coins owned by the account.\n   *\n   * @param assetId - The asset ID of the coins to retrieve.\n   * @returns A promise that resolves to an array of Coins.\n   */\n  async getCoins(assetId?: BytesLike): Promise<Coin[]> {\n    const coins = [];\n\n    const pageSize = 9999;\n    let cursor;\n    // eslint-disable-next-line no-unreachable-loop\n    for (;;) {\n      const pageCoins = await this.provider.getCoins(this.address, assetId, {\n        first: pageSize,\n        after: cursor,\n      });\n\n      coins.push(...pageCoins);\n\n      const hasNextPage = pageCoins.length >= pageSize;\n      if (!hasNextPage) {\n        break;\n      }\n\n      // TODO: implement pagination\n      throw new FuelError(\n        ErrorCode.NOT_SUPPORTED,\n        `Wallets containing more than ${pageSize} coins exceed the current supported limit.`\n      );\n    }\n\n    return coins;\n  }\n\n  /**\n   * Retrieves messages owned by the account.\n   *\n   * @returns A promise that resolves to an array of Messages.\n   */\n  async getMessages(): Promise<Message[]> {\n    const messages = [];\n\n    const pageSize = 9999;\n    let cursor;\n    // eslint-disable-next-line no-unreachable-loop\n    for (;;) {\n      const pageMessages = await this.provider.getMessages(this.address, {\n        first: pageSize,\n        after: cursor,\n      });\n\n      messages.push(...pageMessages);\n\n      const hasNextPage = pageMessages.length >= pageSize;\n      if (!hasNextPage) {\n        break;\n      }\n\n      // TODO: implement pagination\n      throw new FuelError(\n        ErrorCode.NOT_SUPPORTED,\n        `Wallets containing more than ${pageSize} messages exceed the current supported limit.`\n      );\n    }\n\n    return messages;\n  }\n\n  /**\n   * Retrieves the balance of the account for the given asset.\n   *\n   * @param assetId - The asset ID to check the balance for.\n   * @returns A promise that resolves to the balance amount.\n   */\n  async getBalance(assetId: BytesLike = BaseAssetId): Promise<BN> {\n    const amount = await this.provider.getBalance(this.address, assetId);\n    return amount;\n  }\n\n  /**\n   * Retrieves all the balances for the account.\n   *\n   * @returns A promise that resolves to an array of Coins and their quantities.\n   */\n  async getBalances(): Promise<CoinQuantity[]> {\n    const balances = [];\n\n    const pageSize = 9999;\n    let cursor;\n    // eslint-disable-next-line no-unreachable-loop\n    for (;;) {\n      const pageBalances = await this.provider.getBalances(this.address, {\n        first: pageSize,\n        after: cursor,\n      });\n\n      balances.push(...pageBalances);\n\n      const hasNextPage = pageBalances.length >= pageSize;\n      if (!hasNextPage) {\n        break;\n      }\n\n      // TODO: implement pagination\n      throw new FuelError(\n        ErrorCode.NOT_SUPPORTED,\n        `Wallets containing more than ${pageSize} balances exceed the current supported limit.`\n      );\n    }\n\n    return balances;\n  }\n\n  /**\n   * Adds resources to the transaction enough to fund it.\n   *\n   * @param request - The transaction request.\n   * @param coinQuantities - The coin quantities required to execute the transaction.\n   * @param fee - The estimated transaction fee.\n   * @returns A promise that resolves when the resources are added to the transaction.\n   */\n  async fund<T extends TransactionRequest>(\n    request: T,\n    coinQuantities: CoinQuantity[],\n    fee: BN\n  ): Promise<void> {\n    const updatedQuantities = addAmountToAsset({\n      amount: bn(fee),\n      assetId: BaseAssetId,\n      coinQuantities,\n    });\n\n    const quantitiesDict: Record<string, { required: BN; owned: BN }> = {};\n\n    updatedQuantities.forEach(({ amount, assetId }) => {\n      quantitiesDict[assetId] = {\n        required: amount,\n        owned: bn(0),\n      };\n    });\n\n    const cachedUtxos: BytesLike[] = [];\n    const cachedMessages: BytesLike[] = [];\n\n    const owner = this.address.toB256();\n\n    request.inputs.forEach((input) => {\n      const isResource = 'amount' in input;\n\n      if (isResource) {\n        const isCoin = 'owner' in input;\n\n        if (isCoin) {\n          const assetId = String(input.assetId);\n          if (input.owner === owner && quantitiesDict[assetId]) {\n            const amount = bn(input.amount);\n            quantitiesDict[assetId].owned = quantitiesDict[assetId].owned.add(amount);\n\n            // caching this utxo to avoid fetching it again if requests needs to be funded\n            cachedUtxos.push(input.id);\n          }\n        } else if (input.recipient === owner && input.amount && quantitiesDict[BaseAssetId]) {\n          quantitiesDict[BaseAssetId].owned = quantitiesDict[BaseAssetId].owned.add(input.amount);\n\n          // caching this message to avoid fetching it again if requests needs to be funded\n          cachedMessages.push(input.nonce);\n        }\n      }\n    });\n\n    const missingQuantities: CoinQuantity[] = [];\n    Object.entries(quantitiesDict).forEach(([assetId, { owned, required }]) => {\n      if (owned.lt(required)) {\n        missingQuantities.push({\n          assetId,\n          amount: required.sub(owned),\n        });\n      }\n    });\n\n    const needsToBeFunded = missingQuantities.length;\n\n    if (needsToBeFunded) {\n      const resources = await this.getResourcesToSpend(missingQuantities, {\n        messages: cachedMessages,\n        utxos: cachedUtxos,\n      });\n      request.addResources(resources);\n    }\n  }\n\n  /**\n   * A helper that creates a transfer transaction request and returns it.\n   *\n   * @param destination - The address of the destination.\n   * @param amount - The amount of coins to transfer.\n   * @param assetId - The asset ID of the coins to transfer.\n   * @param txParams - The transaction parameters (gasLimit, gasPrice, maturity).\n   * @returns A promise that resolves to the prepared transaction request.\n   */\n  async createTransfer(\n    /** Address of the destination */\n    destination: string | AbstractAddress,\n    /** Amount of coins */\n    amount: BigNumberish,\n    /** Asset ID of coins */\n    assetId: BytesLike = BaseAssetId,\n    /** Tx Params */\n    txParams: TxParamsType = {}\n  ): Promise<TransactionRequest> {\n    const { minGasPrice } = this.provider.getGasConfig();\n    const params = { gasPrice: minGasPrice, ...txParams };\n    const request = new ScriptTransactionRequest(params);\n    request.addCoinOutput(Address.fromAddressOrString(destination), amount, assetId);\n    const { maxFee, requiredQuantities } = await this.provider.getTransactionCost(request);\n    await this.fund(request, requiredQuantities, maxFee);\n    return request;\n  }\n\n  /**\n   * Transfers coins to a destination address.\n   *\n   * @param destination - The address of the destination.\n   * @param amount - The amount of coins to transfer.\n   * @param assetId - The asset ID of the coins to transfer.\n   * @param txParams - The transaction parameters (gasLimit, gasPrice, maturity).\n   * @returns A promise that resolves to the transaction response.\n   */\n  async transfer(\n    /** Address of the destination */\n    destination: string | AbstractAddress,\n    /** Amount of coins */\n    amount: BigNumberish,\n    /** Asset ID of coins */\n    assetId: BytesLike = BaseAssetId,\n    /** Tx Params */\n    txParams: TxParamsType = {}\n  ): Promise<TransactionResponse> {\n    const request = await this.createTransfer(destination, amount, assetId, txParams);\n    return this.sendTransaction(request);\n  }\n\n  /**\n   * Transfers coins to a contract address.\n   *\n   * @param contractId - The address of the contract.\n   * @param amount - The amount of coins to transfer.\n   * @param assetId - The asset ID of the coins to transfer.\n   * @param txParams - The optional transaction parameters.\n   * @returns A promise that resolves to the transaction response.\n   */\n  async transferToContract(\n    /** Contract address */\n    contractId: string | AbstractAddress,\n    /** Amount of coins */\n    amount: BigNumberish,\n    /** Asset ID of coins */\n    assetId: BytesLike = BaseAssetId,\n    /** Tx Params */\n    txParams: TxParamsType = {}\n  ): Promise<TransactionResponse> {\n    const contractAddress = Address.fromAddressOrString(contractId);\n    const { minGasPrice } = this.provider.getGasConfig();\n    const params = { gasPrice: minGasPrice, ...txParams };\n\n    const script = await composeScriptForTransferringToContract();\n\n    const scriptData = formatScriptDataForTransferringToContract(\n      contractAddress.toB256(),\n      amount,\n      assetId\n    );\n\n    const request = new ScriptTransactionRequest({\n      ...params,\n      script,\n      scriptData,\n    });\n\n    request.addContractInputAndOutput(contractAddress);\n\n    const { maxFee, requiredQuantities } = await this.provider.getTransactionCost(request, [\n      { amount: bn(amount), assetId: String(assetId) },\n    ]);\n\n    await this.fund(request, requiredQuantities, maxFee);\n\n    return this.sendTransaction(request);\n  }\n\n  /**\n   * Withdraws an amount of the base asset to the base chain.\n   *\n   * @param recipient - Address of the recipient on the base chain.\n   * @param amount - Amount of base asset.\n   * @param txParams - The optional transaction parameters.\n   * @returns A promise that resolves to the transaction response.\n   */\n  async withdrawToBaseLayer(\n    /** Address of the recipient on the base chain */\n    recipient: string | AbstractAddress,\n    /** Amount of base asset */\n    amount: BigNumberish,\n    /** Tx Params */\n    txParams: TxParamsType = {}\n  ): Promise<TransactionResponse> {\n    const recipientAddress = Address.fromAddressOrString(recipient);\n    // add recipient and amount to the transaction script code\n    const recipientDataArray = getBytesCopy(\n      '0x'.concat(recipientAddress.toHexString().substring(2).padStart(64, '0'))\n    );\n    const amountDataArray = getBytesCopy(\n      '0x'.concat(bn(amount).toHex().substring(2).padStart(16, '0'))\n    );\n    const script = new Uint8Array([\n      ...getBytesCopy(withdrawScript.bytes),\n      ...recipientDataArray,\n      ...amountDataArray,\n    ]);\n\n    const params = { script, ...txParams };\n    const request = new ScriptTransactionRequest(params);\n    const forwardingQuantities = [{ amount: bn(amount), assetId: BaseAssetId }];\n\n    const { requiredQuantities, maxFee } = await this.provider.getTransactionCost(\n      request,\n      forwardingQuantities\n    );\n\n    await this.fund(request, requiredQuantities, maxFee);\n\n    return this.sendTransaction(request);\n  }\n\n  /**\n   * Sends a transaction to the network.\n   *\n   * @param transactionRequestLike - The transaction request to be sent.\n   * @returns A promise that resolves to the transaction response.\n   */\n  async sendTransaction(\n    transactionRequestLike: TransactionRequestLike,\n    options?: Pick<ProviderSendTxParams, 'awaitExecution'>\n  ): Promise<TransactionResponse> {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    await this.provider.estimateTxDependencies(transactionRequest);\n    return this.provider.sendTransaction(transactionRequest, {\n      ...options,\n      estimateTxDependencies: false,\n    });\n  }\n\n  /**\n   * Simulates a transaction.\n   *\n   * @param transactionRequestLike - The transaction request to be simulated.\n   * @returns A promise that resolves to the call result.\n   */\n  async simulateTransaction(transactionRequestLike: TransactionRequestLike): Promise<CallResult> {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    await this.provider.estimateTxDependencies(transactionRequest);\n    return this.provider.simulate(transactionRequest, { estimateTxDependencies: false });\n  }\n}\n","import { U64Coder } from '@fuel-ts/abi-coder';\nimport type { B256Address } from '@fuel-ts/interfaces';\nimport { BN, type BigNumberish } from '@fuel-ts/math';\nimport * as asm from '@fuels/vm-asm';\nimport { getBytesCopy, type BytesLike } from 'ethers';\n\nexport const composeScriptForTransferringToContract = async () => {\n  // implementation extracted from Rust SDK at:\n  // https://github.com/FuelLabs/fuels-rs/blob/master/packages/fuels-core/src/types/transaction_builders.rs#L240-L272\n  // This script loads:\n  //  - a pointer to the contract id,\n  //  - the actual amount\n  //  - a pointer to the asset id\n  // into the registers 0x10, 0x12, 0x13\n  // and calls the TR instruction\n\n  // TODO: Remove ts-expect-error\n  // @ts-expect-error method reference missing in DTS\n  await asm.initWasm();\n\n  // const gtf = fuelAsm.gtf(0x10, 0x00, 0xc);\n  const gtf = asm.gtf(0x10, 0x00, asm.GTFArgs.ScriptData);\n  const addi = asm.addi(0x11, 0x10, 0x20);\n  const lw = asm.lw(0x12, 0x11, 0x0);\n  const addi2 = asm.addi(0x13, 0x11, 0x8);\n  const tr = asm.tr(0x10, 0x12, 0x13);\n  const ret = asm.ret(0x1);\n\n  const script = Uint8Array.from([\n    ...gtf.to_bytes(),\n    ...addi.to_bytes(),\n    ...lw.to_bytes(),\n    ...addi2.to_bytes(),\n    ...tr.to_bytes(),\n    ...ret.to_bytes(),\n  ]);\n\n  return script;\n};\n\nexport const formatScriptDataForTransferringToContract = (\n  hexelifiedContractId: B256Address,\n  amountToTransfer: BigNumberish,\n  assetId: BytesLike\n) => {\n  const numberCoder = new U64Coder();\n\n  const encoded = numberCoder.encode(new BN(amountToTransfer).toNumber());\n\n  const scriptData = Uint8Array.from([\n    ...getBytesCopy(hexelifiedContractId),\n    ...encoded,\n    ...getBytesCopy(assetId),\n  ]);\n\n  return scriptData;\n};\n","import { hashMessage } from '@fuel-ts/hasher';\nimport type {\n  TransactionResponse,\n  TransactionRequestLike,\n  CallResult,\n  Provider,\n  ProviderSendTxParams,\n} from '@fuel-ts/providers';\nimport { transactionRequestify } from '@fuel-ts/providers';\nimport { Signer } from '@fuel-ts/signer';\nimport type { BytesLike } from 'ethers';\n\nimport { Account } from './account';\nimport { encryptKeystoreWallet } from './keystore-wallet';\n\n/**\n * `BaseWalletUnlocked` provides the base functionalities for an unlocked wallet.\n */\nexport class BaseWalletUnlocked extends Account {\n  /**\n   * Default HDWallet path.\n   */\n  static defaultPath = \"m/44'/1179993420'/0'/0/0\";\n\n  /**\n   * A function that returns the wallet's signer.\n   */\n  signer: () => Signer;\n\n  /**\n   * Creates a new BaseWalletUnlocked instance.\n   *\n   * @param privateKey - The private key of the wallet.\n   * @param provider - A Provider instance (optional).\n   */\n  constructor(privateKey: BytesLike, provider?: Provider) {\n    const signer = new Signer(privateKey);\n    super(signer.address, provider);\n    this.signer = () => signer;\n  }\n\n  /**\n   * Gets the private key of the wallet.\n   *\n   * @returns The private key of the wallet.\n   */\n  get privateKey(): string {\n    return this.signer().privateKey;\n  }\n\n  /**\n   * Gets the public key of the wallet.\n   *\n   * @returns\n   */\n  get publicKey(): string {\n    return this.signer().publicKey;\n  }\n\n  /**\n   * Signs a message with the wallet's private key.\n   *\n   * @param message - The message to sign.\n   * @returns A promise that resolves to the signature as a ECDSA 64 bytes string.\n   */\n  async signMessage(message: string): Promise<string> {\n    const signedMessage = await this.signer().sign(hashMessage(message));\n    return signedMessage;\n  }\n\n  /**\n   * Signs a transaction with the wallet's private key.\n   *\n   * @param transactionRequestLike - The transaction request to sign.\n   * @returns A promise that resolves to the signature as a ECDSA 64 bytes string.\n   */\n  async signTransaction(transactionRequestLike: TransactionRequestLike): Promise<string> {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    const chainId = this.provider.getChain().consensusParameters.chainId.toNumber();\n    const hashedTransaction = transactionRequest.getTransactionId(chainId);\n    const signature = await this.signer().sign(hashedTransaction);\n\n    return signature;\n  }\n\n  /**\n   * Populates a transaction with the witnesses signature.\n   *\n   * @param transactionRequestLike - The transaction request to populate.\n   * @returns The populated transaction request.\n   */\n  async populateTransactionWitnessesSignature(transactionRequestLike: TransactionRequestLike) {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    const signedTransaction = await this.signTransaction(transactionRequest);\n\n    transactionRequest.updateWitnessByOwner(this.address, signedTransaction);\n\n    return transactionRequest;\n  }\n\n  /**\n   * Populates the witness signature for a transaction and sends it to the network using `provider.sendTransaction`.\n   *\n   * @param transactionRequestLike - The transaction request to send.\n   * @returns A promise that resolves to the TransactionResponse object.\n   */\n  async sendTransaction(\n    transactionRequestLike: TransactionRequestLike,\n    options?: Pick<ProviderSendTxParams, 'awaitExecution'>\n  ): Promise<TransactionResponse> {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    await this.provider.estimateTxDependencies(transactionRequest);\n    return this.provider.sendTransaction(\n      await this.populateTransactionWitnessesSignature(transactionRequest),\n      { ...options, estimateTxDependencies: false }\n    );\n  }\n\n  /**\n   * Populates the witness signature for a transaction and sends a call to the network using `provider.call`.\n   *\n   * @param transactionRequestLike - The transaction request to simulate.\n   * @returns A promise that resolves to the CallResult object.\n   */\n  async simulateTransaction(transactionRequestLike: TransactionRequestLike): Promise<CallResult> {\n    const transactionRequest = transactionRequestify(transactionRequestLike);\n    await this.provider.estimateTxDependencies(transactionRequest);\n    return this.provider.call(\n      await this.populateTransactionWitnessesSignature(transactionRequest),\n      {\n        utxoValidation: true,\n        estimateTxDependencies: false,\n      }\n    );\n  }\n\n  async encrypt(password: string): Promise<string> {\n    return encryptKeystoreWallet(this.privateKey, this.address, password);\n  }\n}\n","import { Address } from '@fuel-ts/address';\nimport {\n  bufferFromString,\n  keccak256,\n  randomBytes,\n  scrypt,\n  stringFromBuffer,\n  decryptJsonWalletData,\n  encryptJsonWalletData,\n} from '@fuel-ts/crypto';\nimport { ErrorCode, FuelError } from '@fuel-ts/errors';\nimport type { AbstractAddress } from '@fuel-ts/interfaces';\nimport { hexlify } from 'ethers';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type KeystoreWallet = {\n  id: string;\n  version: number;\n  address: string;\n  crypto: KeystoreCrypto;\n};\n\ntype KeystoreCrypto = {\n  cipher: 'aes-128-ctr';\n  cipherparams: { iv: string };\n  ciphertext: string;\n  kdf: 'scrypt';\n  mac: string;\n  kdfparams: KDFParams;\n};\n\ntype KDFParams = {\n  dklen: number;\n  n: number;\n  p: number;\n  r: number;\n  salt: string;\n};\n\n// Same values used in the Rust SDK\nexport const DEFAULT_KDF_PARAMS_LOG_N = 13;\nexport const DEFAULT_KDF_PARAMS_R = 8;\nexport const DEFAULT_KDF_PARAMS_P = 1;\nexport const DEFAULT_KEY_SIZE = 32;\nexport const DEFAULT_IV_SIZE = 16;\n\n/**\n * Removes the '0x' prefix from a hexadecimal string.\n * If the prefix does not exist, it returns the original string.\n */\nexport const removeHexPrefix = (hexString: string) => {\n  if (/^0x/.test(hexString)) {\n    return hexString.slice(2);\n  }\n\n  return hexString;\n};\n\nexport async function encryptKeystoreWallet(\n  privateKey: string,\n  address: string | AbstractAddress,\n  password: string\n): Promise<string> {\n  // Convert the hexlified private key string to a Buffer.\n  const privateKeyBuffer = bufferFromString(removeHexPrefix(privateKey), 'hex');\n  const ownerAddress = Address.fromAddressOrString(address);\n  // Generate a random salt.\n  const salt = randomBytes(DEFAULT_KEY_SIZE);\n\n  const key = scrypt({\n    password: bufferFromString(password),\n    salt,\n    dklen: DEFAULT_KEY_SIZE,\n    n: 2 ** DEFAULT_KDF_PARAMS_LOG_N,\n    r: DEFAULT_KDF_PARAMS_R,\n    p: DEFAULT_KDF_PARAMS_P,\n  });\n\n  // Encrypt the private key using AES-128-CTR.\n  const iv = randomBytes(DEFAULT_IV_SIZE);\n\n  const ciphertext = await encryptJsonWalletData(privateKeyBuffer, key, iv);\n\n  const data = Uint8Array.from([...key.subarray(16, 32), ...ciphertext]);\n\n  // Calculate the MAC.\n  const macHashUint8Array = keccak256(data);\n\n  const mac = stringFromBuffer(macHashUint8Array, 'hex');\n\n  // Construct keystore.\n  const keystore: KeystoreWallet = {\n    id: uuidv4(),\n    version: 3,\n    address: removeHexPrefix(ownerAddress.toHexString()),\n    crypto: {\n      cipher: 'aes-128-ctr',\n      mac,\n      cipherparams: { iv: stringFromBuffer(iv, 'hex') },\n      ciphertext: stringFromBuffer(ciphertext, 'hex'),\n      kdf: 'scrypt',\n      kdfparams: {\n        dklen: DEFAULT_KEY_SIZE,\n        n: 2 ** DEFAULT_KDF_PARAMS_LOG_N,\n        p: DEFAULT_KDF_PARAMS_P,\n        r: DEFAULT_KDF_PARAMS_R,\n        salt: stringFromBuffer(salt, 'hex'),\n      },\n    },\n  };\n\n  return JSON.stringify(keystore);\n}\n\nexport async function decryptKeystoreWallet(jsonWallet: string, password: string): Promise<string> {\n  const keystoreWallet = JSON.parse(jsonWallet) as KeystoreWallet;\n\n  // Extract the parameters needed for decryption.\n  const {\n    crypto: {\n      mac,\n      ciphertext,\n      cipherparams: { iv },\n      kdfparams: { dklen, n, r, p, salt },\n    },\n  } = keystoreWallet;\n\n  const ciphertextBuffer = bufferFromString(ciphertext, 'hex');\n  const ivBuffer = bufferFromString(iv, 'hex');\n  const saltBuffer = bufferFromString(salt, 'hex');\n\n  const passwordBuffer = bufferFromString(password);\n\n  const key = scrypt({\n    password: passwordBuffer,\n    salt: saltBuffer,\n    n,\n    p,\n    r,\n    dklen,\n  });\n\n  // Verify the MAC. It should be the Keccak-256 hash of the concatenation of the second half of the derived key and the ciphertext.\n  const data = Uint8Array.from([...key.subarray(16, 32), ...ciphertextBuffer]);\n\n  const macHashUint8Array = keccak256(data);\n\n  const macHash = stringFromBuffer(macHashUint8Array, 'hex');\n\n  if (mac !== macHash) {\n    throw new FuelError(\n      ErrorCode.INVALID_PASSWORD,\n      'Failed to decrypt the keystore wallet, the provided password is incorrect.'\n    );\n  }\n\n  // Decrypt the private key.\n  const buffer = await decryptJsonWalletData(ciphertextBuffer, key, ivBuffer);\n\n  const privateKey = hexlify(buffer);\n\n  return privateKey;\n}\n","import type { AbstractAddress } from '@fuel-ts/interfaces';\nimport type { Provider } from '@fuel-ts/providers';\nimport type { BytesLike } from 'ethers';\n\nimport { WalletLocked, WalletUnlocked } from './wallets';\n\n/**\n * `Wallet` provides methods to create locked and unlocked wallet instances.\n */\nexport class Wallet {\n  /**\n   * Creates a locked wallet instance from an address and a provider.\n   *\n   * @param address - The address of the wallet.\n   * @param provider - A Provider instance (optional).\n   * @returns A locked wallet instance.\n   */\n  static fromAddress(address: string | AbstractAddress, provider?: Provider): WalletLocked {\n    return new WalletLocked(address, provider);\n  }\n\n  /**\n   * Creates an unlocked wallet instance from a private key and a provider.\n   *\n   * @param privateKey - The private key of the wallet.\n   * @param provider - A Provider instance (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static fromPrivateKey(privateKey: BytesLike, provider?: Provider) {\n    return new WalletUnlocked(privateKey, provider);\n  }\n\n  /**\n   * Generate a new Wallet Unlocked with a random key pair.\n   *\n   * @param generateOptions - Options to customize the generation process (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static generate = WalletUnlocked.generate;\n\n  /**\n   * Create a Wallet Unlocked from a seed.\n   *\n   * @param seed - The seed phrase.\n   * @param provider - A Provider instance (optional).\n   * @param path - The derivation path (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static fromSeed = WalletUnlocked.fromSeed;\n\n  /**\n   * Create a Wallet Unlocked from a mnemonic phrase.\n   *\n   * @param mnemonic - The mnemonic phrase.\n   * @param provider - A Provider instance (optional).\n   * @param path - The derivation path (optional).\n   * @param passphrase - The passphrase for the mnemonic (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static fromMnemonic = WalletUnlocked.fromMnemonic;\n\n  /**\n   * Create a Wallet Unlocked from an extended key.\n   *\n   * @param extendedKey - The extended key.\n   * @param provider - A Provider instance (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static fromExtendedKey = WalletUnlocked.fromExtendedKey;\n\n  /**\n   * Create a Wallet Unlocked from an encrypted JSON.\n   *\n   * @param jsonWallet - The encrypted JSON keystore.\n   * @param password - The password to decrypt the JSON.\n   * @param provider - A Provider instance (optional).\n   * @returns An unlocked wallet instance.\n   */\n  static fromEncryptedJson = WalletUnlocked.fromEncryptedJson;\n}\n","import { randomBytes } from '@fuel-ts/crypto';\nimport { coinQuantityfy, ScriptTransactionRequest } from '@fuel-ts/providers';\nimport type { CoinQuantityLike } from '@fuel-ts/providers';\n\nimport type { Account } from '../account';\nimport { WalletUnlocked } from '../wallets';\n\nexport const seedTestWallet = async (wallet: Account, quantities: CoinQuantityLike[]) => {\n  const genesisWallet = new WalletUnlocked(\n    process.env.GENESIS_SECRET || randomBytes(32),\n    wallet.provider\n  );\n\n  // Connect to the same Provider as wallet\n  const resources = await genesisWallet.getResourcesToSpend(quantities);\n\n  const { minGasPrice } = genesisWallet.provider.getGasConfig();\n\n  // Create transaction\n  const request = new ScriptTransactionRequest({\n    gasLimit: 10000,\n    gasPrice: minGasPrice,\n  });\n\n  request.addResources(resources);\n\n  quantities\n    .map(coinQuantityfy)\n    .forEach(({ amount, assetId }) => request.addCoinOutput(wallet.address, amount, assetId));\n  await genesisWallet.sendTransaction(request, { awaitExecution: true });\n};\n","import type { Provider, CoinQuantityLike } from '@fuel-ts/providers';\n\nimport { Wallet } from '../wallet';\nimport type { WalletUnlocked } from '../wallets';\n\nimport { seedTestWallet } from './seedTestWallet';\n\nexport const generateTestWallet = async (\n  provider: Provider,\n  quantities?: CoinQuantityLike[]\n): Promise<WalletUnlocked> => {\n  const wallet = Wallet.generate({ provider });\n  if (quantities) {\n    await seedTestWallet(wallet, quantities);\n  }\n  return wallet;\n};\n","import { BaseAssetId } from '@fuel-ts/address/configs';\nimport { toHex } from '@fuel-ts/math';\nimport { Provider } from '@fuel-ts/providers';\nimport { Signer } from '@fuel-ts/signer';\nimport { defaultChainConfig, defaultConsensusKey } from '@fuel-ts/utils';\nimport { findBinPath } from '@fuel-ts/utils/cli-utils';\nimport type { ChildProcessWithoutNullStreams } from 'child_process';\nimport { spawn } from 'child_process';\nimport { randomUUID } from 'crypto';\nimport { hexlify } from 'ethers';\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { getPortPromise } from 'portfinder';\nimport treeKill from 'tree-kill';\n\nimport type { WalletUnlocked } from '../wallets';\n\nimport { generateTestWallet } from './generateTestWallet';\n\nconst getFlagValueFromArgs = (args: string[], flag: string) => {\n  const flagIndex = args.indexOf(flag);\n  if (flagIndex === -1) {\n    return undefined;\n  }\n  return args[flagIndex + 1];\n};\n\nconst extractRemainingArgs = (args: string[], flagsToRemove: string[]) => {\n  const newArgs = [...args];\n  flagsToRemove.forEach((flag) => {\n    const flagIndex = newArgs.indexOf(flag);\n    if (flagIndex !== -1) {\n      newArgs.splice(flagIndex, 2);\n    }\n  });\n  return newArgs;\n};\n\nexport type LaunchNodeOptions = {\n  ip?: string;\n  port?: string;\n  args?: string[];\n  useSystemFuelCore?: boolean;\n  loggingEnabled?: boolean;\n  debugEnabled?: boolean;\n  basePath?: string;\n};\n\nexport type LaunchNodeResult = Promise<{\n  cleanup: () => void;\n  ip: string;\n  port: string;\n  chainConfigPath: string;\n}>;\n\nexport type KillNodeParams = {\n  child: ChildProcessWithoutNullStreams;\n  configPath: string;\n  killFn: (pid: number) => void;\n  state: {\n    isDead: boolean;\n  };\n};\n\nexport const killNode = (params: KillNodeParams) => {\n  const { child, configPath, state, killFn } = params;\n  if (!state.isDead) {\n    if (child.pid) {\n      state.isDead = true;\n      killFn(Number(child.pid));\n    }\n\n    // Remove all the listeners we've added.\n    child.stdout.removeAllListeners();\n    child.stderr.removeAllListeners();\n\n    // Remove the temporary folder and all its contents.\n    if (existsSync(configPath)) {\n      rmSync(configPath, { recursive: true });\n    }\n  }\n};\n\n// #region launchNode-launchNodeOptions\n/**\n * Launches a fuel-core node.\n * @param ip - the ip to bind to. (optional, defaults to 0.0.0.0)\n * @param port - the port to bind to. (optional, defaults to 4000 or the next available port)\n * @param args - additional arguments to pass to fuel-core.\n * @param useSystemFuelCore - whether to use the system fuel-core binary or the one provided by the \\@fuel-ts/fuel-core package.\n * @param loggingEnabled - whether the node should output logs. (optional, defaults to true)\n * @param debugEnabled - whether the node should log debug messages. (optional, defaults to false)\n * @param basePath - the base path to use for the temporary folder. (optional, defaults to os.tmpdir())\n * */\n// #endregion launchNode-launchNodeOptions\nexport const launchNode = async ({\n  ip,\n  port,\n  args = [],\n  useSystemFuelCore = false,\n  loggingEnabled = true,\n  debugEnabled = false,\n  basePath,\n}: LaunchNodeOptions): LaunchNodeResult =>\n  // eslint-disable-next-line no-async-promise-executor\n  new Promise(async (resolve, reject) => {\n    // filter out the flags chain, consensus-key, db-type, and poa-instant. we don't want to pass them twice to fuel-core. see line 214.\n    const remainingArgs = extractRemainingArgs(args, [\n      '--chain',\n      '--consensus-key',\n      '--db-type',\n      '--poa-instant',\n    ]);\n\n    const chainConfigPath = getFlagValueFromArgs(args, '--chain');\n    const consensusKey = getFlagValueFromArgs(args, '--consensus-key') || defaultConsensusKey;\n\n    const dbTypeFlagValue = getFlagValueFromArgs(args, '--db-type');\n    const useInMemoryDb = dbTypeFlagValue === 'in-memory' || dbTypeFlagValue === undefined;\n\n    const poaInstantFlagValue = getFlagValueFromArgs(args, '--poa-instant');\n    const poaInstant = poaInstantFlagValue === 'true' || poaInstantFlagValue === undefined;\n\n    // This string is logged by the client when the node has successfully started. We use it to know when to resolve.\n    const graphQLStartSubstring = 'Binding GraphQL provider to';\n\n    const binPath = findBinPath('fuels-core', __dirname);\n\n    const command = useSystemFuelCore ? 'fuel-core' : binPath;\n\n    const ipToUse = ip || '0.0.0.0';\n\n    const portToUse =\n      port ||\n      (\n        await getPortPromise({\n          port: 4000, // tries 4000 first, then 4001, then 4002, etc.\n          stopPort: 5000, // don't try ports above 5000\n        })\n      ).toString();\n\n    let chainConfigPathToUse: string;\n\n    const prefix = basePath || os.tmpdir();\n    const suffix = basePath ? '' : randomUUID();\n    const tempDirPath = path.join(prefix, '.fuels', suffix);\n\n    if (chainConfigPath) {\n      chainConfigPathToUse = chainConfigPath;\n    } else {\n      if (!existsSync(tempDirPath)) {\n        mkdirSync(tempDirPath, { recursive: true });\n      }\n      const tempChainConfigFilePath = path.join(tempDirPath, 'chainConfig.json');\n\n      let chainConfig = defaultChainConfig;\n\n      // If there's no genesis key, generate one and some coins to the genesis block.\n      if (!process.env.GENESIS_SECRET) {\n        const pk = Signer.generatePrivateKey();\n        const signer = new Signer(pk);\n        process.env.GENESIS_SECRET = hexlify(pk);\n\n        chainConfig = {\n          ...defaultChainConfig,\n          initial_state: {\n            ...defaultChainConfig.initial_state,\n            coins: [\n              ...defaultChainConfig.initial_state.coins,\n              {\n                owner: signer.address.toHexString(),\n                amount: toHex(1_000_000_000),\n                asset_id: BaseAssetId,\n              },\n            ],\n          },\n        };\n      }\n\n      // Write a temporary chain configuration file.\n      writeFileSync(tempChainConfigFilePath, JSON.stringify(chainConfig), 'utf8');\n\n      chainConfigPathToUse = tempChainConfigFilePath;\n    }\n\n    const child = spawn(\n      command,\n      [\n        'run',\n        ['--ip', ipToUse],\n        ['--port', portToUse],\n        useInMemoryDb ? ['--db-type', 'in-memory'] : ['--db-path', tempDirPath],\n        ['--min-gas-price', '0'],\n        poaInstant ? ['--poa-instant', 'true'] : [],\n        ['--consensus-key', consensusKey],\n        ['--chain', chainConfigPathToUse as string],\n        '--vm-backtrace',\n        '--utxo-validation',\n        '--debug',\n        ...remainingArgs,\n      ].flat(),\n      {\n        stdio: 'pipe',\n      }\n    );\n\n    if (loggingEnabled) {\n      child.stderr.pipe(process.stderr);\n    }\n\n    if (debugEnabled) {\n      child.stdout.pipe(process.stdout);\n    }\n\n    const cleanupConfig: KillNodeParams = {\n      child,\n      configPath: tempDirPath,\n      killFn: treeKill,\n      state: {\n        isDead: false,\n      },\n    };\n\n    // Look for a specific graphql start point in the output.\n    child.stderr.on('data', (chunk: string) => {\n      // Look for the graphql service start.\n      if (chunk.indexOf(graphQLStartSubstring) !== -1) {\n        // Resolve with the cleanup method.\n        resolve({\n          cleanup: () => killNode(cleanupConfig),\n          ip: ipToUse,\n          port: portToUse,\n          chainConfigPath: chainConfigPathToUse as string,\n        });\n      }\n      if (/error/i.test(chunk)) {\n        reject(chunk.toString());\n      }\n    });\n\n    // Process exit.\n    process.on('exit', () => killNode(cleanupConfig));\n\n    // Catches ctrl+c event.\n    process.on('SIGINT', () => killNode(cleanupConfig));\n\n    // Catches \"kill pid\" (for example: nodemon restart).\n    process.on('SIGUSR1', () => killNode(cleanupConfig));\n    process.on('SIGUSR2', () => killNode(cleanupConfig));\n\n    // Catches uncaught exceptions.\n    process.on('beforeExit', () => killNode(cleanupConfig));\n    process.on('uncaughtException', () => killNode(cleanupConfig));\n\n    child.on('error', reject);\n  });\n\nconst generateWallets = async (count: number, provider: Provider) => {\n  const wallets: WalletUnlocked[] = [];\n  for (let i = 0; i < count; i += 1) {\n    const wallet = await generateTestWallet(provider, [[1_000, BaseAssetId]]);\n    wallets.push(wallet);\n  }\n  return wallets;\n};\n\nexport type LaunchNodeAndGetWalletsResult = Promise<{\n  wallets: WalletUnlocked[];\n  stop: () => void;\n  provider: Provider;\n}>;\n\n/**\n * Launches a fuel-core node and returns a provider, 10 wallets, and a cleanup function to stop the node.\n * @param launchNodeOptions - options to launch the fuel-core node with.\n * @param walletCount - the number of wallets to generate. (optional, defaults to 10)\n * */\nexport const launchNodeAndGetWallets = async ({\n  launchNodeOptions,\n  walletCount = 10,\n}: {\n  launchNodeOptions?: Partial<LaunchNodeOptions>;\n  walletCount?: number;\n} = {}): LaunchNodeAndGetWalletsResult => {\n  const { cleanup: closeNode, ip, port } = await launchNode(launchNodeOptions || {});\n\n  const provider = await Provider.create(`http://${ip}:${port}/graphql`);\n  const wallets = await generateWallets(walletCount, provider);\n\n  const cleanup = () => {\n    closeNode();\n  };\n\n  return { wallets, stop: cleanup, provider };\n};\n"],"mappings":"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","names":["Signer","getBytesCopy","gtf","addi","lw","addi2","tr","ret","getBytesCopy","transactionRequestify","Address","ErrorCode","FuelError","transactionRequestify","Signer","path","randomBytes","ScriptTransactionRequest","randomBytes","ScriptTransactionRequest","BaseAssetId","Signer","hexlify","Signer","hexlify","BaseAssetId"]}