Repository navigation
Releases: AvaProtocol/protocols
Release list
v1.2.0
Minor Changes
-
0562978: Add the BNB Chain baseline to the token catalog: WBNB, Binance-Peg BTCB and ETH, FDUSD, USD1, USDe, sUSDe, Cake, wstETH, slisBNB, LBTC, SolvBTC, XVS, LINK, and BNBx (legacy: Stader discontinued it). Each address was checked against the issuer's or BNB Chain's published list and on-chain.
lookupToken(56, WBNB)now returnsWBNB. Before, it fell through toProtocols.uniswapV3.tokens.WETH, whose BNB Chain entry holds WBNB, and answered with symbol"WETH". BNB Chain'sETHsymbol is the Binance-Peg ERC-20, not native ETH. -
0562978: Fill the Ethereum and Base token-catalog gaps found by the coverage audit (#38).
- Ethereum: RLUSD, USDG, GHO, cbETH, sDAI, crvUSD, LUSD, USDtb, eUSDe, SKY, BAL, 1INCH, FXS, KNC, STG, ETHx, ezETH, tETH, frxETH, sfrxETH, FBTC, eBTC, BTC.b, mUSD and syrupUSDT.
- Base: RLUSD (
0x8d58C0C60B8D6b88Fa98B291a646dB34d0F98258, Ripple's L2 address), WBTC, GHO, LBTC, tBTC, weETH, ezETH, wrsETH, syrupUSDC, USDS, sUSDS, USDe and sUSDe.
Every Aave V3 Core reserve on Ethereum, Base and BNB Chain (except expiring Pendle PTs) is now in
Tokens, solookupTokenrecognizes them without the per-protocol fallback. -
b377e71: Add Circle EURC to the Ethereum, Base, Sepolia and Base Sepolia token catalogs. Addresses follow https://developers.circle.com/stablecoins/eurc-contract-addresses.
-
0562978: Rename Ethereum
Tokens["SolvBTC.BBN"]toTokens.xSolvBTC(0xd9D920AA40f578ab794426F5C90F6C731D159DEf). Solv rebranded the token: the contract'sname()andsymbol()both returnxSolvBTC. The address and decimals are unchanged;lookupTokenand the Ethereum sidecar (dist/tokens/ethereum.json) now returnxSolvBTCfor it.Code that reads
Tokens["SolvBTC.BBN"]must switch toTokens.xSolvBTC. -
0562978: Record transfer constraints on token rows and pin catalog addresses to their sources.
TokenChainEntry.transferConstraintslists behaviour that makes a plaintransferto an arbitrary address revert or deliver a different amount. Values come from the newTOKEN_TRANSFER_CONSTRAINT:permissionedRecipient(OUSG, BUIDL, USYC),rebasing(stETH, eETH) andfeeOnTransfer(none listed). No constraints means none is known, not that every transfer succeeds.- Provenance for each row (canonical sources, native/bridged/test, verification date) lives in
src/tokens/provenance/*.json. Tests read it; the package does not ship it. tests/token-coverage.test.tsenforces a defined coverage target per chain, address agreement between provenance,Tokensand protocol modules, and one symbol per address across chains.docs/TOKEN_CATALOG.mddocuments the inclusion and maintenance policy and how consumers should separate recognizing a holding from deciding whether it can be transferred.docs/TOKEN_COVERAGE.mdis the generated per-chain matrix (yarn report:tokens).
Patch Changes
- 0562978: Correct Base Sepolia
USDT(0xCE8565457Cca0fC7542608A2c78610Ed7bC66C8C) to 18 decimals. The row said 6, but the contract'sdecimals()returns 18, so amounts formatted from the catalog were off by 10^12. The contract is an unverified third-party test token, not a Tether deployment. Addyarn verify:tokens, a read-only check of every catalog row's code,decimals()andsymbol()against the chain.
v1.1.0
Minor Changes
- 1a6a8da: Add
uniswapV3Pool({ chainId, tokenA, tokenB, fee }), which derives the canonical Uniswap v3 pool address and token order from the catalog factory.UNISWAP_V3_FEE_TIERSis the list of fee tiers to try (100, 500, 3000, 10000). The address is a CREATE2 prediction: callers still checkgetPoolandliquidity()before offering a pool.
v1.0.0
Major Changes
-
c74d262: Remove
Chains.Holesky(17000). EigenLayer has sunset Holesky and Ava Protocol's testnet AVS moved to Sepolia, so the constant no longer names a chain anything in this catalog targets.Nothing in the catalog covered it: no protocol module and no token declared a 17000 entry, so
dist/tokens/holesky.jsonwas never actually emitted despite the sidecar's filename map and README listing it. The removal drops the constant, its sidecar filename entry, and both doc references.Breaking:
Chains.Holeskyno longer exists. Callers referencing it fail to compile. There is no replacement — useChains.Sepolia(11155111) for testnet work.
Minor Changes
- 3df9da0: Add Polygon PoS (137) and Hyperliquid EVM (999) to
Chains, and mapwrapped.wethto the canonical native wrappers: WPOL0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270(legacy WMATIC) and WHYPE0x5555555555555555555555555555555555555555. No Uniswap/AAVE on HyperEVM in this change; Polygon protocol maps are a follow-up.
v0.12.0
Minor Changes
- ce25af5: Add Robinhood Chain (4663) Uniswap V3 (SwapRouter02 / QuoterV2 / Factory / NFT Position Manager / Permit2 / Universal Router) plus
wrapped.weth. Addresses from the official Uniswap Robinhood deployment page and Robinhood token-contracts docs. No AAVE; no Circle USDC (the chain's day-one stable is USDG).
v0.11.0
Minor Changes
- 70c52bf: Add Unichain (130) Uniswap V3 (SwapRouter02 / QuoterV2 / Factory / NFT Position Manager / Permit2 / Universal Router) plus
wrapped.wethand native Circle USDC. Addresses from the official Uniswap Unichain deployment page and Circle USDC docs.
v0.10.0
Minor Changes
- 0e9a255: Add Uniswap V3 (SwapRouter02 / QuoterV2 / Factory / NFT Position Manager / Permit2 / Universal Router) plus
wrapped.wethand native Circle USDC on Arbitrum One (42161) and Optimism (10). Addresses from the official Uniswap deployment pages. This unblocksSessionPolicyActions.uniswapV3Swap(chainId)in the SDK — that helper readsswapRouter02[chainId]and refuses unknown chains.
v0.9.0
Minor Changes
-
88ec8f2: Ship AAVE V3 Pool coverage for writes (issue #23).
- Add Arbitrum One (42161) and Optimism (10) to
Chainsand to the AAVE V3pool/oracle/poolAddressesProvider/uiPoolDataProvider/wethGatewaymaps. Addresses from@aave-dao/aave-address-book(AaveV3Arbitrum,AaveV3Optimism). - Add
aaveV3.markets— every Pool on a chain, not just the canonical one. Ethereum lists Core / EtherFi / Lido / Horizon; every other covered chain is a singlecorerow. Each row carriespoolpluspoolAddressesProvider(the on-chaingetPool()escape hatch).aaveV3.pool[chainId]stays Core so existing consumers do not break. - Document that the static Pool map is a deliberate cache, not an assumption of immutability.
- Regenerate
aaveV3.reservesso Arbitrum and Optimism ship a Core reserve list (underlyings / aTokens / decimals). Without this a consumer can resolve a Pool and still get an empty supply-token picker. - Guard the next regenerate: a test now asserts
reservescovers the same chain set aspool. Bridged USDC.e on Arb/OP is labeledUSDC.e(on-chainsymbol()is still"USDC") so a symbol lookup cannot silently resolve to the bridged token.
Non-goal (unchanged):
aaveV3.reservesstays Core-only. Non-Core Ethereum markets (EtherFi / Lido / Horizon) list different reserves; scoping those is a separate issue. - Add Arbitrum One (42161) and Optimism (10) to
v0.8.0
Minor Changes
-
b8bcb3f: Ship AAVE V3 reserve-config read surface (issue #19, the scale optimization).
- Add
aaveV3.poolAddressesProviderandaaveV3.uiPoolDataProviderper-chain address maps (Mainnet, Sepolia, Base, Base Sepolia, BNB). EachPoolAddressesProviderwas verified on-chain —getPool()returns the catalog's existingpooladdress — and eachUiPoolDataProviderverified as deployed bytecode. - Extend
aaveV3.poolMethodsAbiwith the version-stable Pool config reads:getConfiguration(asset),getUserConfiguration(user), andgetReserveData(asset)(ReserveDataLegacy). These cover a health-factor / liquidation solver's per-reserve risk config, a user's collateral/borrow flags, and the indices needed to scale balances — on every chain, with no periphery-version pinning. - Export
aaveV3.reserveConfigurationBitsandaaveV3.userConfigurationBits— theReserveConfigurationMap/UserConfigurationMapbit layouts — so consumers decode the on-chain bitmaps without hardcoding offsets. Only the version-stable low bits (0–167) are exported; higher bits shift across deployed V3 versions and are intentionally omitted.
Non-goal (unchanged): governance-mutable, HF-critical values (
ltv/liquidationThreshold/usageAsCollateralEnabled) are not baked into the staticAaveV3Reservecatalog — the catalog ships the address to read from, not the values. TheUiPoolDataProvideraddress is shipped without its return-struct ABI on purpose: that tuple is periphery-version-specific and already differs across covered chains (Ethereum/Base/BNB/Base Sepolia return the v3.3 layout, Sepolia an earlier one), so pair the address with a version-aware ABI at the call site. - Add
v0.7.1
Patch Changes
-
0124250: Guard
buildTokensFromDataagainst a duplicatechainIdinPER_CHAIN.If the same chain were listed twice (a copy-paste in the array, or two chain modules reporting the same
chainId), the flatten would silently overwrite the first chain's entries and produce a wrongTokens.SYMBOL[chainId]map with no error at module load. It now throws fast pointing at the duplicate.
v0.7.0
Minor Changes
-
88236bb: Add AAVE V3 reserve catalog (
aaveV3.reserves).Per-chain list of every AAVE V3 reserve as
{ symbol, underlying, aToken, variableDebtToken, decimals }, generated from chain viaPool.getReservesList+Pool.getReserveData(yarn generate:aave-reserves). Covers Ethereum, Base, BNB, Sepolia, and Base Sepolia. Lets consumers build AAVE supply-token pickers (underlying → aToken receipt) without an on-chain round-trip. Adds theAaveV3Reserve/AaveV3ReservesByChaintypes.