diff --git a/yarn-project/accounts/src/defaults/account_contract.ts b/yarn-project/accounts/src/defaults/account_contract.ts index 0d4b671d5329..0faef8e3ec55 100644 --- a/yarn-project/accounts/src/defaults/account_contract.ts +++ b/yarn-project/accounts/src/defaults/account_contract.ts @@ -10,7 +10,15 @@ import { DefaultAccountInterface } from '../defaults/account_interface.js'; */ export abstract class DefaultAccountContract implements AccountContract { abstract getAuthWitnessProvider(address: CompleteAddress): AuthWitnessProvider; - abstract getDeploymentArgs(): Promise; + abstract getDeploymentFunctionAndArgs(): Promise< + | { + /** The name of the function used to deploy the contract */ + constructorName: string; + /** The args to the function used to deploy the contract */ + constructorArgs: any[]; + } + | undefined + >; abstract getContractArtifact(): Promise; constructor() {} diff --git a/yarn-project/accounts/src/ecdsa/ecdsa_k/account_contract.ts b/yarn-project/accounts/src/ecdsa/ecdsa_k/account_contract.ts index 3995d2e9bd6a..277ca09d1fb1 100644 --- a/yarn-project/accounts/src/ecdsa/ecdsa_k/account_contract.ts +++ b/yarn-project/accounts/src/ecdsa/ecdsa_k/account_contract.ts @@ -17,9 +17,12 @@ export abstract class EcdsaKBaseAccountContract extends DefaultAccountContract { super(); } - async getDeploymentArgs() { + async getDeploymentFunctionAndArgs() { const signingPublicKey = await new Ecdsa().computePublicKey(this.signingPrivateKey); - return [signingPublicKey.subarray(0, 32), signingPublicKey.subarray(32, 64)]; + return { + constructorName: 'constructor', + constructorArgs: [signingPublicKey.subarray(0, 32), signingPublicKey.subarray(32, 64)], + }; } getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider { diff --git a/yarn-project/accounts/src/ecdsa/ssh_ecdsa_r/account_contract.ts b/yarn-project/accounts/src/ecdsa/ssh_ecdsa_r/account_contract.ts index 46707e3973fe..e3274a778b78 100644 --- a/yarn-project/accounts/src/ecdsa/ssh_ecdsa_r/account_contract.ts +++ b/yarn-project/accounts/src/ecdsa/ssh_ecdsa_r/account_contract.ts @@ -22,8 +22,11 @@ export abstract class EcdsaRSSHBaseAccountContract extends DefaultAccountContrac super(); } - getDeploymentArgs() { - return Promise.resolve([this.signingPublicKey.subarray(0, 32), this.signingPublicKey.subarray(32, 64)]); + getDeploymentFunctionAndArgs() { + return Promise.resolve({ + constructorName: 'constructor', + constructorArgs: [this.signingPublicKey.subarray(0, 32), this.signingPublicKey.subarray(32, 64)], + }); } getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider { diff --git a/yarn-project/accounts/src/schnorr/account_contract.ts b/yarn-project/accounts/src/schnorr/account_contract.ts index 980627ccabb9..3be81d838871 100644 --- a/yarn-project/accounts/src/schnorr/account_contract.ts +++ b/yarn-project/accounts/src/schnorr/account_contract.ts @@ -17,9 +17,9 @@ export abstract class SchnorrBaseAccountContract extends DefaultAccountContract super(); } - async getDeploymentArgs() { + async getDeploymentFunctionAndArgs() { const signingPublicKey = await new Schnorr().computePublicKey(this.signingPrivateKey); - return [signingPublicKey.x, signingPublicKey.y]; + return { constructorName: 'constructor', constructorArgs: [signingPublicKey.x, signingPublicKey.y] }; } getAuthWitnessProvider(_address: CompleteAddress): AuthWitnessProvider { diff --git a/yarn-project/accounts/src/single_key/account_contract.ts b/yarn-project/accounts/src/single_key/account_contract.ts index a66a74373ad7..1a91e223e5e9 100644 --- a/yarn-project/accounts/src/single_key/account_contract.ts +++ b/yarn-project/accounts/src/single_key/account_contract.ts @@ -17,7 +17,7 @@ export abstract class SingleKeyBaseAccountContract extends DefaultAccountContrac super(); } - getDeploymentArgs() { + getDeploymentFunctionAndArgs() { return Promise.resolve(undefined); } diff --git a/yarn-project/aztec.js/src/account/contract.ts b/yarn-project/aztec.js/src/account/contract.ts index 63df16c3746d..710b59b773f4 100644 --- a/yarn-project/aztec.js/src/account/contract.ts +++ b/yarn-project/aztec.js/src/account/contract.ts @@ -18,9 +18,17 @@ export interface AccountContract { getContractArtifact(): Promise; /** - * Returns the deployment arguments for this instance, or undefined if this contract does not require deployment. + * Returns the deployment function name and arguments for this instance, or undefined if this contract does not require deployment. */ - getDeploymentArgs(): Promise; + getDeploymentFunctionAndArgs(): Promise< + | { + /** The name of the function used to deploy the contract */ + constructorName: string; + /** The args to the function used to deploy the contract */ + constructorArgs: any[]; + } + | undefined + >; /** * Returns the account interface for this account contract given a deployment at the provided address. @@ -45,9 +53,13 @@ export interface AccountContract { */ export async function getAccountContractAddress(accountContract: AccountContract, secret: Fr, salt: Fr) { const { publicKeys } = await deriveKeys(secret); - const constructorArgs = await accountContract.getDeploymentArgs(); + const { constructorName, constructorArgs } = (await accountContract.getDeploymentFunctionAndArgs()) ?? { + constructorName: undefined, + constructorArgs: undefined, + }; const artifact = await accountContract.getContractArtifact(); const instance = await getContractInstanceFromDeployParams(artifact, { + constructorArtifact: constructorName, constructorArgs, salt, publicKeys, diff --git a/yarn-project/aztec.js/src/account_manager/index.ts b/yarn-project/aztec.js/src/account_manager/index.ts index f642ea5d2264..784b7e2458e7 100644 --- a/yarn-project/aztec.js/src/account_manager/index.ts +++ b/yarn-project/aztec.js/src/account_manager/index.ts @@ -48,9 +48,15 @@ export class AccountManager { const { publicKeys } = await deriveKeys(secretKey); salt = salt !== undefined ? new Fr(salt) : Fr.random(); + const { constructorName, constructorArgs } = (await accountContract.getDeploymentFunctionAndArgs()) ?? { + constructorName: undefined, + constructorArgs: undefined, + }; + const artifact = await accountContract.getContractArtifact(); const instance = await getContractInstanceFromDeployParams(artifact, { - constructorArgs: await accountContract.getDeploymentArgs(), + constructorArtifact: constructorName, + constructorArgs, salt: salt, publicKeys, }); @@ -149,7 +155,10 @@ export class AccountManager { await this.pxe.registerAccount(this.secretKey, completeAddress.partialAddress); - const args = (await this.accountContract.getDeploymentArgs()) ?? []; + const { constructorName, constructorArgs } = (await this.accountContract.getDeploymentFunctionAndArgs()) ?? { + constructorName: undefined, + constructorArgs: undefined, + }; if (deployWallet) { // If deploying using an existing wallet/account, treat it like regular contract deployment. @@ -159,8 +168,8 @@ export class AccountManager { deployWallet, artifact, address => Contract.at(address, artifact, thisWallet), - args, - 'constructor', + constructorArgs, + constructorName, ); } @@ -175,8 +184,8 @@ export class AccountManager { this.getPublicKeys(), wallet, artifact, - args, - 'constructor', + constructorArgs, + constructorName, 'entrypoint', ); } @@ -221,7 +230,7 @@ export class AccountManager { * Returns whether this account contract has a constructor and needs deployment. */ public async isDeployable() { - return (await this.accountContract.getDeploymentArgs()) !== undefined; + return (await this.accountContract.getDeploymentFunctionAndArgs()) !== undefined; } } diff --git a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts index 0e81646fa474..c72413d462ee 100644 --- a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts +++ b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts @@ -27,7 +27,7 @@ class SchnorrHardcodedKeyAccountContract extends DefaultAccountContract { return Promise.resolve(SchnorrHardcodedAccountContractArtifact); } - getDeploymentArgs() { + getDeploymentFunctionAndArgs() { // This contract has no constructor return Promise.resolve(undefined); }