Skip to content

v3 - #4930

Draft
jxom wants to merge 374 commits into
mainfrom
v3
Draft

v3#4930
jxom wants to merge 374 commits into
mainfrom
v3

Conversation

@jxom

@jxom jxom commented Jul 30, 2026

Copy link
Copy Markdown
Member

npm i viem@next

jxom added 30 commits July 7, 2026 06:42
Lands Tempo accounts on ox primitives: secp256k1/P256/WebAuthn/WebCrypto
sources with root and access-key modes, keychain (v2) signature
enveloping, synthetic multisig accounts, voucher and key-authorization
signing, and access-key resolution.

signTransaction implements the core local-account shape: sign payloads
and wire formats come from the chain's transaction hooks (with
TxEnvelopeTempo defaults), so the account carries no serialization
logic; multisig requests return owner approvals over the multisig
digest. Cross-checked byte-for-byte against the v2 implementation.

Dependency-blocked v2 test ports are marked test.todo (convention added
to AGENTS.tmp.md); WebAuthn coverage now runs against a fake
authenticator built on ox, closing the earlier getCredential deferral.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Refreshes src-old, test-old, contracts-old, and site-old to
wevm/viem main @ 8cebc26 (v2.54.6). Brings in storage credits,
the updated multisig implementation, sponsored feeToken fixes,
client-less token call builders, encryptedDeposit.prepare,
receive-policy claimer validation, and getRawTransaction as the
new parity baseline.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Ports the main deltas that touch migrated modules: the storage-credits
precompile (ABI via a verbatim generator override — the interface is not
in the pinned node crates — plus address and selector map), the
previously missing tip20ChannelReserve address, client-less
resolveToken and the CallParameters/resolveCallParameters plumbing for
token call builders, the sponsored-multisig e2e case (as test.todo),
and the Mars Credit chain.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Ports upstream getRawTransaction (v2.54.5) into the transaction
namespace: returns the raw serialized transaction for a hash via
eth_getRawTransactionByHash, throwing Transaction.NotFoundError when
unknown. Also documents the existing EIP-1898 blockHash/requireCanonical
options on contract.read.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Chain request codecs were invoked via `z.decode`, which validates against
the codec's RPC side and rejects native inputs (bigint quantities); ox
`*ToRpc` codecs now plug in directly, and
`Chain.ExtractTransactionRequest` resolves the native request type from
`z.output`. `transaction.estimateGas` threads the chain request codec so
chain-specific fields reach the node. `transaction.prepare` respects
hook-modified `request.account` (multisig sender derivation) and no
longer feeds self-derived fees into its internal gas estimation (nodes
cap estimable gas by sender balance, breaking sponsored senders).

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Lands `chainConfig.ts` (RPC codecs over ox tempo primitives with a thin
client-concern adapter, envelope hooks with multisig combining and
fee-payer format selection, the full prepare hook, and signature-envelope
`verifyHash`), re-wires the tempo chain definitions (+ `hardfork`
fields), adds the `Chain.ts` alias module and `zones/zone.ts`, and gives
`Account.signTransaction` the local fee-payer co-sign branch (TIP-1
gas sponsorship). Bumps ox to 1.0.0-beta.14, which owns the tempo
request wire fields upstream. Adds the signing e2e node gate covering
root, access-key (secp256k1/p256/webAuthn), fee-token, expiring-nonce,
and sponsored flows; native multisig stays gated until the public node
image decodes the multisig signature envelope.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Port the TIP-20 token action namespace from v2: writes with sync
variants, reads, and event watchers, plus the Tempo client factory,
decorator, and `viem/tempo` entrypoint. Includes per-action docs
pages, harness updates for fee-token setup reuse, and widened
`Account.Account` to include multisig accounts.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Port the fee namespace (validateToken, user/validator token reads,
writes with sync variants, watchers) and the nonce namespace from v2.
The nonce actions drop the namespace echo (getNonce -> nonce.get,
watchNonceIncremented -> nonce.watchIncremented). Includes decorator
wiring with per-method JSDoc, per-action docs pages + sidebar groups,
and a registerValidator test-harness helper.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Port the fee-AMM, payment-channel, and stablecoin-DEX namespaces from
v2 (51 actions) with identical export sets. Pool ids are computed
directionally inline (fee-AMM ids are not pair-sorted), getPool reads
batch through the client instead of multicall, and channel.signVoucher
rides Account.signVoucher. Fixes found by the ported suites: channel
settle/close no longer leak the voucher signature into the transaction
request, and watchFlipOrderPlaced filters isFlipOrder client-side
(non-indexed args cannot be topic-filtered). Includes decorator wiring
with per-method JSDoc and per-action docs pages + sidebar groups.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Cut `as never` from 683 to 103 sites, every survivor verified
load-bearing. Union-of-actions dispatch now routes through shared
internal helpers (dispatchWrite/dispatchSend/estimateWrite/
simulateWrite) instead of per-file casts; either-or block selectors
thread conditional spreads; runtime-discriminated calls branch so each
arm typechecks. Fixes a real public inference bug: `strict: true` on
contract.getLogs/watchEvent/createEventFilter and event.createFilter
now narrows decoded `log.args` (the widened `strict | boolean`
property defeated generic pinning). Adds the "No `as never`"
convention to AGENTS.md.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Port the TIP-403 transfer-policy, receive-policy, and validator-config
namespaces from v2 (43 actions) with identical export sets, built on
the cast-free dispatch idiom. policy.create now honors an explicit
admin option (v2 silently used the sender). Unblocks and ports the dex
cancelStale test, which surfaced that fee transfers are now
policy-enforced (blacklisted senders must pay fees in another token).
Includes decorator wiring with per-method JSDoc and per-action docs
pages + sidebar groups.

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
- drop runtime z.RpcSchema usage from core action paths
- emit tempo abis aggregate as pure IIFE
- tempo transaction hooks delegate non-tempo shapes to core defaults

