> ## Documentation Index
> Fetch the complete documentation index at: https://docs.agentchain.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Deployments

> Contract addresses for SignerAnchor, ReceiptAnchor, and PolicyAnchor on Base Sepolia and Base mainnet.

<Note>
  This is the canonical on-chain address registry for the AgentChain anchor suite. Always use this page as your trust root — never hardcode addresses from other sources.
</Note>

## Anchor Contracts

These contracts are non-custodial, immutable (no proxy, no upgrade path).
`SignerAnchor` is owned by a 2-of-3 Gnosis Safe multisig.
`ReceiptAnchor` is ownerless and permissionless.

| Contract        | Purpose                                                                  | Status     |
| --------------- | ------------------------------------------------------------------------ | ---------- |
| `SignerAnchor`  | On-chain registry of authorized receipt signers; powers `isAuthorized()` | ✅ Deployed |
| `ReceiptAnchor` | Permissionless receipt hash anchoring for `anchored` lifecycle state     | ✅ Deployed |
| `PolicyAnchor`  | Optional on-chain policy hash registry for `policySource = "anchored"`   | ✅ Deployed |

## Deploy Commands

<Note>
  All deploys currently target **Base Sepolia** only. Mainnet deployment is pending a security audit.
  Deploy scripts enforce this at runtime: `require(block.chainid != 8453, "mainnet blocked")`.
</Note>

```bash theme={null}
# SignerAnchor (requires SIGNER_ANCHOR_OWNER = multisig address)
forge script script/DeploySignerAnchor.s.sol \
  --rpc-url $BASE_SEPOLIA_RPC_URL \
  --broadcast \
  --private-key $DEPLOYER_PRIVATE_KEY \
  --unverified

# ReceiptAnchor (no owner — permissionless)
forge script script/DeployReceiptAnchor.s.sol \
  --rpc-url $BASE_SEPOLIA_RPC_URL \
  --broadcast \
  --private-key $DEPLOYER_PRIVATE_KEY \
  --unverified
```

## Base Sepolia (chainId: 84532)

Deployed **2026-04-28** by `0x6a8CB7fd38dB93f9679466ab42CDca8D5951f5a9` (ANCHOR\_PRIVATE\_KEY).
Verified on [sepolia.basescan.org](https://sepolia.basescan.org).

| Contract        | Address                                      | BaseScan                                                                                  |
| --------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `SignerAnchor`  | `0x36cbAE566545e8df3ad15C171a7840266526E28F` | [View ↗](https://sepolia.basescan.org/address/0x36cbAE566545e8df3ad15C171a7840266526E28F) |
| `ReceiptAnchor` | `0x1F98D953785047f25a4886D12D103F4D67F1D8B3` | [View ↗](https://sepolia.basescan.org/address/0x1F98D953785047f25a4886D12D103F4D67F1D8B3) |
| `PolicyAnchor`  | `0xe69BCa52D31Ea05034252b5A4034F045A401DDAC` | [View ↗](https://sepolia.basescan.org/address/0xe69BCa52D31Ea05034252b5A4034F045A401DDAC) |
| Multisig owner  | `PENDING` (2-of-3 Safe)                      | —                                                                                         |

## Base Mainnet (chainId: 8453)

<Warning>
  Mainnet deployment is pending a security audit. No mainnet contracts are active.
  The deploy scripts enforce this at runtime: `require(block.chainid != 8453, ...)`.
</Warning>

| Contract        | Address   | BaseScan |
| --------------- | --------- | -------- |
| `SignerAnchor`  | `PENDING` | —        |
| `ReceiptAnchor` | `PENDING` | —        |
| `PolicyAnchor`  | `PENDING` | —        |
| Multisig owner  | `PENDING` | —        |

## SDK verify fallback

Until `SignerAnchor` is configured in the SDK client, `ReceiptDomain.verifyingContract` defaults to the deployed `SignerAnchor` address on Base Sepolia (`0x36cbAE566545e8df3ad15C171a7840266526E28F`).
For other chains where `SignerAnchor` is not yet deployed, the SDK falls back to the HTTP signer registry at `GET /.well-known/agentchain-signers`.
This is surfaced via `reasons: ["signer_anchor_unavailable"]` in the verify response — never a silent pass.

## Passing the anchor address to the SDK

```typescript theme={null}
import { AgentChain } from '@humbleaf/agentchain-sdk';

const ac = new AgentChain({
  apiKey: process.env.AGENTCHAIN_API_KEY,
  signerAnchorAddress: '0x36cbAE566545e8df3ad15C171a7840266526E28F', // Base Sepolia
  signerAnchorChainId: 84532,
  signerAnchorRpcUrl: 'https://sepolia.base.org',
});

// Two-step ECDSA + on-chain signer check
const result = await ac.receipts.verifyWithAnchor(receipt);
// result.valid === true
// result.onChainVerified === true | false
// If !onChainVerified: result.reasons includes 'signer_anchor_unavailable' | 'signer_anchor_rpc_error'
```

## On-disk registry

Addresses are machine-readable at:

* [`knowledge/deployments/base-sepolia.json`](../../knowledge/deployments/base-sepolia.json)
* [`knowledge/deployments/base-mainnet.json`](../../knowledge/deployments/base-mainnet.json)

CI verifies this page matches those files after every deploy.
