shared: drop tx setMinFee floor 500K → 200K (unmask CIP-33 fee savings)

The 500K lovelace floor was set higher than the natural fee for both
inlined (~340K) and ref-script (~242K) Plutus V3 spend txs. With it
in place, every script-spending tx pays the same 0.5 AP3X regardless
of whether scripts are inlined or referenced — masking the on-chain
size reduction of ~3.4 KB / -82% per Claim/Submit/Accept measured
end-to-end on Vector L2 testnet.

200K is below both natural fees (so lucid's auto-estimate wins) and
still ~5x above the lucid-evolution 0.4.30 ~5K under-estimate the
floor was originally guarding against.

Expected per-cycle saving on Vector L2 testnet: ~0.32 AP3X
(Claim: 0.34 → 0.24, Submit: 0.34 → 0.25, Accept: 0.35 → 0.23).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
david
2026-05-14 16:51:22 +02:00
parent 3792509892
commit 1c852f3a68
2 changed files with 11 additions and 9 deletions

View File

@@ -374,7 +374,7 @@ export async function buildLiveTxForEscrow(
// lucid 0.4.30 under-estimates Conway fees by ~1K lovelace on
// PostEscrow (Ogmios 3122). 500K is a comfortable floor; excess
// becomes change. Same fix as Claim/Submit/Accept paths.
.setMinFee(500_000n);
.setMinFee(200_000n);
const completed = await txBuilder.complete();
signed = await completed.sign.withWallet().complete();
@@ -468,9 +468,11 @@ async function buildSpendOpenOrClaimedTx(opts: {
.validTo(opts.validToMs)
// lucid-evolution 0.4.30 under-estimates fee for Plutus V3 spends by
// ~5K lovelace (Conway minFeeReferenceScripts multiplier appears to be
// missed). Set a comfortable floor so the ledger accepts. ~0.5 AP3X
// is well below the locked deposit; excess is normal change.
.setMinFee(500_000n);
// missed). 0.2 AP3X floor leaves headroom for that under-estimate
// without masking the savings from CIP-33 ref-scripts (natural
// ref-script tx fee is ~0.24 AP3X; inlined is ~0.34 AP3X — both above
// the floor, so lucid's estimate wins and the size delta surfaces).
.setMinFee(200_000n);
// Let lucid pick coins + compute fee normally; production wallets have
// multiple real UTxOs (no need for the test-side leftover-as-fee hack).
@@ -608,7 +610,7 @@ export async function buildLiveTxForAccept(params: LiveAcceptParams): Promise<Bu
.addSignerKey(params.buyerKey.pubKeyHash)
.validFrom(params.tipMs - 60_000)
.validTo(params.windowEnd)
.setMinFee(500_000n);
.setMinFee(200_000n);
// Same UPLC-eval delegation as Claim/Submit (see buildSpendOpenOrClaimedTx
// for the rationale). lucid 0.4.30's CML WASM evaluator falsely rejects
@@ -676,7 +678,7 @@ export async function buildLiveTxForReclaim(params: LiveReclaimParams): Promise<
// already verified tipMs >= deliver_by, so a 60s back-pad is safe.
.validFrom(params.tipMs - 60_000)
.validTo(params.tipMs + 60_000)
.setMinFee(500_000n);
.setMinFee(200_000n);
// Same UPLC eval delegation as Accept — lucid's CML evaluator falsely
// rejects valid Plutus V3 spends; route to Ogmios.
@@ -736,7 +738,7 @@ export async function buildLiveTxForAdvert(
.addSignerKey(walletKey.pubKeyHash)
.validFrom(advertisedAt - 60_000)
.validTo(advertisedAt + 5 * 60_000)
.setMinFee(500_000n);
.setMinFee(200_000n);
const completed = await txBuilder.complete();
signed = await completed.sign.withWallet().complete();
@@ -799,7 +801,7 @@ export async function buildLiveTxForRetireAdvert(
// propagation lag the same as sibling builders.
.validFrom(nowMs - 60_000)
.validTo(nowMs + 5 * 60_000)
.setMinFee(500_000n);
.setMinFee(200_000n);
// Same UPLC-eval delegation as Claim/Submit/Accept — see
// buildSpendOpenOrClaimedTx for the lucid 0.4.30 false-rejection rationale.

View File

@@ -79,7 +79,7 @@ export async function buildLiveTxForPublishReferenceScripts(
advertScript,
)
.addSignerKey(walletKey.pubKeyHash)
.setMinFee(500_000n);
.setMinFee(200_000n);
const completed = await txBuilder.complete({
presetWalletInputs: realWalletUtxos,