diff --git a/packages/cli/src/deployment.ts b/packages/cli/src/deployment.ts index b3f723514..f2753404d 100644 --- a/packages/cli/src/deployment.ts +++ b/packages/cli/src/deployment.ts @@ -359,7 +359,7 @@ function createDeployer( const deployedContracts: string[] = [] const executedScripts: string[] = [] - const deployContract = async ( + const deployContractInner = async ( contractFactory: ContractFactory, params: DeployContractParams

, taskTag?: string @@ -416,6 +416,24 @@ function createDeployer( return deployResult } + const deployContract = async ( + contractFactory: ContractFactory, + params: DeployContractParams

, + taskTag?: string + ): Promise> => { + return deployContractInner(contractFactory, params, taskTag) + } + + const deployTemplate = async ( + contractFactory: ContractFactory, + taskTag?: string + ): Promise> => { + const params: DeployContractParams

= { + initialFields: contractFactory.contract.getInitialFieldsWithDefaultValues() as P + } + return deployContractInner(contractFactory, params, taskTag) + } + const runScript = async

( executableScript: ExecutableScript

, params: ExecuteScriptParams

, @@ -490,6 +508,7 @@ function createDeployer( provider: web3.getCurrentNodeProvider(), account: account, deployContract: deployContract, + deployTemplate: deployTemplate, runScript: runScript, getDeployContractResult: getDeployContractResult, getRunScriptResult: getRunScriptResult, diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 1148d0044..964e83afa 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -135,6 +135,11 @@ export interface Deployer { taskTag?: string ): Promise> + deployTemplate( + constractFactory: ContractFactory, + taskTag?: string + ): Promise> + runScript

( executableScript: ExecutableScript

, params: ExecuteScriptParams

, diff --git a/packages/web3/src/contract/contract.ts b/packages/web3/src/contract/contract.ts index e94d9260b..1e2f70c93 100644 --- a/packages/web3/src/contract/contract.ts +++ b/packages/web3/src/contract/contract.ts @@ -1010,6 +1010,12 @@ export abstract class ContractFactory> { + return this.deploy(signer, { + initialFields: this.contract.getInitialFieldsWithDefaultValues() as F + }) + } + // This is used for testing contract functions stateForTest(initFields: F, asset?: Asset, address?: string): ContractState { const newAsset = { diff --git a/test/contract.test.ts b/test/contract.test.ts index e96d6341d..05aa551ba 100644 --- a/test/contract.test.ts +++ b/test/contract.test.ts @@ -37,7 +37,9 @@ import { encodePrimitiveValues, addressVal, byteVecVal, - u256Val + u256Val, + ZERO_ADDRESS, + MINIMAL_CONTRACT_DEPOSIT } from '../packages/web3' import { Contract, Script, getContractIdFromUnsignedTx } from '../packages/web3' import { expectAssertionError, testAddress, randomContractAddress, getSigner, mintToken } from '../packages/web3-test' @@ -736,4 +738,33 @@ describe('contract', function () { } ]) }) + + it('should deploy contract template', async () => { + const signer = await getSigner() + const template0 = await Assert.deployTemplate(signer) + const state0 = await template0.contractInstance.fetchState() + expect(state0['fields']).toEqual({}) + expect(BigInt(state0.asset.alphAmount)).toEqual(MINIMAL_CONTRACT_DEPOSIT) + + const template1 = await Add.deployTemplate(signer) + const state1 = await template1.contractInstance.fetchState() + expect(state1.fields).toEqual({ sub: '', result: 0n }) + expect(BigInt(state1.asset.alphAmount)).toEqual(MINIMAL_CONTRACT_DEPOSIT) + + const template2 = await UserAccount.deployTemplate(signer) + const state2 = await template2.contractInstance.fetchState() + expect(state2.fields).toEqual({ + id: '', + address: ZERO_ADDRESS, + balances: { + totalAmount: 0n, + tokens: [ + { tokenId: '', amount: 0n }, + { tokenId: '', amount: 0n } + ] + }, + name: '' + }) + expect(BigInt(state2.asset.alphAmount)).toEqual(MINIMAL_CONTRACT_DEPOSIT) + }) })