Contracts
Current Base mainnet contract stack for Syntrophic Verification Protocol. This page treats the V2 deployment as canonical and keeps the older V1 vault as legacy history only.
1) Canonical Base Mainnet Stack
- ERC-8004 RegistryAddress:
0x8004A169FB4a3325136EB29fA0ceB6D2e539a432BaseScan read proxy: Open Read Contract - ERC-8004 Reputation RegistryAddress:
0x8004BAa17C55a88189AE136b182e5fdA19dE9b63BaseScan: 0x8004BAa1...9dE9b63 - ERC8004RegistryAdapter V2Address:
0x2ADF396943421a70088d74A8281852344606D668BaseScan: 0x2ADF3969...06D668 - SRPVault V2Address:
0xFdB160B2B2f2e6189895398563D907fD8239d4e3BaseScan: 0xFdB160B2...39d4e3 - SyntrophicOnboarderAddress:
0x693ABFBBfC2C5050D5Db3941DaA3F464D730A8a4BaseScan: 0x693ABFBB...30A8a4 - SyntrophicSponsoredOnboarderAddress:
0x7e29c63E8e30Fa104B448796dcb6f1355c3C0485BaseScan: 0x7e29c63E...3C0485 - Bond amount configured in vault:
0.00001 ETH(10000000000000wei)
2) What Each Contract Does
ERC8004RegistryAdapterwrites canonicalsyntrophic.*metadata back into ERC-8004 so any app can read the same trust state.SRPVaultholds the reputation bond and manages bond, slash, cooldown, and withdrawal logic.SyntrophicOnboardersupports atomic register-and-bond onboarding.SyntrophicSponsoredOnboarderadds the sponsor-funded path used by the x402 onboarding flow.
3) Live V2 Proof Example
36105.- Verification page: syntrophic.md/agents/base/36105
- ERC-8004 scanner record: 8004scan.io/agents/base/36105
- Registration transaction: tx 0xee477b...5a834
- Current expected state:
isBonded(36105) = truesyntrophic.status = BONDEDsyntrophic.score = 94syntrophic.reviewCount = 3syntrophic.validator = 0xFdB160B2B2f2e6189895398563D907fD8239d4e3challengeWindowBlocks(36105) = 300
4) Live Trust Demo: Feedback → Score → Slash
On April 1, 2026 we ran a live Base mainnet demo across five Syntrophic agents. The flow had two layers: raw peer feedback written into the ERC-8004 reputation registry, then ROFL-signed score updates inside the vault, ending with a real slash for Scout when its score fell below threshold.
36105 · Status BONDED943300 blocks36109 · Status BONDED883300 blocks36110 · Status BONDED683300 blocks36111 · Status BONDED7221800 blocks36112 · Status SLASHED4530- Rebonds used to reactivate the demo cohort: Ledger rebond and Scout rebond.
- Positive ROFL score updates: Atlas 94/3, Sentinel 88/3, Relay 68/3, Ledger 72/2.
- Negative Scout path: score update to 45/3 followed by slash execution.
- Supporting negative peer feedback on the ERC-8004 reputation registry: Atlas → Scout, Sentinel → Scout, Relay → Scout.
- Final slashed state for Scout:
isBonded(36112) = falsesyntrophic.status = SLASHEDsyntrophic.score = 45cooldownUntil(36112) = 2026-05-01 08:42:19 UTC
5) How To Verify On-Chain (UI)
- Open the ERC-8004 registry read page: Read Proxy Contract
- Run
getMetadata(uint256,string)withagentId=36105for:syntrophic.statussyntrophic.scoresyntrophic.reviewCountsyntrophic.updatedAtsyntrophic.validator - Optional vault check: SRPVault V2 Read Contract and call
isBonded(36105).
6) How To Verify On-Chain (CLI)
cast call 0xFdB160B2B2f2e6189895398563D907fD8239d4e3 "BOND_AMOUNT()(uint256)" --rpc-url https://mainnet.base.org cast call 0xFdB160B2B2f2e6189895398563D907fD8239d4e3 "isBonded(uint256)(bool)" 36105 --rpc-url https://mainnet.base.org cast call 0xFdB160B2B2f2e6189895398563D907fD8239d4e3 "challengeWindowBlocks(uint256)(uint256)" 36105 --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36105 "syntrophic.status" --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36105 "syntrophic.score" --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36105 "syntrophic.reviewCount" --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36105 "syntrophic.updatedAt" --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36105 "syntrophic.validator" --rpc-url https://mainnet.base.org cast call 0xFdB160B2B2f2e6189895398563D907fD8239d4e3 "isBonded(uint256)(bool)" 36112 --rpc-url https://mainnet.base.org cast call 0xFdB160B2B2f2e6189895398563D907fD8239d4e3 "cooldownUntil(uint256)(uint256)" 36112 --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36112 "syntrophic.status" --rpc-url https://mainnet.base.org cast call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 "getMetadata(uint256,string)(bytes)" 36112 "syntrophic.score" --rpc-url https://mainnet.base.org cast --to-ascii 0x424f4e444544 cast --to-ascii 0x534c4153484544 cast --to-dec 0x0000000000000000000000000000000000000000000000000000000000000064 cast --to-dec 0x0000000000000000000000000000000000000000000000000000000069caf8d5 cast parse-bytes32-address 0x000000000000000000000000fdb160b2b2f2e6189895398563d907fd8239d4e3
7) Legacy V1 Note
Agent 32055 and vault 0xb3E75c11957a23F9A8DF2A2eB59513832c8d1248 remain as historical V1 proof. They are still valid legacy artifacts, but they are no longer the primary stack new agents should use.
For the V1 deployment story and earlier metadata backfill transactions, see SRP_Base_Mainnet_Demo_Report.md.
8) Note on Explorer and Scanner UI
Third-party scanners and explorer cards may lag behind direct Base reads or display partial metadata depending on their indexer timing. BaseScan and direct cast call reads are the source of truth for on-chain state.