Add per-transition output parsing to execute lifecycle - #54
Merged
Conversation
|
@marshacb must be a member of the Provable team on Vercel to deploy. Learn more about collaboration on Vercel and other options here. |
marshacb
force-pushed
the
feat/aleo-abi-transitions
branch
from
May 8, 2026 21:52
17d5b8f to
b5cdc19
Compare
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
marshacb
marked this pull request as ready for review
May 8, 2026 21:52
iamalwaysuncomfortable
left a comment
Member
There was a problem hiding this comment.
Quick question, shouldn't executeContract provide transition outputs in the case of rpc clients as well?
iamalwaysuncomfortable
requested changes
May 11, 2026
iamalwaysuncomfortable
left a comment
Member
There was a problem hiding this comment.
Some mild changes requested to keep behavior consistent.
Comment on lines
+343
to
+349
| /** | ||
| * Extract per-transition output strings from a transaction, decrypting owned records. | ||
| * Returns structured transitions + flat outputs for backwards compat. | ||
| */ | ||
| function extractTransitions(tx: any): { transitions: RawTransitionResult[]; outputs: string[] } { | ||
| const rawTransitions: RawTransitionResult[] = [] | ||
| const allOutputs: string[] = [] |
There was a problem hiding this comment.
Two comments here on behavioral predictability
- RPC based invocations of
executeContractshould also return the outputs and the transitions so that the behavior is consistent no matter what the client invoking it is. - I think
executeTransactionpoints towriteContractin the wallet client, but points toexecuteContractin the SDK version here. We should make sure that in the SDK version it also points towriteContractto keep the behavior the same (and with the method in the wallet adapter).
7 tasks
- RPC path now polls for confirmation and walks transitions itself, returning
the same {transactionId, transitions, outputs} shape as the local path. The
SDK does not ask the wallet to decrypt — record outputs surface as raw
record1... ciphertexts on the RPC path.
- executeTransaction aliased to writeContract everywhere (matches the Aleo
wallet adapter spec); the full-lifecycle action lives as executeContract.
- outputs is the called function's transition only on both paths; inner
cross-program transitions are surfaced via transitions[].
- Extract waitForConfirmation and extractTransitions to shared core utilities.
Position-based top-level identification replaces name matching.
iamalwaysuncomfortable
approved these changes
May 13, 2026
iamalwaysuncomfortable
added a commit
that referenced
this pull request
May 13, 2026
* init types/tests * adding storage variable parsing from aleo ABI * remove extra loop for vec storage var checking * Add contract runtime layer: record serialization, execution actions, and RecordFieldValue.type (#39) * Add contract runtime utilities: parseRecordPlaintext, toPlaintext, encodeInputs, simulateContract, executeContract, and RecordFieldValue.type for round-trip serialization * Add contract runtime layer: record serialization, input encoding, simulateContract, executeTransaction, and RecordFieldValue.type for round-trip support * Rename toPlaintext to toString, scope ExecuteResult.outputs to top-level function * Add program and recordName to RecordValue, rename toPlaintext to toString, scope ExecuteResult.outputs to top-level function * Add ABI-aware helpers (getRecordDef, getInputTypes, ABI overloads), Leo compiler format normalization in parseAbi, and serializeRecord alias * Implement execute lifecycle: local proving, delegated DPS, and fee handling (#46) * Implement execute lifecycle: local proving + delegated DPS, fee conversion, confirmation polling, and end-to-end integration tests * Use TransactionJSON from SDK instead of inline type for transaction output extraction * Add @veil/codegen: typed contract factories with named params, typed returns, and simulate/execute proxies (#45) * Add @veil/codegen package: generate TypeScript types, record mappers, and function I/O types from Aleo program ABIs * Add typed contract factory generation to codegen (createXContract with embedded ABI) * Add typed contract interface with autocomplete for function and mapping names * Wire auto-encode inputs and auto-parse outputs into getContract proxies, accept ABI type, add comprehensive proxy tests * Update codegen to use InputValue/ParsedOutput types matching getContract proxy signatures * Handle unrecognized values gracefully in parseRecordPlaintextLoose * Generate named params and typed returns in contract factory (closes Ethereum UX gap for inputs and outputs) * Fix result.outputs reference bug and add _record support for record re-consumption in codegen * Fix generated type errors: cast plaintext outputs through unknown, narrow abi to ABI * Clean up generated code: remove unused imports, replace as any with indexed access types, add client validation, fix unused result in void wrappers * Use structs for ABI detection, remove references in comments * Re-implement simulate/execute in loadNetwork architecture, update integration tests for dynamic SDK pattern * Add loyalty-node example app (#43) * Add loyalty-node example app using @veil/core + @veil/provable with simulate support * Simplify loyalty-node app to use ABI-aware utilities (no manual loadAbi, getInputTypes, or recordToString) * Use generated contract factories with simulate proxies, add codegen dependency and generate script * Use auto-encode/auto-parse contract proxies with native values and RecordValue inputs * Use codegen named params and typed returns, remove manual helpers and output casts * Add read_state demo to showcase mapping reads and complete namespace coverage * Restructure demos around simulate/execute/read namespaces, add ALEO_PRIVATE_KEY env support * Fix toCredits precision, use funded SDK account, simplify execute demo to single on-chain step * Adapt loyalty-node to loadNetwork pattern, fix duplicate Input/Output exports * Add type-level ABI inference for getContract (#48) * Add type-level ABI inference for getContract: function/mapping name narrowing and typed namespaces * Map future/dynamicFuture to FutureValue in codegen instead of void * Add optional dynamicId to record types for RecordWithDynamicID and ExternalRecordWithDynamicID support * Add typed error classes for transaction lifecycle with error classification (#49) * Add typed error classes for transaction lifecycle: broadcast, proving, timeout, finalize, and duplicate errors * Address review feedback: options bag constructors, split record errors, ConfigurationError, lastError tracking, getStatus helper * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: mia <93600681+miazn@users.noreply.github.com> * Add per-transition output parsing to execute lifecycle (#54) * Add per-transition output parsing: structured transitions from execute with program/function metadata * Handle record_with_dynamic_id outputs in transition parser * Add dynamicId record output test for per-transition parsing * Align executeContract behavior across account types (#55) - RPC path now polls for confirmation and walks transitions itself, returning the same {transactionId, transitions, outputs} shape as the local path. The SDK does not ask the wallet to decrypt — record outputs surface as raw record1... ciphertexts on the RPC path. - executeTransaction aliased to writeContract everywhere (matches the Aleo wallet adapter spec); the full-lifecycle action lives as executeContract. - outputs is the called function's transition only on both paths; inner cross-program transitions are surfaced via transitions[]. - Extract waitForConfirmation and extractTransitions to shared core utilities. Position-based top-level identification replaces name matching. * Align codegen and inference integer types to bigint for all bit widths --------- Co-authored-by: Mike Turner <mike@provable.com> * Remove NetworkRecordProvider, use RecordScanner as sole scanning path (#56) * Return per-transition outputs from simulateContract (#57) * Return per-transition outputs from simulateContract - SimulateContractReturnType (and RawSimulateResult) now carries transitions[] alongside outputs, matching ExecuteContractReturnType's shape. outputs is the called function's transition only; inner cross-program transitions are surfaced via transitions[]. - Contract proxy's simulate.fn() now returns { transitions, outputs } with the same per-transition parsing as execute.fn() — same-program transitions parsed with the local ABI, foreign loose-parsed. - Provable's simulate uses programManager.buildAuthorization instead of programManager.run. The Authorization carries the transition list with outputs (same structure a confirmed Transaction has, minus the proof) and doesn't run a full circuit, so it's faster. Outputs flow through the shared extractTransitions with the local-account view-key decryptor. * Add cross-program Authorization integration test Surfaces a real wire-format gap: after `decryptTransition(tvk)`, `outputs(true)` returns JS-native values (`10`) instead of Aleo-typed strings (`'10u32'`). `transition.toString()` emits the same wire-format JSON the chain returns from `/transaction/confirmed/{id}`, so the simulate path now JSON.parses that for each transition before handing it to extractTransitions — outputs are consistent with the execute path. Test vectors (multiply_test.aleo / double_test.aleo) taken from the @provablehq/sdk JSDoc examples. --------- Signed-off-by: mia <93600681+miazn@users.noreply.github.com> Co-authored-by: marshacb <cameron.marshall12@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Mike Turner <mike@provable.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Structures execute results by transition instead of flattening all outputs into one array. Each transition includes its program, function, and outputs. Enables cross-program call output attribution (#13).
Depends on #48 and #49.