Skip to content

Arbitrum mainnet release#291

Merged
gianalarcon merged 18 commits into
mainfrom
develop
Jun 11, 2026
Merged

Arbitrum mainnet release#291
gianalarcon merged 18 commits into
mainfrom
develop

Conversation

@gianalarcon

@gianalarcon gianalarcon commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Task name here

Support arbitrum one in production

Types of change

  • Feature
  • Bug
  • Enhancement

Comments (optional)

gianalarcon and others added 18 commits June 5, 2026 11:54
* docs: add llms.txt intro page for AI agents (#256)

Add a GitBook-friendly page introducing PolyPay's llms.txt support so
non-technical readers can discover the feature and link AI agents to
the live playbook.

- New page docs/llms-txt-for-agents.md covering what llms.txt is, the
  live endpoint, the five integration flows it documents, two ways to
  wire an agent up, and compatibility notes.
- Add the page to docs/SUMMARY.md between x402 and Architecture.
- Fix stale api.polypay.xyz references in docs/x402-deposits.md to the
  real api.polypay.pro host.

* feat(x402): add Coinbase CDP bazaar deposit route for agentic.market listing (#260)

Adds a second x402 deposit endpoint /x402/bazaar/deposit/:multisig that
routes through Coinbase CDP facilitator instead of PayAI, so the resource
gets indexed in CDP discovery and surfaces on agentic.market.

The default /x402/deposit/:multisig path keeps using PayAI (better rate
limits, simpler auth) — no UI change. CDP path activates implicitly when
CDP_API_KEY_ID is set; otherwise it returns a clear config error.

CDP requires Ed25519 JWT signed per-request (2-min TTL), so the service
now lazy-imports @coinbase/x402 createAuthHeader to produce the
Authorization header. Payment requirements for the CDP path also embed a
declareDiscoveryExtension-shaped extensions.bazaar block (strict JSON
Schema), without which CDP would settle but not index.

Includes scripts/bazaar-bootstrap.ts to produce the first real settlement
that triggers CDP indexing — bootstrap must run against a deployed
backend (the resource URL ends up in the catalog).

Refs #259

---------

Co-authored-by: BoHsuu <115441679+Huygon764@users.noreply.github.com>
…ring

Add a Rust/WASM (Arbitrum Stylus) port of MetaMultiSigWallet and wire
Arbitrum Sepolia (421614) through shared, frontend and backend. The
contract is deployed and validated on-chain (Poseidon parity proven vs
the deployed PoseidonT3 library).

Per-account auto-deploy from the relayer is still open: the full contract
is ~29KB compressed, over the 24KB EVM limit, so cargo-stylus fragments
it and the single-bytecode StylusDeployer path can't be used. Options to
resume (proxy factory / CLI shell-out / manual) are documented in
packages/stylus/NOTES.md.
Wire Arbitrum Sepolia (421614) as a third destination chain alongside
Horizen and Base. Testnet only — zkVerify has no Arbitrum One verifier yet.

- Per-account multisig wallets via EIP-1167 proxy + shared Stylus impl,
  created on-chain by MetaMultiSigWalletStylusFactory.
- Stylus impl adds init() for the proxy pattern, plus an internal
  self-call dispatcher to work around the Stylus delegatecall + CALL
  msg.sender issue (see packages/stylus/NOTES.md).
- Custom 52-byte proxy variant of EIP-1167 that accepts plain ETH
  transfers (empty-calldata STOP) so cargo-stylus's fragmented loader
  doesn't revert deposits.
- Backend relayer routes Stylus-chain deploys through the factory;
  zkVerify aggregation domain 4 wired for chain 421614.
- Frontend network picker + sidebar surface Arbitrum Sepolia on testnet.
- Shared config carries impl/factory addresses + Circle USDC for 421614.
- Fix prisma findUnique by address_chainId in add/remove signer handlers
  (existing bug surfaced by the new chain).
- New docs/arbitrum-stylus.md user guide covering flows, limitations
  (add/remove signer broken, 6h aggregation cadence, MetaMask Blockaid
  warning) and on-chain addresses.
Reduces flaky "Invalid proof" reverts on execute() when Kurier marks a
proof aggregated but the receipt hasn't been published to the destination
chain yet. The 40s heuristic was occasionally too tight for Horizen
testnet under load.
Add packages/stylus-factory — a Rust/Stylus port of the Solidity
MetaMultiSigWalletStylusFactory. Emits byte-identical 62-byte proxy
bytecode (unit test in src/lib.rs guards against drift), so accounts
created by either factory are indistinguishable on-chain. The new
factory is the one wired into shared/contracts-config.ts; the Solidity
factory is no longer referenced from app code.

The accompanying NOTES.md update explains why Poseidon hashing inside
the Stylus impl is not feasible without breaking the Noir circuit
(only Stylus-native Poseidon library — OpenZeppelin — is Poseidon2,
incompatible) and stays as a STATICCALL to the on-chain PoseidonT3
Solidity library.
The log line hardcoded "40s" but CROSS_CHAIN_FINALIZATION_WAIT is now
120s, so the message was misleading. Interpolate the constant so the
logged duration stays in sync with the actual wait.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Revert the global bump to 2min — 40s is the value develop runs in
production and works reliably for Horizen and Base. zkVerify reduced
Arbitrum Sepolia aggregation time, so the existing 40s post-aggregation
wait is sufficient there too; no need to slow every chain to 2min.

The finalization log still derives its duration from the constant, so it
now correctly reports 40s.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
zkVerify reduced Arbitrum Sepolia aggregation from ~6h to ~2 min, so the
"can sit pending for hours / prefer Horizen for fast demos" caveat no
longer applies. Reframe the section as a normal note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Removes the daily relayer low-balance Telegram alert and its orphaned
config wiring. This is replaced by an external scheduled agent that
checks the relayer balance on Base + Horizen mainnet (plus ETH/BTC
prices) and posts to Telegram.

- Delete src/balance-alert/* (module, scheduler, TelegramService)
- Unregister BalanceAlertModule from app.module; keep ScheduleModule
  (still used by transaction-reconciler + price schedulers)
- Delete src/config/telegram.config.ts and drop its load entry
- Remove TELEGRAM_* config keys, env validation, and .env.example block

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add Arbitrum One as a Stylus chain across shared/backend/frontend (chain
def, contracts-config entry, STYLUS_CHAIN_IDS, native USDC, zkVerify
domain 10). Introduce a shared CHAIN_IDS single source of truth and reuse
it in token.ts and ChooseNetwork. Add the mainnet deploy script and the
hardhat arbitrum public-RPC fix.

Deploy is deferred: the Stylus impl (31202 bytes) exceeds Arbitrum One's
24576-byte code-size limit until ArbOS 60 lands there. See
packages/stylus/NOTES.md.
The full impl was 31202 bytes (2 fragments), over Arbitrum One's 24576-byte
Stylus code-size limit, so it only deployed on Arbitrum Sepolia (ArbOS 60).
Slimmed to 24295 bytes (1 fragment) so it deploys on Arbitrum One today:

- Drop on-chain events (Deposit/TransactionExecuted/Owner); the app tracks txs
  via the backend DB + relayer, not on-chain logs, so no functional impact.
  Largest saving (~6KB of alloy event encoding).
- Hand-roll the PoseidonT3 and zkVerify STATICCALLs instead of sol_interface
  bindings (internal only, no ABI change).

Kept: execute (same ABI), transfer, batch, signer management, getters, proof
verification. Deployed and tested (transfer/batch) on Arbitrum Sepolia and
Arbitrum One. Revert plan (restore events when ArbOS 60 lands on Arbitrum One)
in packages/stylus/NOTES.md.
The PriceScheduler captured the weekly ZEN price solely to feed the
Quest/Reward payout flow, which is disabled. Unregister it from
PriceModule so its Friday cron no longer runs. The scheduler file and
PriceService capture methods are kept for future reuse; the live
GET /prices endpoint is unaffected.
docs(arbitrum): document Arbitrum One mainnet support
Update docs
The impl is now 24295 bytes (single fragment, under the 24 KiB limit), not
~29-31 KB / fragmented. Update the comments in MetaMultiSigWalletStylus.ts,
relayer-wallet.service.ts, contracts-config.ts, stylus lib.rs / factory and
README that still described the old fragmented impl and the reverted Poseidon
experiment; the per-account proxy rationale is now framed as cost.
@gianalarcon gianalarcon merged commit 774b932 into main Jun 11, 2026
6 checks passed
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