Skip to content

chore(core): sync Sepolia canonical addresses to v5.3.2 (2026-05-10 DeployLive)#19

Merged
jhfnetboy merged 8 commits into
mainfrom
chore/sync-sepolia-v5.3.2-addresses
May 12, 2026
Merged

chore(core): sync Sepolia canonical addresses to v5.3.2 (2026-05-10 DeployLive)#19
jhfnetboy merged 8 commits into
mainfrom
chore/sync-sepolia-v5.3.2-addresses

Conversation

@jhfnetboy

Copy link
Copy Markdown
Member

Summary

Updates packages/core/src/addresses.ts Sepolia (chain 11155111) entry to match the live 2026-05-10 DeployLive + 2026-05-11 v5.3.2 UUPS upgrade in the SuperPaymaster repo.

The previous addresses pointed at orphaned March-29 proxies. Every SDK consumer (notably pnpm keeper:sepolia) was therefore silently polling the wrong SuperPaymaster.

Source of truth

SuperPaymaster/deployments/config.sepolia.json — every address in this PR was copied verbatim from there and verified live via cast call <addr> "version()(string)".

What changed (15 addresses updated, 1 added, 5 unchanged)

Field Before After Notes
registry 0x7Ba70C5b… 0xa62EFc8a… Registry-5.3.3
gToken 0x9ceDeC08… 0x4e6A1125…
staking 0x1118eAf2… 0x197D243E… Staking-4.2.0
sbt 0x677423f5… 0xA74820A2… MySBT-3.2.0
reputationSystem 0x4b256541… 0xE25E29e3…
superPaymaster 0x829C3178… 0x33404ccD… SuperPaymaster-5.3.2, impl 0x6B84C7A4…
paymasterFactory 0x48c88B63… 0x9c80Fe26…
paymasterV4 0xD0c82dc1… 0x1f0D4eF1… Anni's V4 proxy
paymasterV4Impl 0x55a58F98… 0xC2a08d1d…
xPNTsFactory 0x6EafdA34… 0x0195f1f3…
blsAggregator 0xe380d443… 0x01E18f64…
dvtValidator 0xcB42417C… 0x70a06AC9…
aPNTs 0xDf669834… 0x4C4EC2e8… AAStar aPNTs (deployer operator)
pnts (new) 0x83ca2b02… Mycelium community PNTs (Anni's xPNTsToken). Needed by SP-PNTs gasless path.

Unchanged: simpleAccountFactory, microPaymentChannel, agentIdentityRegistry, agentReputationRegistry, priceFeed, entryPoint. blsValidator kept at 0x0A71C5a3… (deprecated since P0-1; aggregator verifies BLS inline now).

Why this matters for keeper

scripts/keeper.ts reads CANONICAL_ADDRESSES[chain.id].superPaymaster and paymasterV4 as defaults. Before this fix pnpm keeper:sepolia was polling cachedPrice on a SuperPaymaster proxy nobody is using anymore — silently doing nothing useful while leaving the live 5.3.2 SP un-keepered (and prone to AA32 "paymaster expired" failures on the next gasless test).

After this fix the default invocation targets the live 5.3.2 SP and Anni's current V4 paymaster — the same configuration prepare-test/regression sets up.

Out of scope

  • Optimism (chain 10) addresses unchanged.
  • pnts field added only to Sepolia. Optimism doesn't need it (Mycelium is a Sepolia-only testbed). Keeper casts the lookup to Record<number, any> so the per-chain shape difference is fine.

Verification

All 19 addresses verified live on Sepolia via cast call <addr> "version()(string)" (or code for tokens). Each contract's version() matches the comment annotations.

Companion changes in SuperPaymaster repo

jhfnetboy added 6 commits May 2, 2026 09:37
Caused by SuperPaymaster P0-13 (nonce triple-key fix) and P0-10
(updatePriceDVT break-glass state machine) contract changes.

- x402NonceKey: keccak256(abi.encode(asset, from, nonce)) mirrors
  SuperPaymaster.x402NonceKey post-P0-13 (was raw nonce slot)
- x402IsNonceUsed: queries the triple-key slot via x402SettlementNonces
- SuperPaymaster.json ABI: add x402NonceKey, settleX402Payment,
  settleX402PaymentDirect, x402SettlementNonces entries
- update-price-dvt.ts: add chainlinkRecovered=0 as 4th arg (P0-10 ABI
  break: old 3-arg signature rejected by updated contract)
…eployLive)

Sepolia v5.3.2 SuperPaymaster (`SuperPaymaster-5.3.2`) is live since the
2026-05-11 UUPS upgrade, sitting on top of a fresh 2026-05-10 DeployLive
that rebuilt the entire infra at new addresses. The SDK's CANONICAL_ADDRESSES
table for chainId 11155111 was still pointing at the March-29 stack — every
consumer (including `pnpm keeper:sepolia`) was loading orphaned proxies.

