Error with deployment script with Typescript SDK

This is my deployment script but I get an error when creating factory instance.

Error deploying contract: TypeError: Class constructor ContractFactory cannot be invoked without 'new'

I have simple counter contract from the example, I’ve build it and generated types.

versions:
forc 0.63.3
fuels 0.94.3

Deployment script.

import { Provider, Wallet } from 'fuels';
import { TestContractFactory } from '@/sway-api'; // Adjust import path as necessary
import dotenv from 'dotenv';

// Load environment variables from .env file
dotenv.config();

const FUEL_NETWORK_URL = "https://testnet.fuel.network/v1/graphql";
const WALLET_PVT_KEY = process.env.NEXT_PUBLIC_WALLET_PVT_KEY || "";

console.log("WALLET_PVT_KEY: ", WALLET_PVT_KEY);

async function deployContract() {
    try {
        // Create the provider
        const provider = await Provider.create(FUEL_NETWORK_URL);
        console.log("Provider initialized successfully");

        // Create the wallet
        const wallet = Wallet.fromPrivateKey(WALLET_PVT_KEY, provider);
        console.log("Wallet created successfully");

        // Create a factory instance with the correct `new` keyword
        const factory = new TestContractFactory(wallet);
        console.log("Factory instance created");

        // Deploy the contract using the factory instance
        const deployResult = await factory.deploy();
        console.log("Deploy initiated");

        // Wait for deployment results
        const { contract, transactionResult } = await deployResult.waitForResult();
        console.log('Contract deployed successfully with ID:', contract);
        console.log('Transaction ID:', transactionResult.id);
    } catch (error) {
        console.error("Error deploying contract:", error);
    }
}

deployContract().catch(console.error);

This is generated TestContractFactory.ts

/* Autogenerated file. Do not edit manually. */

/* eslint-disable max-classes-per-file */
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/consistent-type-imports */

/*
  Fuels version: 0.94.3
*/

import { ContractFactory, decompressBytecode } from "fuels";
import type { Provider, Account, DeployContractOptions, DeployContractResult } from "fuels";

import { TestContract } from "./TestContract";

const bytecode = decompressBytecode("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");

export class TestContractFactory extends ContractFactory {

  static readonly bytecode = bytecode;

  constructor(accountOrProvider: Account | Provider) {
    super(bytecode, TestContract.abi, accountOrProvider);
  }

  static async deploy (
    wallet: Account,
    options: DeployContractOptions = {}
  ): Promise<DeployContractResult<TestContract>> {
    const factory = new TestContractFactory(wallet);

    return factory.deploy({
      storageSlots: TestContract.storageSlots,
      ...options,
    });
  }
}

If there is any github projects that use Typescript SDK with a simple deployment script I would appreciate the link

Hey @KITSCHO this is quite strange as I am currently unable to reproduce your error on a local devnet. I made minor adjustments to your code here to just use the in-browser wallet to deploy to the local fuel-core node , but otherwise it’s the same. You can give that a try and see if your issue is reproduced using that code.

To answer your second comment though, feel free to explore these links.

2 Likes

Yes this worked when I did it like you did.

I wanted to have a separate deploy script. this is my folder structure.

I execute this script with the command npx ts-node -r tsconfig-paths/register ./scripts/deploy.ts

The only difference in the code is that the wallet is from the private key. Is there a chance that that error is thrown because of lack of funds or something?

Ah ok I solved it.
I had to change in my tsconfig.json from "target": "es5", to “target”: “esnext”.
Now it is deploying correctly.

1 Like

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.