Resolver Selection

This guide concisely explains how to choose and configure the right resolver for a yield-bearing underlying assets.

A resolver is a code template that supports ~99.9% of yield-bearing underlyings and enables the permissionless creation of Napier Markets.

Use this guide to quickly determine the correct resolver settings for your use case.


Glossary

  • Underlying: Yield-bearing position token (e.g., a vault or lending position).

  • Asset: Base token used to value the underlying (what users deposit/withdraw).

  • Vault: ERC-20 token representing ownership of the underlying (e.g., ERC-4626 share token).

  • Resolver: Contract that returns the exchange rate between vault shares and assets.


TL;DR

  • Choose the appropriate resolver for your underlying and gather the required inputs.

    • Rebasing tokensNot natively supported.

    • ERC-4626 standardERC4626 Resolver

    • Has “convert shares → assets” functionCustom Conversion Resolver (spec-like convertToAssets(uint256 shares) -> uint256 assets; name may differ)

    • Has “price per share” functionShare Price Resolver (e.g., assetsPerShare() -> uint256 assets)

    • External oracle priceExternal Price Resolver (generic) or Price Oracle Feed Resolver (Chainlink / Redstone / etc)

    • Constant price (no yield, fixed rate) → Constant Price Resolver

    • Other / unclear → Contact us.


Flowchart

Here we visualize which resolver to choose based on the underlying asset.


Inputs by Resolver

Each resolver requires a different set of inputs.

ERC 4626

  • vault: ERC-4626 token address

    • asset is auto-read from vault.asset()

Custom Conversion

  • vault: underlying ERC-20 address

  • asset: base ERC-20 address (e.g., USDC)

  • conversionFunctionSignature: function that converts shares → assets Spec

customConversionFn(uint256 shares) returns (uint256 assets)
  • shares: amount of vault shares to convert

  • assets: resulting base asset amount

Share Price

  • vault: underlying ERC-20 address

  • asset: base ERC-20 address

  • priceFunctionSignature: function that returns price per share Spec

customPriceFn() returns (uint256 assets)
  • assets: base asset amount for 1 share (equivalent to convertToAssets(10**vault.decimals()) scaled accordingly)

External Price Oracle

  • vault: underlying ERC-20 address

  • asset: base ERC-20 address

  • oracle: price oracle address

  • priceFeedFunctionSignature: oracle function returning price Spec

priceFeedFn() returns (uint256 assets)
  • assets: base asset amount for 1 share

Price Oracle Feed

  • vault: underlying ERC-20 address

  • asset: base ERC-20 address

  • oracle: Chainlink AggregatorV3Interface that returns vault price vs. asset

Constant Price

  • vault: underlying ERC-20 address

  • asset: base ERC-20 address

Caution: price is fixed; implies no yield and ignores risks (e.g., de-peg).

Critical Notes & Assumptions

  • Decimals matter: all conversion/price returns must use correct precision.

  • Trusted sources: share-price, conversion, and oracle feeds are treated as trusted.

  • No freshness checks: resolvers do not validate data staleness.

  • Immutability: resolvers cannot be upgraded after deployment.

  • No reverts: the called functions must not revert.

  • Exact signatures: function signatures & return types must match each resolver’s spec.

TIP: vault and asset must be ERC-20. If the underlying accepts native coin deposits, set asset to the wrapped native token for that chain.


Common Wrapped Native Token Addresses

  • Ethereum: WETH 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

  • Optimism: WETH 0x4200000000000000000000000000000000000006

  • BSC: WBNB 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c

  • Polygon: WMATIC 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270

  • Sonic: WS_SONIC 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38

  • Fraxtal: WFRXETH 0xFC00000000000000000000000000000000000006

  • HyperLiquid: WHYPE 0x5555555555555555555555555555555555555555

  • Mantle: WMNT 0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8

  • Base: WETH 0x4200000000000000000000000000000000000006

  • Arbitrum: WETH 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1

  • Avalanche: WAVAX 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7


Final Checks Before Deploy

Last updated

Was this helpful?