@aztec/cli-wallet 0.0.1-commit.f2ce05ee → 0.0.1-commit.f5d02921e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/cmds/authorize_action.d.ts +2 -2
- package/dest/cmds/authorize_action.d.ts.map +1 -1
- package/dest/cmds/check_tx.d.ts +1 -1
- package/dest/cmds/check_tx.d.ts.map +1 -1
- package/dest/cmds/check_tx.js +36 -9
- package/dest/cmds/create_account.d.ts +4 -3
- package/dest/cmds/create_account.d.ts.map +1 -1
- package/dest/cmds/create_account.js +32 -21
- package/dest/cmds/deploy.d.ts +4 -3
- package/dest/cmds/deploy.d.ts.map +1 -1
- package/dest/cmds/deploy.js +27 -23
- package/dest/cmds/deploy_account.d.ts +4 -3
- package/dest/cmds/deploy_account.d.ts.map +1 -1
- package/dest/cmds/deploy_account.js +27 -16
- package/dest/cmds/get_fee_juice_balance.d.ts +5 -0
- package/dest/cmds/get_fee_juice_balance.d.ts.map +1 -0
- package/dest/cmds/get_fee_juice_balance.js +27 -0
- package/dest/cmds/index.d.ts +1 -1
- package/dest/cmds/index.d.ts.map +1 -1
- package/dest/cmds/index.js +30 -14
- package/dest/cmds/send.d.ts +4 -3
- package/dest/cmds/send.d.ts.map +1 -1
- package/dest/cmds/send.js +27 -23
- package/dest/storage/wallet_db.d.ts +6 -1
- package/dest/storage/wallet_db.d.ts.map +1 -1
- package/dest/storage/wallet_db.js +14 -0
- package/dest/utils/options/fees.d.ts +2 -2
- package/dest/utils/options/fees.d.ts.map +1 -1
- package/dest/utils/options/fees.js +8 -5
- package/dest/utils/wallet.d.ts +8 -3
- package/dest/utils/wallet.d.ts.map +1 -1
- package/dest/utils/wallet.js +45 -40
- package/package.json +14 -14
- package/src/cmds/check_tx.ts +41 -10
- package/src/cmds/create_account.ts +32 -18
- package/src/cmds/deploy.ts +24 -15
- package/src/cmds/deploy_account.ts +26 -13
- package/src/cmds/get_fee_juice_balance.ts +37 -0
- package/src/cmds/index.ts +57 -4
- package/src/cmds/send.ts +24 -16
- package/src/cmds/simulate.ts +1 -1
- package/src/storage/wallet_db.ts +14 -0
- package/src/utils/options/fees.ts +13 -5
- package/src/utils/wallet.ts +53 -56
package/src/cmds/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from '@aztec/cli/utils';
|
|
13
13
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
14
14
|
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
15
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
15
16
|
|
|
16
17
|
import { type Command, Option } from 'commander';
|
|
17
18
|
import inquirer from 'inquirer';
|
|
@@ -40,6 +41,17 @@ import {
|
|
|
40
41
|
integerArgParser,
|
|
41
42
|
} from '../utils/options/index.js';
|
|
42
43
|
|
|
44
|
+
function parseWaitForStatus(status: string): TxStatus {
|
|
45
|
+
switch (status) {
|
|
46
|
+
case 'proposed':
|
|
47
|
+
return TxStatus.PROPOSED;
|
|
48
|
+
case 'checkpointed':
|
|
49
|
+
return TxStatus.CHECKPOINTED;
|
|
50
|
+
default:
|
|
51
|
+
throw new Error(`Invalid wait-for-status: ${status}. Use 'proposed' or 'checkpointed'.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
43
55
|
// TODO: This function is only used in 1 place so we could just inline this
|
|
44
56
|
export function injectCommands(
|
|
45
57
|
program: Command,
|
|
@@ -63,7 +75,7 @@ export function injectCommands(
|
|
|
63
75
|
const createAccountCommand = program
|
|
64
76
|
.command('create-account')
|
|
65
77
|
.description(
|
|
66
|
-
'Creates an aztec account that can be used for sending transactions. Registers the account on the PXE and deploys an account contract. Uses a Schnorr
|
|
78
|
+
'Creates an aztec account that can be used for sending transactions. Registers the account on the PXE and deploys an account contract. Uses a Schnorr account which uses an immutable key for authentication.',
|
|
67
79
|
)
|
|
68
80
|
.summary('Creates an aztec account that can be used for sending transactions.')
|
|
69
81
|
.addOption(createAccountOption('Alias or address of the account performing the deployment', !db, db))
|
|
@@ -90,6 +102,11 @@ export function injectCommands(
|
|
|
90
102
|
)
|
|
91
103
|
.addOption(createAliasOption('Alias for the account. Used for easy reference in subsequent commands.', !db))
|
|
92
104
|
.addOption(createTypeOption(true))
|
|
105
|
+
.option(
|
|
106
|
+
'-s, --salt <hex string>',
|
|
107
|
+
'Optional deployment salt as a hex string for generating the deployment address. Defaults to 0.',
|
|
108
|
+
parseFieldFromHexString,
|
|
109
|
+
)
|
|
93
110
|
.option(
|
|
94
111
|
'--register-only',
|
|
95
112
|
'Just register the account on the Wallet. Do not deploy or initialize the account contract.',
|
|
@@ -98,6 +115,7 @@ export function injectCommands(
|
|
|
98
115
|
// `options.wait` is default true. Passing `--no-wait` will set it to false.
|
|
99
116
|
// https://github.com/tj/commander.js#other-option-types-negatable-boolean-and-booleanvalue
|
|
100
117
|
.option('--no-wait', 'Skip waiting for the contract to be deployed. Print the hash of deployment transaction')
|
|
118
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
101
119
|
.addOption(createVerboseOption());
|
|
102
120
|
|
|
103
121
|
addOptions(createAccountCommand, CLIFeeArgs.getOptions()).action(async (_options, command) => {
|
|
@@ -107,7 +125,9 @@ export function injectCommands(
|
|
|
107
125
|
type,
|
|
108
126
|
from: parsedFromAddress,
|
|
109
127
|
secretKey,
|
|
128
|
+
salt,
|
|
110
129
|
wait,
|
|
130
|
+
waitForStatus: waitForStatusStr,
|
|
111
131
|
registerOnly,
|
|
112
132
|
skipInitialization,
|
|
113
133
|
publicDeploy,
|
|
@@ -137,6 +157,7 @@ export function injectCommands(
|
|
|
137
157
|
node,
|
|
138
158
|
type,
|
|
139
159
|
secretKey,
|
|
160
|
+
salt,
|
|
140
161
|
publicKey,
|
|
141
162
|
alias,
|
|
142
163
|
parsedFromAddress,
|
|
@@ -146,6 +167,7 @@ export function injectCommands(
|
|
|
146
167
|
registerClass,
|
|
147
168
|
wait,
|
|
148
169
|
CLIFeeArgs.parse(options, log, db),
|
|
170
|
+
parseWaitForStatus(waitForStatusStr),
|
|
149
171
|
json,
|
|
150
172
|
verbose,
|
|
151
173
|
debugLogger,
|
|
@@ -180,12 +202,22 @@ export function injectCommands(
|
|
|
180
202
|
'--skip-initialization',
|
|
181
203
|
'Skip initializing the account contract. Useful for publicly deploying an existing account.',
|
|
182
204
|
)
|
|
205
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
183
206
|
.addOption(createVerboseOption());
|
|
184
207
|
|
|
185
208
|
addOptions(deployAccountCommand, CLIFeeArgs.getOptions()).action(async (parsedAccount, _options, command) => {
|
|
186
209
|
const { deployAccount } = await import('./deploy_account.js');
|
|
187
210
|
const options = command.optsWithGlobals();
|
|
188
|
-
const {
|
|
211
|
+
const {
|
|
212
|
+
wait,
|
|
213
|
+
waitForStatus: waitForStatusStr,
|
|
214
|
+
from: parsedFromAddress,
|
|
215
|
+
json,
|
|
216
|
+
registerClass,
|
|
217
|
+
skipInitialization,
|
|
218
|
+
publicDeploy,
|
|
219
|
+
verbose,
|
|
220
|
+
} = options;
|
|
189
221
|
|
|
190
222
|
const { wallet, node } = walletAndNodeWrapper;
|
|
191
223
|
|
|
@@ -199,6 +231,7 @@ export function injectCommands(
|
|
|
199
231
|
publicDeploy,
|
|
200
232
|
skipInitialization,
|
|
201
233
|
CLIFeeArgs.parse(options, log, db),
|
|
234
|
+
parseWaitForStatus(waitForStatusStr),
|
|
202
235
|
json,
|
|
203
236
|
verbose,
|
|
204
237
|
debugLogger,
|
|
@@ -219,7 +252,7 @@ export function injectCommands(
|
|
|
219
252
|
)
|
|
220
253
|
.option(
|
|
221
254
|
'-s, --salt <hex string>',
|
|
222
|
-
'Optional deployment salt as a hex string for generating the deployment address.',
|
|
255
|
+
'Optional deployment salt as a hex string for generating the deployment address. Defaults to random.',
|
|
223
256
|
parseFieldFromHexString,
|
|
224
257
|
)
|
|
225
258
|
.option('--universal', 'Do not mix the sender address into the deployment.')
|
|
@@ -238,6 +271,7 @@ export function injectCommands(
|
|
|
238
271
|
'The amount of time in seconds to wait for the deployment to post to L2',
|
|
239
272
|
).conflicts('wait'),
|
|
240
273
|
)
|
|
274
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
241
275
|
.addOption(createVerboseOption());
|
|
242
276
|
|
|
243
277
|
addOptions(deployCommand, CLIFeeArgs.getOptions()).action(async (artifactPathPromise, _options, command) => {
|
|
@@ -249,6 +283,7 @@ export function injectCommands(
|
|
|
249
283
|
args,
|
|
250
284
|
salt,
|
|
251
285
|
wait,
|
|
286
|
+
waitForStatus: waitForStatusStr,
|
|
252
287
|
classRegistration,
|
|
253
288
|
init,
|
|
254
289
|
publicDeployment,
|
|
@@ -279,8 +314,9 @@ export function injectCommands(
|
|
|
279
314
|
typeof init === 'string' ? false : init,
|
|
280
315
|
wait,
|
|
281
316
|
CLIFeeArgs.parse(options, log, db),
|
|
282
|
-
|
|
317
|
+
parseWaitForStatus(waitForStatusStr),
|
|
283
318
|
verbose,
|
|
319
|
+
timeout,
|
|
284
320
|
debugLogger,
|
|
285
321
|
log,
|
|
286
322
|
);
|
|
@@ -308,6 +344,7 @@ export function injectCommands(
|
|
|
308
344
|
)
|
|
309
345
|
.addOption(createAccountOption('Alias or address of the account to send the transaction from', !db, db))
|
|
310
346
|
.option('--no-wait', 'Print transaction hash without waiting for it to be mined')
|
|
347
|
+
.option('--wait-for-status <status>', "Tx status to wait for: 'proposed' or 'checkpointed'", 'proposed')
|
|
311
348
|
.addOption(createVerboseOption());
|
|
312
349
|
|
|
313
350
|
addOptions(sendCommand, CLIFeeArgs.getOptions()).action(async (functionName, _options, command) => {
|
|
@@ -319,6 +356,7 @@ export function injectCommands(
|
|
|
319
356
|
contractAddress,
|
|
320
357
|
from: parsedFromAddress,
|
|
321
358
|
wait,
|
|
359
|
+
waitForStatus: waitForStatusStr,
|
|
322
360
|
alias,
|
|
323
361
|
authWitness: authWitnessArray,
|
|
324
362
|
verbose,
|
|
@@ -342,6 +380,7 @@ export function injectCommands(
|
|
|
342
380
|
alias,
|
|
343
381
|
CLIFeeArgs.parse(options, log, db),
|
|
344
382
|
authWitnesses,
|
|
383
|
+
parseWaitForStatus(waitForStatusStr),
|
|
345
384
|
verbose,
|
|
346
385
|
log,
|
|
347
386
|
);
|
|
@@ -492,6 +531,20 @@ export function injectCommands(
|
|
|
492
531
|
}
|
|
493
532
|
});
|
|
494
533
|
|
|
534
|
+
program
|
|
535
|
+
.command('get-fee-juice-balance')
|
|
536
|
+
.description('Checks the Fee Juice balance for a given address.')
|
|
537
|
+
.argument('<address>', 'Aztec address or alias to check balance for', address =>
|
|
538
|
+
aliasedAddressParser('accounts', address, db),
|
|
539
|
+
)
|
|
540
|
+
.option('--json', 'Emit output as json')
|
|
541
|
+
.option('--exact', 'Show exact balance with all 18 decimal places')
|
|
542
|
+
.action(async (address, options) => {
|
|
543
|
+
const { getFeeJuiceBalanceCmd } = await import('./get_fee_juice_balance.js');
|
|
544
|
+
const { json, exact } = options;
|
|
545
|
+
await getFeeJuiceBalanceCmd(walletAndNodeWrapper.node, address, json, exact, log);
|
|
546
|
+
});
|
|
547
|
+
|
|
495
548
|
program
|
|
496
549
|
.command('create-authwit')
|
|
497
550
|
.description(
|
package/src/cmds/send.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { AuthWitness } from '@aztec/aztec.js/authorization';
|
|
3
3
|
import { Contract, NO_WAIT, type SendInteractionOptions } from '@aztec/aztec.js/contracts';
|
|
4
|
-
import type
|
|
4
|
+
import { type AztecNode, waitForTx } from '@aztec/aztec.js/node';
|
|
5
5
|
import { prepTx } from '@aztec/cli/utils';
|
|
6
6
|
import type { LogFn } from '@aztec/foundation/log';
|
|
7
|
+
import { TxStatus } from '@aztec/stdlib/tx';
|
|
7
8
|
|
|
8
9
|
import { DEFAULT_TX_TIMEOUT_S } from '../utils/cli_wallet_and_node_wrapper.js';
|
|
9
10
|
import { CLIFeeArgs } from '../utils/options/fees.js';
|
|
@@ -22,6 +23,7 @@ export async function send(
|
|
|
22
23
|
cancellable: boolean,
|
|
23
24
|
feeOpts: CLIFeeArgs,
|
|
24
25
|
authWitnesses: AuthWitness[],
|
|
26
|
+
waitForStatus: TxStatus,
|
|
25
27
|
verbose: boolean,
|
|
26
28
|
log: LogFn,
|
|
27
29
|
) {
|
|
@@ -37,10 +39,14 @@ export async function send(
|
|
|
37
39
|
authWitnesses,
|
|
38
40
|
};
|
|
39
41
|
|
|
40
|
-
const
|
|
42
|
+
const localStart = performance.now();
|
|
43
|
+
const sim = await call.simulate({
|
|
41
44
|
...sendOptions,
|
|
42
45
|
fee: { ...sendOptions.fee, estimateGas: true },
|
|
43
46
|
});
|
|
47
|
+
// estimateGas: true guarantees these fields are present
|
|
48
|
+
const estimatedGas = sim.estimatedGas!;
|
|
49
|
+
const stats = sim.stats!;
|
|
44
50
|
|
|
45
51
|
if (feeOpts.estimateOnly) {
|
|
46
52
|
return;
|
|
@@ -50,21 +56,29 @@ export async function send(
|
|
|
50
56
|
printProfileResult(stats!, log);
|
|
51
57
|
}
|
|
52
58
|
|
|
59
|
+
const { txHash } = await call.send({
|
|
60
|
+
...sendOptions,
|
|
61
|
+
fee: { ...sendOptions.fee, gasSettings: estimatedGas },
|
|
62
|
+
wait: NO_WAIT,
|
|
63
|
+
});
|
|
64
|
+
const localTimeMs = performance.now() - localStart;
|
|
65
|
+
|
|
66
|
+
log(`\nTransaction hash: ${txHash.toString()}`);
|
|
67
|
+
|
|
53
68
|
if (wait) {
|
|
54
69
|
try {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
wait: { timeout: DEFAULT_TX_TIMEOUT_S },
|
|
59
|
-
});
|
|
70
|
+
const nodeStart = performance.now();
|
|
71
|
+
const receipt = await waitForTx(node, txHash, { timeout: DEFAULT_TX_TIMEOUT_S, waitForStatus });
|
|
72
|
+
const nodeTimeMs = performance.now() - nodeStart;
|
|
60
73
|
|
|
61
|
-
const
|
|
62
|
-
log(
|
|
63
|
-
log('Transaction has been mined');
|
|
74
|
+
const statusLabel = waitForStatus === TxStatus.PROPOSED ? 'proposed' : 'checkpointed';
|
|
75
|
+
log(`Transaction has been ${statusLabel}`);
|
|
64
76
|
log(` Tx fee: ${receipt.transactionFee}`);
|
|
65
77
|
log(` Status: ${receipt.status}`);
|
|
66
78
|
log(` Block number: ${receipt.blockNumber}`);
|
|
67
79
|
log(` Block hash: ${receipt.blockHash?.toString()}`);
|
|
80
|
+
log(` Local processing time: ${(localTimeMs / 1000).toFixed(1)}s`);
|
|
81
|
+
log(` Node inclusion time: ${(nodeTimeMs / 1000).toFixed(1)}s`);
|
|
68
82
|
|
|
69
83
|
return {
|
|
70
84
|
txHash,
|
|
@@ -74,12 +88,6 @@ export async function send(
|
|
|
74
88
|
throw err;
|
|
75
89
|
}
|
|
76
90
|
} else {
|
|
77
|
-
const txHash = await call.send({
|
|
78
|
-
...sendOptions,
|
|
79
|
-
fee: { ...sendOptions.fee, gasSettings: estimatedGas },
|
|
80
|
-
wait: NO_WAIT,
|
|
81
|
-
});
|
|
82
|
-
log(`\nTransaction hash: ${txHash.toString()}`);
|
|
83
91
|
log('Transaction pending. Check status with check-tx');
|
|
84
92
|
return {
|
|
85
93
|
txHash,
|
package/src/cmds/simulate.ts
CHANGED
|
@@ -38,7 +38,7 @@ export async function simulate(
|
|
|
38
38
|
});
|
|
39
39
|
if (verbose) {
|
|
40
40
|
await printAuthorizations(
|
|
41
|
-
simulationResult.offchainEffects
|
|
41
|
+
simulationResult.offchainEffects,
|
|
42
42
|
async (address: AztecAddress) => {
|
|
43
43
|
const metadata = await wallet.getContractMetadata(address);
|
|
44
44
|
if (!metadata.instance) {
|
package/src/storage/wallet_db.ts
CHANGED
|
@@ -70,6 +70,20 @@ export class WalletDB {
|
|
|
70
70
|
return { amount: BigInt(amountStr), secret: secretStr, leafIndex: BigInt(leafIndexStr) };
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
async peekBridgedFeeJuice(recipient: AztecAddress, log: LogFn) {
|
|
74
|
+
const stackPointer =
|
|
75
|
+
(await this.#bridgedFeeJuice.getAsync(`${recipient.toString()}:stackPointer`))?.readInt8() || 0;
|
|
76
|
+
const result = await this.#bridgedFeeJuice.getAsync(`${recipient.toString()}:${stackPointer}`);
|
|
77
|
+
if (!result) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`No stored fee juice available for recipient ${recipient.toString()}. Please provide claim amount and secret. Stack pointer ${stackPointer}`,
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
const [amountStr, secretStr, leafIndexStr] = result.toString().split(':');
|
|
83
|
+
log(`Peeked ${amountStr} fee juice for recipient ${recipient.toString()}. Stack pointer ${stackPointer}`);
|
|
84
|
+
return { amount: BigInt(amountStr), secret: secretStr, leafIndex: BigInt(leafIndexStr) };
|
|
85
|
+
}
|
|
86
|
+
|
|
73
87
|
async storeAccount(
|
|
74
88
|
address: AztecAddress,
|
|
75
89
|
{
|
|
@@ -115,6 +115,7 @@ export function parsePaymentMethod(
|
|
|
115
115
|
payment: string,
|
|
116
116
|
log: LogFn,
|
|
117
117
|
db?: WalletDB,
|
|
118
|
+
estimateOnly?: boolean,
|
|
118
119
|
): (wallet: Wallet, from: AztecAddress, gasSettings: GasSettings) => Promise<FeePaymentMethod | undefined> {
|
|
119
120
|
const parsed = payment.split(',').reduce(
|
|
120
121
|
(acc, item) => {
|
|
@@ -149,7 +150,7 @@ export function parsePaymentMethod(
|
|
|
149
150
|
amount: claimAmount,
|
|
150
151
|
secret: claimSecret,
|
|
151
152
|
leafIndex: messageLeafIndex,
|
|
152
|
-
} = await db.popBridgedFeeJuice(from, log));
|
|
153
|
+
} = estimateOnly ? await db.peekBridgedFeeJuice(from, log) : await db.popBridgedFeeJuice(from, log));
|
|
153
154
|
} else {
|
|
154
155
|
({ claimAmount, claimSecret, messageLeafIndex } = parsed);
|
|
155
156
|
}
|
|
@@ -157,10 +158,10 @@ export function parsePaymentMethod(
|
|
|
157
158
|
const { FeeJuicePaymentMethodWithClaim } = await import('@aztec/aztec.js/fee');
|
|
158
159
|
return new FeeJuicePaymentMethodWithClaim(from, {
|
|
159
160
|
claimAmount: (typeof claimAmount === 'string'
|
|
160
|
-
? Fr.
|
|
161
|
+
? Fr.fromString(claimAmount)
|
|
161
162
|
: new Fr(claimAmount)
|
|
162
163
|
).toBigInt(),
|
|
163
|
-
claimSecret: Fr.
|
|
164
|
+
claimSecret: typeof claimSecret === 'string' ? Fr.fromString(claimSecret) : claimSecret,
|
|
164
165
|
messageLeafIndex: BigInt(messageLeafIndex),
|
|
165
166
|
});
|
|
166
167
|
} else {
|
|
@@ -171,6 +172,9 @@ export function parsePaymentMethod(
|
|
|
171
172
|
case 'fpc-public': {
|
|
172
173
|
const fpc = getFpc();
|
|
173
174
|
const asset = getAsset();
|
|
175
|
+
log(
|
|
176
|
+
`WARNING: fpc-public is deprecated and will not work on mainnet alpha. Use fee_juice or fpc-sponsored instead.`,
|
|
177
|
+
);
|
|
174
178
|
log(`Using public fee payment with asset ${asset} via paymaster ${fpc}`);
|
|
175
179
|
const { PublicFeePaymentMethod } = await import('@aztec/aztec.js/fee');
|
|
176
180
|
return new PublicFeePaymentMethod(fpc, from, wallet, gasSettings);
|
|
@@ -178,6 +182,9 @@ export function parsePaymentMethod(
|
|
|
178
182
|
case 'fpc-private': {
|
|
179
183
|
const fpc = getFpc();
|
|
180
184
|
const asset = getAsset();
|
|
185
|
+
log(
|
|
186
|
+
`WARNING: fpc-private is deprecated and will not work on mainnet alpha. Use fee_juice or fpc-sponsored instead.`,
|
|
187
|
+
);
|
|
181
188
|
log(`Using private fee payment with asset ${asset} via paymaster ${fpc}`);
|
|
182
189
|
const { PrivateFeePaymentMethod } = await import('@aztec/aztec.js/fee');
|
|
183
190
|
return new PrivateFeePaymentMethod(fpc, from, wallet, gasSettings);
|
|
@@ -260,9 +267,10 @@ export class CLIFeeArgs {
|
|
|
260
267
|
}
|
|
261
268
|
|
|
262
269
|
static parse(args: RawCliFeeArgs, log: LogFn, db?: WalletDB): CLIFeeArgs {
|
|
270
|
+
const estimateOnly = !!args.estimateGasOnly;
|
|
263
271
|
return new CLIFeeArgs(
|
|
264
|
-
|
|
265
|
-
parsePaymentMethod(args.payment ?? 'method=fee_juice', log, db),
|
|
272
|
+
estimateOnly,
|
|
273
|
+
parsePaymentMethod(args.payment ?? 'method=fee_juice', log, db, estimateOnly),
|
|
266
274
|
parseGasSettings(args),
|
|
267
275
|
);
|
|
268
276
|
}
|
package/src/utils/wallet.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { EcdsaRAccountContract, EcdsaRSSHAccountContract } from '@aztec/accounts
|
|
|
2
2
|
import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
|
|
3
3
|
import { StubAccountContractArtifact, createStubAccount } from '@aztec/accounts/stub';
|
|
4
4
|
import { getIdentities } from '@aztec/accounts/utils';
|
|
5
|
-
import { type Account, type AccountContract,
|
|
5
|
+
import { type Account, type AccountContract, NO_FROM } from '@aztec/aztec.js/account';
|
|
6
6
|
import {
|
|
7
7
|
type InteractionFeeOptions,
|
|
8
8
|
getContractInstanceFromInstantiationParams,
|
|
@@ -11,18 +11,19 @@ import {
|
|
|
11
11
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
12
12
|
import { AccountManager, type Aliased, type SimulateOptions } from '@aztec/aztec.js/wallet';
|
|
13
13
|
import type { DefaultAccountEntrypointOptions } from '@aztec/entrypoints/account';
|
|
14
|
+
import { DefaultEntrypoint } from '@aztec/entrypoints/default';
|
|
14
15
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
15
16
|
import type { LogFn } from '@aztec/foundation/log';
|
|
17
|
+
import type { NotesFilter } from '@aztec/pxe/client/lazy';
|
|
16
18
|
import type { PXEConfig } from '@aztec/pxe/config';
|
|
17
19
|
import type { PXE } from '@aztec/pxe/server';
|
|
18
20
|
import { createPXE, getPXEConfig } from '@aztec/pxe/server';
|
|
19
21
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
22
|
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
21
23
|
import { NoteDao } from '@aztec/stdlib/note';
|
|
22
|
-
import type {
|
|
23
|
-
import type { TxProvingResult, TxSimulationResult } from '@aztec/stdlib/tx';
|
|
24
|
+
import type { SimulationOverrides, TxExecutionRequest, TxProvingResult, TxSimulationResult } from '@aztec/stdlib/tx';
|
|
24
25
|
import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx';
|
|
25
|
-
import { BaseWallet } from '@aztec/wallet-sdk/base-wallet';
|
|
26
|
+
import { BaseWallet, type SimulateViaEntrypointOptions } from '@aztec/wallet-sdk/base-wallet';
|
|
26
27
|
|
|
27
28
|
import type { WalletDB } from '../storage/wallet_db.js';
|
|
28
29
|
import type { AccountType } from './constants.js';
|
|
@@ -71,7 +72,8 @@ export class CLIWallet extends BaseWallet {
|
|
|
71
72
|
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
72
73
|
txNonce,
|
|
73
74
|
cancellable: this.cancellableTransactions,
|
|
74
|
-
|
|
75
|
+
// If from is an address, feeOptions include the way the account contract should handle the fee payment
|
|
76
|
+
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions!,
|
|
75
77
|
};
|
|
76
78
|
return await fromAccount.createTxExecutionRequest(
|
|
77
79
|
feeExecutionPayload ?? executionPayload,
|
|
@@ -87,14 +89,12 @@ export class CLIWallet extends BaseWallet {
|
|
|
87
89
|
increasedFee: InteractionFeeOptions,
|
|
88
90
|
): Promise<TxProvingResult> {
|
|
89
91
|
const cancellationTxRequest = await this.createCancellationTxExecutionRequest(from, txNonce, increasedFee);
|
|
90
|
-
return await this.pxe.proveTx(cancellationTxRequest);
|
|
92
|
+
return await this.pxe.proveTx(cancellationTxRequest, this.scopesFrom(from));
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
override async getAccountFromAddress(address: AztecAddress) {
|
|
94
96
|
let account: Account | undefined;
|
|
95
|
-
if (address.
|
|
96
|
-
account = new SignerlessAccount();
|
|
97
|
-
} else if (this.accountCache.has(address.toString())) {
|
|
97
|
+
if (this.accountCache.has(address.toString())) {
|
|
98
98
|
return this.accountCache.get(address.toString())!;
|
|
99
99
|
} else {
|
|
100
100
|
const accountManager = await this.createOrRetrieveAccount(address);
|
|
@@ -185,13 +185,7 @@ export class CLIWallet extends BaseWallet {
|
|
|
185
185
|
*/
|
|
186
186
|
private async getFakeAccountDataFor(address: AztecAddress) {
|
|
187
187
|
const originalAccount = await this.getAccountFromAddress(address);
|
|
188
|
-
|
|
189
|
-
// Overwriting SignerlessAccount is not supported, and does not really make sense
|
|
190
|
-
// since it has no authorization mechanism.
|
|
191
|
-
if (originalAccount instanceof SignerlessAccount) {
|
|
192
|
-
throw new Error(`Cannot create fake account data for SignerlessAccount at address: ${address}`);
|
|
193
|
-
}
|
|
194
|
-
const originalAddress = (originalAccount as Account).getCompleteAddress();
|
|
188
|
+
const originalAddress = originalAccount.getCompleteAddress();
|
|
195
189
|
const contractInstance = await this.pxe.getContractInstance(originalAddress.address);
|
|
196
190
|
if (!contractInstance) {
|
|
197
191
|
throw new Error(`No contract instance found for address: ${originalAddress.address}`);
|
|
@@ -208,59 +202,62 @@ export class CLIWallet extends BaseWallet {
|
|
|
208
202
|
}
|
|
209
203
|
|
|
210
204
|
override async simulateTx(executionPayload: ExecutionPayload, opts: SimulateOptions): Promise<TxSimulationResult> {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
205
|
+
const simulationResults = await super.simulateTx(executionPayload, opts);
|
|
206
|
+
|
|
207
|
+
if (opts.fee?.estimateGas) {
|
|
208
|
+
const feeOptions = await this.completeFeeOptions(opts.from, executionPayload.feePayer, opts.fee?.gasSettings);
|
|
209
|
+
const limits = getGasLimits(simulationResults, opts.fee?.estimatedGasPadding);
|
|
210
|
+
printGasEstimates(feeOptions, limits, this.userLog);
|
|
211
|
+
}
|
|
212
|
+
return simulationResults;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Uses a stub account for kernelless simulation, bypassing real account authorization.
|
|
217
|
+
* Uses DefaultEntrypoint directly for NO_FROM transactions.
|
|
218
|
+
*/
|
|
219
|
+
protected override async simulateViaEntrypoint(
|
|
220
|
+
executionPayload: ExecutionPayload,
|
|
221
|
+
opts: SimulateViaEntrypointOptions,
|
|
222
|
+
): Promise<TxSimulationResult> {
|
|
223
|
+
const { from, feeOptions, scopes } = opts;
|
|
215
224
|
const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
|
|
216
|
-
const chainInfo = await this.getChainInfo();
|
|
217
|
-
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
218
|
-
txNonce: Fr.random(),
|
|
219
|
-
cancellable: this.cancellableTransactions,
|
|
220
|
-
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions,
|
|
221
|
-
};
|
|
222
225
|
const finalExecutionPayload = feeExecutionPayload
|
|
223
226
|
? mergeExecutionPayloads([feeExecutionPayload, executionPayload])
|
|
224
227
|
: executionPayload;
|
|
228
|
+
const chainInfo = await this.getChainInfo();
|
|
225
229
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const txRequest = await fromAccount.createTxExecutionRequest(
|
|
232
|
-
finalExecutionPayload,
|
|
233
|
-
feeOptions.gasSettings,
|
|
234
|
-
chainInfo,
|
|
235
|
-
executionOptions,
|
|
236
|
-
);
|
|
237
|
-
simulationResults = await this.pxe.simulateTx(
|
|
238
|
-
txRequest,
|
|
239
|
-
true /* simulatePublic */,
|
|
240
|
-
opts?.skipTxValidation,
|
|
241
|
-
opts?.skipFeeEnforcement ?? true,
|
|
242
|
-
);
|
|
230
|
+
let overrides: SimulationOverrides | undefined;
|
|
231
|
+
let txRequest: TxExecutionRequest;
|
|
232
|
+
if (from === NO_FROM) {
|
|
233
|
+
const entrypoint = new DefaultEntrypoint();
|
|
234
|
+
txRequest = await entrypoint.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo);
|
|
243
235
|
} else {
|
|
244
|
-
const { account
|
|
245
|
-
|
|
236
|
+
const { account, instance, artifact } = await this.getFakeAccountDataFor(from);
|
|
237
|
+
overrides = {
|
|
238
|
+
contracts: { [from.toString()]: { instance, artifact } },
|
|
239
|
+
};
|
|
240
|
+
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
241
|
+
txNonce: Fr.random(),
|
|
242
|
+
cancellable: this.cancellableTransactions,
|
|
243
|
+
// If from is an address, feeOptions include the way the account contract should handle the fee payment
|
|
244
|
+
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions!,
|
|
245
|
+
};
|
|
246
|
+
txRequest = await account.createTxExecutionRequest(
|
|
246
247
|
finalExecutionPayload,
|
|
247
248
|
feeOptions.gasSettings,
|
|
248
249
|
chainInfo,
|
|
249
250
|
executionOptions,
|
|
250
251
|
);
|
|
251
|
-
const contractOverrides = {
|
|
252
|
-
[opts.from.toString()]: { instance, artifact },
|
|
253
|
-
};
|
|
254
|
-
simulationResults = await this.pxe.simulateTx(txRequest, true /* simulatePublic */, true, true, {
|
|
255
|
-
contracts: contractOverrides,
|
|
256
|
-
});
|
|
257
252
|
}
|
|
258
253
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
254
|
+
return this.pxe.simulateTx(txRequest, {
|
|
255
|
+
simulatePublic: true,
|
|
256
|
+
skipFeeEnforcement: true,
|
|
257
|
+
skipTxValidation: true,
|
|
258
|
+
overrides,
|
|
259
|
+
scopes,
|
|
260
|
+
});
|
|
264
261
|
}
|
|
265
262
|
|
|
266
263
|
// Exposed because of the `aztec-wallet get-tx` command. It has been decided that it's fine to keep around because
|