Skip to content

Commit

Permalink
Add method for deploying contract template
Browse files Browse the repository at this point in the history
  • Loading branch information
Lbqds committed Jul 29, 2024
1 parent 1126c53 commit 95ab131
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 2 deletions.
21 changes: 20 additions & 1 deletion packages/cli/src/deployment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ function createDeployer<Settings = unknown>(
const deployedContracts: string[] = []
const executedScripts: string[] = []

const deployContract = async <T extends ContractInstance, P extends Fields>(
const deployContractInner = async <T extends ContractInstance, P extends Fields>(
contractFactory: ContractFactory<T, P>,
params: DeployContractParams<P>,
taskTag?: string
Expand Down Expand Up @@ -416,6 +416,24 @@ function createDeployer<Settings = unknown>(
return deployResult
}

const deployContract = async <T extends ContractInstance, P extends Fields>(
contractFactory: ContractFactory<T, P>,
params: DeployContractParams<P>,
taskTag?: string
): Promise<DeployContractResult<T>> => {
return deployContractInner(contractFactory, params, taskTag)
}

const deployTemplate = async <T extends ContractInstance, P extends Fields>(
contractFactory: ContractFactory<T, P>,
taskTag?: string
): Promise<DeployContractResult<T>> => {
const params: DeployContractParams<P> = {
initialFields: contractFactory.contract.getInitialFieldsWithDefaultValues() as P
}
return deployContractInner(contractFactory, params, taskTag)
}

const runScript = async <P extends Fields>(
executableScript: ExecutableScript<P>,
params: ExecuteScriptParams<P>,
Expand Down Expand Up @@ -490,6 +508,7 @@ function createDeployer<Settings = unknown>(
provider: web3.getCurrentNodeProvider(),
account: account,
deployContract: deployContract,
deployTemplate: deployTemplate,
runScript: runScript,
getDeployContractResult: getDeployContractResult,
getRunScriptResult: getRunScriptResult,
Expand Down
5 changes: 5 additions & 0 deletions packages/cli/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@ export interface Deployer {
taskTag?: string
): Promise<DeployContractResult<T>>

deployTemplate<T extends ContractInstance, P extends Fields>(
constractFactory: ContractFactory<T, P>,
taskTag?: string
): Promise<DeployContractResult<T>>

runScript<P extends Fields>(
executableScript: ExecutableScript<P>,
params: ExecuteScriptParams<P>,
Expand Down
6 changes: 6 additions & 0 deletions packages/web3/src/contract/contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1010,6 +1010,12 @@ export abstract class ContractFactory<I extends ContractInstance, F extends Fiel
}
}

async deployTemplate(signer: SignerProvider): Promise<DeployContractResult<I>> {
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<F> {
const newAsset = {
Expand Down
33 changes: 32 additions & 1 deletion test/contract.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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)
})
})

0 comments on commit 95ab131

Please sign in to comment.