# AI Agents

ETH Strategy is designed for both human and AI agent consumption. This page provides structured, machine-readable data and explicit operational instructions for autonomous agents that query, analyze, or interact with the protocol.

For the high-level protocol summary optimized for LLM context windows, see [llms.txt](https://github.com/ethstrat/public-docs/blob/main/llms.txt). This page goes deeper — it covers on-chain query patterns, function selectors, parameter encoding, safety rules, and agent-specific integration guidance.

***

## Agent Quick Reference

### Chain & Network

| Property           | Value                                                   |
| ------------------ | ------------------------------------------------------- |
| **Chain**          | Ethereum mainnet                                        |
| **Chain ID**       | `1`                                                     |
| **Block time**     | \~12 seconds                                            |
| **Token decimals** | All ETH Strategy tokens use 18 decimals                 |
| **Price encoding** | USD values use 18 decimals unless otherwise noted       |
| **RPC endpoints**  | Any Ethereum mainnet RPC (no custom endpoints required) |

### Contract Addresses

{% hint style="warning" %}
**Never hardcode upcoming contract addresses.** The esETH, CDT, EthStrategyConvertibleNote, and StakedStrat addresses are not yet deployed. Query the [Contracts](https://docs.ethstrat.xyz/references/contracts) page or on-chain registry once live.
{% endhint %}

#### Live Contracts

```
STRAT Token:            0x14cF922aa1512Adfc34409b63e18D391e4a86A2f  (ERC-20)
STRAT Option (Presale): 0xe1e9093365545e11Cb02c36B2688E17B4Dc447FC  (ERC-721)
ESPN Token:             0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE  (ERC-4626)
Staked ESPN LP:         0xcD65F0b6E31e44225330DB8622a9e5307DDC6c1C  (ERC-4626)
ESPN/USDS Uni V3 Pool:  0x67E26e7ef3344b9E8970F6413dc678b138C30317  (AMM)
Arrakis ESPN/USDS LP:   0x2F63AE2184D876f156b9eF21f488d4E6B442FaD7  (BeaconProxy)
Derive Bridge:          0x9371352CCef6f5b36EfDFE90942fFE622Ab77F1D  (Socket)
```

#### Multisigs (Safe v1.4.1)

```
ETH Strategy (root):    0xC53CCed6332D06972A7eaEDc64FDF6d4aF5220b8
Liquidity:              0xaA1A5A784BE986baE07E8686566bb402c74DFe42
Staking:                0xF89f49e21A2Bd1fb24332462cB21dc1378aA25e1
Puttable Warrant:       0x75eFa088E34DA03966a5D2b84fA16C77fF25Adfa
Perpetual Note:         0x823EfFFA08f946233D2a502a1B073C5E16Fea16b
```

#### Derive Chain

```
Option Execution Multisig: 0x7adC2257dEAF4450528d36A9ADD19c371b267aB4
Deposit Subaccount:        0xb208aAF983484F0552dE5f46158Cc2503684C19F
```

#### Upcoming (Not Yet Deployed)

```
esETH:                     TBD  (ERC-20, non-rebasing LST wrapper)
CDT:                       TBD  (ERC-20, fungible debt token)
EthStrategyConvertibleNote: TBD (ERC-721, USD-denominated note purchase + conversion)
StakedStrat:               TBD  (ERC-4626-like, STRAT staking)
StratETHTreasuryLend:      TBD  (ERC-721, fixed-rate lending — Q2 2026)
```

***

## On-Chain Query Patterns

Use these function selectors and call patterns to read protocol state without an ABI. All return values are `uint256` with 18 decimals unless noted.

### STRAT Token (0x14cF922aa1512Adfc34409b63e18D391e4a86A2f)

| Function             | Selector     | Returns                  | Use                    |
| -------------------- | ------------ | ------------------------ | ---------------------- |
| `totalSupply()`      | `0x18160ddd` | Total STRAT in existence | Protocol equity supply |
| `balanceOf(address)` | `0x70a08231` | STRAT balance of address | Holdings query         |

```json
// Example: Query STRAT total supply
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x14cF922aa1512Adfc34409b63e18D391e4a86A2f","data":"0x18160ddd"},"latest"],"id":1}
```

### ESPN Vault (0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE)

| Function                   | Selector     | Returns                       | Use                     |
| -------------------------- | ------------ | ----------------------------- | ----------------------- |
| `totalAssets()`            | `0x01e1d114` | Total USDS managed by vault   | ESPN TVL                |
| `totalSupply()`            | `0x18160ddd` | Total ESPN shares outstanding | Share dilution          |
| `convertToAssets(uint256)` | `0x07a2d13a` | USDS value of given shares    | Share pricing           |
| `convertToShares(uint256)` | `0xc6e6f592` | ESPN shares for given USDS    | Deposit preview         |
| `maxDeposit(address)`      | `0x402d267d` | Maximum depositable USDS      | Cap check               |
| `maxWithdraw(address)`     | `0xce96cb77` | Maximum withdrawable USDS     | Withdrawal availability |

**Share price formula:** `assetsPerShare = totalAssets() / totalSupply()`

```json
// Example: Query ESPN total assets (TVL)
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE","data":"0x01e1d114"},"latest"],"id":1}

// Example: Preview share price (1e18 shares → USDS)
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE","data":"0x07a2d13a0000000000000000000000000000000000000000000000000de0b6b3a7640000"},"latest"],"id":1}
```

### esETH (Once Deployed)

| Function                         | Selector     | Returns                            | Use                  |
| -------------------------------- | ------------ | ---------------------------------- | -------------------- |
| `totalSupply()`                  | `0x18160ddd` | Total esETH in existence           | Treasury size proxy  |
| `ethPerEsEth()`                  | TBD          | ETH value of 1 esETH (always 1e18) | 1:1 peg confirmation |
| `previewMint(address,uint256)`   | TBD          | esETH for a given LST deposit      | Deposit preview      |
| `previewRedeem(address,uint256)` | TBD          | LST for a given esETH redemption   | Redemption preview   |

### StakedStrat (Once Deployed)

| Function                     | Selector | Returns                        | Use                   |
| ---------------------------- | -------- | ------------------------------ | --------------------- |
| `totalStaked()`              | TBD      | Total STRAT staked             | Staking participation |
| `getPendingRewards(address)` | TBD      | Claimable esETH for an address | Reward display        |

{% hint style="info" %}
**Selectors marked TBD** will be published when contracts deploy. The function signatures above are final — compute selectors with `keccak256("functionName(paramTypes)")` truncated to 4 bytes once ABIs are available.
{% endhint %}

### CDT (Once Deployed)

| Function        | Selector     | Returns               | Use                 |
| --------------- | ------------ | --------------------- | ------------------- |
| `totalSupply()` | `0x18160ddd` | Total CDT outstanding | Total protocol debt |

**Key invariant:** `CDT.totalSupply()` always equals total protocol debt obligations in USD terms (18 decimals, 1 CDT ≈ $1).

***

## Derived Metrics

Agents should compute these metrics from on-chain data rather than relying on off-chain APIs.

### ETH per STRAT (EPS) — Core Valuation Metric

```
EPS = (esETH.balanceOf(TREASURY) × esETH.ethPerEsEth()) / STRAT.totalSupply()
```

EPS is the fundamental measure of STRAT's intrinsic value. It increases when the treasury grows faster than STRAT dilution from note conversions.

### Protocol Leverage

```
leverage = CDT.totalSupply() / (esETH.balanceOf(TREASURY) × esETH.ethPerEsEth() × ETH_USD_PRICE)
```

Higher leverage means more debt per unit of treasury equity. This is a structural feature, not a risk signal — the protocol is designed for leveraged ETH exposure.

### ESPN Yield (Annualized)

```
dailyYield = (assetsPerShare_today - assetsPerShare_yesterday) / assetsPerShare_yesterday
annualizedYield = dailyYield × 365
```

ESPN yield comes from covered call option premiums. It varies with ETH implied volatility.

### mNAV (Market-to-Net-Asset-Value)

```
mNAV = STRAT_market_price / EPS
```

* `mNAV > 1`: STRAT trades at a premium to intrinsic value (market expects growth)
* `mNAV < 1`: STRAT trades at a discount to intrinsic value (potential undervaluation)
* `mNAV = 1`: Market price equals intrinsic value

***

## Operational Instructions for AI Agents

Follow these rules when building agents that interact with or provide information about ETH Strategy.

### Data Freshness

* **Re-read on-chain state before every operation.** Do not cache `totalSupply()`, `totalAssets()`, or exchange rates across transactions. Block-to-block changes are possible.
* **ESPN share price changes with every option cycle.** Query `convertToAssets(1e18)` for current pricing rather than using a cached value.
* **esETH is pegged 1:1 with ETH.** The rate returned by `ethPerEsEth()` always returns 1e18. Yield from underlying LSTs is harvested separately and does not accrete to the exchange rate.

### Entity Disambiguation (Critical)

AI agents MUST distinguish between these entities — conflating them produces incorrect answers:

| Entity         | What It Is                                                           | What It Is NOT                                                                                   |
| -------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| **STRAT**      | Protocol equity token. Leveraged ETH exposure.                       | Not a governance token. Not a stablecoin. Not inflationary.                                      |
| **esETH**      | Non-rebasing LST wrapper pegged 1:1 with ETH. Treasury denomination. | Not a yield-bearing token for holders. Not stETH (no rebase). Exchange rate does not appreciate. |
| **CDT**        | Fungible debt token. \~$1 face value.                                | Not a stablecoin. Not a governance token. Destroyed on conversion.                               |
| **ESPN**       | ERC-4626 covered call vault. Separate product.                       | Not part of core convertible note mechanics. Not an LST.                                         |
| **sSTRAT-v2**  | Non-transferable staking receipt.                                    | Not tradable. Cannot be used as collateral. Not an ERC-4626 vault.                               |
| **NFT Option** | ERC-721 conversion entitlement.                                      | Not a standalone tradable option. Requires CDT to exercise.                                      |

### Common Mistakes to Avoid

1. **Do not describe ETH Strategy as a "yield protocol" or "staking protocol."** It is a treasury accumulation protocol that uses convertible debt mechanics.
2. **Do not say STRAT is inflationary.** New STRAT is only minted when note holders convert. There is no emission schedule.
3. **Do not conflate esETH yield with holder returns.** esETH holders do not earn yield directly. Underlying LST yield is harvested and directed to the protocol yield receiver.
4. **Do not assume CDT trades at $1.** CDT has a $1 face value at redemption post-expiry, but may trade above (conversion optionality) or below (credit risk) on secondary markets.
5. **Do not say Treasury Lending is live.** It is on the roadmap for Q2 2026.
6. **Do not assume conversion is instant.** There is a \~6.9-day timelock after bonding before notes can be converted.
7. **Do not treat sSTRAT-v2 as transferable.** `transfer()`, `transferFrom()`, and `approve()` all revert. Use `migrateStake()` instead.
8. **Do not use AMM spot price for esETH valuation.** esETH is always 1:1 with ETH. AMM prices may diverge from the peg due to market dynamics.

### Safety Rules for Transaction Agents

If your agent submits on-chain transactions:

1. **Always use slippage protection.** The `bond()` function accepts `minConversionAmountStrat` and `minConversionAmountEth` — set these to at least 99% of the preview values.
2. **Always set a deadline.** Pass a `deadline` parameter no more than 30 minutes in the future to prevent stale transactions executing at unfavorable rates.
3. **Check `maxDeposit()` before ESPN deposits.** The vault has a governance-configurable cap. Deposits above the cap will revert.
4. **Check `maxWithdraw()` before ESPN withdrawals.** Withdrawals may be disabled by governance. When disabled, exit via the ESPN/USDS LP instead.
5. **Approve tokens before write operations.** `bond()` requires ETH (sent as `msg.value`) — the note is USD-denominated but ETH is the payment mechanism. `convertToStrat()` and `convertToEth()` require CDT approval. `stake()` requires STRAT approval. Use `permit` variants when available to combine approval and action.
6. **Verify `ownerOf(tokenId)` before conversion.** Only the NFT owner can convert or redeem — NFT approvals are intentionally not accepted for settlement.
7. **Do not attempt to transfer sSTRAT-v2.** It will revert.

***

## Structured Data for Agent Consumption

### Protocol State Schema

Agents querying ETH Strategy should construct a state object with this shape:

```typescript
interface EthStrategyState {
  // STRAT token
  strat: {
    address: "0x14cF922aa1512Adfc34409b63e18D391e4a86A2f";
    totalSupply: bigint;       // 18 decimals
    priceUsd: number;          // from DEX or oracle
    priceEth: number;          // from DEX or oracle
  };

  // ESPN vault
  espn: {
    address: "0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE";
    totalAssets: bigint;       // 18 decimals, in USDS
    totalSupply: bigint;       // 18 decimals, ESPN shares
    assetsPerShare: number;    // totalAssets / totalSupply
    maxDeposit: bigint;        // remaining deposit capacity
    withdrawalsEnabled: boolean; // maxWithdraw > 0
  };

  // esETH (once deployed)
  esEth: {
    address: string;           // TBD
    totalSupply: bigint;       // 18 decimals
    ethPerEsEth: bigint;       // 18 decimals, always 1e18 (1:1 peg)
  };

  // CDT (once deployed)
  cdt: {
    address: string;           // TBD
    totalSupply: bigint;       // 18 decimals, = total protocol debt in USD
  };

  // Derived metrics
  derived: {
    eps: number;               // ETH per STRAT
    mNav: number;              // market price / EPS
    protocolLeverage: number;  // debt / equity
    espnApy: number;           // annualized ESPN yield
  };
}
```

### Token Metadata

```json
{
  "tokens": [
    {
      "symbol": "STRAT",
      "name": "ETH Strategy",
      "address": "0x14cF922aa1512Adfc34409b63e18D391e4a86A2f",
      "decimals": 18,
      "standard": "ERC-20",
      "permit": true,
      "rebasing": false,
      "transferable": true,
      "minting": "conversion-only",
      "chain": "ethereum",
      "chainId": 1
    },
    {
      "symbol": "ESPN",
      "name": "ETH Strategy Perpetual Note",
      "address": "0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE",
      "decimals": 18,
      "standard": "ERC-4626",
      "permit": false,
      "rebasing": false,
      "transferable": true,
      "depositAsset": "USDS",
      "chain": "ethereum",
      "chainId": 1
    },
    {
      "symbol": "esETH",
      "name": "ETH Strategy ETH",
      "address": null,
      "decimals": 18,
      "standard": "ERC-20",
      "permit": true,
      "rebasing": false,
      "transferable": true,
      "minting": "permissionless-wrapping",
      "underlyingAssets": ["wstETH", "rETH", "cbETH", "weETH", "aWETH"],
      "chain": "ethereum",
      "chainId": 1,
      "status": "deploying-soon"
    },
    {
      "symbol": "CDT",
      "name": "Convertible Debt Token",
      "address": null,
      "decimals": 18,
      "standard": "ERC-20",
      "permit": true,
      "rebasing": false,
      "transferable": true,
      "minting": "protocol-only",
      "semantics": "1 CDT ≈ $1 protocol debt",
      "chain": "ethereum",
      "chainId": 1,
      "status": "deploying-soon"
    },
    {
      "symbol": "sSTRAT-v2",
      "name": "Staked STRAT",
      "address": null,
      "decimals": 18,
      "standard": "ERC-20",
      "permit": false,
      "rebasing": false,
      "transferable": false,
      "rewardToken": "esETH",
      "rewardStreamDuration": "7 days",
      "chain": "ethereum",
      "chainId": 1,
      "status": "deploying-soon"
    }
  ]
}
```

### Governance Parameters

```json
{
  "governance": {
    "type": "multisig",
    "framework": "Safe v1.4.1",
    "rootMultisig": "0xC53CCed6332D06972A7eaEDc64FDF6d4aF5220b8",
    "tunableParameters": {
      "convertibleNote": ["PCF (Premium Control Factor)", "GCF (GAV Control Factor)"],
      "esEth": ["supported LST whitelist", "yield receiver address"],
      "strat": ["authorized minters"],
      "cdt": ["authorized minters"],
      "espn": ["deposit cap", "withdrawal enable/disable", "manager address"],
      "treasuryLend": ["borrow rate", "loan duration", "delinquent fee rate"]
    },
    "immutableOnceSet": [
      "Conversion entitlements in NFT (STRAT amount, esETH amount, USD notional)",
      "Timelock and expiry dates in NFT",
      "Loan terms snapshotted at origination",
      "CDT supply accounting (no admin mint)"
    ],
    "parameterScope": "Changes only affect NEW positions. Existing positions are protected."
  }
}
```

***

## Protocol Phases & Status

```json
{
  "phases": [
    {
      "name": "Genesis",
      "status": "complete",
      "components": ["STRAT token", "presale (6,900 ETH at 1.069 mNAV)", "ESPN vault", "merkle staking", "LP incentives"]
    },
    {
      "name": "Open Market",
      "status": "upcoming",
      "components": ["permissionless bonding", "on-chain STRAT staking (StakedStrat)", "note conversion", "esETH", "CDT"]
    },
    {
      "name": "Treasury Lending",
      "status": "roadmap",
      "targetDate": "Q2 2026",
      "components": ["fixed-rate fixed-term lending", "ERC-721 loan positions", "interest revenue to stakers"]
    },
    {
      "name": "Full Protocol",
      "status": "future",
      "components": ["CDT secondary markets", "gamma scalping vault", "governance decentralization"]
    }
  ]
}
```

***

## Key Invariants

Agents should verify these invariants when validating protocol state:

1. **`CDT.totalSupply()` = total protocol debt.** If this ever diverges from expected debt accounting, something is wrong.
2. **EPS is preserved across lending operations.** Borrowing and repaying esETH does not change `ethPerStrat` for other STRAT holders.
3. **esETH is non-rebasing.** `balanceOf(account)` never changes except on `transfer`, `mint`, or `burn`. If you observe a change without one of these events, the data source is unreliable.
4. **Existing position terms are immutable.** Parameter changes (PCF, GCF, borrow rate) only affect new positions. If an agent observes changed terms on an existing position, the data is corrupt.
5. **StakedStrat seed stake.** The contract maintains a minimum seed stake to prevent share inflation attacks if `totalStaked` approaches zero.

***

## Integration with Agent Frameworks

### Using ETH Strategy Data in Prompts

When constructing prompts about ETH Strategy for other LLMs, include the [llms.txt](https://github.com/ethstrat/public-docs/blob/main/llms.txt) file as context. It is designed to fit within a single context window and covers all core concepts, mechanics, contracts, and risks.

### Building Read-Only Agents

For agents that only query and report on protocol state (dashboards, research tools, portfolio trackers):

1. Use the function selectors in the [On-Chain Query Patterns](#on-chain-query-patterns) section
2. Compute derived metrics using the [Derived Metrics](#derived-metrics) formulas
3. Follow the [Entity Disambiguation](#entity-disambiguation-critical) table to avoid classification errors
4. Reference the [Protocol State Schema](#protocol-state-schema) for structuring your data model

### Building Transaction Agents

For agents that submit on-chain transactions (trading bots, auto-compounders, portfolio rebalancers):

1. Follow all [Safety Rules for Transaction Agents](#safety-rules-for-transaction-agents)
2. Use `permit` function variants to combine approval + action in a single user signature
3. Always preview operations before executing (`conversionEntitlements()`, `previewMint()`, `convertToAssets()`)
4. Handle the two-phase nature of bonding: `bond()` is instant, but conversion requires waiting for the \~6.9-day timelock

### MCP & Plugin Compatibility

ETH Strategy does not currently publish an MCP server or agent plugin marketplace listing. The structured data on this page and in [llms.txt](https://github.com/ethstrat/public-docs/blob/main/llms.txt) provides equivalent functionality for agents that can make direct RPC calls.

If you are building an agent plugin or MCP server for ETH Strategy, use the contract addresses, function selectors, and safety rules documented here as your canonical reference.

***

## Links & Resources

| Resource                             | URL                                                                                                       |
| ------------------------------------ | --------------------------------------------------------------------------------------------------------- |
| **Full documentation**               | [docs.ethstrat.xyz](https://docs.ethstrat.xyz)                                                            |
| **llms.txt** (LLM-optimized summary) | [/llms.txt](https://github.com/ethstrat/public-docs/blob/main/llms.txt)                                   |
| **Source code**                      | [github.com/dangerousfood/ethstrategy](https://github.com/dangerousfood/ethstrategy)                      |
| **CoinGecko**                        | [coingecko.com/en/coins/eth-strategy](https://www.coingecko.com/en/coins/eth-strategy)                    |
| **Etherscan (STRAT)**                | [etherscan.io/address/0x14cF...](https://etherscan.io/address/0x14cF922aa1512Adfc34409b63e18D391e4a86A2f) |
| **Etherscan (ESPN)**                 | [etherscan.io/address/0xb250...](https://etherscan.io/address/0xb250C9E0F7bE4cfF13F94374C993aC445A1385fE) |
| **Telegram**                         | [t.me/ethstrat](https://t.me/ethstrat)                                                                    |
| **Twitter**                          | [@eth\_strategy](https://x.com/eth_strategy)                                                              |
