Integration Guide
Integrate esETH, STRAT, CDT, and StakedStrat into your protocol, wallet, or application — with opinionated guidance and working code.
This guide is for developers integrating ETH Strategy tokens into smart contracts, wallets, aggregators, dashboards, or any on-chain system. It covers each token's interface, recommended integration patterns, and production caveats that will save you from subtle bugs.
If you're looking for protocol mechanics rather than integration patterns, start with the Protocol Overview. For the complete API reference (every function with parameters, return values, access control, and revert conditions), see the Contract Reference.
Quick Reference
esETH
ERC-20
No
Yes
Yes
Non-rebasing. Balances never change except on transfer/mint/burn. Safe to cache.
STRAT
ERC-20
No
Yes
Yes
Only minted through note conversion. No inflation schedule.
CDT
ERC-20
No
Yes
Yes
Each token = ~$1 protocol debt. totalSupply() = total debt.
sSTRAT-v2
ERC-20
No
No
No
Non-transferable receipt token. transfer() and approve() revert.
NFT Option
ERC-721
N/A
Yes
N/A
Conversion rights. Requires CDT to exercise. Partial exercise supported.
ESPN
ERC-4626
No
Yes
No
Standard vault interface. Deposit USDS, receive shares.
esETH Integration
esETH is the protocol's non-rebasing wrapper around multiple liquid staking tokens (wstETH, rETH, cbETH, weETH, aWETH), pegged 1:1 with ETH. It is the denomination layer for the entire treasury.
Why esETH is Easy to Integrate
Use esETH the way you use wstETH or rETH. esETH is a standard, non-rebasing ERC-20. Unlike stETH, balances never change from rebase events. You can:
Store balances in
mapping(address => uint256)without driftCache balances across blocks without staleness
Use esETH in AMM pools, lending markets, and vaults without rebase accounting
Treat 1 esETH as exactly 1 ETH — the peg is fixed at 1:1 (yield is harvested separately, not embedded in the token value)
If you've integrated wstETH or rETH, esETH works the same way. If you've struggled with stETH rebase edge cases, esETH eliminates them.
Core Interface
Pricing esETH
esETH is always 1:1 with ETH. For lending markets, collateral valuation, and any system that needs esETH's "fair value":
Do not use AMM spot price for esETH valuation in lending or collateral contexts. The 1:1 peg is maintained by construction — yield from underlying LSTs is harvested separately and does not accrete to esETH's value. AMM prices reflect market dynamics and may diverge from the peg.
1 esETH = 1 ETH, always. Unlike wstETH or rETH, esETH does not appreciate over time. Yield from underlying LSTs is harvested and directed to the protocol — not embedded in esETH's value.
Production Warnings
Rounding: expect 1-2 wei dust on maximum-balance operations. When transferring a user's entire esETH balance, the last 1-2 wei may remain due to integer division in internal calculations. If your contract needs exact-balance transfers, read balanceOf() and transfer that amount rather than a cached value.
Supported LSTs are governance-configurable. The set of LSTs that esETH accepts for minting and offers for redemption can change. Do not hardcode LST addresses — query the contract for the current whitelist. A previously supported LST may be removed, and redemption for that LST would revert.
Redemption depends on contract holdings. Unlike minting (which can wrap any supported LST), redemption requires the esETH contract to actually hold the requested LST. If the treasury has rebalanced its LST allocation, your preferred LST may have insufficient balance. Check previewRedeem() before executing.
Yield is not reflected in balances. esETH holders do not receive yield. Underlying LST yield is harvested separately and directed to the protocol's yield receiver. esETH is a denomination layer, not a yield-bearing token for the holder.
ERC-2612 permit front-running. As with any permit-based approval, a griefer can front-run your permit call by submitting the same signature first. The permit succeeds for the griefer (setting the allowance), then your transaction reverts. Mitigation: wrap permit + action in a try/catch — if permit reverts, check if allowance is already set, and proceed with the action.
STRAT Integration
STRAT is a standard ERC-20 with ERC-2612 permit support. It does not rebase and is only minted through convertible note conversion.
Key Facts for Integrators
No inflation schedule. STRAT supply only increases when note holders convert. There is no emission schedule or admin mint.
Valuation metric: ETH per STRAT (EPS) = total esETH in treasury / total STRAT supply. This is the fundamental metric — it increases when the treasury grows faster than STRAT dilution.
Contract address: 0x14cF922aa1512Adfc34409b63e18D391e4a86A2f
Displaying STRAT Value
For dashboards and portfolio trackers, show EPS alongside the market price:
CDT Integration
CDT is a standard ERC-20 with ERC-2612 permit support. Each CDT represents approximately $1 of protocol debt.
Key Facts for Integrators
totalSupply()= total protocol debt. This is an on-chain transparency guarantee. Display it to users as the protocol's total debt outstanding.CDT does not accrue interest or yield. Its value comes from: (1) the $1 face-value redemption right after note expiry, and (2) its utility as a "key" required to exercise NFT conversion rights.
CDT is required for conversion. An NFT alone cannot be converted — the holder must also hold and burn CDT. This creates organic demand for CDT beyond its face value.
Minting is restricted to authorized protocol contracts (ConvertibleNote, TreasuryLend). CDT cannot be minted by governance or any external address.
CDT as a Leverage Indicator
StakedStrat (sSTRAT-v2) Integration
StakedStrat is the on-chain staking contract. It accepts STRAT deposits and streams esETH rewards over 7-day periods.
Core Interface
Production Warnings
sSTRAT-v2 is non-transferable. transfer(), transferFrom(), and approve() all revert with TransferDisabled. Do not attempt to build markets, pools, or collateral positions with sSTRAT-v2. It is an accounting receipt, not a tradable asset. The only way to move a staked position is migrateStake().
getPendingRewards() may undercount. The view function projects the current reward stream forward but does not account for newly arrived esETH that hasn't been synced. If you need an accurate reading (e.g., for a dashboard), call syncRewards() first in a static call:
Unstaking auto-claims rewards. When a user unstakes, all pending esETH rewards are automatically claimed and sent to them. This is by design — there is no scenario where unstaking forfeits earned yield. Account for this in your UI: after an unstake transaction, the user will have received both their STRAT and their esETH rewards.
7-day streaming means delayed reward visibility. When new rewards arrive at the contract, they stream linearly over 7 days. A large deposit into the reward pool doesn't instantly appear as claimable — it drips over the week. Display this to users as "streaming rewards" rather than a lump sum.
Convertible Note Integration
The convertible note system has two components: the EthStrategyConvertibleNote contract (handles bonding, conversion, and redemption) and the NFT options it mints.
Bonding
Conversion
Reading Note State
Each NFT encodes the full position state. Query it to display note details in your UI:
Production Warnings
Only ownerOf(tokenId) can convert or redeem. NFT approvals (approve, setApprovalForAll) are intentionally not accepted for settlement authorization. If your contract holds note NFTs, it must call conversion/redemption functions directly — it cannot delegate this to another address. This is a security design choice to reduce attack surface.
Timelock prevents immediate conversion. After bonding, there is a ~6.9-day window where the note exists but cannot be converted or redeemed. The NFT and CDT can be transferred during this period. Build your UI to show the timelock countdown.
Partial exercise is supported but CDT must match. To exercise 50% of a note, burn 50% of amountOwedCdt. The NFT's entitlement fields decrement proportionally. The NFT is only burned when amountOwedCdt reaches zero (full exercise).
conversionEntitlements() preview may show zero ETH. If the protocol is underwater (total debt > treasury value in USD), the ETH conversion entitlement for new notes is zero. STRAT conversion rights are still granted. Check the preview before presenting note terms to users.
ESPN (ERC-4626 Vault) Integration
ESPN follows the standard ERC-4626 Tokenized Vault interface. If your protocol or aggregator already supports ERC-4626, ESPN requires no custom integration work.
Key Details
Deposit asset
USDS
Share token
ESPN
Deposit cap
Governance-configurable
Withdrawals
May be disabled by governance; exit via LP redemption when direct withdrawals are disabled
Withdrawals may be disabled. Check maxWithdraw(owner) before presenting a withdraw button. When direct withdrawals are disabled, users exit via the ESPN/USDS LP on secondary markets or the redemption queue.
End-to-End Example: Bond, Stake, and Earn
This example walks through the complete flow using ethers.js v6:
Contract addresses for esETH, CDT, EthStrategyConvertibleNote, and StakedStrat will be published on the Contracts page before permissionless launch. Core contracts have completed audits; reports will be released alongside the code.
Deployed Contracts
See Contracts for all deployed and upcoming contract addresses.
Live Now
Deploying Soon
esETH
Non-rebasing unified LST wrapper
CDT
Fungible ERC-20 protocol debt token (with ERC-2612 permit)
EthStrategyConvertibleNote
Bonding, note issuance, conversion, redemption
StakedStrat
On-chain STRAT staking with 7-day reward streaming
Security Considerations for Integrators
Access Control
esETH
Ownable2Step
Protocol multisig
STRAT
Ownable2Step
Protocol multisig
CDT
Ownable2Step
Protocol multisig
StakedStrat
Ownable2Step
Protocol multisig
ConvertibleNote
Ownable2Step
Protocol multisig
All ownership transfers require a two-step process (propose → accept) to prevent accidental transfers to wrong addresses.
Reentrancy
All state-changing functions on StakedStrat and ConvertibleNote are guarded by nonReentrant. Token transfer callbacks cannot be exploited to corrupt accounting.
Immutability
ETH Strategy contracts are deployed without proxy-upgrade patterns. Deployed code is immutable. Governance can tune parameters (PCF, GCF, supported LSTs, caps) but cannot change contract logic.
What Governance Can and Cannot Change
PCF/GCF (bonding price factors)
Existing note entitlements
Supported LST whitelist
Existing note timelock/expiry
Deposit caps
Existing loan terms
Reward distribution addresses
CDT supply accounting
Borrow rate, loan duration (TreasuryLend)
Contract logic (no upgrades)
Getting Help
Source code: github.com/dangerousfood/ethstrategy (Apache 2.0)
Documentation: docs.ethstrat.xyz
Telegram: t.me/ethstrat
Twitter: @eth_strategy
Last updated