@aztec/end-to-end 0.0.1-commit.ffe5b04ea → 0.0.1-commit.fff30aa
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/README.md +27 -0
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +3 -4
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +3 -2
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +3 -1
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +5 -2
- package/dest/e2e_fees/fees_test.js +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +1 -0
- package/dest/e2e_p2p/p2p_network.d.ts +1 -1
- package/dest/e2e_p2p/p2p_network.js +1 -1
- package/dest/e2e_p2p/shared.d.ts +19 -1
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +31 -0
- package/dest/fixtures/authwit_proxy.d.ts +1 -1
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -1
- package/dest/fixtures/authwit_proxy.js +4 -0
- package/dest/fixtures/setup.d.ts +9 -5
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +13 -9
- package/dest/forward-compatibility/wallet_rpc_client.d.ts +7 -0
- package/dest/forward-compatibility/wallet_rpc_client.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_rpc_client.js +15 -0
- package/dest/forward-compatibility/wallet_service.d.ts +3 -0
- package/dest/forward-compatibility/wallet_service.d.ts.map +1 -0
- package/dest/forward-compatibility/wallet_service.js +109 -0
- package/dest/install_legacy_contracts.d.cts +10 -0
- package/dest/install_legacy_contracts.d.cts.map +1 -0
- package/dest/legacy-jest-resolver.d.cts +3 -0
- package/dest/legacy-jest-resolver.d.cts.map +1 -0
- package/dest/shared/jest_setup.js +1 -41
- package/dest/shared/submit-transactions.d.ts +1 -1
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +9 -12
- package/dest/simulators/lending_simulator.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +2 -2
- package/dest/spartan/setup_test_wallets.d.ts +4 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +24 -12
- package/dest/spartan/tx_metrics.js +1 -1
- package/dest/spartan/utils/config.d.ts +1 -4
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +1 -2
- package/dest/spartan/utils/nodes.d.ts +5 -4
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +9 -9
- package/dest/test-wallet/test_wallet.d.ts +24 -23
- package/dest/test-wallet/test_wallet.d.ts.map +1 -1
- package/dest/test-wallet/test_wallet.js +115 -80
- package/dest/test-wallet/worker_wallet.d.ts +4 -4
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -1
- package/dest/test-wallet/worker_wallet_schema.d.ts +3 -3
- package/package.json +45 -43
- package/src/bench/client_flows/client_flows_benchmark.ts +3 -3
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +3 -6
- package/src/e2e_epochs/epochs_test.ts +14 -2
- package/src/e2e_fees/fees_test.ts +1 -1
- package/src/e2e_p2p/inactivity_slash_test.ts +1 -0
- package/src/e2e_p2p/p2p_network.ts +1 -1
- package/src/e2e_p2p/shared.ts +52 -0
- package/src/fixtures/authwit_proxy.ts +4 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/setup.ts +20 -12
- package/src/forward-compatibility/wallet_rpc_client.ts +14 -0
- package/src/forward-compatibility/wallet_service.ts +104 -0
- package/src/install_legacy_contracts.cjs +75 -0
- package/src/legacy-jest-resolver.cjs +101 -0
- package/src/shared/jest_setup.ts +1 -51
- package/src/shared/submit-transactions.ts +4 -1
- package/src/shared/uniswap_l1_l2.ts +29 -24
- package/src/simulators/lending_simulator.ts +4 -2
- package/src/spartan/setup_test_wallets.ts +48 -9
- package/src/spartan/tx_metrics.ts +1 -1
- package/src/spartan/utils/config.ts +0 -1
- package/src/spartan/utils/nodes.ts +10 -15
- package/src/test-wallet/test_wallet.ts +144 -99
- package/src/test-wallet/worker_wallet.ts +3 -2
- package/dest/fixtures/elu_monitor.d.ts +0 -21
- package/dest/fixtures/elu_monitor.d.ts.map +0 -1
- package/dest/fixtures/elu_monitor.js +0 -102
- package/src/fixtures/elu_monitor.ts +0 -126
|
@@ -173,7 +173,7 @@ export async function withSequencersAdmin<T>(env: TestConfig, fn: (node: AztecNo
|
|
|
173
173
|
if (statusRes.status !== 200) {
|
|
174
174
|
throw new Error(`Admin endpoint returned status ${statusRes.status}`);
|
|
175
175
|
}
|
|
176
|
-
const client = createAztecNodeAdminClient(url
|
|
176
|
+
const client = createAztecNodeAdminClient(url);
|
|
177
177
|
return { result: await fn(client), process };
|
|
178
178
|
} catch (err) {
|
|
179
179
|
// Kill the port-forward before retrying
|
|
@@ -255,18 +255,21 @@ export async function initHADb(namespace: string): Promise<void> {
|
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
258
|
+
* Enables or disables probabilistic transaction dropping on validators and waits for rollout.
|
|
259
|
+
* Wired to env vars P2P_DROP_TX and P2P_DROP_TX_CHANCE via Helm values.
|
|
260
260
|
*/
|
|
261
261
|
export async function setValidatorTxDrop({
|
|
262
262
|
namespace,
|
|
263
|
+
enabled,
|
|
263
264
|
probability,
|
|
264
265
|
logger: log,
|
|
265
266
|
}: {
|
|
266
267
|
namespace: string;
|
|
268
|
+
enabled: boolean;
|
|
267
269
|
probability: number;
|
|
268
270
|
logger: Logger;
|
|
269
271
|
}) {
|
|
272
|
+
const drop = enabled ? 'true' : 'false';
|
|
270
273
|
const prob = String(probability);
|
|
271
274
|
|
|
272
275
|
const selectors = ['app.kubernetes.io/name=validator', 'app.kubernetes.io/component=validator', 'app=validator'];
|
|
@@ -281,7 +284,7 @@ export async function setValidatorTxDrop({
|
|
|
281
284
|
if (names.length === 0) {
|
|
282
285
|
continue;
|
|
283
286
|
}
|
|
284
|
-
const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace} P2P_DROP_TX_CHANCE=${prob}`;
|
|
287
|
+
const cmd = `kubectl set env statefulset -l ${selector} -n ${namespace} P2P_DROP_TX=${drop} P2P_DROP_TX_CHANCE=${prob}`;
|
|
285
288
|
log.info(`command: ${cmd}`);
|
|
286
289
|
await execAsync(cmd);
|
|
287
290
|
updated = true;
|
|
@@ -363,24 +366,16 @@ export async function enableValidatorDynamicBootNode(
|
|
|
363
366
|
*/
|
|
364
367
|
export async function rollAztecPods(namespace: string, clearState: boolean = false) {
|
|
365
368
|
// Pod components use 'validator', but StatefulSets and PVCs use 'sequencer-node' for validators
|
|
366
|
-
// RPC nodes have nodeType='rpc-node' in Helm values, so their component label is 'rpc-node' (not 'rpc')
|
|
367
369
|
const podComponents = [
|
|
368
370
|
'p2p-bootstrap',
|
|
369
371
|
'prover-node',
|
|
370
372
|
'prover-broker',
|
|
371
373
|
'prover-agent',
|
|
372
374
|
'sequencer-node',
|
|
373
|
-
'rpc
|
|
374
|
-
'validator-ha-db',
|
|
375
|
-
];
|
|
376
|
-
const pvcComponents = [
|
|
377
|
-
'p2p-bootstrap',
|
|
378
|
-
'prover-node',
|
|
379
|
-
'prover-broker',
|
|
380
|
-
'sequencer-node',
|
|
381
|
-
'rpc-node',
|
|
375
|
+
'rpc',
|
|
382
376
|
'validator-ha-db',
|
|
383
377
|
];
|
|
378
|
+
const pvcComponents = ['p2p-bootstrap', 'prover-node', 'prover-broker', 'sequencer-node', 'rpc', 'validator-ha-db'];
|
|
384
379
|
// StatefulSet components that need to be scaled down before PVC deletion
|
|
385
380
|
// Note: validators use 'sequencer-node' as component label, not 'validator'
|
|
386
381
|
const statefulSetComponents = [
|
|
@@ -388,7 +383,7 @@ export async function rollAztecPods(namespace: string, clearState: boolean = fal
|
|
|
388
383
|
'prover-node',
|
|
389
384
|
'prover-broker',
|
|
390
385
|
'sequencer-node',
|
|
391
|
-
'rpc
|
|
386
|
+
'rpc',
|
|
392
387
|
'validator-ha-db',
|
|
393
388
|
];
|
|
394
389
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { EcdsaKAccountContract, EcdsaRAccountContract } from '@aztec/accounts/ecdsa';
|
|
2
2
|
import { SchnorrAccountContract } from '@aztec/accounts/schnorr';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { StubEcdsaAccountContractArtifact, createStubEcdsaAccount } from '@aztec/accounts/stub/ecdsa';
|
|
4
|
+
import { StubSchnorrAccountContractArtifact, createStubSchnorrAccount } from '@aztec/accounts/stub/schnorr';
|
|
5
|
+
import { type Account, type AccountContract, NO_FROM } from '@aztec/aztec.js/account';
|
|
6
|
+
import type { CompleteAddress } from '@aztec/aztec.js/addresses';
|
|
5
7
|
import {
|
|
6
8
|
type CallIntent,
|
|
7
9
|
type ContractFunctionInteractionCallIntent,
|
|
@@ -13,10 +15,12 @@ import {
|
|
|
13
15
|
} from '@aztec/aztec.js/authorization';
|
|
14
16
|
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
15
17
|
import { AccountManager, type SendOptions } from '@aztec/aztec.js/wallet';
|
|
18
|
+
import { TxSimulationResultWithAppOffset } from '@aztec/aztec.js/wallet';
|
|
16
19
|
import type { DefaultAccountEntrypointOptions } from '@aztec/entrypoints/account';
|
|
20
|
+
import { DefaultEntrypoint } from '@aztec/entrypoints/default';
|
|
17
21
|
import { Fq, Fr } from '@aztec/foundation/curves/bn254';
|
|
18
22
|
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
19
|
-
import type {
|
|
23
|
+
import type { NotesFilter } from '@aztec/pxe/client/lazy';
|
|
20
24
|
import { type PXEConfig, getPXEConfig } from '@aztec/pxe/config';
|
|
21
25
|
import { PXE, type PXECreationOptions, createPXE } from '@aztec/pxe/server';
|
|
22
26
|
import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
@@ -24,9 +28,17 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
24
28
|
import { getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
|
|
25
29
|
import { deriveSigningKey } from '@aztec/stdlib/keys';
|
|
26
30
|
import type { NoteDao } from '@aztec/stdlib/note';
|
|
27
|
-
import
|
|
31
|
+
import {
|
|
32
|
+
type BlockHeader,
|
|
33
|
+
type ContractOverrides,
|
|
34
|
+
SimulationOverrides,
|
|
35
|
+
type TxExecutionRequest,
|
|
36
|
+
type TxHash,
|
|
37
|
+
type TxReceipt,
|
|
38
|
+
} from '@aztec/stdlib/tx';
|
|
28
39
|
import { ExecutionPayload, mergeExecutionPayloads } from '@aztec/stdlib/tx';
|
|
29
|
-
import { BaseWallet, type
|
|
40
|
+
import { BaseWallet, type SimulateViaEntrypointOptions } from '@aztec/wallet-sdk/base-wallet';
|
|
41
|
+
import type { AccountType } from '@aztec/wallets/embedded';
|
|
30
42
|
|
|
31
43
|
import { AztecNodeProxy, ProvenTx } from './utils.js';
|
|
32
44
|
|
|
@@ -36,6 +48,7 @@ import { AztecNodeProxy, ProvenTx } from './utils.js';
|
|
|
36
48
|
export interface AccountData {
|
|
37
49
|
secret: Fr;
|
|
38
50
|
salt: Fr;
|
|
51
|
+
type?: AccountType;
|
|
39
52
|
contract: AccountContract;
|
|
40
53
|
}
|
|
41
54
|
|
|
@@ -76,70 +89,92 @@ export class TestWallet extends BaseWallet {
|
|
|
76
89
|
|
|
77
90
|
createSchnorrAccount(secret: Fr, salt: Fr, signingKey?: Fq): Promise<AccountManager> {
|
|
78
91
|
signingKey = signingKey ?? deriveSigningKey(secret);
|
|
79
|
-
|
|
80
|
-
secret,
|
|
81
|
-
salt,
|
|
82
|
-
contract: new SchnorrAccountContract(signingKey),
|
|
83
|
-
};
|
|
84
|
-
return this.createAccount(accountData);
|
|
92
|
+
return this.createAccount({ secret, salt, type: 'schnorr', contract: new SchnorrAccountContract(signingKey) });
|
|
85
93
|
}
|
|
86
94
|
|
|
87
95
|
createECDSARAccount(secret: Fr, salt: Fr, signingKey: Buffer): Promise<AccountManager> {
|
|
88
|
-
|
|
96
|
+
return this.createAccount({
|
|
89
97
|
secret,
|
|
90
98
|
salt,
|
|
99
|
+
type: 'ecdsasecp256r1',
|
|
91
100
|
contract: new EcdsaRAccountContract(signingKey),
|
|
92
|
-
};
|
|
93
|
-
return this.createAccount(accountData);
|
|
101
|
+
});
|
|
94
102
|
}
|
|
95
103
|
|
|
96
104
|
createECDSAKAccount(secret: Fr, salt: Fr, signingKey: Buffer): Promise<AccountManager> {
|
|
97
|
-
|
|
105
|
+
return this.createAccount({
|
|
98
106
|
secret,
|
|
99
107
|
salt,
|
|
108
|
+
type: 'ecdsasecp256k1',
|
|
100
109
|
contract: new EcdsaKAccountContract(signingKey),
|
|
101
|
-
};
|
|
102
|
-
return this.createAccount(accountData);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async getFakeAccountDataFor(address: AztecAddress) {
|
|
106
|
-
const originalAccount = await this.getAccountFromAddress(address);
|
|
107
|
-
if (originalAccount instanceof SignerlessAccount) {
|
|
108
|
-
throw new Error(`Cannot create fake account data for SignerlessAccount at address: ${address}`);
|
|
109
|
-
}
|
|
110
|
-
const originalAddress = (originalAccount as Account).getCompleteAddress();
|
|
111
|
-
const contractInstance = await this.pxe.getContractInstance(originalAddress.address);
|
|
112
|
-
if (!contractInstance) {
|
|
113
|
-
throw new Error(`No contract instance found for address: ${originalAddress.address}`);
|
|
114
|
-
}
|
|
115
|
-
const stubAccount = createStubAccount(originalAddress);
|
|
116
|
-
const instance = await getContractInstanceFromInstantiationParams(StubAccountContractArtifact, {
|
|
117
|
-
salt: Fr.random(),
|
|
118
110
|
});
|
|
119
|
-
return {
|
|
120
|
-
account: stubAccount,
|
|
121
|
-
instance,
|
|
122
|
-
artifact: StubAccountContractArtifact,
|
|
123
|
-
};
|
|
124
111
|
}
|
|
125
|
-
protected accounts: Map<string, Account> = new Map();
|
|
126
112
|
|
|
127
113
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* When this flag is true, simulateViaEntrypoint constructs a request using a fake account
|
|
131
|
-
* (and accepts contract overrides on the input) and the PXE emulates kernel effects without
|
|
132
|
-
* generating kernel witnesses. When false, simulateViaEntrypoint defers to the standard
|
|
133
|
-
* simulation path via the real account entrypoint.
|
|
114
|
+
* Builds contract overrides for all provided addresses by replacing their account contracts with stub implementations.
|
|
134
115
|
*/
|
|
135
|
-
|
|
116
|
+
protected async buildAccountOverrides(addresses: AztecAddress[]): Promise<ContractOverrides> {
|
|
117
|
+
const accounts = await this.getAccounts();
|
|
118
|
+
const contracts: ContractOverrides = {};
|
|
119
|
+
|
|
120
|
+
const filtered = accounts.filter(acc => addresses.some(addr => addr.equals(acc.item)));
|
|
121
|
+
|
|
122
|
+
for (const account of filtered) {
|
|
123
|
+
const address = account.item;
|
|
124
|
+
const originalAccount = await this.getAccountFromAddress(address);
|
|
125
|
+
const completeAddress = originalAccount.getCompleteAddress();
|
|
126
|
+
const contractInstance = await this.pxe.getContractInstance(completeAddress.address);
|
|
127
|
+
if (!contractInstance) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`No contract instance found for address: ${completeAddress.address} during account override building. This is a bug!`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const stubArtifact = this.getStubArtifactFor(address);
|
|
134
|
+
const stubConstructorArgs =
|
|
135
|
+
this.getTypeFor(address) === 'schnorr' ? [Fr.ZERO, Fr.ZERO] : [Buffer.alloc(32), Buffer.alloc(32)];
|
|
136
|
+
const stubInstance = await getContractInstanceFromInstantiationParams(stubArtifact, {
|
|
137
|
+
salt: Fr.random(),
|
|
138
|
+
constructorArgs: stubConstructorArgs,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
contracts[address.toString()] = {
|
|
142
|
+
instance: stubInstance,
|
|
143
|
+
artifact: stubArtifact,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
136
146
|
|
|
137
|
-
|
|
138
|
-
this.simulatedSimulations = true;
|
|
147
|
+
return contracts;
|
|
139
148
|
}
|
|
140
149
|
|
|
141
|
-
|
|
142
|
-
|
|
150
|
+
protected accounts: Map<string, { account: Account; type: AccountType }> = new Map();
|
|
151
|
+
|
|
152
|
+
private getTypeFor(address: AztecAddress): AccountType {
|
|
153
|
+
return this.accounts.get(address.toString())?.type ?? 'schnorr';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private getStubArtifactFor(address: AztecAddress) {
|
|
157
|
+
return this.getTypeFor(address) === 'schnorr'
|
|
158
|
+
? StubSchnorrAccountContractArtifact
|
|
159
|
+
: StubEcdsaAccountContractArtifact;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private getStubAccountFor(address: AztecAddress, completeAddress: CompleteAddress) {
|
|
163
|
+
return this.getTypeFor(address) === 'schnorr'
|
|
164
|
+
? createStubSchnorrAccount(completeAddress)
|
|
165
|
+
: createStubEcdsaAccount(completeAddress);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Controls how the test wallet simulates transactions:
|
|
170
|
+
* - `kernelless`: Skips kernel circuits but uses the real account contract. Default.
|
|
171
|
+
* - `kernelless-override`: Skips kernels and replaces the account with a stub that doesn't do authwit validation.
|
|
172
|
+
* - `full`: Uses real kernel circuits and real account contracts. Slow!
|
|
173
|
+
*/
|
|
174
|
+
private simulationMode: 'kernelless' | 'kernelless-override' | 'full' = 'kernelless';
|
|
175
|
+
|
|
176
|
+
setSimulationMode(mode: 'kernelless' | 'kernelless-override' | 'full') {
|
|
177
|
+
this.simulationMode = mode;
|
|
143
178
|
}
|
|
144
179
|
|
|
145
180
|
setMinFeePadding(value?: number) {
|
|
@@ -147,27 +182,25 @@ export class TestWallet extends BaseWallet {
|
|
|
147
182
|
}
|
|
148
183
|
|
|
149
184
|
protected getAccountFromAddress(address: AztecAddress): Promise<Account> {
|
|
150
|
-
|
|
151
|
-
if (address.equals(AztecAddress.ZERO)) {
|
|
152
|
-
account = new SignerlessAccount();
|
|
153
|
-
} else {
|
|
154
|
-
account = this.accounts.get(address?.toString() ?? '');
|
|
155
|
-
}
|
|
185
|
+
const entry = this.accounts.get(address?.toString() ?? '');
|
|
156
186
|
|
|
157
|
-
if (!
|
|
187
|
+
if (!entry) {
|
|
158
188
|
throw new Error(`Account not found in wallet for address: ${address}`);
|
|
159
189
|
}
|
|
160
190
|
|
|
161
|
-
return Promise.resolve(account);
|
|
191
|
+
return Promise.resolve(entry.account);
|
|
162
192
|
}
|
|
163
193
|
|
|
164
194
|
getAccounts() {
|
|
165
|
-
return Promise.resolve(
|
|
195
|
+
return Promise.resolve(
|
|
196
|
+
Array.from(this.accounts.values()).map(entry => ({ alias: '', item: entry.account.getAddress() })),
|
|
197
|
+
);
|
|
166
198
|
}
|
|
167
199
|
|
|
168
200
|
async createAccount(accountData?: AccountData): Promise<AccountManager> {
|
|
169
201
|
const secret = accountData?.secret ?? Fr.random();
|
|
170
202
|
const salt = accountData?.salt ?? Fr.random();
|
|
203
|
+
const type = accountData?.type ?? 'schnorr';
|
|
171
204
|
const contract = accountData?.contract ?? new SchnorrAccountContract(GrumpkinScalar.random());
|
|
172
205
|
|
|
173
206
|
const accountManager = await AccountManager.create(this, secret, contract, salt);
|
|
@@ -177,7 +210,8 @@ export class TestWallet extends BaseWallet {
|
|
|
177
210
|
|
|
178
211
|
await this.registerContract(instance, artifact, secret);
|
|
179
212
|
|
|
180
|
-
|
|
213
|
+
const address = accountManager.address.toString();
|
|
214
|
+
this.accounts.set(address, { account: await accountManager.getAccount(), type });
|
|
181
215
|
|
|
182
216
|
return accountManager;
|
|
183
217
|
}
|
|
@@ -220,60 +254,71 @@ export class TestWallet extends BaseWallet {
|
|
|
220
254
|
return account.createAuthWit(intentInnerHash, chainInfo);
|
|
221
255
|
}
|
|
222
256
|
|
|
223
|
-
/**
|
|
224
|
-
* Override simulateViaEntrypoint to use fake accounts for kernelless simulation
|
|
225
|
-
* when simulatedSimulations is enabled. Otherwise falls through to the real entrypoint path.
|
|
226
|
-
*/
|
|
227
257
|
protected override async simulateViaEntrypoint(
|
|
228
258
|
executionPayload: ExecutionPayload,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (!this.simulatedSimulations) {
|
|
236
|
-
return super.simulateViaEntrypoint(
|
|
237
|
-
executionPayload,
|
|
238
|
-
from,
|
|
239
|
-
feeOptions,
|
|
240
|
-
scopes,
|
|
241
|
-
skipTxValidation,
|
|
242
|
-
skipFeeEnforcement,
|
|
243
|
-
);
|
|
244
|
-
}
|
|
259
|
+
opts: SimulateViaEntrypointOptions,
|
|
260
|
+
): Promise<TxSimulationResultWithAppOffset> {
|
|
261
|
+
const { from, feeOptions, additionalScopes, skipTxValidation, skipFeeEnforcement } = opts;
|
|
262
|
+
const scopes = this.scopesFrom(from, additionalScopes);
|
|
263
|
+
const skipKernels = this.simulationMode !== 'full';
|
|
264
|
+
const useOverride = this.simulationMode === 'kernelless-override';
|
|
245
265
|
|
|
246
266
|
const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
|
|
247
|
-
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
248
|
-
txNonce: Fr.random(),
|
|
249
|
-
cancellable: this.cancellableTransactions,
|
|
250
|
-
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions,
|
|
251
|
-
};
|
|
252
267
|
const finalExecutionPayload = feeExecutionPayload
|
|
253
268
|
? mergeExecutionPayloads([feeExecutionPayload, executionPayload])
|
|
254
269
|
: executionPayload;
|
|
255
|
-
const { account: fromAccount, instance, artifact } = await this.getFakeAccountDataFor(from);
|
|
256
270
|
const chainInfo = await this.getChainInfo();
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
271
|
+
|
|
272
|
+
let overrides: SimulationOverrides | undefined;
|
|
273
|
+
let txRequest: TxExecutionRequest;
|
|
274
|
+
if (useOverride) {
|
|
275
|
+
const accountOverrides = await this.buildAccountOverrides(scopes);
|
|
276
|
+
overrides = new SimulationOverrides(accountOverrides);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (from === NO_FROM) {
|
|
280
|
+
const entrypoint = new DefaultEntrypoint();
|
|
281
|
+
txRequest = await entrypoint.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo);
|
|
282
|
+
} else {
|
|
283
|
+
let fromAccount: Account;
|
|
284
|
+
if (useOverride) {
|
|
285
|
+
const originalAccount = await this.getAccountFromAddress(from);
|
|
286
|
+
fromAccount = this.getStubAccountFor(from, originalAccount.getCompleteAddress());
|
|
287
|
+
} else {
|
|
288
|
+
fromAccount = await this.getAccountFromAddress(from);
|
|
289
|
+
}
|
|
290
|
+
const executionOptions: DefaultAccountEntrypointOptions = {
|
|
291
|
+
txNonce: Fr.random(),
|
|
292
|
+
cancellable: this.cancellableTransactions,
|
|
293
|
+
// If from is an address, feeOptions include the way the account contract should handle the fee payment
|
|
294
|
+
feePaymentMethodOptions: feeOptions.accountFeePaymentMethodOptions!,
|
|
295
|
+
};
|
|
296
|
+
txRequest = await fromAccount.createTxExecutionRequest(
|
|
297
|
+
finalExecutionPayload,
|
|
298
|
+
feeOptions.gasSettings,
|
|
299
|
+
chainInfo,
|
|
300
|
+
executionOptions,
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
const result = await this.pxe.simulateTx(txRequest, {
|
|
267
305
|
simulatePublic: true,
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
306
|
+
skipKernels,
|
|
307
|
+
skipFeeEnforcement,
|
|
308
|
+
skipTxValidation,
|
|
309
|
+
overrides,
|
|
271
310
|
scopes,
|
|
272
311
|
});
|
|
312
|
+
const appCallOffset = await this.computeAppCallOffset(from, feeOptions);
|
|
313
|
+
return TxSimulationResultWithAppOffset.fromResultAndOffset(result, appCallOffset);
|
|
273
314
|
}
|
|
274
315
|
|
|
275
316
|
async proveTx(exec: ExecutionPayload, opts: Omit<SendOptions, 'wait'>): Promise<ProvenTx> {
|
|
276
|
-
const fee = await this.completeFeeOptions(
|
|
317
|
+
const fee = await this.completeFeeOptions({
|
|
318
|
+
from: opts.from,
|
|
319
|
+
feePayer: exec.feePayer,
|
|
320
|
+
gasSettings: opts.fee?.gasSettings,
|
|
321
|
+
});
|
|
277
322
|
const txRequest = await this.createTxExecutionRequestFromPayloadAndFee(exec, opts.from, fee);
|
|
278
323
|
const txProvingResult = await this.pxe.proveTx(txRequest, this.scopesFrom(opts.from, opts.additionalScopes));
|
|
279
324
|
return new ProvenTx(
|
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
ProfileOptions,
|
|
14
14
|
SendOptions,
|
|
15
15
|
SimulateOptions,
|
|
16
|
+
TxSimulationResultWithAppOffset,
|
|
16
17
|
Wallet,
|
|
17
18
|
WalletCapabilities,
|
|
18
19
|
} from '@aztec/aztec.js/wallet';
|
|
@@ -29,7 +30,7 @@ import type { ContractArtifact, EventMetadataDefinition, FunctionCall } from '@a
|
|
|
29
30
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
30
31
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
31
32
|
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
32
|
-
import type { ExecutionPayload, TxProfileResult,
|
|
33
|
+
import type { ExecutionPayload, TxProfileResult, UtilityExecutionResult } from '@aztec/stdlib/tx';
|
|
33
34
|
import { Tx } from '@aztec/stdlib/tx';
|
|
34
35
|
|
|
35
36
|
import { Worker } from 'worker_threads';
|
|
@@ -165,7 +166,7 @@ export class WorkerWallet implements Wallet {
|
|
|
165
166
|
return this.call('registerContract', instance, artifact, secretKey);
|
|
166
167
|
}
|
|
167
168
|
|
|
168
|
-
simulateTx(exec: ExecutionPayload, opts: SimulateOptions): Promise<
|
|
169
|
+
simulateTx(exec: ExecutionPayload, opts: SimulateOptions): Promise<TxSimulationResultWithAppOffset> {
|
|
169
170
|
return this.call('simulateTx', exec, opts);
|
|
170
171
|
}
|
|
171
172
|
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/** Samples event-loop utilization, delay histogram, and heap usage per test, writing columnar text to a file. */
|
|
2
|
-
export declare class EluMonitor {
|
|
3
|
-
private filePath;
|
|
4
|
-
private intervalMs;
|
|
5
|
-
private timer;
|
|
6
|
-
private lastELU;
|
|
7
|
-
private histogram;
|
|
8
|
-
private testName;
|
|
9
|
-
private testStart;
|
|
10
|
-
private eluSamples;
|
|
11
|
-
constructor(filePath: string, intervalMs?: number);
|
|
12
|
-
/** Begin sampling for a test. Writes a header line and starts the periodic sampler. */
|
|
13
|
-
startTest(testName: string): void;
|
|
14
|
-
/** Stop sampling and write a summary line. */
|
|
15
|
-
stopTest(): void;
|
|
16
|
-
/** Alias for stopTest — call on process exit to flush any remaining data. */
|
|
17
|
-
stop(): void;
|
|
18
|
-
private sample;
|
|
19
|
-
private writeSummary;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWx1X21vbml0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maXh0dXJlcy9lbHVfbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxpSEFBaUg7QUFDakgscUJBQWEsVUFBVTtJQUNyQixPQUFPLENBQUMsUUFBUSxDQUFTO0lBQ3pCLE9BQU8sQ0FBQyxVQUFVLENBQVM7SUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBNkM7SUFDMUQsT0FBTyxDQUFDLE9BQU8sQ0FBbUM7SUFDbEQsT0FBTyxDQUFDLFNBQVMsQ0FBb0I7SUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBcUI7SUFDckMsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLFVBQVUsQ0FBZ0I7SUFFbEMsWUFBWSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFJaEQ7SUFFRCx1RkFBdUY7SUFDdkYsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQW1CaEM7SUFFRCw4Q0FBOEM7SUFDOUMsUUFBUSxJQUFJLElBQUksQ0FtQmY7SUFFRCwrRUFBNkU7SUFDN0UsSUFBSSxJQUFJLElBQUksQ0FFWDtJQUVELE9BQU8sQ0FBQyxNQUFNO0lBOEJkLE9BQU8sQ0FBQyxZQUFZO0NBbUJyQiJ9
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"elu_monitor.d.ts","sourceRoot":"","sources":["../../src/fixtures/elu_monitor.ts"],"names":[],"mappings":"AAKA,iHAAiH;AACjH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,UAAU,CAAgB;IAElC,YAAY,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAIhD;IAED,uFAAuF;IACvF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAmBhC;IAED,8CAA8C;IAC9C,QAAQ,IAAI,IAAI,CAmBf;IAED,+EAA6E;IAC7E,IAAI,IAAI,IAAI,CAEX;IAED,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,YAAY;CAmBrB"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { appendFileSync } from 'node:fs';
|
|
2
|
-
import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
|
|
3
|
-
const NANOS_PER_MS = 1_000_000;
|
|
4
|
-
/** Samples event-loop utilization, delay histogram, and heap usage per test, writing columnar text to a file. */ export class EluMonitor {
|
|
5
|
-
filePath;
|
|
6
|
-
intervalMs;
|
|
7
|
-
timer;
|
|
8
|
-
lastELU;
|
|
9
|
-
histogram;
|
|
10
|
-
testName;
|
|
11
|
-
testStart;
|
|
12
|
-
eluSamples = [];
|
|
13
|
-
constructor(filePath, intervalMs){
|
|
14
|
-
this.filePath = filePath;
|
|
15
|
-
this.intervalMs = intervalMs ?? 2000;
|
|
16
|
-
this.histogram = monitorEventLoopDelay({
|
|
17
|
-
resolution: 20
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
/** Begin sampling for a test. Writes a header line and starts the periodic sampler. */ startTest(testName) {
|
|
21
|
-
this.stopTest();
|
|
22
|
-
this.testName = testName;
|
|
23
|
-
this.testStart = performance.now();
|
|
24
|
-
this.eluSamples = [];
|
|
25
|
-
appendFileSync(this.filePath, `\n=== Test: ${testName} ===\n`);
|
|
26
|
-
appendFileSync(this.filePath, padColumns('TIME', 'ELU', 'EL_DLY_P50', 'EL_DLY_P99', 'EL_DLY_MAX', 'HEAP_MB') + '\n');
|
|
27
|
-
this.lastELU = performance.eventLoopUtilization();
|
|
28
|
-
this.histogram.enable();
|
|
29
|
-
this.timer = setInterval(()=>this.sample(), this.intervalMs);
|
|
30
|
-
// Allow the process to exit even if the timer is still running.
|
|
31
|
-
this.timer.unref();
|
|
32
|
-
}
|
|
33
|
-
/** Stop sampling and write a summary line. */ stopTest() {
|
|
34
|
-
if (!this.timer) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// Take a final sample before stopping.
|
|
38
|
-
this.sample();
|
|
39
|
-
clearInterval(this.timer);
|
|
40
|
-
this.timer = undefined;
|
|
41
|
-
this.histogram.disable();
|
|
42
|
-
this.histogram.reset();
|
|
43
|
-
this.writeSummary();
|
|
44
|
-
this.lastELU = undefined;
|
|
45
|
-
this.testName = undefined;
|
|
46
|
-
this.testStart = undefined;
|
|
47
|
-
this.eluSamples = [];
|
|
48
|
-
}
|
|
49
|
-
/** Alias for stopTest — call on process exit to flush any remaining data. */ stop() {
|
|
50
|
-
this.stopTest();
|
|
51
|
-
}
|
|
52
|
-
sample() {
|
|
53
|
-
const newELU = performance.eventLoopUtilization();
|
|
54
|
-
const delta = performance.eventLoopUtilization(newELU, this.lastELU);
|
|
55
|
-
this.lastELU = newELU;
|
|
56
|
-
const elu = delta.utilization;
|
|
57
|
-
this.eluSamples.push(elu);
|
|
58
|
-
const p50 = this.histogram.percentile(50) / NANOS_PER_MS;
|
|
59
|
-
const p99 = this.histogram.percentile(99) / NANOS_PER_MS;
|
|
60
|
-
const max = this.histogram.max / NANOS_PER_MS;
|
|
61
|
-
const heapMb = Math.round(process.memoryUsage().heapUsed / (1024 * 1024));
|
|
62
|
-
const now = new Date();
|
|
63
|
-
const time = [
|
|
64
|
-
now.getHours(),
|
|
65
|
-
now.getMinutes(),
|
|
66
|
-
now.getSeconds()
|
|
67
|
-
].map((n)=>String(n).padStart(2, '0')).join(':');
|
|
68
|
-
const line = padColumns(time, elu.toFixed(2), `${p50.toFixed(1)}ms`, `${p99.toFixed(1)}ms`, `${max.toFixed(1)}ms`, String(heapMb));
|
|
69
|
-
appendFileSync(this.filePath, line + '\n');
|
|
70
|
-
// Reset histogram so next sample only reflects the new interval.
|
|
71
|
-
this.histogram.reset();
|
|
72
|
-
}
|
|
73
|
-
writeSummary() {
|
|
74
|
-
if (this.eluSamples.length === 0 || this.testStart === undefined) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
const mean = this.eluSamples.reduce((a, b)=>a + b, 0) / this.eluSamples.length;
|
|
78
|
-
const maxElu = Math.max(...this.eluSamples);
|
|
79
|
-
const sorted = [
|
|
80
|
-
...this.eluSamples
|
|
81
|
-
].sort((a, b)=>a - b);
|
|
82
|
-
const p90Elu = sorted[Math.floor(sorted.length * 0.9)] ?? maxElu;
|
|
83
|
-
const durationS = ((performance.now() - this.testStart) / 1000).toFixed(1);
|
|
84
|
-
let summary = `--- Summary: mean_elu=${mean.toFixed(2)} max_elu=${maxElu.toFixed(2)} p90_elu=${p90Elu.toFixed(2)} duration=${durationS}s`;
|
|
85
|
-
if (maxElu > 0.85) {
|
|
86
|
-
summary += ' WARNING:ELU>0.85';
|
|
87
|
-
}
|
|
88
|
-
summary += ' ---\n';
|
|
89
|
-
appendFileSync(this.filePath, summary);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function padColumns(...cols) {
|
|
93
|
-
const widths = [
|
|
94
|
-
11,
|
|
95
|
-
7,
|
|
96
|
-
12,
|
|
97
|
-
12,
|
|
98
|
-
12,
|
|
99
|
-
8
|
|
100
|
-
];
|
|
101
|
-
return cols.map((col, i)=>col.padEnd(widths[i] ?? 10)).join('');
|
|
102
|
-
}
|