Repository navigation
feat(server): escrow relay foundations: protocol, config, envelope codec and RPC (#96) - #126
Merged
TOMOKI977 merged 25 commits intoOct 8, 2026
Merged
Conversation
Narrow rules scoped by file path and line shape for env var name constants, generated class-name lookups and recorded ledger keys. Migrates the existing allowlist to [[allowlists]], which cannot be mixed with the deprecated [allowlist].
Adds PreparedTransaction, CreateHireResult, HireDetail, Hire, Payment and Puls3ApiException, the escrow_preparation table and the requestId, input and jobId columns of hire. Part of #96.
Reads the preparation validity, inclusion fee and platform fee from the environment with no defaults (ADR-0005 D3). Documents the keys in .env.example. Part of #96.
Defines how the relay decodes, compares and re-encodes a transaction envelope. Part of #96.
…opes Adds stellar_dart and crypto. The spike decodes recorded testnet envelopes, re-encodes them byte for byte and checks the network hash and the ed25519 signature. Part of #96.
Decodes a signed envelope, compares it field by field with its preparation (contract, function, arguments, source, time bounds) and verifies the signature. Part of #96.
Adds account sequence lookup and the simulate, send and get-transaction calls that carry an unsigned or signed envelope. Part of #96.
A new preparation supersedes the previous one, and each preparation has at most one submission, proven by a Postgres race test. Part of #96.
Gives the relay its view of a hire: idempotency key, input and escrow job id, with a hire having no status until create_job is confirmed. Part of #96.
prepareCreateJob, prepareFund, prepareComplete and prepareReject build, simulate and store an unsigned envelope. A new preparation supersedes the previous one, and the configuration has no defaults. Part of #96.
submitEscrowCall checks the signed envelope against its preparation, stores a ChainSubmission as submitted and only then sends it. Chain outcomes never throw, and a repeated submit returns the existing record. Part of #96.
HireEscrowEffects.onJobCreated binds the job id once and opens the hire. Part of #96.
createHire returns the hire with an unsigned create_job, and a repeated requestId from the same wallet returns the same hire or IdempotencyKeyReused. Part of #96.
createHire, prepareCreateJob, prepareFund, prepareComplete, prepareReject and submitEscrowCall, each behind requireLogin through an injectable SessionWallet. The production default fails closed with AuthenticationUnavailable until wallet sessions land (#25). Regenerates the endpoint and client. Part of #96.
Lists ChainDataUnavailable for submitEscrowCall, drops the TypeScript sidecar from the ADRs and documents the config keys and the end-to-end run. Part of #96.
Runs the real endpoint, services, codec, RPC client and chain tracker against testnet. The consumer key stays in the process environment. Part of #96.
This was referenced Oct 8, 2026
5 tasks done
moises-cisneros
changed the base branch from
feat/96-escrow-relay-03-stellar-codec
to
feat/96-escrow-relay
October 8, 2026 16:59
4 of 9 tasks
This was referenced Oct 8, 2026
TOMOKI977
approved these changes
Oct 8, 2026
TOMOKI977
left a comment
Contributor
There was a problem hiding this comment.
Approved. This slice is part of the code I reviewed in full on #119 at b0a4adc (all four lenses; see the review there). I checked that the tip of the chain matches b0a4adc except for the CI fix in .env.example and .gitleaks.toml (and main's #112). The follow-ups listed on #119 apply to the chain as a whole.
TOMOKI977
pushed a commit
that referenced
this pull request
Oct 8, 2026
Closes #96. Server-side relay (api.md Decision A): HireEndpoint with idempotent createHire, prepareCreateJob/prepareFund/prepareComplete/prepareReject that build unsigned Soroban envelopes, and submitEscrowCall that verifies the signed envelope byte for byte, checks the ed25519 signature against the session wallet, stores a submitted ChainSubmission and sends it for the chain tracker. Session wallet fails closed until #25. Includes the testnet e2e tool (tool/e2e_relay_testnet.dart), docs and the OpenSpec archive. Reviewed as #119; landed through the chain #126, #129, #132, #134.
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.
Refs #96
Part of the chain that replaces #119, split after its review. Tracker: #122. Regrouped from a first 12 PR split (#123, #124, #125 were folded into this one).
Summary
Everything the relay stands on, with no behavior yet: the protocol models and the
escrow_preparationtable (with generated code and migration), the relay configuration without defaults (ADR-0005 D3), the XDR encoder, theEnvelopeCodeccontract with itsstellar_dartimplementation (field by field comparison and ed25519 verification, backed by a spike on recorded testnet envelopes), and the Soroban RPC calls (sequence, simulate, send, get transaction). Also the CI fixes from the review of #119: the three variables in.env.exampleand narrow gitleaks allowlists.Acceptance criteria
The chain as a whole covers #96; this PR carries its slice (see Scope below).
prepare…andsubmitEscrowCall(proven in the docs PR)submit…call never throws for chain outcomesChainSubmissionVerification evidence
Notes for reviewers
feat/96-escrow-relay), notmain. The commits are ordered to be read one by one.size:exception.Chain Context
feat/96-escrow-relayfeat/96-escrow-relayHireRelayConfig,SessionWallet, XDR encoder, envelope codec, RPC calls,.env.example,.gitleaks.toml, with their tests.Chain Overview
Scope
HireRelayConfig,SessionWallet, XDR encoder, envelope codec, RPC calls,.env.example,.gitleaks.toml, with their tests.Autonomy