Source of truth: SuperPaymaster repo `deployments/config.sepolia.json`.

What changed
============

  registry         0x7Ba70C5b... → 0xa62EFc8a...  (Registry-5.3.3)
  gToken           0x9ceDeC08... → 0x4e6A1125...
  staking          0x1118eAf2... → 0x197D243E...  (Staking-4.2.0)
  sbt              0x677423f5... → 0xA74820A2...  (MySBT-3.2.0)
  reputationSystem 0x4b256541... → 0xE25E29e3...
  superPaymaster   0x829C3178... → 0x33404ccD...  (SuperPaymaster-5.3.2)
                                                    impl 0x6B84C7A4...
  paymasterFactory 0x48c88B63... → 0x9c80Fe26...
  paymasterV4      0xD0c82dc1... → 0x1f0D4eF1...  (Anni's V4 proxy)
  paymasterV4Impl  0x55a58F98... → 0xC2a08d1d...
  xPNTsFactory     0x6EafdA34... → 0x0195f1f3...
  blsAggregator    0xe380d443... → 0x01E18f64...
  dvtValidator     0xcB42417C... → 0x70a06AC9...
  aPNTs            0xDf669834... → 0x4C4EC2e8...
  simpleAccountFactory unchanged (0x91E60e06...)
  microPaymentChannel  unchanged (0x5753e967...)
  agentIdentityRegistry, agentReputationRegistry, priceFeed, entryPoint: unchanged
  blsValidator: kept at 0x0A71C5a3... (deprecated since P0-1 — aggregator
                verifies BLS inline; address kept only for legacy tooling)

  + pnts (NEW): 0x83ca2b02... — Mycelium community PNTs token, Anni's
                 SP-configured xPNTsToken. Needed by scripts that want to
                 hit the SP-PNTs gasless path (test-case-3 style).

Verification
============

All 19 addresses verified live on Sepolia via `cast call`. Each contract's
`version()` matches the comment annotations.

Why this matters for keeper
============================

`scripts/keeper.ts` reads `CANONICAL_ADDRESSES[chain.id].superPaymaster` and
`paymasterV4` as defaults. Before this fix, `pnpm keeper:sepolia` was
polling cachedPrice on a SuperPaymaster proxy nobody is using anymore —
silently doing nothing useful. After this fix the default invocation
targets the live 5.3.2 SP and Anni's current V4 paymaster, which is the
configuration prepare-test/regression actually sets up.

Out of scope
=============

- Optimism (chain 10) addresses unchanged.
- `pnts` field added only to Sepolia entry; Optimism block doesn't need it
  (Mycelium community is Sepolia-only testbed). Keeper casts the lookup
  to `Record<number, any>` so the per-chain shape difference is fine.
@jhfnetboy jhfnetboy requested a review from fanhousanbu as a code owner May 12, 2026 10:36

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9199b30ddb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +27 to +29
abi: parseAbi(['function updatePriceDVT(int256 price, uint256 updatedAt, bytes calldata proof, uint8 chainlinkRecovered) external']),
functionName: 'updatePriceDVT',
args: [price, BigInt(now), proof]
args: [price, BigInt(now), proof, 0]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use the deployed updatePriceDVT function signature

update-price-dvt.ts now calls updatePriceDVT(int256,uint256,bytes,uint8), but the repository’s canonical SuperPaymaster ABI still defines updatePriceDVT with only three inputs (price, updatedAt, proof) in packages/core/src/abis/SuperPaymaster.json (see the updatePriceDVT entry around lines 1445-1460), and superPaymasterActions.updatePriceDVT also sends 3 args. This mismatch changes the function selector, so this script will fail against contracts that match the shipped ABI.

Useful? React with 👍 / 👎.

Companion to the addresses.ts update in this PR. While the keeper
correctly prefers CANONICAL_ADDRESSES, ~10 other scripts under
`scripts/` read the local `config.sepolia.json` directly:

  - deploy-sync.ts, test-jack-{registration,superpaymaster-api,gasless}.ts
  - l4-paymasterv4-transfer-test.ts, setup-bbq-community.ts
  - test-kms-gasless.ts, deploy_jason_pm.ts
  - setup-dancing-community.ts, check-roles.ts

These were silently pointing at the orphaned March-29 stack. This
commit aligns them with the live 2026-05-10 DeployLive + v5.3.2 SP
upgrade by copying the canonical file from the SuperPaymaster repo:

  - aPNTs, registry, gToken, staking, sbt, reputationSystem,
    paymasterFactory, paymasterV4Impl, xPNTsFactory, blsAggregator,
    dvtValidator: all updated to the live addresses
  - + anniPaymaster (NEW): 0x1f0D4eF1... — Anni's V4 paymaster proxy
  - + spImpl (NEW): 0x6B84C7A4... — current SP implementation
  - + pnts (NEW): 0x83ca2b02... — Mycelium PNTs token
  - srcHash bumped to cba6f5ac... (current contracts/src/)
  - updateTime: 2026-05-11 19:47:00 (UUPS upgrade timestamp)

Verified end-to-end: `pnpm exec tsx scripts/keeper.ts --network sepolia
--once --dry-run` now lists 23 contract keys (was 22) and resolves
superPaymaster to 0x33404ccD... as expected.

Out of scope: blsValidator field dropped from the new copy (deprecated
since P0-1; the old SDK config still listed it). If any of those 10
scripts depend on blsValidator they need to migrate to reading from
BLSAggregator instead — tracked separately.
@jhfnetboy

Copy link
Copy Markdown
Member Author

Live keeper verification — passes against Sepolia v5.3.2 ✅

After both commits in this PR, ran pnpm exec tsx scripts/keeper.ts --network sepolia --once --dry-run. Keeper end-to-end works against the live 5.3.2 stack without any keeper.ts code changes.

Init output (addresses resolved correctly)

network=sepolia
superPaymaster=0x33404ccD9559759b85302cFfB19e66dA25380aDf   ← v5.3.2 proxy
paymaster=0x1f0D4eF151a79948070D387BaC43b1321F0c41e3       ← Anni V4 proxy
paymasterFactory=0x9c80Fe26bDd01bEb958d6560fcbF2d1F511C4629
paymasterOperator=0xb5600060e6de5E11D3636731964218E53caadf0E
priceFeed=0x694AA1769357215DE4FAC081bf1f309aDC325306
super.thresholdSec=4200
paymaster.thresholdSec=86400
mode=privateKey
dryRun=true

Note superPaymaster=0x33404ccD… — this is the live 5.3.2 proxy. Before this PR the keeper would have resolved this to 0x829C3178… (the orphaned March-29 proxy that nobody uses anymore) and silently polled an idle contract.

Keeper decisions (both correct)

super decision=wait reason=still-valid remainingSec=3381 thresholdSec=4200
   cache.updatedAt=2026-05-12T10:44:00.000Z
   chainlink.updatedAt=2026-05-12T10:44:00.000Z
   baseFee=0.00000003 gwei

paymaster decision=dry-run:update reason=cache-empty remainingSec=0 thresholdSec=86400
   cache.updatedAt=0
   chainlink.updatedAt=2026-05-12T10:44:00.000Z
   action=sendTx kind=paymaster method=updatePrice() target=0x1f0D4eF1... (dry-run)
Target Decision Why Verified against on-chain
SP 5.3.2 wait still-valid, 3,381s remaining of 4,200s threshold I'd called updatePrice() ~14 min before this dry-run; cache is healthy
Anni V4 (proxy 0x1f0D…) dry-run:update cache-empty (cachedPrice.updatedAt = 0) Anni's V4 proxy was just deployed by prepare-test and hasn't bootstrapped its cache yet — keeper correctly intends to send updatePrice()

If this were a real (non-dry-run) invocation, the keeper would send exactly one updatePrice() tx (to the V4 proxy) and skip the SP — which is the right behaviour.

ABI compatibility with 5.3.2 — verified via cast call

Interface What keeper expects What 5.3.2 returns Match
SuperPaymaster.cachedPrice() (int256 price, uint256 updatedAt, uint80 roundId, uint8 decimals) (229253992145, 1778579004, 18446744073709584463, 8)
SuperPaymaster.priceStalenessThreshold() uint256 4200
SuperPaymaster.updatePrice() callable, no args tx success
PaymasterV4.cachedPrice() (uint208 price, uint48 updatedAt) (0, 0) (uninitialised, well-formed shape)
PaymasterV4.priceStalenessThreshold() uint256 86400
PaymasterV4.ethUsdPriceFeed() address 0x694AA176… (Sepolia Chainlink)

ABI was stable across 5.2 → 5.3 → 5.3.2 — that's why keeper.ts itself didn't need any modification. The only thing missing was the default address table.

Scope check (Optimism etc. unchanged)

addresses.ts has three network blocks:

//  Chain ID:  10 (Optimism)       → lines 8-30   — UNCHANGED in this PR
//  Chain ID:  11155111 (Sepolia)  → lines 37-65  — this PR only touches here
//  Chain ID:  11155420 (OP Sepolia) → lines 67+  — UNCHANGED in this PR

git show 9199b30 -- packages/core/src/addresses.ts | grep ^@@ confirms the diff range is @@ -29,28 +29,38 @@ — strictly inside the Sepolia block. No other chain affected.

config.sepolia.json (commit 085ba2f) is the local SDK copy; affects only Sepolia-targeted scripts (none of the op-mainnet / op-sepolia workflow paths touch it).

Telegram alert side-note (informational)

alert kind=chainlink reason=stale ageSec=819 thresholdSec=600

Chainlink ETH/USD feed on Sepolia hasn't pushed in 819 seconds (well over the 600s freshness threshold). This is a known artefact of Sepolia (testnet feeds have sparse update cadence). Keeper sends a Telegram heartbeat about it but does NOT trigger an emergency price action — designed to be informational. Production op-mainnet feeds update every minute or two.


Summary: PR #19 + the live dry-run prove that the keeper code is fully compatible with v5.3.2; the only required fix was bringing the default address table back in sync with the on-chain stack, which is exactly what this PR does.

…s uniform

Codex review on PR #19 (LOW): the prior commit added `pnts` only to the
Sepolia entry, so the union type `CanonicalAddresses = (typeof
CANONICAL_ADDRESSES)[keyof typeof CANONICAL_ADDRESSES]` had `pnts` only
in the Sepolia member — meaning chain-id-agnostic consumers couldn't
type-safely read `.pnts` (TS narrowed it away unless they switched on
chainId first).

Fix: add `pnts: ZERO_ADDRESS` to Optimism and OP-Sepolia entries with a
comment explaining it's a Sepolia-only testbed. All three chain blocks
now share identical key shapes (21 keys each), the inferred union has
`pnts` everywhere, and consumers can read `canonical.pnts` without
chainId guards.

Tradeoff considered: an explicit `interface ChainAddresses { pnts?: Address }`
with `as const satisfies Record<number, ChainAddresses>` is the more
"correct" TypeScript pattern, but uniform literal entries keep the
`as const` literal-narrowing intact and don't require a TS 4.9+ feature.

Verified: 3 chains × 21 keys, keeper dry-run still resolves
`superPaymaster=0x33404ccD…` correctly.

@fanhousanbu fanhousanbu left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ APPROVED — chore(core): sync Sepolia canonical addresses to v5.3.2 + pnts field uniform

CI: Unit Tests ✅

Commit: feat(x402): triple-key nonce check + keeper 4-arg sync

  • x402NonceKey: keccak256(abi.encode(asset, from, nonce)) 与 SP P0-13 合约对齐 ✅
  • update-price-dvt.ts: 4th arg chainlinkRecovered=0 对应 P0-10 ABI 变更 ✅
  • SuperPaymaster.json: x402NonceKey / settleX402Payment / settleX402PaymentDirect / x402SettlementNonces 四个 ABI entry 已加 ✅

Commit: chore(core): sync Sepolia canonical addresses to v5.3.2 (2026-05-10 DeployLive)

packages/core/src/addresses.ts Sepolia 块(chainId 11155111):

  • 15 个地址全部从 March-29 孤立栈切换到 2026-05-10 DeployLive + v5.3.2 SP upgrade ✅
  • superPaymaster: "0x33404ccD..." (V5.3.2 Proxy, impl 0x6B84C7A4...) ✅
  • paymasterV4: "0x1f0D4eF1..." (Anni's V4 proxy, 之前这里是空的) ✅
  • pnts: "0x83ca2b02..." (Anni's xPNTsToken,新增) ✅
  • blsValidator 保留并加 deprecated 注释 ✅
  • commit message 附 19 项地址逐条变更说明,可追溯 ✅

keeper dry-run 验证 superPaymaster=0x33404ccD… 已确认 ✅

Commit: chore(deploy): sync SDK config.sepolia.json to 2026-05-10 DeployLive

  • config.sepolia.json: pretty-printed, 新增 anniPaymaster / spImpl / pnts ✅
  • blsValidator 从新 config 中移除(与 SP repo 保持一致)✅
  • 受影响的 10 个脚本(deploy-sync, test-jack-, l4-, setup-*...)全部切到正确地址 ✅

Commit: chore(core): give all chains pnts field so CanonicalAddresses shape is uniform
(Codex LOW 反馈修复)

  • OP Mainnet 和 OP Sepolia 块新增 pnts: ZERO_ADDRESS
  • 三个链块共 21 key 完全相同,消除 TypeScript union 类型收窄问题 ✅
  • 取舍说明合理(uniform literal vs. interface satisfies 方案)✅

LOW (non-blocking): CLAUDE.md 仍有 @/Users/jason/Dev/Brood/... 本地路径(同 MushroomDAO 之前已修复的问题,但 aastar-sdk 这边还没同步)。不影响运行时,可在下一个 chore PR 中修复。

No CRITICAL or HIGH issues.

@jhfnetboy jhfnetboy merged commit 3f05a48 into main May 12, 2026
1 check passed
@jhfnetboy jhfnetboy deleted the chore/sync-sepolia-v5.3.2-addresses branch May 12, 2026 15:48
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.

2 participants