Retainer/DocsBASE SEPOLIA

Contracts and addresses

Retainer deploys an unmodified instance of Coinbase's audited router and transacts against Coinbase's canonical manager. Nothing here is Retainer's to audit.

Base Sepolia — chain 84532

ContractAddressWho deployed it
SpendRouter (Retainer's instance)0x337099eE403C090388A66cc9370F7b0Fe4CDcC79Retainer. Verified source on Basescan; logic untouched.
SpendPermissionManager0xf85210B21cC50302F477BA56686d2019dC9b67AdCoinbase. Canonical; same address on Base mainnet. Not redeployed.
PublicERC6492Validator0xcfCE48B757601F3f351CB6f434CB0517aEEE293DCoinbase. Canonical.
USDC (testnet)0x036CbD53842c5426634e7929541eC2318f3dCF7eCircle.
CoinbaseSmartWalletFactory0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428aCoinbase. Used by the scripted test account.

The router deployment

Provenance

The three contract sources are copied verbatim from coinbase/spend-permissions at commite0004e63edc4e17de7aa978293800ac7a16892e5. A script re-checks them against upstream by sha256 and fails if anything drifted.contracts/src/PROVENANCE.md contracts/script/verify-vendor.sh

Filesha256
SpendPermissionManager.sol2a5a0d72f06cd1b66099d4e8ee9129dc5c52c75c46a4b42eeebf415b4fb2a231
SpendRouter.sol104e1a47fb47e3ebc92710721ac37a3b7c999081c1257b34608ab3aaf8d636f2
PublicERC6492Validator.solf3cb49c5864badf20ccc7dfaccb0c98aa28c2a01520bf923d2087394f00433ca

The deployed manager's on-chain SPEND_PERMISSION_TYPEHASH equals keccak256of the type string in that vendored source, which is what makes “the code we read is the code we transact against” a checked statement.test_typehash_matchesDeployedManager

Audits — upstream, not Retainer's

ScopeDatesFirm
SpendPermissionManagerOctober, November, December 2024Cantina
SpendRouter2026-03-18 and 2026-03-21Cantina

Reports live in upstream's audits/ directory. Retainer has commissioned no audit of its own: its Solidity is limited to a deploy script and tests, and its off-chain code has not been reviewed by a third party.

Events the reconciler indexes

  • SpendPermissionUsed(bytes32,address,address,address,(uint48,uint48,uint160)) — topic 0xbcba65b4…6753c
  • SpendRouted(address,address,address,bytes32,address,uint256) — topic 0x92c3f8f6…c9dae

Both topics, and every custom error selector the classifier decodes, are pinned by test so an upstream change cannot drift past unnoticed. contracts/test/retainer/ErrorSelectors.t.sol

Mainnet
There is no mainnet deployment. The Base Sepolia keys are disposable and are never to be reused on mainnet; a mainnet deployment would mean a new key set and a permanent public contract. Neither has been done.