From 14cae3d866306c81812efa62d066949c8ebcd726 Mon Sep 17 00:00:00 2001 From: Phil Windle Date: Tue, 10 Mar 2026 14:21:04 +0000 Subject: [PATCH 1/2] Simulate gas in n tps test. Set min txs per block to 1 --- spartan/environments/alpha-net.env | 3 +- spartan/environments/devnet.env | 3 +- spartan/environments/five-tps-long-epoch.env | 2 +- spartan/environments/five-tps-short-epoch.env | 2 +- spartan/environments/network-defaults.yml | 2 +- spartan/environments/next-net.env | 2 +- spartan/environments/prove-n-tps-fake.env | 2 +- spartan/environments/prove-n-tps-real.env | 2 +- spartan/environments/staging-public.env | 2 +- spartan/environments/ten-tps-long-epoch.env | 2 +- spartan/environments/ten-tps-short-epoch.env | 2 +- spartan/environments/tps-scenario.env | 2 +- spartan/scripts/deploy_network.sh | 4 +- spartan/terraform/deploy-aztec-infra/main.tf | 1 + .../terraform/deploy-aztec-infra/variables.tf | 10 +++- .../end-to-end/src/spartan/n_tps.test.ts | 30 +++++++++-- .../src/spartan/setup_test_wallets.ts | 50 ++++++++++++++++--- 17 files changed, 96 insertions(+), 25 deletions(-) diff --git a/spartan/environments/alpha-net.env b/spartan/environments/alpha-net.env index 6e4a2273390a..563054a0f9bb 100644 --- a/spartan/environments/alpha-net.env +++ b/spartan/environments/alpha-net.env @@ -69,7 +69,8 @@ AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SPONSORED_FPC=true SEQ_MAX_TX_PER_CHECKPOINT=72 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 +SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/environments/devnet.env b/spartan/environments/devnet.env index 106979eef6bb..92225d10c947 100644 --- a/spartan/environments/devnet.env +++ b/spartan/environments/devnet.env @@ -53,7 +53,8 @@ VALIDATOR_MNEMONIC_START_INDEX=$((1 + MNEMONIC_INDEX_OFFSET)) VALIDATOR_INDICES=$(seq -s ',' $VALIDATOR_MNEMONIC_START_INDEX $((VALIDATOR_MNEMONIC_START_INDEX + TOTAL_VALIDATORS - 1))) VALIDATOR_PUBLISHER_MNEMONIC_START_INDEX=$((5000 + MNEMONIC_INDEX_OFFSET)) VALIDATOR_PUBLISHERS_PER_REPLICA=8 -SEQ_MIN_TX_PER_BLOCK=0 +PUBLISHERS_PER_VALIDATOR_KEY=1 +SEQ_MIN_TX_PER_BLOCK=1 SEQ_MAX_TX_PER_BLOCK=32 PROVER_PUBLISHER_MNEMONIC_START_INDEX=$((8000 + MNEMONIC_INDEX_OFFSET)) diff --git a/spartan/environments/five-tps-long-epoch.env b/spartan/environments/five-tps-long-epoch.env index aad096238ac8..9afa08bce7b2 100644 --- a/spartan/environments/five-tps-long-epoch.env +++ b/spartan/environments/five-tps-long-epoch.env @@ -55,7 +55,7 @@ AZTEC_SLASHING_OFFSET_IN_ROUNDS=1 AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SEQ_MAX_TX_PER_CHECKPOINT=180 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/environments/five-tps-short-epoch.env b/spartan/environments/five-tps-short-epoch.env index c35ed34e45c9..f3404f588425 100644 --- a/spartan/environments/five-tps-short-epoch.env +++ b/spartan/environments/five-tps-short-epoch.env @@ -55,7 +55,7 @@ AZTEC_SLASHING_OFFSET_IN_ROUNDS=1 AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SEQ_MAX_TX_PER_CHECKPOINT=180 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/environments/network-defaults.yml b/spartan/environments/network-defaults.yml index be0f2d34b88a..926059296b14 100644 --- a/spartan/environments/network-defaults.yml +++ b/spartan/environments/network-defaults.yml @@ -170,7 +170,7 @@ _prodlike: &prodlike # Sequencer Configuration #--------------------------------------------------------------------------- # Minimum transactions to include in a block. - SEQ_MIN_TX_PER_BLOCK: 0 + SEQ_MIN_TX_PER_BLOCK: 1 # Maximum transactions to include in a block # Build checkpoint even if block is empty. SEQ_BUILD_CHECKPOINT_IF_EMPTY: true diff --git a/spartan/environments/next-net.env b/spartan/environments/next-net.env index b27e1903029f..196aa3169b6e 100644 --- a/spartan/environments/next-net.env +++ b/spartan/environments/next-net.env @@ -28,7 +28,7 @@ L1_TX_FAILED_STORE=gs://aztec-develop/next-net/failed-l1-txs TEST_ACCOUNTS=true SPONSORED_FPC=true -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 SEQ_MAX_TX_PER_CHECKPOINT=7 diff --git a/spartan/environments/prove-n-tps-fake.env b/spartan/environments/prove-n-tps-fake.env index 920909247f34..3747a0fa0b90 100644 --- a/spartan/environments/prove-n-tps-fake.env +++ b/spartan/environments/prove-n-tps-fake.env @@ -41,10 +41,10 @@ PROVER_TEST_DELAY_TYPE=realistic PROVER_TEST_VERIFICATION_DELAY_MS=250 SEQ_MAX_TX_PER_CHECKPOINT=80 -SEQ_MIN_TX_PER_BLOCK=0 SEQ_BLOCK_DURATION_MS=6000 SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT=36 SEQ_BUILD_CHECKPOINT_IF_EMPTY=true +SEQ_MIN_TX_PER_BLOCK=1 P2P_MAX_TX_POOL_SIZE=1000000000 DEBUG_P2P_INSTRUMENT_MESSAGES=true diff --git a/spartan/environments/prove-n-tps-real.env b/spartan/environments/prove-n-tps-real.env index e914ddeebff5..20b3758f4280 100644 --- a/spartan/environments/prove-n-tps-real.env +++ b/spartan/environments/prove-n-tps-real.env @@ -38,7 +38,7 @@ PROVER_AGENT_POLL_INTERVAL_MS=10000 PUBLISHERS_PER_PROVER=1 SEQ_MAX_TX_PER_CHECKPOINT=72 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 SEQ_BLOCK_DURATION_MS=6000 SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT=36 SEQ_BUILD_CHECKPOINT_IF_EMPTY=true diff --git a/spartan/environments/staging-public.env b/spartan/environments/staging-public.env index 41a53217da1f..5ddac52aa063 100644 --- a/spartan/environments/staging-public.env +++ b/spartan/environments/staging-public.env @@ -25,7 +25,7 @@ R2_SECRET_ACCESS_KEY=REPLACE_WITH_GCP_SECRET TEST_ACCOUNTS=false SPONSORED_FPC=true -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 SEQ_MAX_TX_PER_CHECKPOINT=7 # 0.1 TPS # Build checkpoint even if block is empty. diff --git a/spartan/environments/ten-tps-long-epoch.env b/spartan/environments/ten-tps-long-epoch.env index 819bfa4e69f2..d30e3f9e12f7 100644 --- a/spartan/environments/ten-tps-long-epoch.env +++ b/spartan/environments/ten-tps-long-epoch.env @@ -56,7 +56,7 @@ AZTEC_SLASHING_OFFSET_IN_ROUNDS=1 AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SEQ_MAX_TX_PER_CHECKPOINT=360 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/environments/ten-tps-short-epoch.env b/spartan/environments/ten-tps-short-epoch.env index e25967860346..012af344707e 100644 --- a/spartan/environments/ten-tps-short-epoch.env +++ b/spartan/environments/ten-tps-short-epoch.env @@ -56,7 +56,7 @@ AZTEC_SLASHING_OFFSET_IN_ROUNDS=1 AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SEQ_MAX_TX_PER_CHECKPOINT=360 -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/environments/tps-scenario.env b/spartan/environments/tps-scenario.env index 308455667709..688fa0c6a4e5 100644 --- a/spartan/environments/tps-scenario.env +++ b/spartan/environments/tps-scenario.env @@ -68,7 +68,7 @@ AZTEC_SLASHING_OFFSET_IN_ROUNDS=1 AZTEC_LOCAL_EJECTION_THRESHOLD=90000000000000000000 SEQ_MAX_TX_PER_CHECKPOINT=15 # approx 0.2 TPS -SEQ_MIN_TX_PER_BLOCK=0 +SEQ_MIN_TX_PER_BLOCK=1 # Override L1 tx utils bump percentages for scenario tests VALIDATOR_L1_PRIORITY_FEE_BUMP_PERCENTAGE=0 diff --git a/spartan/scripts/deploy_network.sh b/spartan/scripts/deploy_network.sh index e1d0b0cbef35..415c596a2227 100755 --- a/spartan/scripts/deploy_network.sh +++ b/spartan/scripts/deploy_network.sh @@ -104,9 +104,10 @@ else fi PROVER_FAILED_PROOF_STORE=${PROVER_FAILED_PROOF_STORE:-} -SEQ_MIN_TX_PER_BLOCK=${SEQ_MIN_TX_PER_BLOCK:-0} +SEQ_MIN_TX_PER_BLOCK=${SEQ_MIN_TX_PER_BLOCK:-1} SEQ_MAX_TX_PER_BLOCK=${SEQ_MAX_TX_PER_BLOCK:-null} SEQ_MAX_TX_PER_CHECKPOINT=${SEQ_MAX_TX_PER_CHECKPOINT:-8} +SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER=${SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER:-2} SEQ_BLOCK_DURATION_MS=${SEQ_BLOCK_DURATION_MS:-} SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT=${SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT:-} SEQ_BUILD_CHECKPOINT_IF_EMPTY=${SEQ_BUILD_CHECKPOINT_IF_EMPTY:-} @@ -532,6 +533,7 @@ VALIDATOR_HA_REPLICAS = ${VALIDATOR_HA_REPLICAS} SEQ_MIN_TX_PER_BLOCK = ${SEQ_MIN_TX_PER_BLOCK} SEQ_MAX_TX_PER_BLOCK = ${SEQ_MAX_TX_PER_BLOCK} SEQ_MAX_TX_PER_CHECKPOINT = ${SEQ_MAX_TX_PER_CHECKPOINT} +SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER = ${SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER} SEQ_BLOCK_DURATION_MS = ${SEQ_BLOCK_DURATION_MS:-null} SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT = ${SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT:-null} SEQ_BUILD_CHECKPOINT_IF_EMPTY = ${SEQ_BUILD_CHECKPOINT_IF_EMPTY:-null} diff --git a/spartan/terraform/deploy-aztec-infra/main.tf b/spartan/terraform/deploy-aztec-infra/main.tf index 6b039f742b37..59a189fafacd 100644 --- a/spartan/terraform/deploy-aztec-infra/main.tf +++ b/spartan/terraform/deploy-aztec-infra/main.tf @@ -213,6 +213,7 @@ locals { "validator.node.env.SEQ_MIN_TX_PER_BLOCK" = var.SEQ_MIN_TX_PER_BLOCK "validator.node.env.SEQ_MAX_TX_PER_BLOCK" = var.SEQ_MAX_TX_PER_BLOCK "validator.node.env.SEQ_MAX_TX_PER_CHECKPOINT" = var.SEQ_MAX_TX_PER_CHECKPOINT + "validator.node.env.SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER" = var.SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER "validator.node.env.SEQ_BLOCK_DURATION_MS" = var.SEQ_BLOCK_DURATION_MS "validator.node.env.SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT" = var.SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT "validator.node.env.SEQ_BUILD_CHECKPOINT_IF_EMPTY" = var.SEQ_BUILD_CHECKPOINT_IF_EMPTY diff --git a/spartan/terraform/deploy-aztec-infra/variables.tf b/spartan/terraform/deploy-aztec-infra/variables.tf index 2e9bbdb09151..015dcaff79ee 100644 --- a/spartan/terraform/deploy-aztec-infra/variables.tf +++ b/spartan/terraform/deploy-aztec-infra/variables.tf @@ -340,7 +340,7 @@ variable "TEST_ACCOUNTS" { variable "SEQ_MIN_TX_PER_BLOCK" { description = "Minimum number of sequencer transactions per block" type = string - default = "0" + default = "1" } variable "SEQ_MAX_TX_PER_BLOCK" { @@ -389,6 +389,12 @@ variable "SEQ_BUILD_CHECKPOINT_IF_EMPTY" { default = null } +variable "SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER" { + description = "Per-block gas budget multiplier for both L2 and DA gas." + type = string + default = null +} + variable "SENTINEL_ENABLED" { description = "Whether to enable sentinel" type = string @@ -771,7 +777,7 @@ variable "FISHERMAN_MODE" { variable "P2P_GOSSIPSUB_D" { description = "The P2P Gossipsub D parameter" type = string - default = "6" + default = "8" } variable "P2P_GOSSIPSUB_DLO" { diff --git a/yarn-project/end-to-end/src/spartan/n_tps.test.ts b/yarn-project/end-to-end/src/spartan/n_tps.test.ts index f2f452f20074..86b04c4b956e 100644 --- a/yarn-project/end-to-end/src/spartan/n_tps.test.ts +++ b/yarn-project/end-to-end/src/spartan/n_tps.test.ts @@ -10,7 +10,7 @@ import { RunningPromise } from '@aztec/foundation/promise'; import { retryUntil } from '@aztec/foundation/retry'; import { sleep } from '@aztec/foundation/sleep'; import { BenchmarkingContract } from '@aztec/noir-test-contracts.js/Benchmarking'; -import { GasFees } from '@aztec/stdlib/gas'; +import { type Gas, GasFees } from '@aztec/stdlib/gas'; import { TopicType } from '@aztec/stdlib/p2p'; import { Tx, TxHash } from '@aztec/stdlib/tx'; @@ -293,7 +293,7 @@ describe('sustained N TPS test', () => { // this function creates n + 1 accounts. We only want one for each wallet const localTestAccounts = await Promise.all( - testWallets.map(lw => deploySponsoredTestAccounts(lw.wallet, aztecNode, logger, 0)), + testWallets.map(lw => deploySponsoredTestAccounts(lw.wallet, aztecNode, logger, 0, { estimateGas: true })), ); lowValueWallets = localTestAccounts.slice(0, lowValueAccounts).map(({ wallet }) => wallet); @@ -306,23 +306,44 @@ describe('sustained N TPS test', () => { logger.info('Deploying benchmark contract...'); const sponsor = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()); - ({ contract: benchmarkContract } = await BenchmarkingContract.deploy(localTestAccounts[0].wallet).send({ + const deployInteraction = BenchmarkingContract.deploy(localTestAccounts[0].wallet); + const deploySim = await deployInteraction.simulate({ from: localTestAccounts[0].recipientAddress, fee: { paymentMethod: sponsor }, + }); + logger.info('Benchmark contract deploy estimated gas', { gasLimits: deploySim.estimatedGas?.gasLimits }); + ({ contract: benchmarkContract } = await deployInteraction.send({ + from: localTestAccounts[0].recipientAddress, + fee: { paymentMethod: sponsor, gasSettings: deploySim.estimatedGas }, })); logger.info('Benchmark contract deployed', { address: benchmarkContract.address.toString() }); logger.info(`Test setup complete`); }); + let benchmarkGasEstimate: { gasLimits: Gas; teardownGasLimits: Gas } | undefined; + const submitProven = async ( wallet: TestWallet, maxPriorityFeesPerGas: GasFees = GasFees.empty(), ): Promise => { const sponsor = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()); + + if (!benchmarkGasEstimate) { + const sim = await benchmarkContract.methods.sha256_hash_1024(Array(1024).fill(42)).simulate({ + from: (await benchmarkContract.wallet.getAccounts())[0].item, + fee: { paymentMethod: sponsor, estimateGas: true }, + }); + benchmarkGasEstimate = sim.estimatedGas; + logger.info('Benchmark tx estimated gas', { gasLimits: benchmarkGasEstimate?.gasLimits }); + } + const tx = await proveInteraction(wallet, benchmarkContract.methods.sha256_hash_1024(Array(1024).fill(42)), { from: (await wallet.getAccounts())[0].item, - fee: { paymentMethod: sponsor, gasSettings: { maxPriorityFeesPerGas } }, + fee: { + paymentMethod: sponsor, + gasSettings: { maxPriorityFeesPerGas, ...benchmarkGasEstimate }, + }, }); return tx; @@ -334,6 +355,7 @@ describe('sustained N TPS test', () => { let prototypeTx = prototypeTxs.get(from.toString()); if (!prototypeTx) { prototypeTx = await submitProven(wallet); + console.log(`Tx gas limits `, prototypeTx.data.constants.txContext.gasSettings.gasLimits); prototypeTxs.set(from.toString(), prototypeTx); } diff --git a/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts b/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts index 6464708418e5..814ba7fb747a 100644 --- a/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts +++ b/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts @@ -129,16 +129,27 @@ export async function deploySponsoredTestAccountsWithTokens( } async function deployAccountWithDiagnostics( - account: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any }, + account: { getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>; address: any }, paymentMethod: SponsoredFeePaymentMethod, aztecNode: AztecNode, logger: Logger, accountLabel: string, + estimateGas?: boolean, ): Promise { const deployMethod = await account.getDeployMethod(); let txHash; try { - const deployResult = await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod }, wait: NO_WAIT }); + let gasSettings; + if (estimateGas) { + const sim = await deployMethod.simulate({ from: AztecAddress.ZERO, fee: { paymentMethod } }); + gasSettings = sim.estimatedGas; + logger.info(`${accountLabel} estimated gas: DA=${gasSettings.gasLimits.daGas} L2=${gasSettings.gasLimits.l2Gas}`); + } + const deployResult = await deployMethod.send({ + from: AztecAddress.ZERO, + fee: { paymentMethod, gasSettings }, + wait: NO_WAIT, + }); txHash = deployResult.txHash; await waitForTx(aztecNode, txHash, { timeout: 2400 }); logger.info(`${accountLabel} deployed at ${account.address}`); @@ -161,18 +172,29 @@ async function deployAccountWithDiagnostics( } async function deployAccountsInBatches( - accounts: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any }[], + accounts: { + getDeployMethod: () => Promise<{ simulate: (opts: any) => any; send: (opts: any) => any }>; + address: any; + }[], paymentMethod: SponsoredFeePaymentMethod, aztecNode: AztecNode, logger: Logger, labelPrefix: string, batchSize = 2, + estimateGas?: boolean, ): Promise { for (let i = 0; i < accounts.length; i += batchSize) { const batch = accounts.slice(i, i + batchSize); await Promise.all( batch.map((account, idx) => - deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`), + deployAccountWithDiagnostics( + account, + paymentMethod, + aztecNode, + logger, + `${labelPrefix}${i + idx + 1}`, + estimateGas, + ), ), ); } @@ -183,6 +205,7 @@ export async function deploySponsoredTestAccounts( aztecNode: AztecNode, logger: Logger, numberOfFundedWallets = 1, + opts?: { estimateGas?: boolean }, ): Promise { const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1); const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt); @@ -192,8 +215,23 @@ export async function deploySponsoredTestAccounts( const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()); - await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account'); - await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2); + await deployAccountWithDiagnostics( + recipientAccount, + paymentMethod, + aztecNode, + logger, + 'Recipient account', + opts?.estimateGas, + ); + await deployAccountsInBatches( + fundedAccounts, + paymentMethod, + aztecNode, + logger, + 'Funded account ', + 2, + opts?.estimateGas, + ); return { aztecNode, From fbdac41cbffd75c9d75e8e83b3bc691b5911aaab Mon Sep 17 00:00:00 2001 From: Phil Windle Date: Tue, 10 Mar 2026 15:23:04 +0000 Subject: [PATCH 2/2] Lint fix --- yarn-project/end-to-end/src/spartan/n_tps.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn-project/end-to-end/src/spartan/n_tps.test.ts b/yarn-project/end-to-end/src/spartan/n_tps.test.ts index 86b04c4b956e..7c3f861f0885 100644 --- a/yarn-project/end-to-end/src/spartan/n_tps.test.ts +++ b/yarn-project/end-to-end/src/spartan/n_tps.test.ts @@ -355,7 +355,6 @@ describe('sustained N TPS test', () => { let prototypeTx = prototypeTxs.get(from.toString()); if (!prototypeTx) { prototypeTx = await submitProven(wallet); - console.log(`Tx gas limits `, prototypeTx.data.constants.txContext.gasSettings.gasLimits); prototypeTxs.set(from.toString(), prototypeTx); }