> For the complete documentation index, see [llms.txt](https://etherfi.gitbook.io/etherfi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://etherfi.gitbook.io/etherfi/developers/contracts-and-integrations/integration-guide.md).

# Integration Guide

This guide is for **developers integrating ether.fi's liquid restaking tokens** (eETH and weETH) into a protocol, dApp, or smart contract. It covers the token model, how to price the tokens, and the on-chain flows for minting, wrapping, and redeeming.

For the canonical, cross-chain address list see [Deployed Contracts](/etherfi/developers/contracts-and-integrations/deployed-contracts.md). For a click-by-click Etherscan walkthrough of withdrawals, see [How To](/etherfi/developers/contracts-and-integrations/how-to.md).

## Choose the right token

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>eETH</strong> — rebasing</td><td>Balance grows over time as rewards accrue. ERC-20 with permit. Best when you want a 1:1-with-ETH unit of account and can handle a rebasing balance.</td></tr><tr><td><strong>weETH</strong> — non-rebasing (recommended for DeFi)</td><td>A wrapped, fixed-balance token whose <em>value</em> grows relative to eETH. This is the version most DeFi protocols integrate, because a non-rebasing balance is simpler for AMMs, lending markets, and accounting.</td></tr></tbody></table>

{% hint style="info" %}
If you're listing a single token in a lending market, AMM, or vault, integrate **weETH**.
{% endhint %}

## Key contracts (Ethereum mainnet)

| Contract                 | Address                                                                                                                 |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| LiquidityPool            | [`0x308861A430be4cce5502d0A12724771Fc6DaF216`](https://etherscan.io/address/0x308861A430be4cce5502d0A12724771Fc6DaF216) |
| eETH                     | [`0x35fA164735182de50811E8e2E824cFb9B6118ac2`](https://etherscan.io/address/0x35fA164735182de50811E8e2E824cFb9B6118ac2) |
| weETH                    | [`0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee`](https://etherscan.io/address/0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee) |
| EtherFiRedemptionManager | [`0xDadEf1fFBFeaAB4f68A9fD181395F68b4e4E7Ae0`](https://etherscan.io/address/0xDadEf1fFBFeaAB4f68A9fD181395F68b4e4E7Ae0) |
| WithdrawRequestNFT       | [`0x7d5706f6ef3F89B3951E23e557CDFBC3239D4E2c`](https://etherscan.io/address/0x7d5706f6ef3F89B3951E23e557CDFBC3239D4E2c) |

For weETH on other chains (Arbitrum, Base, Optimism, and more), see [Deployed Contracts](/etherfi/developers/contracts-and-integrations/deployed-contracts.md).

## Pricing weETH

weETH appreciates against eETH (and ETH) as rewards accrue. Read the exchange rate directly from the weETH contract:

```solidity
interface IWeETH {
    // eETH equivalent of 1 weETH, scaled to 1e18
    function getRate() external view returns (uint256);
    // explicit conversions
    function getEETHByWeETH(uint256 weETHAmount) external view returns (uint256);
    function getWeETHByeETH(uint256 eETHAmount) external view returns (uint256);
}
```

`getRate()` returns the amount of eETH represented by one weETH, scaled to `1e18`. Since eETH targets a 1:1 relationship with ETH via rebasing, this rate is also the weETH→ETH rate for most purposes.

{% hint style="warning" %}
For production price feeds on Ethereum and L2s, use a dedicated oracle such as [RedStone](https://docs.redstone.finance/docs/smart-contract-devs/price-feeds) or Chainlink rather than reading `getRate()` cross-chain. See [Integrations](/etherfi/developers/contracts-and-integrations/integrations.md) for available feeds.
{% endhint %}

## Mint eETH (stake ETH)

Send ETH to the LiquidityPool and receive eETH. An optional referral address can be supplied.

```solidity
interface ILiquidityPool {
    function deposit() external payable returns (uint256);
    function deposit(address _referral) external payable returns (uint256);
}
```

```javascript
// ethers v6
const lp = new ethers.Contract(LIQUIDITY_POOL, ILiquidityPoolAbi, signer);
const tx = await lp["deposit()"]({ value: ethers.parseEther("1") });
await tx.wait();
// the signer now holds eETH
```

## Wrap eETH into weETH

Approve the weETH contract to spend your eETH, then wrap. `unwrap` reverses it.

```solidity
interface IWeETH {
    function wrap(uint256 eETHAmount) external returns (uint256);   // returns weETH minted
    function unwrap(uint256 weETHAmount) external returns (uint256); // returns eETH returned
}
```

```javascript
const eeth = new ethers.Contract(EETH, IERC20Abi, signer);
await (await eeth.approve(WEETH, amount)).wait();

const weeth = new ethers.Contract(WEETH, IWeETHAbi, signer);
await (await weeth.wrap(amount)).wait();
```

## Redeem back to ETH

There are two paths. Both require unwrapping weETH to eETH first if you hold weETH (or use the weETH-specific redemption function).

{% stepper %}
{% step %}

#### Instant redemption (subject to liquidity)

`EtherFiRedemptionManager.redeemEEth(amount, receiver, outputToken)` / `redeemWeEth(amount, receiver, outputToken)` swap eETH/weETH for ETH (or stETH, selected via `outputToken`) immediately, minus a small exit fee, when buffer liquidity is above the low watermark. Check `canRedeem(amount, token)` and `getInstantLiquidityAmount(token)` first; the per-token fee, watermark, and rate-limit bucket are readable via `tokenToRedemptionInfo(token)`.
{% endstep %}

{% step %}

#### Queued withdrawal (no fee)

`LiquidityPool.requestWithdraw(recipient, amount)` mints a `WithdrawRequestNFT`. Once `isFinalized(requestId)` is true, call `WithdrawRequestNFT.claimWithdraw(tokenId)` to receive ETH. The payout is locked in at finalization — preview it with `getClaimableAmount(tokenId)`.
{% endstep %}
{% endstepper %}

See [How To](/etherfi/developers/contracts-and-integrations/how-to.md) for the full Etherscan walkthrough with the exact function selectors and approval steps.

{% hint style="warning" %}
**Protocol safeguards your integration should tolerate.** Deposits, withdrawals, redemptions, and token transfers check an onchain [Blacklister](https://etherscan.io/address/0x5585996E7cFE95f2D99e61168B8b35C66Ff99B18) and revert for blacklisted addresses. eETH minting and burning draw from global rate-limit buckets, and contracts can be paused for bounded periods during incidents — so deposit and redeem calls can revert temporarily under extreme conditions. See [MultiSigs & Controls](/etherfi/security/security-and-risks/multisigs-and-controls.md) for the full model.
{% endhint %}

## Source of truth & audits

* Smart contracts: [github.com/etherfi-protocol/smart-contracts](https://github.com/etherfi-protocol/smart-contracts)
* [Deployed Contracts](/etherfi/developers/contracts-and-integrations/deployed-contracts.md) — all live addresses, all chains
* [Audits](/etherfi/security/security-and-risks/audits.md) — 30+ public reports

{% hint style="info" %}
Building something with weETH? Join our [Discord](https://discord.com/invite/zqGzcuQWvD) to get support and have your integration listed.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://etherfi.gitbook.io/etherfi/developers/contracts-and-integrations/integration-guide.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