Amp-Thread-ID: https://ampcode.com/threads/T-019f3562-6191-707e-8402-ee011f40a8a0
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@paulmillr

Copy link
Copy Markdown
Contributor

@jxom packages are ready now. All are 2.3.0. Curves are post-audit.

* fix: accept partial logs in `extractEvent` helpers

EIP-5792 call receipts expose logs as `{ address, data, topics }`. These
wrappers required a full `Log.Log`, so decoding a batched receipt needed a cast
even though `AbiEvent.extractLogs` accepts the partial shape already.

Make them generic over the logs passed in, so the return keeps whatever
metadata the input carried.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix: accept partial logs in OP Stack & Earn extractors

Same widening as the `extractEvent` sweep, but these three surfaces need more
than a signature change.

`Earn` filters logs by emitting address before decoding, so its constraint
requires `address` and its `filter` carries a type predicate. Without it,
`filter` widens to the constraint and blurs metadata for full-log callers.

OP Stack declares its decoded-log types up front, so those gain a log type
parameter defaulting to `Log.Log`. `Deposit.getL2TransactionHashes` stays
pinned to full logs: its source hash is derived from `blockHash` & `logIndex`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: update changeset

* fix: accept partial logs in remaining extractors

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: jxom <7336481+jxom@users.noreply.github.com>
@socket-security

socket-security Bot commented Aug 10, 2026

Copy link
Copy Markdown

All alerts resolved. Learn more about Socket for GitHub.

This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored.

View full report

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
jxom and others added 2 commits August 14, 2026 15:50
* feat: add block header watcher (#4999)

* fix: complete block header watcher integration (#5001)

* chore: version package (#5000)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(tempo): bind encrypted deposits to sender (#5002)

* fix(tempo): bind encrypted deposits to sender

Co-authored-by: Derek Cofausper <256792747+decofe@users.noreply.github.com>

* ci: test sender-bound zone deposits

* ci: align Tempo and Zone fixtures

* test(tempo): routed T10 fixtures through encrypted deposits

* chore: logged local Zone provisioning stall

* chore: ignored unpatched extract-zip advisory

* fix(tempo): defaulted encrypted deposit sender

* ci: skipped Wagmi verification

* chore: remove friction log

---------

Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>
Co-authored-by: Derek Cofausper <256792747+decofe@users.noreply.github.com>
Co-authored-by: Steven Truong <struong@users.noreply.github.com>
Co-authored-by: jxom <7336481+jxom@users.noreply.github.com>

* chore: version package (#5003)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(siwe): reject unparseable expirationTime and notBefore (#4990)

* fix(siwe): reject unparseable expirationTime and notBefore

Invalid Date values from parseSiweMessage (e.g. Expiration Time: never)
are truthy, so comparisons like `time >= expirationTime` are always
false and lifetime / nbf checks were skipped. Fail closed when either
field is present but not a real date (sibling of thirdweb-dev/js#8875 /
supabase/auth#2688).

* fix(siwe): require EIP-4361 date-time strings and reject invalid time

Validate raw SIWE timestamps against the RFC 3339 profile before Date
coercion, and fail closed when the caller-supplied time is invalid so
lifetime comparisons cannot be skipped.

* fix(siwe): inline date validation

---------

Co-authored-by: jxom <7336481+jxom@users.noreply.github.com>

* fix: asset discovery in `simulateCalls` (#4997)

* fix(simulateCalls): discover assets from simulated logs

* refactor(simulateCalls): align asset discovery with repo conventions

* fix(simulateCalls): pin both asset-tracing passes to one base block

* test(simulateCalls): skip asset tracing on the pinned Anvil

* chore: update accessListHints comment

* fix(simulateCalls): preserve block tags and request errors

* fix(simulateCalls): harden asset trace discovery

* test: use reth for mainnet forks

* test(simulateCalls): run asset tracing against reth

* fix(simulateCalls): align asset trace simulations

* fix(simulateCalls): stabilize asset tracing

* chore: add static call source

* fix(simulateCalls): simplify asset tracing

* fix(simulateCalls): isolate asset balance probes

* fix(simulateCalls): align asset probe callers

* fix(simulateCalls): preserve pending block tag

* fix(simulateCalls): normalize transfer topics

* refactor(simulateCalls): remove redundant asset deduplication

* test(simulateCalls): cover asset tracing edge cases

* docs(simulateCalls): describe pending asset tracing

---------

Co-authored-by: jxom <7336481+jxom@users.noreply.github.com>

* fix: update nanoid security override

* fix: increase package size limits

* ci: remove docs deployment

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: struong <steven@tempo.xyz>
Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>
Co-authored-by: Derek Cofausper <256792747+decofe@users.noreply.github.com>
Co-authored-by: Steven Truong <struong@users.noreply.github.com>
Co-authored-by: Sash <sash@ela.city>
Co-authored-by: Ghadi <92851745+Ghadi8@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants