@vechain/sdk-network
Version:
This module serves as the standard interface connecting decentralized applications (dApps) and users to the VeChainThor blockchain
192 lines (171 loc) • 6.22 kB
text/typescript
import {
ABIContract,
type ABIEvent,
type ABIFunction
} from '@vechain/sdk-core';
import {
type Abi,
type ExtractAbiEventNames,
type ExtractAbiFunctionNames
} from 'abitype';
import { type VeChainSigner } from '../../../signer';
import type { TransactionReceipt } from '../../transactions/types';
import { type ContractsModule } from '../contracts-module';
import type { ContractCallOptions, ContractTransactionOptions } from '../types';
import {
getClauseProxy,
getCriteriaProxy,
getFilterProxy,
getReadProxy,
getTransactProxy
} from './contract-proxy';
import {
type ContractFunctionClause,
type ContractFunctionCriteria,
type ContractFunctionFilter,
type ContractFunctionRead,
type ContractFunctionTransact
} from './types';
/**
* A class representing a smart contract deployed on the blockchain.
*/
class Contract<TAbi extends Abi> {
readonly contractsModule: ContractsModule;
readonly address: string;
readonly abi: Abi;
private signer?: VeChainSigner;
readonly deployTransactionReceipt: TransactionReceipt | undefined;
public read: ContractFunctionRead<
TAbi,
ExtractAbiFunctionNames<TAbi, 'pure' | 'view'>
> = {} as ContractFunctionRead<
TAbi,
ExtractAbiFunctionNames<TAbi, 'pure' | 'view'>
>;
public transact: ContractFunctionTransact<
TAbi,
ExtractAbiFunctionNames<TAbi, 'payable' | 'nonpayable'>
> = {} as ContractFunctionTransact<
TAbi,
ExtractAbiFunctionNames<TAbi, 'payable' | 'nonpayable'>
>;
public filters: ContractFunctionFilter<TAbi, ExtractAbiEventNames<TAbi>> =
{} as ContractFunctionFilter<TAbi, ExtractAbiEventNames<TAbi>>;
public clause: ContractFunctionClause<TAbi, ExtractAbiFunctionNames<TAbi>> =
{} as ContractFunctionClause<TAbi, ExtractAbiFunctionNames<TAbi>>;
public criteria: ContractFunctionCriteria<
TAbi,
ExtractAbiEventNames<TAbi>
> = {} as ContractFunctionCriteria<TAbi, ExtractAbiEventNames<TAbi>>;
private contractCallOptions: ContractCallOptions = {};
private contractTransactionOptions: ContractTransactionOptions = {};
/**
* Initializes a new instance of the `Contract` class.
* @param address The address of the contract.
* @param abi The Application Binary Interface (ABI) of the contract, which defines the contract's methods and events.
* @param thor An instance of ThorClient to interact with the blockchain.
* @param signer The signer caller used for signing transactions.
* @param transactionReceipt (Optional) The transaction receipt of the contract deployment.
*/
constructor(
address: string,
abi: Abi,
contractsModule: ContractsModule,
signer?: VeChainSigner,
transactionReceipt?: TransactionReceipt
) {
this.abi = abi;
this.address = address;
this.contractsModule = contractsModule;
this.deployTransactionReceipt = transactionReceipt;
this.signer = signer;
this.read = getReadProxy(this);
this.transact = getTransactProxy(this);
this.filters = getFilterProxy(this);
this.clause = getClauseProxy(this);
this.criteria = getCriteriaProxy(this);
}
/**
* Sets the options for contract calls.
* @param options - The contract call options to set.
* @returns The updated contract call options.
*/
public setContractReadOptions(
options: ContractCallOptions
): ContractCallOptions {
this.contractCallOptions = options;
return this.contractCallOptions;
}
/**
* Clears the current contract call options, resetting them to an empty object.
* @returns The updated contract call options.
*/
public getContractReadOptions(): ContractCallOptions {
return this.contractCallOptions;
}
/**
* Clears the current contract call options, resetting them to an empty object.
*/
public clearContractReadOptions(): void {
this.contractCallOptions = {};
}
/**
* Sets the options for contract transactions.
* @param options - The contract transaction options to set.
* @returns The updated contract transaction options.
*/
public setContractTransactOptions(
options: ContractTransactionOptions
): ContractTransactionOptions {
this.contractTransactionOptions = options;
return this.contractTransactionOptions;
}
/**
* Retrieves the options for contract transactions.
* @returns The contract transaction options.
*/
public getContractTransactOptions(): ContractTransactionOptions {
return this.contractTransactionOptions;
}
/**
* Clears the current contract transaction options, resetting them to an empty object.
*/
public clearContractTransactOptions(): void {
this.contractTransactionOptions = {};
}
/**
* Sets the private key of the caller for signing transactions.
* @param signer - The caller signer
*/
public setSigner(signer: VeChainSigner): VeChainSigner {
this.signer = signer;
return this.signer;
}
/**
* Get the caller signer used for signing transactions.
* @returns The signer used for signing transactions.
*/
public getSigner(): VeChainSigner | undefined {
return this.signer;
}
/**
* Retrieves the function ABI for the specified function name.
* @param prop - The name of the function.
* @return The function ABI for the specified event name.
* @throws {InvalidAbiItem}
*
*/
public getFunctionAbi(prop: string | symbol): ABIFunction {
return ABIContract.ofAbi(this.abi).getFunction(prop.toString());
}
/**
* Retrieves the event ABI for the specified event name.
* @param eventName - The name of the event.
* @return The event ABI for the specified event name.
* @throws {InvalidAbiItem}
*/
public getEventAbi(eventName: string | symbol): ABIEvent {
return ABIContract.ofAbi(this.abi).getEvent(eventName.toString());
}
}
export { Contract };