-
Notifications
You must be signed in to change notification settings - Fork 270
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat!: pay fee for account init (#5601)
This PR enables accounts to pay tx fees when they're deployed. To achieve this a new deployment method was added that's used by the `AccountManager` class to optionally register/publicly deploy and initialize the target account contract. Entrypoint classes now accept authwits/packed arguments alongside the normal function calls from before. This is needed so that authwits could be created in a parent context and then passed along as transient authwits to the transaction (see `ExecutionRequestInit` wrapper type) Initializing an account contract can use any of the three existing payment methods: - using bridged gas token from L1 - paying privately through a fee payment contract - paying publicly through a fee payment contract In order to use fee payment contracts this PR adds `noinitcheck` to `spend_private_authwit` and `spend_public_authwit` because it's not possible to read the init nullifier in the current tx (protocol limitation). Instead the contract relies on the note containing the public key to exist to validate that the contract has been initialized correctly. An extra payment flow is tested as well: a third party takes the account's public keys and deploys and initializes the account while paying the associated fee. This simulates the flow where a deployment service is used that takes payment through a side chain (e.g. fiat). Breaking change: moved `DefaultMultiCallEntrypoint` to aztec.js This PR supersedes #5540 and #5543. Fix #5190 #5191 #5544.
- Loading branch information
Showing
33 changed files
with
834 additions
and
262 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
yarn-project/aztec.js/src/account_manager/deploy_account_method.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import { type PublicKey } from '@aztec/circuit-types'; | ||
import { FunctionData } from '@aztec/circuits.js'; | ||
import { | ||
type ContractArtifact, | ||
type FunctionArtifact, | ||
encodeArguments, | ||
getFunctionArtifact, | ||
} from '@aztec/foundation/abi'; | ||
|
||
import { type AuthWitnessProvider } from '../account/interface.js'; | ||
import { type Wallet } from '../account/wallet.js'; | ||
import { type ExecutionRequestInit } from '../api/entrypoint.js'; | ||
import { Contract } from '../contract/contract.js'; | ||
import { DeployMethod, type DeployOptions } from '../contract/deploy_method.js'; | ||
import { EntrypointPayload } from '../entrypoint/payload.js'; | ||
|
||
/** | ||
* Contract interaction for deploying an account contract. Handles fee preparation and contract initialization. | ||
*/ | ||
export class DeployAccountMethod extends DeployMethod { | ||
#authWitnessProvider: AuthWitnessProvider; | ||
#feePaymentArtifact: FunctionArtifact | undefined; | ||
|
||
constructor( | ||
authWitnessProvider: AuthWitnessProvider, | ||
publicKey: PublicKey, | ||
wallet: Wallet, | ||
artifact: ContractArtifact, | ||
args: any[] = [], | ||
constructorNameOrArtifact?: string | FunctionArtifact, | ||
feePaymentNameOrArtifact?: string | FunctionArtifact, | ||
) { | ||
super( | ||
publicKey, | ||
wallet, | ||
artifact, | ||
(address, wallet) => Contract.at(address, artifact, wallet), | ||
args, | ||
constructorNameOrArtifact, | ||
); | ||
|
||
this.#authWitnessProvider = authWitnessProvider; | ||
this.#feePaymentArtifact = | ||
typeof feePaymentNameOrArtifact === 'string' | ||
? getFunctionArtifact(artifact, feePaymentNameOrArtifact) | ||
: feePaymentNameOrArtifact; | ||
} | ||
|
||
protected async getInitializeFunctionCalls(options: DeployOptions): Promise<ExecutionRequestInit> { | ||
const exec = await super.getInitializeFunctionCalls(options); | ||
|
||
if (options.fee && this.#feePaymentArtifact) { | ||
const { address } = this.getInstance(); | ||
const feePayload = await EntrypointPayload.fromFeeOptions(options?.fee); | ||
|
||
exec.calls.push({ | ||
to: address, | ||
args: encodeArguments(this.#feePaymentArtifact, [feePayload]), | ||
functionData: FunctionData.fromAbi(this.#feePaymentArtifact), | ||
}); | ||
|
||
exec.authWitnesses ??= []; | ||
exec.packedArguments ??= []; | ||
|
||
exec.authWitnesses.push(await this.#authWitnessProvider.createAuthWit(feePayload.hash())); | ||
exec.packedArguments.push(...feePayload.packedArguments); | ||
} | ||
|
||
return exec; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.