@aztec/bb-prover 0.0.0-test.1 → 0.0.1-commit.017a351
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/avm_proving_tests/avm_proving_tester.d.ts +21 -20
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +196 -87
- package/dest/bb/bb_js_backend.d.ts +196 -0
- package/dest/bb/bb_js_backend.d.ts.map +1 -0
- package/dest/bb/bb_js_backend.js +379 -0
- package/dest/bb/bb_js_debug.d.ts +52 -0
- package/dest/bb/bb_js_debug.d.ts.map +1 -0
- package/dest/bb/bb_js_debug.js +176 -0
- package/dest/bb/cli.d.ts +1 -1
- package/dest/bb/file_names.d.ts +4 -0
- package/dest/bb/file_names.d.ts.map +1 -0
- package/dest/bb/file_names.js +5 -0
- package/dest/bb/index.d.ts +1 -1
- package/dest/config.d.ts +19 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/honk.d.ts +3 -3
- package/dest/honk.d.ts.map +1 -1
- package/dest/honk.js +3 -2
- package/dest/index.d.ts +4 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -1
- package/dest/instrumentation.d.ts +3 -3
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +22 -46
- package/dest/prover/client/bb_private_kernel_prover.d.ts +46 -0
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/client/bb_private_kernel_prover.js +177 -0
- package/dest/prover/client/bundle.d.ts +6 -0
- package/dest/prover/client/bundle.d.ts.map +1 -0
- package/dest/prover/client/bundle.js +7 -0
- package/dest/prover/client/lazy.d.ts +6 -0
- package/dest/prover/client/lazy.d.ts.map +1 -0
- package/dest/prover/client/lazy.js +7 -0
- package/dest/prover/index.d.ts +3 -4
- package/dest/prover/index.d.ts.map +1 -1
- package/dest/prover/index.js +2 -3
- package/dest/prover/proof_utils.d.ts +29 -0
- package/dest/prover/proof_utils.d.ts.map +1 -0
- package/dest/prover/proof_utils.js +95 -0
- package/dest/prover/server/bb_prover.d.ts +96 -0
- package/dest/prover/server/bb_prover.d.ts.map +1 -0
- package/dest/prover/server/bb_prover.js +841 -0
- package/dest/test/delay_values.d.ts +1 -1
- package/dest/test/delay_values.d.ts.map +1 -1
- package/dest/test/delay_values.js +37 -23
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -0
- package/dest/test/test_circuit_prover.d.ts +27 -36
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +517 -88
- package/dest/test/test_verifier.d.ts +6 -3
- package/dest/test/test_verifier.d.ts.map +1 -1
- package/dest/test/test_verifier.js +23 -1
- package/dest/verification_key/verification_key_data.d.ts +1 -2
- package/dest/verification_key/verification_key_data.d.ts.map +1 -1
- package/dest/verification_key/verification_key_data.js +9 -34
- package/dest/verifier/batch_chonk_verifier.d.ts +56 -0
- package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
- package/dest/verifier/batch_chonk_verifier.js +384 -0
- package/dest/verifier/bb_verifier.d.ts +9 -5
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +156 -49
- package/dest/verifier/index.d.ts +3 -1
- package/dest/verifier/index.d.ts.map +1 -1
- package/dest/verifier/index.js +2 -0
- package/dest/verifier/queued_chonk_verifier.d.ts +14 -0
- package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -0
- package/dest/verifier/queued_chonk_verifier.js +102 -0
- package/package.json +38 -34
- package/src/avm_proving_tests/avm_proving_tester.ts +163 -126
- package/src/bb/bb_js_backend.ts +435 -0
- package/src/bb/bb_js_debug.ts +227 -0
- package/src/bb/file_names.ts +6 -0
- package/src/config.ts +18 -0
- package/src/honk.ts +3 -2
- package/src/index.ts +3 -1
- package/src/instrumentation.ts +22 -47
- package/src/prover/client/bb_private_kernel_prover.ts +423 -0
- package/src/prover/client/bundle.ts +10 -0
- package/src/prover/client/lazy.ts +10 -0
- package/src/prover/index.ts +2 -3
- package/src/prover/proof_utils.ts +155 -0
- package/src/prover/server/bb_prover.ts +713 -0
- package/src/test/delay_values.ts +38 -22
- package/src/test/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +264 -154
- package/src/test/test_verifier.ts +15 -3
- package/src/verification_key/verification_key_data.ts +11 -31
- package/src/verifier/batch_chonk_verifier.ts +415 -0
- package/src/verifier/bb_verifier.ts +93 -76
- package/src/verifier/index.ts +2 -0
- package/src/verifier/queued_chonk_verifier.ts +108 -0
- package/dest/bb/execute.d.ts +0 -140
- package/dest/bb/execute.d.ts.map +0 -1
- package/dest/bb/execute.js +0 -780
- package/dest/prover/bb_native_private_kernel_prover.d.ts +0 -25
- package/dest/prover/bb_native_private_kernel_prover.d.ts.map +0 -1
- package/dest/prover/bb_native_private_kernel_prover.js +0 -69
- package/dest/prover/bb_private_kernel_prover.d.ts +0 -32
- package/dest/prover/bb_private_kernel_prover.d.ts.map +0 -1
- package/dest/prover/bb_private_kernel_prover.js +0 -109
- package/dest/prover/bb_prover.d.ts +0 -120
- package/dest/prover/bb_prover.d.ts.map +0 -1
- package/dest/prover/bb_prover.js +0 -423
- package/dest/prover/client_ivc_proof_utils.d.ts +0 -25
- package/dest/prover/client_ivc_proof_utils.d.ts.map +0 -1
- package/dest/prover/client_ivc_proof_utils.js +0 -43
- package/dest/stats.d.ts +0 -5
- package/dest/stats.d.ts.map +0 -1
- package/dest/stats.js +0 -62
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +0 -17
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +0 -1
- package/dest/wasm/bb_wasm_private_kernel_prover.js +0 -46
- package/dest/wasm/bundle.d.ts +0 -6
- package/dest/wasm/bundle.d.ts.map +0 -1
- package/dest/wasm/bundle.js +0 -8
- package/dest/wasm/lazy.d.ts +0 -6
- package/dest/wasm/lazy.d.ts.map +0 -1
- package/dest/wasm/lazy.js +0 -8
- package/src/bb/execute.ts +0 -853
- package/src/prover/bb_native_private_kernel_prover.ts +0 -119
- package/src/prover/bb_private_kernel_prover.ts +0 -249
- package/src/prover/bb_prover.ts +0 -781
- package/src/prover/client_ivc_proof_utils.ts +0 -42
- package/src/stats.ts +0 -64
- package/src/wasm/bb_wasm_private_kernel_prover.ts +0 -55
- package/src/wasm/bundle.ts +0 -11
- package/src/wasm/lazy.ts +0 -11
|
@@ -1,78 +1,124 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import type { AvmStat } from '@aztec/bb.js';
|
|
2
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
3
|
+
import {
|
|
4
|
+
PublicTxSimulationTester,
|
|
5
|
+
SimpleContractDataSource,
|
|
6
|
+
type TestEnqueuedCall,
|
|
7
|
+
type TestExecutorMetrics,
|
|
8
|
+
type TestPrivateInsertions,
|
|
9
|
+
} from '@aztec/simulator/public/fixtures';
|
|
10
|
+
import type { PublicTxResult } from '@aztec/simulator/server';
|
|
11
|
+
import { AvmCircuitInputs, AvmCircuitPublicInputs, PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
4
12
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
13
|
+
import type { Gas } from '@aztec/stdlib/gas';
|
|
5
14
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
6
|
-
import {
|
|
7
|
-
import { VerificationKeyData } from '@aztec/stdlib/vks';
|
|
15
|
+
import type { GlobalVariables } from '@aztec/stdlib/tx';
|
|
8
16
|
import { NativeWorldStateService } from '@aztec/world-state';
|
|
9
17
|
|
|
10
|
-
import fs from 'node:fs/promises';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
18
|
import path from 'path';
|
|
13
19
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
import { BBJsFactory } from '../bb/bb_js_backend.js';
|
|
21
|
+
|
|
22
|
+
const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
|
|
23
|
+
|
|
24
|
+
// Config with collectHints enabled for proving tests
|
|
25
|
+
const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
|
|
26
|
+
skipFeeEnforcement: false,
|
|
27
|
+
collectCallMetadata: true, // For results.
|
|
28
|
+
collectDebugLogs: false,
|
|
29
|
+
collectHints: true, // Required for proving!
|
|
30
|
+
collectPublicInputs: true, // Required for proving!
|
|
31
|
+
collectStatistics: false,
|
|
32
|
+
});
|
|
26
33
|
|
|
27
34
|
export class AvmProvingTester extends PublicTxSimulationTester {
|
|
35
|
+
private readonly bbJsFactory = new BBJsFactory(BB_PATH);
|
|
36
|
+
|
|
28
37
|
constructor(
|
|
29
|
-
private bbWorkingDirectory: string,
|
|
30
38
|
private checkCircuitOnly: boolean,
|
|
31
|
-
worldStateDB: WorldStateDB,
|
|
32
39
|
contractDataSource: SimpleContractDataSource,
|
|
33
40
|
merkleTrees: MerkleTreeWriteOperations,
|
|
41
|
+
globals?: GlobalVariables,
|
|
42
|
+
metrics?: TestExecutorMetrics,
|
|
34
43
|
) {
|
|
35
|
-
|
|
44
|
+
// simulator factory is undefined because for proving, we use the default C++ simulator
|
|
45
|
+
super(merkleTrees, contractDataSource, globals, metrics, /*simulatorFactory=*/ undefined, provingConfig);
|
|
36
46
|
}
|
|
37
47
|
|
|
38
|
-
static
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
static async new(
|
|
49
|
+
worldStateService: NativeWorldStateService, // make sure to close this later
|
|
50
|
+
checkCircuitOnly: boolean = false,
|
|
51
|
+
globals?: GlobalVariables,
|
|
52
|
+
metrics?: TestExecutorMetrics,
|
|
53
|
+
) {
|
|
41
54
|
const contractDataSource = new SimpleContractDataSource();
|
|
42
|
-
const merkleTrees = await
|
|
43
|
-
|
|
44
|
-
return new AvmProvingTester(bbWorkingDirectory, checkCircuitOnly, worldStateDB, contractDataSource, merkleTrees);
|
|
55
|
+
const merkleTrees = await worldStateService.fork();
|
|
56
|
+
return new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics);
|
|
45
57
|
}
|
|
46
58
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.
|
|
59
|
+
/**
|
|
60
|
+
* Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
|
|
61
|
+
* Returns the in-memory proof fields on success; throws via jest expect() on failure.
|
|
62
|
+
*/
|
|
63
|
+
async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<Uint8Array[]> {
|
|
64
|
+
const inputsBuffer = avmCircuitInputs.serializeWithMessagePack();
|
|
65
|
+
|
|
66
|
+
if (this.checkCircuitOnly) {
|
|
67
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
68
|
+
const { passed, stats } = await instance.checkAvmCircuit(inputsBuffer);
|
|
69
|
+
this.recordProverMetrics(stats, txLabel);
|
|
70
|
+
expect(passed).toBe(true);
|
|
71
|
+
return [];
|
|
58
72
|
}
|
|
59
|
-
|
|
73
|
+
|
|
74
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
75
|
+
const { proof, stats } = await instance.generateAvmProof(inputsBuffer);
|
|
76
|
+
this.recordProverMetrics(stats, txLabel);
|
|
77
|
+
return proof;
|
|
60
78
|
}
|
|
61
79
|
|
|
62
|
-
async verify(
|
|
80
|
+
async verify(proof: Uint8Array[], publicInputs: AvmCircuitPublicInputs): Promise<void> {
|
|
63
81
|
if (this.checkCircuitOnly) {
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
return proofRes;
|
|
82
|
+
// Check-circuit did not generate a proof; nothing to verify.
|
|
83
|
+
return;
|
|
67
84
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
const piBuffer = publicInputs.serializeWithMessagePack();
|
|
86
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
87
|
+
const { verified } = await instance.verifyAvmProof(proof, piBuffer);
|
|
88
|
+
expect(verified).toBe(true);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
|
|
92
|
+
const proof = await this.prove(avmCircuitInputs, txLabel);
|
|
93
|
+
await this.verify(proof, avmCircuitInputs.publicInputs);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private recordProverMetrics(stats: AvmStat[], txLabel: string) {
|
|
97
|
+
// Build a lookup keyed on the stage name with the `_ms` suffix stripped, matching the legacy
|
|
98
|
+
// stdout-scraped shape. bb::avm2::Stats::time() stores keys with `_ms` appended.
|
|
99
|
+
const times: { [key: string]: number } = {};
|
|
100
|
+
for (const { name, valueMs } of stats) {
|
|
101
|
+
const key = name.endsWith('_ms') ? name.slice(0, -'_ms'.length) : name;
|
|
102
|
+
times[key] = valueMs;
|
|
103
|
+
}
|
|
104
|
+
if (Object.keys(times).length === 0) {
|
|
105
|
+
throw new Error('AVM response did not contain any proving-stage timings!');
|
|
106
|
+
}
|
|
107
|
+
// Hack to make labels match.
|
|
108
|
+
const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
|
|
109
|
+
// Cast because TS doesn't realize `metrics` is protected, not private on the parent class.
|
|
110
|
+
(this as any).metrics?.recordProverMetrics(txLabelWithCount, {
|
|
111
|
+
proverSimulationStepMs: times['simulation/all'],
|
|
112
|
+
proverProvingStepMs: times['proving/all'],
|
|
113
|
+
proverTraceGenerationStepMs: times['tracegen/all'],
|
|
114
|
+
traceGenerationInteractionsMs: times['tracegen/interactions'],
|
|
115
|
+
traceGenerationTracesMs: times['tracegen/traces'],
|
|
116
|
+
provingSumcheckMs: times['prove/sumcheck'],
|
|
117
|
+
provingPcsMs: times['prove/pcs_rounds'],
|
|
118
|
+
provingLogDerivativeInverseMs: times['prove/log_derivative_inverse_round'],
|
|
119
|
+
provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
|
|
120
|
+
provingWireCommitmentsMs: times['prove/wire_commitments_round'],
|
|
121
|
+
});
|
|
76
122
|
}
|
|
77
123
|
|
|
78
124
|
public async simProveVerify(
|
|
@@ -82,89 +128,80 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
82
128
|
teardownCall: TestEnqueuedCall | undefined,
|
|
83
129
|
expectRevert: boolean | undefined,
|
|
84
130
|
feePayer = sender,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const verificationRes = await this.verify(provingRes as BBSuccess);
|
|
104
|
-
expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
131
|
+
privateInsertions?: TestPrivateInsertions,
|
|
132
|
+
txLabel: string = 'unlabeledTx',
|
|
133
|
+
disableRevertCheck: boolean = false,
|
|
134
|
+
gasLimits?: Gas,
|
|
135
|
+
): Promise<PublicTxResult> {
|
|
136
|
+
const simTimer = new Timer();
|
|
137
|
+
const simRes = await this.simulateTx(
|
|
138
|
+
sender,
|
|
139
|
+
setupCalls,
|
|
140
|
+
appCalls,
|
|
141
|
+
teardownCall,
|
|
142
|
+
feePayer,
|
|
143
|
+
privateInsertions,
|
|
144
|
+
txLabel,
|
|
145
|
+
gasLimits,
|
|
146
|
+
);
|
|
147
|
+
const simDuration = simTimer.ms();
|
|
148
|
+
this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
|
|
107
149
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
worldStateDB: WorldStateDB,
|
|
112
|
-
contractDataSource: SimpleContractDataSource,
|
|
113
|
-
merkleTrees: MerkleTreeWriteOperations,
|
|
114
|
-
) {
|
|
115
|
-
super(worldStateDB, contractDataSource, merkleTrees);
|
|
116
|
-
}
|
|
150
|
+
if (!disableRevertCheck) {
|
|
151
|
+
expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
|
|
152
|
+
}
|
|
117
153
|
|
|
118
|
-
|
|
119
|
-
const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
|
|
154
|
+
const opString = this.checkCircuitOnly ? 'Check circuit' : 'Proving and verification';
|
|
120
155
|
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
156
|
+
const avmCircuitInputs = new AvmCircuitInputs(simRes.hints!, simRes.publicInputs!);
|
|
157
|
+
const timer = new Timer();
|
|
158
|
+
await this.proveVerify(avmCircuitInputs, txLabel);
|
|
159
|
+
this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
|
|
126
160
|
|
|
127
|
-
|
|
128
|
-
// Then we prove.
|
|
129
|
-
const proofRes = await generateAvmProofV2(BB_PATH, this.bbWorkingDirectory, avmCircuitInputs, this.logger);
|
|
130
|
-
if (proofRes.status === BB_RESULT.FAILURE) {
|
|
131
|
-
this.logger.error(`Proof generation failed: ${proofRes.reason}`);
|
|
132
|
-
}
|
|
133
|
-
expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
|
|
134
|
-
return proofRes as BBSuccess;
|
|
161
|
+
return simRes;
|
|
135
162
|
}
|
|
136
163
|
|
|
137
|
-
async
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
164
|
+
public override async executeTxWithLabel(
|
|
165
|
+
txLabel: string,
|
|
166
|
+
sender: AztecAddress,
|
|
167
|
+
setupCalls?: TestEnqueuedCall[],
|
|
168
|
+
appCalls?: TestEnqueuedCall[],
|
|
169
|
+
teardownCall?: TestEnqueuedCall,
|
|
170
|
+
feePayer?: AztecAddress,
|
|
171
|
+
privateInsertions?: TestPrivateInsertions,
|
|
172
|
+
gasLimits?: Gas,
|
|
173
|
+
) {
|
|
174
|
+
return await this.simProveVerify(
|
|
175
|
+
sender,
|
|
176
|
+
setupCalls ?? [],
|
|
177
|
+
appCalls ?? [],
|
|
178
|
+
teardownCall,
|
|
179
|
+
undefined,
|
|
180
|
+
feePayer,
|
|
181
|
+
privateInsertions,
|
|
182
|
+
txLabel,
|
|
183
|
+
true,
|
|
184
|
+
gasLimits,
|
|
149
185
|
);
|
|
150
186
|
}
|
|
151
187
|
|
|
152
|
-
public async
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
expectRevert: boolean | undefined,
|
|
158
|
-
feePayer = sender,
|
|
188
|
+
public async simProveVerifyAppLogic(
|
|
189
|
+
appCall: TestEnqueuedCall,
|
|
190
|
+
expectRevert?: boolean,
|
|
191
|
+
txLabel: string = 'unlabeledTx',
|
|
192
|
+
gasLimits?: Gas,
|
|
159
193
|
) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
194
|
+
await this.simProveVerify(
|
|
195
|
+
/*sender=*/ AztecAddress.fromNumber(42),
|
|
196
|
+
/*setupCalls=*/ [],
|
|
197
|
+
[appCall],
|
|
198
|
+
undefined,
|
|
199
|
+
expectRevert,
|
|
200
|
+
/*feePayer=*/ undefined,
|
|
201
|
+
/*privateInsertions=*/ undefined,
|
|
202
|
+
txLabel,
|
|
203
|
+
/*disableRevertCheck=*/ false,
|
|
204
|
+
gasLimits,
|
|
205
|
+
);
|
|
169
206
|
}
|
|
170
207
|
}
|