Instantiating a Smart Contract
The getContract function is your gateway to creating and interacting with contract instances on OP_NET. By utilizing this function, you ensure that your contract instance is correctly typed and capable of interacting seamlessly with its ABI-defined methods.
Method
getContract<T extends BaseContractProperties>(
   address: string | Address,
   abi: BitcoinInterface | BitcoinInterfaceAbi,
   provider: AbstractRpcProvider,
   network: Network,
   sender?: Address
): BaseContract<T> & Omit<T, keyof BaseContract<T>>;
- 
Parameters: - address: string | Address: The address of the contract to instantiate.
- abi: BitcoinInterface | BitcoinInterfaceAbi: The ABI of the contract.
- provider: AbstractRpcProvider: The provider instance connected to OP_NET.
- network: Network: The target network for the contract.
- sender?: Address: (Optional) The sender address for contract interactions.
 
- 
Returns: - BaseContract<T>: The contract instance with all methods, events, and properties defined in the ABI.
- Omit<T, keyof BaseContract<T>>: The contract interface without the methods and events inherited from the base contract.
 
Example of Instantiating a Contract
Instantiating with a String Address
import { getContract, IOP_20Contract, OP_20_ABI } from "opnet";
import { networks } from "@btc-vision/bitcoin";
const op20Contract = getContract<IOP_20Contract>(
  "opr1exampleaddress", // Contract address as a string
  OP_20_ABI, // OP_20 token contract ABI
  provider, // JSONRpcProvider connected to OP_NET
  networks.regtest // Target network
  // Optional: Add the sender's address
  // Address.fromString("your-public-key")
);
Instantiating with an Address Object
const op20Contract = getContract<IOP_20Contract>(
  contractAddressObject, // Address object resolved via getPublicKeyInfo or other methods
  OP_20_ABI,
  provider,
  networks.regtest
  // Optional: Add the sender's address
  // Address.fromString("your-public-key")
);
In both cases, the returned instance allows you to interact with the OP_20 token contract, using methods defined in its ABI (e.g., balanceOf, transfer).
Best Practices
- Specify the expected contract interface (e.g., IOP_20Contract) to enable full IntelliSense support and reduce runtime errors.
- Create and reuse a single instance of your JSONRpcProviderfor consistent connectivity and improved performance.
- Set the senderparameter explicitly if your contract interactions require it, otherwise, leave it unset for general use.
What’s Next?
Now that you understand the basics, explore the following topics to dive deeper into contract interactions: