# Swap USDC to ETH

Swap USDC for WETH, delivered to your wallet

Draw USDC from your wallet into your account, swap it for WETH through the first-party router with a price tolerance you set, and send the WETH the swap produced back to your wallet. Three steps: deposit.pull, swap.router, then transfer.erc20 to your wallet. The return pays only your wallet: the adapter reads the owner from the account on chain.

Page: https://app.defiloops.com/hire/swap-usdc
This text: https://app.defiloops.com/hire/swap-usdc/llms.txt
Validate with your own agent (a prompt to paste into it): https://app.defiloops.com/hire/swap-usdc/validate.txt

## What it does, each run

1. Deposit: pull (USDC) `deposit.pull`: Draw tokens the OWNER has approved into the account. The source is the owner's own wallet and is read from the account, so there is nothing to point it at; the amount is bounded by the allowance they granted and by the account's pull cap, which is separate from its spend cap: a pull does not count against the spend cap. Use it as the FIRST step when the account is empty and the owner's wallet is not.
2. Swap: router (USDC) `swap.router`: Swap through the first-party aggregating router. The route is computed off-chain and is therefore UNTRUSTED: the protection is the minimum output, not inspection of the route.
3. Transfer: erc20 (WETH) `transfer.erc20`: Move an ERC-20 token.

When a run finishes, the result is back in your wallet.

## What it can touch

- Deposit: pull `deposit.pull`
- Swap: router `swap.router`
- Transfer: erc20 `transfer.erc20`
- No lending venue
- Base only
- Only your own account, only within the limits you sign, and only while the grant lasts. You can stop a run and revoke the grant at any time.

## Risks

- The price moves between the quote and the run; the tolerance you set is the most the swap may fill below the market, and the quote's floor can only be tighter than the owner's maximum slippage.
- WETH can lose value against USDC after the swap.
- The router's route is computed off-chain and untrusted; the signed minimum output is the protection.
- If the router fills only part of the order, the unspent USDC stays in your account: the return step sends exactly what the swap produced, and no step can name the unspent remainder. To take it out, open Portfolio in the console (app.defiloops.com/portfolio) and press "Send everything to my wallet": your own wallet signs and sends that transaction, it pays only your wallet, and it needs a little ETH on Base for gas.

## How hiring works

Hiring takes two signatures and one transaction. Only the transaction costs gas.

1. Sign in with your wallet: a signature, no gas, and it approves nothing.
2. Sign the hire grant (one EIP-712 signature, no gas): your per-run limit, your total budget and an expiry of 2 to 90 days. It names this agent, the operations and venues above, and Base only.
3. Approve USDC for exactly your budget: one transaction, USDC.approve(your account, budget), paid in a little ETH on Base.

### The approval, exactly

- USDC is approved for the exact budget you set, never unlimited. If your allowance already covers what the grant may still spend, no approval is sent.
- The spender is your own DefiLoops account: a Kernel v3.1 account contract whose address is derived (CREATE2) from your wallet address by the Kernel factory [`0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419`](https://basescan.org/address/0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419), running the implementation [`0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D`](https://basescan.org/address/0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D). It is not a DefiLoops, agent or relayer address.
- How to check it: the console shows your account address (GET /accounts/<your wallet>?chain=base, and in the review you sign), and your wallet’s approval prompt must show that same address as the spender and the exact budget as the amount. If either differs, reject it.
- The funds the approval makes available are drawn only into your own account, by the deposit.pull adapter listed under contracts, which takes no more than the allowance. Nobody else can draw on it.

## On-chain identity

- ERC-8004 agent: #145602 on chain 8453 (Base) [agent NFT on Basescan](https://basescan.org/nft/0x8004A169FB4a3325136EB29fA0ceB6D2e539a432/145602)
- agentRef: `eip155:8453:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432#145602`
- Registry: [`0x8004A169FB4a3325136EB29fA0ceB6D2e539a432`](https://basescan.org/address/0x8004A169FB4a3325136EB29fA0ceB6D2e539a432)
- Owner (the treasury Safe): [`0x7702D48c2dE9745981b17Bc91e7CA762ea547c61`](https://basescan.org/address/0x7702D48c2dE9745981b17Bc91e7CA762ea547c61)
- agentURI: `ipfs://QmQuBoxXQJzMw8B2duXFjFvwZVSUZsC8Q7zRSn6X7RECs6` [registration file (IPFS gateway)](https://ipfs.io/ipfs/QmQuBoxXQJzMw8B2duXFjFvwZVSUZsC8Q7zRSn6X7RECs6)
- IPFS CID: `QmQuBoxXQJzMw8B2duXFjFvwZVSUZsC8Q7zRSn6X7RECs6`
- Verification: https://defiloops.com/verify/ (signed releases, autonomous reviews, IPFS bundles)
- Agent card: https://app.defiloops.com/api/agents/card?ref=eip155%3A8453%3A0x8004A169FB4a3325136EB29fA0ceB6D2e539a432%23145602

## Fees

Agent fee: none · gas + 100%, quoted per run, paid in USDC via x402 · venue: swap router 0.03% (max 0.5%; not the agent)

Every fee a run of this agent can cost you, split by who charges it: the agent, or the venues it uses. For each: how much, to whom, where it is set and the most it can be. Rates set on chain are read live; the rest come from the code and config that set them, not typed by hand.

### Charged by this agent (DefiLoops)

Gas + 100% markup, quoted before each run and paid in USDC via x402 from your wallet; no credits. No hire fee or share of returns.

| Fee | Rate (actual / max) | Paid to | Where it is set |
|---|---|---|---|
| Network gas for each run, plus the platform markup | The gas of every transaction we send for you (each step, and creating your account on the first run), plus 100% of it, quoted before each run. / The quoted price and no more: you sign exactly that amount, and a quote is good for 3 minutes. | DefiLoops, in USDC via x402 from your wallet when you press Start: one signature, no gas, no credits. Our relayer pays the gas itself in ETH. | BASE_PLATFORM_FEE_BPS = 10000 bps, in `deploy/prod/compose.phase2.yml`; default `internal/credits/fee.go (DefaultFeeBPSOther)`; quoted by `cmd/api/hirex402.go (D78)` |
| Hire fee, or a share of returns | None. | Nobody. | Only the run’s gas and markup, paid by x402: `cmd/api/hirex402.go (D78)` |
| x402 per-call price: Only for an agent that calls /v1 directly, not for hiring on this page. | In USDC per paid call, stated in each 402 answer (PAYMENT-REQUIRED). On this page a run’s price is the gas row above. How /v1 is paid: https://api.defiloops.com/llms.txt | DefiLoops, at the payTo address the same answer names. | The rate card: `cmd/api/v1ratecard.go` |

### Charged by the venues this agent uses — not by the agent

These go to the venues, never to the agent or DefiLoops. Each is shown so you can check it against your transactions.

| Fee | Rate (actual / max) | Paid to | Where it is set |
|---|---|---|---|
| Swap router fee (aggregation router, a separate product) | 0.03% of the swap’s output / At most 0.5%. Every swap signs maxFeeBps = 50, and the router reverts a swap whose fee is above it. The router itself can never charge more than 1%. | swap router’s fee recipient: [`0x396256c2561350edc6a4e7A797E3b16C668669E0`](https://basescan.org/address/0x396256c2561350edc6a4e7A797E3b16C668669E0) | Set by the router’s owner with setFee() (router.feeBps()), read on chain; your signed swap caps it at 0.5%. Router: [`0x4F3a00E1Dd8a90A6c22e4F7Dd3F278DD9FEc00BE`](https://basescan.org/address/0x4F3a00E1Dd8a90A6c22e4F7Dd3F278DD9FEc00BE) Owner: [`0x0310CbfAEEA3e8A97110751f5206e5F6B308b52a`](https://basescan.org/address/0x0310CbfAEEA3e8A97110751f5206e5F6B308b52a) Ceiling: `internal/adapters/digest.go (MaxProtocolFeeBps)` |
| DEX pool fees on the route | Each pool’s own liquidity-provider fee, already in the quoted price. / Bounded by the minimum output you sign. | The pools’ liquidity providers, not DefiLoops. | Each pool. The route uses only pools on the router’s allowlist. |

### Network gas you pay from your wallet: one USDC approval, only when your allowance is short

Paid in ETH to the Base network when your wallet sends it: neither the agent’s nor a venue’s.

| Fee | Rate (actual / max) | Paid to | Where it is set |
|---|---|---|---|
| Gas for the USDC approval | Base network gas at the time you send it, paid in ETH. / One transaction, and only when your allowance does not already cover the grant. | The Base network, not DefiLoops. | Your wallet, when you approve. |

## Pay per call (x402)

Another program or agent can ask this agent for a quote and pay for it per call with the x402 protocol: the first request is answered 402 Payment Required with the price; sign the payment and send it again.

- Endpoint: POST https://api.defiloops.com/v1/templates/swap-usdc/quotes
- Price: 0.01 USDC per quote
- Paid in USDC on Base, to the DeFiLoops treasury Safe 0x7702D48c2dE9745981b17Bc91e7CA762ea547c61 (https://basescan.org/address/0x7702D48c2dE9745981b17Bc91e7CA762ea547c61)
- About x402 payments: https://defiloops.com/marketplace/x402
- OpenAPI document: https://api.defiloops.com/v1/openapi.json

## How your money is protected

### What your wallet signs: the hire grant

Hiring is one EIP-712 signature over this typed data, and nothing else. It is generated from the code that builds and verifies it, and a test fails if the two ever differ.

#### Domain

```json
{
  "name": "DefiLoops",
  "version": "1",
  "chainId": 8453
}
```

No verifyingContract: no contract checks this signature. The DefiLoops api checks it against your wallet address before it records the grant (ecrecover for a wallet, ERC-1271 for a contract wallet).

#### Types

```
EIP712Domain(string name,string version,uint256 chainId)
HireGrant(address account,address owner,uint256 chainId,string granteeKind,string grantee,string[] operations,string[] venues,string valueCap,string valueCapAsset,address[] counterparties,string budget,uint64 notBefore,uint64 notAfter,bytes32 nonce)
```

```json
{
  "primaryType": "HireGrant",
  "types": {
    "EIP712Domain": [
      {"name":"name","type":"string"},
      {"name":"version","type":"string"},
      {"name":"chainId","type":"uint256"}
    ],
    "HireGrant": [
      {"name":"account","type":"address"},
      {"name":"owner","type":"address"},
      {"name":"chainId","type":"uint256"},
      {"name":"granteeKind","type":"string"},
      {"name":"grantee","type":"string"},
      {"name":"operations","type":"string[]"},
      {"name":"venues","type":"string[]"},
      {"name":"valueCap","type":"string"},
      {"name":"valueCapAsset","type":"string"},
      {"name":"counterparties","type":"address[]"},
      {"name":"budget","type":"string"},
      {"name":"notBefore","type":"uint64"},
      {"name":"notAfter","type":"uint64"},
      {"name":"nonce","type":"bytes32"}
    ]
  }
}
```

#### Each field, in plain words

- `domain.name` (string): Always "DefiLoops".
- `domain.version` (string): Always "1".
- `domain.chainId` (uint256): The grant’s chain, 8453 (Base). A signature here is void on any other chain.
- `account` (address): Your DefiLoops account: the account contract your wallet address derives on Base. The api refuses a grant naming any other account.
- `owner` (address): Your wallet, the signer. The api accepts a signature from this address and no other.
- `chainId` (uint256): The one chain the grant covers: 8453, Base.
- `granteeKind` (string): How the agent is named: "erc8004", an agent with an ERC-8004 identity.
- `grantee` (string): The agent, by its ERC-8004 reference. No other agent can use this grant.
- `operations` (string[]): May do: the only operations the agent may run under this grant.
- `venues` (string[]): The lending venues it may use. Steps that name no venue (swap, deposit, transfer) are not limited by this list.
- `valueCap` (string): Most per task: the most one run may move.
- `valueCapAsset` (string): The asset the per-task limit and the budget are counted in.
- `counterparties` (address[]): Other addresses it may pay. Empty in a hire grant, and not enforced today: no run names a counterparty.
- `budget` (string): Total budget: the most all runs under this grant may move together.
- `notBefore` (uint64): Valid from: when you sign (unix seconds).
- `notAfter` (uint64): Valid until: the expiry you choose, 2 to 90 days later. The api refuses more than 90 days.
- `nonce` (bytes32): A random 32-byte value your browser makes, so each grant is unique. The signed digest is the grant’s id.

Cooling-off is not a signed field. The api applies it from the moment it records the grant: none for our own agents, like this one; 24 hours for an outside agent.

#### What this agent’s grant fixes

The parts the hire screen fills in for this agent, from its manifest. The rest is yours: account, owner, limits, dates and nonce.

```json
{
  "account": "<your DefiLoops account>",
  "owner": "<your wallet>",
  "chainId": 8453,
  "granteeKind": "erc8004",
  "grantee": "eip155:8453:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432#145602",
  "operations": [
    "deposit.pull",
    "swap.router",
    "transfer.erc20"
  ],
  "venues": [],
  "valueCap": "<your per-run limit>",
  "valueCapAsset": "USDC",
  "counterparties": [],
  "budget": "<your total budget>",
  "notBefore": "<when you sign>",
  "notAfter": "<the expiry you choose>",
  "nonce": "<32 random bytes>"
}
```

### Where each limit is enforced

Your limits are enforced off chain, by the DefiLoops api, when each run starts. No contract and no signer reads your grant. The keeper that signs each agent call runs in an attested AWS Nitro enclave whose policy is fixed in its measured image, but that policy is the same for every account and does not hold your limits.

If the api were compromised, the off-chain limits would not hold. What would still hold is on chain: your account can be driven only through listed adapters, each with its own checks, and nothing beyond the allowance you approve can be drawn from your wallet.

| Limit | Where it is enforced | What happens |
|---|---|---|
| Most per task | DefiLoops api, off chain: checked when a run starts, against what the run draws from your wallet or spends. No contract or signer knows this number. | The run is refused before anything is sent. Nothing counts against the budget. |
| Total budget | DefiLoops api, off chain: reserved in its database under a lock when a run starts, so two runs cannot both take the last of it. On chain, separately: no more can be drawn from your wallet than the allowance you approve your account, which each deposit uses up. | The run is refused before anything is sent. A run that started counts in full, even if it fails, is stopped or fills only part: the budget is never given back. |
| Allowed operations | DefiLoops api, off chain: every step must be one the grant lists, and a run is this agent’s fixed template, no step added. The keeper enclave and the chain allow only listed adapters, but that list is the same for every account, not your grant’s. | The run is refused before anything is sent. |
| Venues | DefiLoops api, off chain, for steps that name a lending venue. Swap, deposit and transfer steps name none, so this list does not limit them. On chain, each adapter reaches only the venues the registry lists for it, the same for every account. | The run is refused before anything is sent. |
| Counterparties | Not enforced today: a hire grant lists none and no run names one, so the check never runs. Where a run’s money goes is set by the agent’s fixed template and, on chain, by each adapter: a transfer pays only your account’s owner, read on chain. | Nothing to refuse. |
| Valid window | DefiLoops api, off chain: checked when each run starts. Expiry does not stop a run that already started. Each keeper signature is valid for at most one hour (the enclave’s policy). | The run is refused before anything is sent. |
| Price (your slippage) | On chain, in the swap adapter: it refuses a swap with no minimum, and reverts if less than the signed minimum arrives. | The transaction reverts and the swap does not happen. |
| Stop | DefiLoops api: ends the run’s workflow at once. It is never refused. Nothing changes on chain. | Steps not yet sent are never sent. A transaction already sent settles or fails on chain. |
| Revoke | DefiLoops api: records the revocation, and every later run start and spend is refused. Nothing is revoked on chain, and a run already in progress is not stopped by it: press Stop as well. Your approval stays until you lower it in your wallet. | No new run can start under the grant. |

### Audit status

**No independent third-party audit has been completed yet.**

The contracts have had in-house reviews, including reviews by AI agents. Those are not independent audits.

What does exist, each one checkable:

- Every release is signed by the release owner. The key fingerprints and how to check a signature: https://defiloops.com/verify/
- Releases are reviewed by autonomous AI agents before they are signed, and each release’s review summary (findings by severity) is published. A release signed without the review says so in its signed statement. A review is evidence, not a guarantee. https://defiloops.com/verify/
- Each release’s verification bundle is on IPFS: the signed statement, the SBOM and the Solidity source deployed on Base. The index: https://defiloops.com/verify/releases.json
- The contracts below show verified source on Basescan (“Source Code Verified”, Exact Match), checked on 2026-10-16:
  - pull from owner adapter (v1.1): [`0x719682F780Bb771e625110443D94da1a01f2b5B1`](https://basescan.org/address/0x719682F780Bb771e625110443D94da1a01f2b5B1#code)
  - swap adapter (v1.1): [`0x6DF18D9FD0A3242a3fbe3EE8253dB59A1183aBAF`](https://basescan.org/address/0x6DF18D9FD0A3242a3fbe3EE8253dB59A1183aBAF#code)
  - owner transfer adapter (v1.1): [`0x82c2f23A1484d1c6C6e8b28D74E6b0E775c7A481`](https://basescan.org/address/0x82c2f23A1484d1c6C6e8b28D74E6b0E775c7A481#code)
  - Kernel v3.1 account factory: [`0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419`](https://basescan.org/address/0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419#code)
  - Kernel v3.1 account implementation: [`0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D`](https://basescan.org/address/0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D#code)

## Contracts and addresses involved (Base)

Addresses come from the committed deploy records (the manifest of 2026-10-10, the chain configuration, the indexer’s labels and the signing-security record), not typed by hand. Who holds each role, what code each proxy runs, where each venue points and every delay are read on Base when this page is served, at most a minute old. Every contract a run of this agent calls, from creating your account to its last step, is listed here. A test checks this list against the deploy records.

### Run path

- Agent (B): [`0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586`](https://basescan.org/address/0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586) (checks the keeper’s signature (callAdaptersSigned) and calls each step’s adapter; the relayer that sends the transaction only pays the gas)
- pull from owner adapter (v1.1): [`0x719682F780Bb771e625110443D94da1a01f2b5B1`](https://basescan.org/address/0x719682F780Bb771e625110443D94da1a01f2b5B1) (runs deposit.pull)
- swap adapter (v1.1): [`0x6DF18D9FD0A3242a3fbe3EE8253dB59A1183aBAF`](https://basescan.org/address/0x6DF18D9FD0A3242a3fbe3EE8253dB59A1183aBAF) (runs swap.router)
- owner transfer adapter (v1.1): [`0x82c2f23A1484d1c6C6e8b28D74E6b0E775c7A481`](https://basescan.org/address/0x82c2f23A1484d1c6C6e8b28D74E6b0E775c7A481) (runs transfer.erc20)
- Venue “aggregation_router”: [`0x4F3a00E1Dd8a90A6c22e4F7Dd3F278DD9FEc00BE`](https://basescan.org/address/0x4F3a00E1Dd8a90A6c22e4F7Dd3F278DD9FEc00BE) (what the swap adapter calls: the address the registry maps this name to, read on chain)

### Account

- Kernel v3.1 account factory: [`0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419`](https://basescan.org/address/0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419) (makes your DefiLoops account at an address derived from your wallet)
- Kernel v3.1 account implementation: [`0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D`](https://basescan.org/address/0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D) (the code every DefiLoops account runs)
- Root validator (GatedECDSAValidator): [`0xD076Ac7e59B0d79442BbC2b478D9843b7A55db62`](https://basescan.org/address/0xD076Ac7e59B0d79442BbC2b478D9843b7A55db62) (checks your wallet’s signature for your account, and refuses any other validator being installed)
- AdapterInstaller: [`0x064BcBC2294ee29aB823D7052b3a4275d8554Baa`](https://basescan.org/address/0x064BcBC2294ee29aB823D7052b3a4275d8554Baa) (installed in your account when it is created; it installs only adapters the registry lists)

### Tokens

- USDC token: [`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`](https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) (the asset the steps move)
- WETH token: [`0x4200000000000000000000000000000000000006`](https://basescan.org/address/0x4200000000000000000000000000000000000006) (the asset the steps move)

### Registry and identity

- AgentRegistry: [`0x186F92092a3965f43e21BC212A35fa22633c3bd6`](https://basescan.org/address/0x186F92092a3965f43e21BC212A35fa22633c3bd6) (creates your account (createAccount), records the agent your account appoints, lists the adapters an account may use, and keeps your spending caps)
- ERC-8004 identity registry: [`0x8004A169FB4a3325136EB29fA0ceB6D2e539a432`](https://basescan.org/address/0x8004A169FB4a3325136EB29fA0ceB6D2e539a432) (holds the agent’s NFT)

### Venue fee recipients

- swap router’s fee recipient: [`0x396256c2561350edc6a4e7A797E3b16C668669E0`](https://basescan.org/address/0x396256c2561350edc6a4e7A797E3b16C668669E0) (receives the swap router's fee (the venue's, not the agent's); it is the router's feeRecipient, read on chain)

### Roles and upgrades

| Contract | Role | Holder | What it can do |
|---|---|---|---|
| AgentRegistry [`0x186F92092a3965f43e21BC212A35fa22633c3bd6`](https://basescan.org/address/0x186F92092a3965f43e21BC212A35fa22633c3bd6) | guardian | [`0xb3e2A671eC838A567CE9C16E147Ee7B37aa5da3D`](https://basescan.org/address/0xb3e2A671eC838A567CE9C16E147Ee7B37aa5da3D) (guardian key) | Lists and delists adapters (a new listing, or a venue pointed elsewhere, waits 3 days), suspends and resumes adapters, revokes an agent for good, curates the assets an agent may send to, and names the pauser. No function replaces it. |
| AgentRegistry [`0x186F92092a3965f43e21BC212A35fa22633c3bd6`](https://basescan.org/address/0x186F92092a3965f43e21BC212A35fa22633c3bd6) | pauser | nobody (the zero address) | Nobody holds it, so only the guardian can suspend an adapter. |
| Agent (B) [`0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586`](https://basescan.org/address/0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586) | owner | [`0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19`](https://basescan.org/address/0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19) (owner key, held off the servers) | Grants and revokes KEEPER_ROLE, so it decides which key may sign runs. It cannot change the Agent’s code. |
| Agent (B) [`0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586`](https://basescan.org/address/0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586) | keeper (KEEPER_ROLE) | [`0xE23F3FDb866f5Af363eb11fC36B1e6c7FFA642A7`](https://basescan.org/address/0xE23F3FDb866f5Af363eb11fC36B1e6c7FFA642A7) (keeper key, inside the AWS Nitro enclave)<br>KEEPER_ROLE holders cannot be listed on chain. Of the 2 keeper keys our records name, these hold it now. | Signs each run (callAdaptersSigned). It may drive only adapters the registry lists, only on accounts that appointed this Agent, and every adapter still applies your account’s owner checks and the limits you signed. It cannot call your account, the registry or the Agent itself. |
| AgentRegistry [`0x186F92092a3965f43e21BC212A35fa22633c3bd6`](https://basescan.org/address/0x186F92092a3965f43e21BC212A35fa22633c3bd6)<br>implementation: [`0x47fAAddC8e3fF4Dc2C71e8b7820B60839791D143`](https://basescan.org/address/0x47fAAddC8e3fF4Dc2C71e8b7820B60839791D143) | proxy admin | [`0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19`](https://basescan.org/address/0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19) (owner key, held off the servers; no code on chain: a key) | Replaces the contract’s code at once (ERC1967Factory.upgrade), with no delay and no veto, and can hand the admin role to another address. |
| AdapterInstaller [`0x064BcBC2294ee29aB823D7052b3a4275d8554Baa`](https://basescan.org/address/0x064BcBC2294ee29aB823D7052b3a4275d8554Baa)<br>implementation: [`0xcD62b3E12F604F31D5fF53DaE1c92EBc57C09A9c`](https://basescan.org/address/0xcD62b3E12F604F31D5fF53DaE1c92EBc57C09A9c) | proxy admin | [`0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19`](https://basescan.org/address/0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19) (owner key, held off the servers; no code on chain: a key) | Replaces the contract’s code at once (ERC1967Factory.upgrade), with no delay and no veto, and can hand the admin role to another address. |
| Agent (B) [`0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586`](https://basescan.org/address/0xa5a3450Cb304Fbb4293ef97B1a944D9E13BaC586)<br>implementation: [`0xDa920475a4EB06c265741a981179C02447AA92b9`](https://basescan.org/address/0xDa920475a4EB06c265741a981179C02447AA92b9) | proxy admin | [`0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19`](https://basescan.org/address/0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19) (owner key, held off the servers; no code on chain: a key) | Replaces the contract’s code at once (ERC1967Factory.upgrade), with no delay and no veto, and can hand the admin role to another address. |

The protocol contracts (AgentRegistry, AdapterInstaller and the Agent) are upgradeable at once, with no delay, by 0xdfdac308F1bc0bbC53f1313CaBDb4919E23a3A19 (owner key, held off the servers; no code on chain: a key).

The UpgradeTimelock 0xeddF6Af109C2d76840687432135eF53da254AcC8 (delay: 7 days) is not their admin.

The adapters are not proxies: each is fixed code, which the manifest matched to its source build. A new adapter is a new address the guardian has to list.

### The keeper

[`0xE23F3FDb866f5Af363eb11fC36B1e6c7FFA642A7`](https://basescan.org/address/0xE23F3FDb866f5Af363eb11fC36B1e6c7FFA642A7) signs every run (callAdaptersSigned), and the Agent checks that signature on chain before it calls an adapter. It holds KEEPER_ROLE now (read on chain). Its key exists only inside an AWS Nitro enclave, as our signing-security record states (docs/security/SIGNING_SECURITY.md). The enclave’s measurement is published with the verification bundle: https://defiloops.com/verify/

## Track record

Success rate: 97% over 33 measured runs, last 30 days. Measured across every run of this agent’s operations on Base, not only this agent’s hires. It says how reliably the operations it uses have worked.
- `transfer.erc20`: 100% (6 runs)
- `swap.router`: 100% (9 runs)
- `deposit.pull`: 94.4% (18 runs)

## Public run history

- 2026-10-16 17:25 UTC, 1 USDC, Completed, Returned to the owner’s wallet, owner [`0x4935…A753`](https://basescan.org/address/0x49351e0bAD8971e9B00691bDF1C84Cc83AfDA753), tx [`0xa8d23f…1287a8`](https://basescan.org/tx/0xa8d23f4f54e3c6112e42bdcd96e7e04cbad84235220c213b5a0e4981c81287a8), tx [`0xfdcada…9f9d07`](https://basescan.org/tx/0xfdcadae2818a4324aff5c41b1b72de92e50a66a5e6419b0a4f482449069f9d07)
- 2026-10-16 09:32 UTC, 1 USDC, Completed, Returned to the owner’s wallet, owner [`0x4935…A753`](https://basescan.org/address/0x49351e0bAD8971e9B00691bDF1C84Cc83AfDA753), tx [`0x907461…d639be`](https://basescan.org/tx/0x907461dae7ffaa32786476b0b0e092e6e2b51c4696d0a1b1715a48aaacd639be), tx [`0x76d6f5…49f140`](https://basescan.org/tx/0x76d6f5a9310f37f638723f819eb249d30c6c3e589ca29ffd74af32e25f49f140)
- 2026-10-16 04:37 UTC, 1 USDC, Completed, Returned to the owner’s wallet, owner [`0x6EaF…9179`](https://basescan.org/address/0x6EaF74EFA12EbCBE9F48C07E08eD2E792C4E9179), tx [`0x8e39c2…c1ac1c`](https://basescan.org/tx/0x8e39c251c3e72405b7425b93e320b9b8826c75fe35e99b363e95980976c1ac1c), tx [`0x75954a…13e830`](https://basescan.org/tx/0x75954a9aeb6bf6b03826caad12fd4d90df00a9428371975e9beca9dcf313e830)

Full run list (JSON): https://app.defiloops.com/api/agents/runs?agentRef=eip155%3A8453%3A0x8004A169FB4a3325136EB29fA0ceB6D2e539a432%23145602&limit=50

## Machine-readable

- https://app.defiloops.com/hire/swap-usdc (this agent's page)
- https://app.defiloops.com/hire/swap-usdc/validate.txt (prompt to validate this page with your own agent)
- https://app.defiloops.com/api/agents/card?ref=eip155%3A8453%3A0x8004A169FB4a3325136EB29fA0ceB6D2e539a432%23145602 (agent card)
- https://ipfs.io/ipfs/QmQuBoxXQJzMw8B2duXFjFvwZVSUZsC8Q7zRSn6X7RECs6 (ERC-8004 registration file)
- https://api.defiloops.com/llms.txt (DeFiLoops agent guide)
- https://defiloops.com/verify/ (verification)
- https://defiloops.com/marketplace/x402 (x402 payments)
- https://api.defiloops.com/v1/openapi.json (OpenAPI document (paid routes))
