{"id":"ERC-7535","name":"Native Asset ERC-4626 Vault","status":"Final","chain":"both","category":{"id":"defi","name":"DeFi Patterns","description":"Vaults, bonds, and financial primitives"},"journeyStages":[{"id":"management","name":"Asset Management","description":"Managing assets over time"}],"uxImpact":"ERC-7535 is a native-asset override of ERC-4626. A compatible vault can accept native ETH through payable deposit or mint calls without a separate WETH wrapping step; support, gas cost, fees, and withdrawal output remain deployment- and network-specific.","officialUrl":"https://ercs.ethereum.org/ERCS/erc-7535","lastReviewed":"2026-09-18","lastUpdated":"2026-09-18","kind":"proposal","hasDetailedContent":true,"content":{"id":"ERC-7535","summary":"ERC-7535 is a native-asset override of ERC-4626. A compatible vault can accept native ETH through payable deposit or mint calls without a separate WETH wrapping step; support, gas cost, fees, and withdrawal output remain deployment- and network-specific.","applicability":{"whenToUse":["The deployed vault implements the native-asset ERC-4626 override and users would otherwise need a separate wrapping step.","The product can detect the vault's payable deposit/mint path and supported withdrawal output.","The UI can simulate the target transaction and show fees and reserve effects.","You are designing a direct native-asset deposit experience with visible states and recovery paths."],"whenToAvoid":["The deployed vault is WETH-backed or does not implement the native-asset ERC-4626 override.","The product only supports wrapped-asset vaults and has no payable native-asset deposit path.","The flow requires a withdrawal/output asset that the deployed vault does not expose.","No token balances, swaps, lending, or yield flows appear in the product."]},"designerTakeaways":["Design a direct native-asset deposit path only after verifying the deployed vault's payable interface.","Show the native asset, expected shares, fee, and withdrawal output; do not imply that every ERC-4626 vault accepts native ETH.","Compare wrapping and direct deposit with a deployment- and network-specific simulation rather than a universal gas estimate."],"problemsSolved":[{"problem":"Users need a separate wrapping step before a compatible vault deposit","oldWay":"Wrap native ETH to WETH, approve it, then deposit.","newWay":"A compatible ERC-7535 vault can accept native ETH through its payable deposit/mint path.","impact":"critical"},{"problem":"Users do not understand the wrapped-asset path","oldWay":"The UI explains WETH even when the deployed vault accepts native ETH.","newWay":"The UI can present the verified native-asset path and distinguish any separate WETH vault.","impact":"critical"},{"problem":"Deposit path cost is unclear","oldWay":"Use a universal wrapping gas estimate.","newWay":"Compare simulated wrapping and direct deposit transactions on the target network, including fees and withdrawal behavior.","impact":"medium"},{"problem":"Native and wrapped balances are fragmented","oldWay":"Users see ETH, WETH, and vault shares without a path explanation.","newWay":"Show the selected vault's native or wrapped asset path and resulting shares explicitly.","impact":"medium"}],"uxPatterns":[{"name":"Direct ETH Deposit","description":"One-step deposit of native ETH into vault","userFlow":["User enters ETH amount to deposit","Preview shows expected vault shares","Click deposit (no approve step)","Sign single transaction","ETH converts to vault shares directly"]},{"name":"Unified Deposit Interface","description":"Explain the native-asset path separately from any WETH vault","userFlow":["User selects a verified native-asset vault path","Show that payable deposit or mint uses msg.value and needs no ERC-20 approval","If a separate WETH vault exists, label it as a different deployment","Show the deployed vault's supported withdrawal behavior","Preview shares using the deployed ERC-4626 interface"]},{"name":"Native Withdrawal","description":"Withdraw back to ETH directly","userFlow":["User sees current position and earnings","Select withdrawal amount","Check whether the deployed vault returns native ETH or another asset","Sign withdrawal transaction","Receive the deployed vault's supported output asset after the withdrawal settles"]}],"uiComponents":[{"name":"NativeAssetInput","description":"Input field that handles native ETH amounts","states":["empty","valid","insufficient","max"],"props":["balance","value","onChange","onMax"]},{"name":"NativeAssetStatus","description":"Show the verified native asset and whether an ERC-20 approval is needed","states":["native-selected","unsupported"],"props":["nativeBalance","approvalStatus"]},{"name":"VaultSharesPreview","description":"Show expected shares from deposit","states":["loading","ready","slippage-warning"],"props":["inputAmount","expectedShares","exchangeRate"]},{"name":"NoApprovalBadge","description":"Indicate no approval needed for native asset","states":["native","needs-approval","approved"],"props":["assetType","approvalStatus"]}],"antiPatterns":[{"pattern":"Showing a native path for a WETH-backed vault","why":"ERC-7535 depends on the deployed vault's native-asset override.","instead":"Verify the target interface and label native versus wrapped deployments.","severity":"critical"},{"pattern":"Promising a universal gas saving","why":"Gas and fee totals vary by deployment, network, withdrawal path, and transaction simulation.","instead":"Show a current simulation comparison with its network and fee source.","severity":"high"},{"pattern":"Defaulting to the wrong asset path","why":"Users may sign a wrapping transaction when a verified native path exists or vice versa.","instead":"Show the selected vault, asset type, approval requirement, and reserve/fee effect.","severity":"high"},{"pattern":"Hiding withdrawal output","why":"A native deposit does not establish that withdrawals return native ETH.","instead":"Show the deployed vault's actual withdrawal/output asset.","severity":"medium"}],"onMonad":[{"aspect":"Native asset and MAX","ethereum":"A native-asset vault accepts ETH only where its deployed implementation supports that path. Transaction fees still affect the maximum deposit.","monad":"Offer MON deposits only for a verified Monad vault that accepts native MON. The sender's fees, delegation state, and reserve eligibility can affect the maximum; a fixed balance-minus-10 formula is not reliable.","designImplication":"Check the deployed vault and simulate the intended deposit. Show the resulting amount and fee without implying that this standard establishes a live Monad integration."}],"specConstraints":[{"id":"native-vault-compatibility","constraint":"An ERC-7535 vault implements ERC-4626 with behavioral overrides for the native asset, deposit, and mint.","appliesTo":"application","normativity":"normative","specQuote":"All [ERC-7535](./eip-7535.md) tokenized Vaults MUST implement ERC-4626 (and by extension ERC-20) with behavioral overrides for the methods `asset`, `deposit`, and `mint` specified below.","specSection":"Specification","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#specification","designImplication":"Detect native-asset support from the deployed vault rather than assuming every ERC-4626 vault accepts ETH directly."},{"id":"payable-deposit","constraint":"Native-asset deposit is payable and uses msg.value as the primary deposit amount.","appliesTo":"wallet","normativity":"normative","specQuote":"MUST use `msg.value` as the primary input parameter for calculating the `shares` output. I.e. MAY ignore `assets` parameter as an input.","specSection":"Specification > Methods > deposit","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#deposit","designImplication":"Show the ETH value sent as the authoritative input and make any ignored assets parameter explicit in advanced details."},{"id":"native-deposit-failure","constraint":"deposit must revert when the full msg.value cannot be deposited because of limits or slippage.","appliesTo":"application","normativity":"normative","specQuote":"MUST revert if all of `msg.value` cannot be deposited (due to deposit limit being reached, slippage, etc).","specSection":"Specification > Methods > deposit","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#deposit","designImplication":"Preview the native deposit limit/slippage path and keep a clear recoverable failure state if the full ETH value cannot be accepted."},{"id":"payable-mint","constraint":"Native-asset mint is payable and uses the sent Ether to determine the minted share result.","appliesTo":"wallet","normativity":"normative","specQuote":"MUST have state mutability of `payable`.","specSection":"Specification > Methods > mint","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#mint","designImplication":"Keep share-targeted minting distinct from asset-targeted deposit and show the required ETH value before signing."},{"id":"native-mint-failure","constraint":"mint must revert when all requested shares cannot be minted, including when msg.value is insufficient.","appliesTo":"application","normativity":"normative","specQuote":"MUST revert if all of `shares` cannot be minted (due to deposit limit being reached, slippage, the user not sending a large enough `msg.value` of Ether to the Vault contract, etc).","specSection":"Specification > Methods > mint","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#mint","designImplication":"Show the underfunded/limit/slippage reason and never mark a partial share result as a successful full mint."},{"id":"native-only-boundary","constraint":"ERC-7535 applies to native ETH and must not be used for an ERC-4626 vault whose asset is wrapped ETH.","appliesTo":"application","normativity":"normative","specQuote":"Any ERC-4626 Vault that uses a Wrapped ETH ERC-20 as the `asset` MUST NOT implement ERC-7535. ERC-7535 only applies to native ETH.","specSection":"Specification > Wrapped ETH","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#wrapped-eth","designImplication":"Label ETH versus WETH clearly and offer wrapping only as a separate path; do not imply native support from an ERC-4626 interface alone."},{"id":"erc4626-compat","constraint":"ERC-7535 remains interface-compatible with ERC-4626 while native ETH changes some behavior such as msg.value priority.","appliesTo":"application","normativity":"backwards-compatibility","specQuote":"## Backwards Compatibility\n\nERC-7535 is fully backward compatible with ERC-4626 at the function interface level. Certain implementation behaviors are different due to the fact that ETH is not ERC-20 compliant, such as the priority of `msg.value` over `assets`.\n\nIt has no known compatibility issues with other standards.","specSection":"Backwards Compatibility","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#backwards-compatibility","designImplication":"Reuse vault share/deposit concepts but disclose native-asset differences wherever users would otherwise expect ERC-20 asset behavior."},{"id":"native-asset-security","constraint":"Native-asset vaults inherit ERC-4626 security concerns and add ETH transfer/reentrancy/accounting risks.","appliesTo":"account-implementation","normativity":"security-considerations","specQuote":"## Security Considerations\n\nIn addition to all security considerations of [ERC-4626](./eip-4626.md), there are security implications of having ETH as the Vault asset.","specSection":"Security Considerations","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#security-considerations","designImplication":"Add reentrancy, forceful-transfer, and accounting caveats to deposit/withdraw confidence states; do not present native ETH support as a risk-free wrapper."},{"id":"native-transfer-risk","constraint":"Using call to transfer ETH permits reentrancy and arbitrary code execution beyond trusted ERC-20 transfers.","appliesTo":"account-implementation","normativity":"security-considerations","specQuote":"### `call` vs `send`\n\nContracts should take care when using `call` to transfer ETH, as this allows additional reentrancy vulnerabilities and arbitrary code execution beyond what is possible with trusted ERC-20 tokens.\n\nIt is safer to simply `send` ETH with a small gas stipend. \n\nImplementers should take extra precautions when deciding how to transfer ETH.","specSection":"Security Considerations > call vs send","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#call-vs-send","designImplication":"Surface a contract-specific security review status for native withdrawals and avoid promising identical behavior to an ERC-20 vault."},{"id":"forced-eth-accounting","constraint":"ETH can be forced into a vault, so implementers should validate that forced transfers do not disrupt accounting.","appliesTo":"account-implementation","normativity":"security-considerations","specQuote":"### Forceful ETH transfers\n\nETH can be forced into any Vault through the `SELFDESTRUCT` opcode. Implementers should validate that this does not disrupt Vault accounting in any way.\n\nSimilarly, any additional `payable` methods should be checked to ensure they do not disrupt Vault accounting.","specSection":"Security Considerations > Forceful ETH transfers","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#forceful-eth-transfers","designImplication":"Treat total assets and balances as implementation-specific and show an accounting warning when unsolicited ETH can affect displayed ratios."},{"id":"weth-alternative","constraint":"Implementers should consider WETH ERC-20 support instead of ERC-7535 when a native-asset experience is not required.","appliesTo":"application","normativity":"security-considerations","specQuote":"### Wrapped ETH\n\nSmart contract systems which implement ERC-4626 should consider only supporting ERC-20 underlying assets, and default to using a Wrapped ETH ERC-20 instead of implementing ERC-7535 for handling ETH.\n\nThe subtle differences between ERC-4626 and ERC-7535 can introduce code fragmentation and security concerns.\n\nCleaner use cases for ERC-7535 are ETH exclusive, such as Wrapped ETH and Liquid Staking Tokens.","specSection":"Security Considerations > Wrapped ETH","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#wrapped-eth","designImplication":"Let users compare direct ETH and wrap-then-deposit paths and state which one the deployed vault actually supports."},{"id":"excess-eth-policy","constraint":"A vault implementer may refund or absorb excess Ether in mint, so the depositor should send an amount close to the exact requirement.","appliesTo":"application","normativity":"rationale","specSection":"Rationale > Allowing msg.value to Not Equal assets Output in a Mint","specUrl":"https://ercs.ethereum.org/ERCS/erc-7535#rationale","designImplication":"State the vault's excess-Ether policy before signing and show whether the result refunds or absorbs the difference; do not imply exact equality when the implementation permits overpayment.","specQuote":"There may be many cases where a user deposits slightly too much Ether in a `mint` call. In these cases, enforcing `msg.value` to equal `assets` would cause unnecessary reversions. It is up to the vault implementer to decide whether to refund or absorb any excess Ether, and up to depositors to deposit as close to the exact amount as possible."}],"keyTakeaways":["A compatible ERC-7535 vault can accept native ETH through payable ERC-4626 deposit/mint calls.","Feature-detect the deployed vault; an ordinary or WETH-backed ERC-4626 vault is not automatically ERC-7535.","Use network-specific simulation for gas and fee comparisons.","Show the actual withdrawal/output path and native-asset reserve effect."],"technicalNotes":"ERC-7535 is a native-asset override of ERC-4626: it overrides asset(), deposit(), and mint(), with payable deposit/mint calls using msg.value. It does not add depositETH() or require a receive() function, and a WETH-backed ERC-4626 vault is not an ERC-7535 vault. Feature-detect the deployed vault's withdrawal behavior and distinguish a separate WETH deployment.","sources":[{"label":"Monad reserve-balance rules","url":"https://docs.monad.xyz/developer-essentials/reserve-balance","type":"reference"},{"label":"Official ERC-7535 specification","url":"https://ercs.ethereum.org/ERCS/erc-7535","type":"official-spec"}],"lastUpdated":"2026-09-18","lastReviewed":"2026-09-18"},"sources":[{"label":"Official specification","url":"https://ercs.ethereum.org/ERCS/erc-7535","type":"official-spec"},{"label":"Discussion search","url":"https://ethereum-magicians.org/search?q=ERC-7535","type":"discussion"},{"label":"Monad reserve-balance rules","url":"https://docs.monad.xyz/developer-essentials/reserve-balance","type":"reference"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-7535","markdown":"https://www.eipsfordesigners.com/standards/ERC-7535/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-7535/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-7535","official":"https://ercs.ethereum.org/ERCS/erc-7535","discussion":"https://ethereum-magicians.org/search?q=ERC-7535"},"freshness":{"lastReviewed":"2026-09-18","lastUpdated":"2026-09-18"}}