Verification log
Every write path must be exercised on testnet (46630) first and then with a tiny mainnet (4663) proof. Hashes are recorded here. Read paths are verified against the live chain as part of the build.
Verified live (read paths), 2026-09-22
| Check | Result | Evidence |
|---|---|---|
| Chain ids | 4663 mainnet, 46630 testnet | eth_chainId on both official RPCs |
| Multicall3, Permit2 bytecode | present on both chains | eth_getCode |
| USDG total supply | 719,115,878.71 USDG | packages/chain smoke script, block 69713865 |
| Uniswap v4 quote ETH to USDG | 0.01 ETH = 27.4157 USDG (pool fee 3000, tickSpacing 60) | pnpm --filter @talon/chain smoke 4663 |
| Pons factory config | launch fee 0.0005 ETH, config 0 enabled, phantom 1.68 ETH, graduation 4.2 ETH, pool fee 0 / tickSpacing 200, creator tax cap 10% | packages/chain/scripts/pons-probe.ts |
| Pons hook | factory.memeHook() = 0xe5e7...6044 | same |
| Pons curve buy math | simulated buy(0.01 ETH) = 5,740,664 tokens, formula = 5,740,671 | eth_call with state override on curve 0xa4f4...3e9e |
| Pons curve ABI selectors | all 46 selectors match live bytecode | packages/chain/test/pons.test.ts |
| Launch activity | 278 TokenLaunched events in 20,000 blocks (~33 min) | eth_getLogs on the factory |
Automated checks (2026-09-22)
| Suite | Result |
|---|---|
pnpm typecheck | 13 packages clean |
pnpm test | 379 passed, 2 skipped (live RPC tests, run with TALON_LIVE_TESTS=1) |
pnpm lint | 368 files clean |
pnpm build | api, worker, mcp, cli, telegram, web all build; web renders 22 static pages with no API running |
forge test | 52 passed, 100% coverage on contracts/src |
| API boot without DB | /health reports 503 { db: "error" }, OpenAPI serves 73 paths |
| Live market read | token_lookup against mainnet resolves USDG and a fresh Pons launch (TALON_LIVE_TESTS=1) |
End-to-end (connect a wallet and sign in, create agent, fund, chat, swap) has not been run because this machine has no Postgres or Redis and no Docker. Run pnpm infra:up on a machine with Docker, or point DATABASE_URL / REDIS_URL at the Railway Postgres and Redis services, then follow the steps below.
Contracts
| Network | FeeSplitterFactory | Deploy tx | Status |
|---|---|---|---|
| 46630 testnet | Blocked: needs a funded deployer key. Run contracts/README.md deploy steps with DEPLOYER_PRIVATE_KEY and PLATFORM_ADDRESS, then fill this row and packages/chain/src/addresses/46630.ts. | ||
| 4663 mainnet | 0x1F911e9f1c6caF205af99749c12726A7478Fee92 (v2) | 0xb3fa021f5263f4cbb0ccfb13ac3f163214edeacb25f15d63da542bf13fdc04b6 | Deployed 2026-10-03, block 78911117, 1,206,857 gas. Runtime bytecode matches the build with the platform and escrow immutables masked; platform() = 0xEF235b874a7BC1dACEC00AEA4efA93C5eabA756C, escrow() = Pons fee escrow 0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e; computeAddress matches the app's CREATE2 prediction. On a mainnet fork, v2 splitter code collected a live ETH credit and a live GLD token credit from the real escrow and split both 75/25. |
| 4663 mainnet (v1, superseded) | 0x21d265f5088FD17288efD75a4Eb53eb5Ee6105B8 | 0x7663...7405 | v1 splitters cannot claim from the Pons escrow. Retired 2026-10-03; the one launch on it (TPROOF test) keeps its splitter. |
Local proof: forge test 52 passed, forge coverage 100% lines/branches/functions on src/. Deploy scripts verified end to end on a local anvil (predicted CREATE2 address equals deployed address; second deploy is idempotent).
Write paths
| Path | Testnet 46630 | Mainnet 4663 (tiny) | Notes |
|---|---|---|---|
wallet_transfer (ETH) | pending | pending | Needs a funded agent wallet. |
approve_token (Permit2) | pending | pending | |
swap_execute ETH to USDG | pending (v4 periphery not verified on testnet) | Done 2026-10-02: 0.0001 ETH to 0.273584 USDG via the Universal Router, 0x842e...99c1 | Run from web chat by agent 0x483b46dBe2272f6E284eBc61985C5D94656e870a (owner: treasury). |
curve_buy / curve_sell | not possible (Pons has no testnet deployment) | pending (target: 0.0005 ETH) | |
launch_token | not possible (no Pons testnet) | pending (target: 0.0005 ETH launch fee, no initial buy) | |
earnings_claim | pending (after a testnet splitter deploy and a manual ETH send to it) | pending |
Definition of done (end to end)
- Connect a wallet and sign in, create an agent, fund it from the connected wallet.
- Chat with the agent and run a swap within its policy.
- Launch a token from the agent and see the FeeSplitter as the creator fee recipient.
- Withdraw from the agent back to the connected (owner) wallet.
Sign-in is wallet only (Sign-In With Ethereum). Nothing in this flow uses email. WalletConnect in the web app needs a Reown project id in NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID; injected wallets work without it.
How to complete the mainnet proofs
- Create
apps/api/.envfrom.env.examplewith Privy credentials (WALLET_PROVIDER=privy) or, for a throwaway proof,WALLET_PROVIDER=localwith a keystore password. Start Postgres + Redis (pnpm infra:up),pnpm db:migrate,pnpm dev. - Connect a wallet and sign in, create an agent, fund it from the connected wallet with about 0.005 ETH on Robinhood Chain (bridge to your wallet first at https://portal.arbitrum.io/bridge?destinationChain=robinhood-chain).
- Run each of these and paste the hashes above:
npx @talon/cli swap 0.001 ETH USDG --yes npx @talon/cli approve USDG --spender universal_router npx @talon/cli swap 1 USDG ETH --yes npx @talon/cli buy <fresh-pons-token> 0.0005 --yes npx @talon/cli sell <that-token> <amount> --yes npx @talon/cli launch --name "Talon Test" --symbol TTEST --image ./logo.png --description "test" --yes npx @talon/cli earnings claim
AgentFeeHook mainnet deploy (2026-10-04)
| Check | Result | Evidence |
|---|---|---|
| Deploy | 0x92a52c923355008d757b55842046b9DE53f48000, low 14 bits clear (no hook permissions) | tx 0xaea4bbae66e40a87a50ce47dca2ed68b314c284697293948276ffd7c45d024d2, block 79704180 |
| Pool init | SPY/USDG, dynamic fee, tickSpacing 60, poolId 0x362e62d876b7ff73d2c2cde9cbedc1cc1a16dac38db54f24061142542989a9cc | tx 0x362c3031f30fbff4c253141b1cb09cafb2ea4e5494739e54961ac4c734fcc7f3 |
| Live state | owner deployer 0xE445...0686, agent 0x63a9...59ab, fee 10000, bounds 500 to 10000, 900 s interval, 7200 s stale | cast call on each getter; StateView getSlot0 lpFee 10000 at sqrtPrice 2200257788955203276805070 (about $771) |
| Bytecode | runtime identical to forge build apart from immutables (metadata hash included) | byte compare of eth_getCode against out/AgentFeeHook.sol |
| Source verified | Blockscout: full match, AgentFeeHook, solc v0.8.28+commit.7893614a, 1,000,000 runs, cancun, MIT, 2026-10-06 | https://robinhoodchain.blockscout.com/address/0x92a52c923355008d757b55842046b9DE53f48000?tab=contract |
| Fork tests | 5 passed against the real PoolManager and PositionManager | FORK_TESTS=true forge test --match-path "test/fork/*" |
| First fee switches | 0.30% at 2026-10-05 13:34 UTC (9:34 ET), 1% at 20:04 UTC (16:04 ET), hourly check-ins between | GET /api/v1/hooks/spy history, FeeUpdated events |
| Seed | position #3625625 owned by the deployer, liquidity 73815829378425, range about +/-10% around $771; 0.1272 SPY and 99.9 USDG in | mint tx 0x4e25e4769661307385d9d501bb6ed989ac0c360d63e7b006cade5617df642631, block 81514930; rehearsed on a fork first |