erc_4626.classification

Documentation for eth_defi.erc_4626.classification Python module.

ERC-4626 vault type classification.

  • Used in vault discovery to figure out what kind of vaults we have autodetected

  • Use multicall based apporach to probe contracts

Module Attributes

ODA_FACT_JLTXX_ADDRESS

JPMorgan OnChain Liquidity-Token Money Market Fund (JLTXX) ODA-FACT diamond.

ODA_FACT_JLTXX_CHAIN_ID

Ethereum mainnet chain id.

ODA_FACT_MONY_ADDRESS

J.P.

ODA_FACT_JLTXX_FIRST_SEEN_AT_BLOCK

JLTXX ODA-FACT deployment block.

ODA_FACT_JLTXX_FIRST_SEEN_AT

JLTXX deployment timestamp, stored as naive UTC.

ODA_FACT_MONY_FIRST_SEEN_AT_BLOCK

MONY Diamond deployment block.

ODA_FACT_MONY_FIRST_SEEN_AT

MONY Diamond deployment timestamp, stored as naive UTC.

ODA_FACT_HARDCODED_LEADS

Hardcoded ODA-FACT lead data used because the single production contract does not emit ERC-4626 Deposit/Withdraw discovery events.

ODA_FACT_HARDCODED_PROTOCOLS

ODA-FACT hardcoded classification flags.

MIDAS_HARDCODED_PROTOCOLS

Midas hardcoded classification flags.

ASSETO_HARDCODED_PROTOCOLS

Asseto tokenised fund products require chain-aware address matching.

ONDO_HARDCODED_PROTOCOLS

Ondo issuer share tokens are chain-aware, non-ERC-4626 products whose NAV is published by separate issuer oracles.

USYC_HARDCODED_PROTOCOLS

Circle USYC is a single permissioned ERC-20 fund token on Ethereum.

FRANKLIN_HARDCODED_PROTOCOLS

Franklin Templeton Benji fund shares require chain-aware address matching.

CENTRIFUGE_TRANCHE_HARDCODED_PROTOCOLS

Centrifuge Tranche tokens are permissioned ERC-20 shares.

WISDOMTREE_HARDCODED_PROTOCOLS

WisdomTree compliance ERC-20 fund shares require chain-aware routing.

SUPERSTATE_HARDCODED_PROTOCOLS

Superstate tokenised fund products require chain-aware address matching.

LIBEARA_HARDCODED_PROTOCOLS

CMTAT is shared by unrelated security tokens, so only reviewed Libeara products are classified through this chain-aware allow-list.

SPIKO_HARDCODED_PROTOCOLS

Spiko USTBL is a single reviewed permissioned fund token on Ethereum.

SYGNUM_HARDCODED_PROTOCOLS

Sygnum FILQ share tokens are reviewed permissioned SygToken proxies.

FDIT_HARDCODED_PROTOCOLS

FDIT and CASHx are reviewed Ethereum-only permissioned fund-share tokens.

THEO_ITOKEN_HARDCODED_PROTOCOLS

Theo iTokens are multi-asset fund tokens, not standard ERC-4626 vaults.

WSTGBP_HARDCODED_PROTOCOLS

wstGBP hardcoded classification flags.

KILOEX_HARDCODED_PROTOCOLS

KiloEx Hybrid Vaults reuse a Gains-compatible contract surface.

AAVE_ATOKEN_VAULTS_BY_CHAIN

Aave V3 ATokenVault deployments, identified by the Aave-specific ATOKEN() accessor.

FRANKENCOIN_HARDCODED_PROTOCOLS

Frankencoin hardcoded classification flags.

VAULT_STREET_HARDCODED_PROTOCOLS

Vault Street hardcoded classification flags.

FRAX_STAKING_HARDCODED_PROTOCOLS

Frax stablecoin staking vaults use shared linear-reward implementations, so the reviewed sFRAX and sfrxUSD deployments are routed by address.

NARA_HARDCODED_PROTOCOLS

NaraUSD+ is Nara's only reviewed production staking vault.

ROYCO_CHAIN_IDS

Royco chains that may host WrappedVault or tranche vault markets.

MELLOW_CORE_CHAIN_IDS

Mellow Core chains with official Core deployments.

CHAIN_RESTRICTED_PROBES

Chain restrictions for protocols deployed on a known limited chain set.

HARDCODED_PROTOCOLS

Handle problematic protocols.

Functions

create_probe_calls(addresses[, ...])

Create calls that call each vault address using multicall.

create_vault_instance(web3, address[, ...])

Create a new vault instance class based on the detected features.

create_vault_instance_autodetect(web3, ...)

Create any vault instance.

detect_vault_features(web3, address[, verbose])

Detect the ERC-4626 features of a vault smart contract.

identify_vault_features(address, calls, ...)

Based on multicall results, create the feature flags for the vault..

probe_vaults(chain_id, web3factory, ...[, ...])

Perform multicalls against each vault address to extract the features of the vault smart contract.

Classes

VaultFeatureProbe

Results of a multicall probing to a vault address.

ODA_FACT_JLTXX_ADDRESS = '0x09864f52b035ae22ee739dfa5c748fa080d07bd8'

JPMorgan OnChain Liquidity-Token Money Market Fund (JLTXX) ODA-FACT diamond.

https://eth.blockscout.com/address/0x09864f52B035AE22eE739dFa5c748fA080D07bD8

ODA_FACT_JLTXX_CHAIN_ID = 1

Ethereum mainnet chain id.

ODA_FACT_MONY_ADDRESS = '0x6a7c6aa2b8b8a6a891de552bdeffa87c3f53bd46'

J.P. Morgan My OnChain Net Yield Fund (MONY) FACT diamond.

https://etherscan.io/address/0x6a7c6aa2b8b8a6a891de552bdeffa87c3f53bd46

ODA_FACT_JLTXX_FIRST_SEEN_AT_BLOCK = 25042223

JLTXX ODA-FACT deployment block.

Source: Blockscout creation transaction 0xb15855289d18025769583dee24f16e5cdd33be9c0e20586cc9d2c20a103f4f43.

ODA_FACT_JLTXX_FIRST_SEEN_AT = datetime.datetime(2026, 5, 7, 9, 20, 11)

JLTXX deployment timestamp, stored as naive UTC.

ODA_FACT_MONY_FIRST_SEEN_AT_BLOCK = 23890166

MONY Diamond deployment block.

Determined from the first Ethereum block containing runtime bytecode for the exact Sourcify-verified deployment.

ODA_FACT_MONY_FIRST_SEEN_AT = datetime.datetime(2025, 11, 27, 12, 52, 11)

MONY Diamond deployment timestamp, stored as naive UTC.

ODA_FACT_HARDCODED_LEADS = ((1, '0x09864f52b035ae22ee739dfa5c748fa080d07bd8', 25042223, datetime.datetime(2026, 5, 7, 9, 20, 11)), (1, '0x6a7c6aa2b8b8a6a891de552bdeffa87c3f53bd46', 23890166, datetime.datetime(2025, 11, 27, 12, 52, 11)))

Hardcoded ODA-FACT lead data used because the single production contract does not emit ERC-4626 Deposit/Withdraw discovery events.

ODA_FACT_HARDCODED_PROTOCOLS = {'0x09864f52b035ae22ee739dfa5c748fa080d07bd8': {ERC4626Feature.oda_fact_like}, '0x6a7c6aa2b8b8a6a891de552bdeffa87c3f53bd46': {ERC4626Feature.oda_fact_like}}

ODA-FACT hardcoded classification flags.

MIDAS_HARDCODED_PROTOCOLS = {'0x007115416ab6c266329a03b09a8aa39ac2ef7d9d': {ERC4626Feature.midas_like}, '0x030b69280892c888670edcdcd8b69fd8026a0bf3': {ERC4626Feature.midas_like}, '0x057ced81348d57aad579a672d521d7b4396e8a61': {ERC4626Feature.midas_like}, '0x06a317991f2f479a6213278b32d17a126fcab501': {ERC4626Feature.midas_like}, '0x0a640e217a3c5579b920f740b556f44b6e9820c5': {ERC4626Feature.midas_like}, '0x0a72ed3c34352ab2dd912b30f2252638c873d6f0': {ERC4626Feature.midas_like}, '0x130f99c2396e02dbaaa4c1643b10e06ecfe7edab': {ERC4626Feature.midas_like}, '0x141f0e9ed8ba2295254c9df9476cce7bc29172b1': {ERC4626Feature.midas_like}, '0x17bc8ffd82b8a36e737ca1141c025089589b915e': {ERC4626Feature.midas_like}, '0x184cfda782ce61366010cab23294fb22fa6189f5': {ERC4626Feature.midas_like}, '0x1c2757c1fef1038428b5bef062495ce94bbe92b2': {ERC4626Feature.midas_like}, '0x1c8ee940b654bfced403f2a44c1603d5be0f50fa': {ERC4626Feature.midas_like}, '0x20226607b4fa64228abf3072ce561d6257683464': {ERC4626Feature.midas_like}, '0x238a700ed6165261cf8b2e544ba797bc11e466ba': {ERC4626Feature.midas_like}, '0x2448cf256192ee8e122e52026758ae28398afb4f': {ERC4626Feature.midas_like}, '0x2540bddc5e854419496192688e8257c5ded7ad78': {ERC4626Feature.midas_like}, '0x27329b57666413b84dcb872fe611edbfe9a1a9ad': {ERC4626Feature.midas_like}, '0x27bfb8d29af693865e3926e752b2f56c7a33a2a8': {ERC4626Feature.midas_like}, '0x2a8c22e3b10036f3aef5875d04f8441d4188b656': {ERC4626Feature.midas_like}, '0x2bf11d2e04bc40daa95c24b8b90ec4f5c57dd326': {ERC4626Feature.midas_like}, '0x2fe058ccf29f123f9dd2aec0418aa66a877d8e50': {ERC4626Feature.midas_like}, '0x34bdda6beb128130158811e5b881da67902325b2': {ERC4626Feature.midas_like}, '0x4089dc8b6637218f13465d28950a82a7e90cbe27': {ERC4626Feature.midas_like}, '0x441794d6a8f9a3739f5d4e98a728937b33489d29': {ERC4626Feature.midas_like}, '0x462be06b03641f0880f694ebc82295572837ba53': {ERC4626Feature.midas_like}, '0x48e284d0729eb1925066307072758d95dbbb49c4': {ERC4626Feature.midas_like}, '0x4e72025984424e52838cf8953e2863eff036b67a': {ERC4626Feature.midas_like}, '0x513bd45be7643fe6c30c41cd4b327e8e341aaf9a': {ERC4626Feature.midas_like}, '0x548857309befb6fb6f20a9c5a56c9023d892785b': {ERC4626Feature.midas_like}, '0x5a42864b14c0c8241ef5ab62dae975b163a2e0c1': {ERC4626Feature.midas_like}, '0x5c9e1c4d60dba50a68cbe3b0c1b5731a6fd08af6': {ERC4626Feature.midas_like}, '0x5e105266db42f78fa814322bce7f388b4c2e61eb': {ERC4626Feature.midas_like}, '0x605a84861ee603e385b01b9048bea6a86118db0a': {ERC4626Feature.midas_like}, '0x616185600989bf8339b58ac9e539d49536598343': {ERC4626Feature.midas_like}, '0x61896940f60a536f1d3dae9580524542d58d3683': {ERC4626Feature.midas_like}, '0x67e1f506b148d0fc95a4e3ffb49068ceb6855c05': {ERC4626Feature.midas_like}, '0x6b35f2e4c9d4c1da0edaf7fd7dc90d9bca4b0873': {ERC4626Feature.midas_like}, '0x6b6b870c7f449266a9f40f94eca5a6ff9b0857e4': {ERC4626Feature.midas_like}, '0x6eb6724d8d3d4ff9e24d872e8c38403169dc05f8': {ERC4626Feature.midas_like}, '0x762fd99ee22742deecb8eecb12165752d9a18164': {ERC4626Feature.midas_like}, '0x766255b53ae70fa39a18aa296f41fab17db6a810': {ERC4626Feature.midas_like}, '0x76cc16608aa7cd32631bb151801bb095313f7bbd': {ERC4626Feature.midas_like}, '0x7cf9dec92ca9fd46f8d86e7798b72624bc116c05': {ERC4626Feature.midas_like}, '0x80cae1bb1b90980148c5bc9c5701b69fafe7d6b2': {ERC4626Feature.midas_like}, '0x81e064d0eb539de7c3170edf38c1a42cbd752a76': {ERC4626Feature.midas_like}, '0x827ce7e8e35861d9ac7fe002755767b695a5594a': {ERC4626Feature.midas_like}, '0x841eeb3e2489b2282b0e14202dc8bd8f7624e29a': {ERC4626Feature.midas_like}, '0x87c9053c819bb28e0d73d33059e1b3da80afb0cf': {ERC4626Feature.midas_like}, '0x8858a307a85982c2b3cb2ace1720237f2f09c39b': {ERC4626Feature.midas_like}, '0x8e2c2c9def45efb9bd3c448945830ddb254154be': {ERC4626Feature.midas_like}, '0x9004b9890d6b901a17f734efe028b1be5bd6cd22': {ERC4626Feature.midas_like}, '0x9114650a2b8f8598a6b6aa1cb2837e145f59f9fd': {ERC4626Feature.midas_like}, '0x926a8a63fa1e1fdbbeb811a0319933b1a0f1edbb': {ERC4626Feature.midas_like}, '0x949a7250bb55eb79bc6bcc97fcd1c473db3e6f29': {ERC4626Feature.midas_like}, '0x94bf32bd7de56e80778530919292beff503ec9e6': {ERC4626Feature.midas_like}, '0x9b5528528656dbc094765e2abb79f293c21191b9': {ERC4626Feature.midas_like}, '0x9fb442d6b612a6dcd2acc67bb53771ef1d9f661a': {ERC4626Feature.midas_like}, '0xa01227a26a7710bc75071286539e47adb6dea417': {ERC4626Feature.midas_like}, '0xa1150cd4a014e06f5e0a6ec9453fe0208da5adab': {ERC4626Feature.midas_like}, '0xa19f6e0df08a7917f2f8a33db66d0af31ff5eca6': {ERC4626Feature.midas_like}, '0xa48cfd53263ade6abdb0ac75287cc0d5a2eee17f': {ERC4626Feature.midas_like}, '0xad4748098c2a771cc034d7dfc10fad9f9ed605fd': {ERC4626Feature.midas_like}, '0xaf801b65239b4de90f73e26f9bd1260943a5e248': {ERC4626Feature.midas_like}, '0xb31bea5c2a43f942a3800558b1aa25978da75f8a': {ERC4626Feature.midas_like}, '0xb39c200d3094c05e048a8f13b69a221db56d012a': {ERC4626Feature.midas_like}, '0xb64c014307622eb15046c66ff71d04258f5963dc': {ERC4626Feature.midas_like}, '0xbb51e2a15a9158ebe2b0ceb8678511e063ab7a55': {ERC4626Feature.midas_like}, '0xc344db27feba7f0a881a50f0f702a525a44f2368': {ERC4626Feature.midas_like}, '0xc462f87f78abdd27b1e41c9ede862275d2c7f36b': {ERC4626Feature.midas_like}, '0xc470e9fc12a60f72c543516dc23de1f55c29e3d5': {ERC4626Feature.midas_like}, '0xc6135d59f8d10c9c035963ce9037b3635170d716': {ERC4626Feature.midas_like}, '0xc8495eaff71d3a563b906295fcf2f685b1783085': {ERC4626Feature.midas_like}, '0xc8739fbbd54c587a2ad43b50cbcc30ae34fe9e34': {ERC4626Feature.midas_like}, '0xca5921df65e2e1b0b98ae91c0187ba80d4124898': {ERC4626Feature.midas_like}, '0xcc476b1a49bcdf5192561e87b6fb8ea78aa28c13': {ERC4626Feature.midas_like}, '0xcc5c22c7a6bcc25e66726aef011dde74289ed203': {ERC4626Feature.midas_like}, '0xccbad2823328bccaea6476df3aa529316ab7474a': {ERC4626Feature.midas_like}, '0xd385ba55a22ac732cf435c5b5c3a1dfe5939ba4d': {ERC4626Feature.midas_like}, '0xd66d69c288d9a6fd735d7be8b2e389970fc4fd42': {ERC4626Feature.midas_like}, '0xd90f6bfed23ffde40106fc4498dd2e9edb95e4e7': {ERC4626Feature.midas_like}, '0xdd629e5241cbc5919847783e6c96b2de4754e438': {ERC4626Feature.midas_like}, '0xe68f4e819ad09f2e0e668297cc1a905994808d38': {ERC4626Feature.midas_like}, '0xe70b5eb021dc3af653d61fd792d8f0b60f36c493': {ERC4626Feature.midas_like}, '0xe7ba07519dfa06e60059563f484d6090dedf21b3': {ERC4626Feature.midas_like}, '0xecacb5434f05a548faf92a31874e0c014beeee91': {ERC4626Feature.midas_like}, '0xf7cf282ec810fded974f99c0163e792f432892bc': {ERC4626Feature.midas_like}, '0xf91c31299e998c5127bc5f11e4a657fc0cf358cd': {ERC4626Feature.midas_like}, '0xffa36b4b011d87d89fef3098ab30fef7bcc3571e': {ERC4626Feature.midas_like}}

Midas hardcoded classification flags.

ASSETO_HARDCODED_PROTOCOLS = {'0x80c080acd48ed66a35ae8a24bc1198672215a9bd': {ERC4626Feature.asseto_like}}

Asseto tokenised fund products require chain-aware address matching.

ONDO_HARDCODED_PROTOCOLS = {'0x1b19c19393e2d034d8ff31ff34c81252fcbbee92': {ERC4626Feature.ondo_like}, '0x96f6ef951840721adbf46ac996b59e0235cb985c': {ERC4626Feature.ondo_like}}

Ondo issuer share tokens are chain-aware, non-ERC-4626 products whose NAV is published by separate issuer oracles.

USYC_HARDCODED_PROTOCOLS = {'0x136471a34f6ef19fe571effc1ca711fdb8e49f2b': {ERC4626Feature.usyc_like}}

Circle USYC is a single permissioned ERC-20 fund token on Ethereum.

https://usyc.docs.hashnote.com/overview/smart-contracts

FRANKLIN_HARDCODED_PROTOCOLS = {'0x3ddc84940ab509c11b20b76b466933f40b750dc9': {ERC4626Feature.franklin_like}, '0x90276e9d4a023b5229e0c2e9d4b2a83fe3a2b48c': {ERC4626Feature.franklin_like}}

Franklin Templeton Benji fund shares require chain-aware address matching.

CENTRIFUGE_TRANCHE_HARDCODED_PROTOCOLS = {'0x8c213ee79581ff4984583c6a801e5263418c4b86': {ERC4626Feature.centrifuge_tranche_like}}

Centrifuge Tranche tokens are permissioned ERC-20 shares. They must be routed separately from Centrifuge’s ERC-7540 LiquidityPool vaults.

WISDOMTREE_HARDCODED_PROTOCOLS = {'0x1fecf3d9d4fee7f2c02917a66028a48c6706c179': {ERC4626Feature.wisdomtree_like}}

WisdomTree compliance ERC-20 fund shares require chain-aware routing.

SUPERSTATE_HARDCODED_PROTOCOLS = {'0x43415eb6ff9db7e26a15b704e7a3edce97d31c4e': {ERC4626Feature.superstate_like}}

Superstate tokenised fund products require chain-aware address matching.

LIBEARA_HARDCODED_PROTOCOLS = {'0x237c717df1b60501f8d029d3fe7385fd090df180': {ERC4626Feature.libeara_like}, '0x50293dd8889b931eb3441d2664dce8396640b419': {ERC4626Feature.libeara_like}, '0x85d38585c3ac08268f598282a84b7c0ddfc0d04f': {ERC4626Feature.libeara_like}, '0xc26af85ede9cc25d449bcebef866bb85afd5d346': {ERC4626Feature.libeara_like}}

CMTAT is shared by unrelated security tokens, so only reviewed Libeara products are classified through this chain-aware allow-list.

SPIKO_HARDCODED_PROTOCOLS = {'0xe4880249745eac5f1ed9d8f7df844792d560e750': {ERC4626Feature.spiko_like}}

Spiko USTBL is a single reviewed permissioned fund token on Ethereum.

SYGNUM_HARDCODED_PROTOCOLS = {'0x54a4fc78431f9201824643e99bec891bb7462a1d': {ERC4626Feature.sygnum_like}, '0xf0db6f529581e7f6ebac7a7f6882923c00fc3a66': {ERC4626Feature.sygnum_like}}

Sygnum FILQ share tokens are reviewed permissioned SygToken proxies.

FDIT_HARDCODED_PROTOCOLS = {'0x48ab4e39ac59f4e88974804b04a991b3a402717f': {ERC4626Feature.fdit_like}}

FDIT and CASHx are reviewed Ethereum-only permissioned fund-share tokens.

THEO_ITOKEN_HARDCODED_PROTOCOLS = {'0x5fa487bca6158c64046b2813623e20755091da0b': {ERC4626Feature.theo_itoken_like}}

Theo iTokens are multi-asset fund tokens, not standard ERC-4626 vaults.

WSTGBP_HARDCODED_PROTOCOLS = {'0x57c3571f10767e49c9d7b60feb6c67804783b7ae': {ERC4626Feature.wstgbp_like}}

wstGBP hardcoded classification flags.

This is deliberately address-only for the initial rollout. wstGBP does not yet have a production track record or large vault deployments that warrant maintaining a chain-specific deployment registry. Revisit this allow-list when a material multi-chain deployment is added.

KILOEX_HARDCODED_PROTOCOLS = {'0x1c3f35f7883fc4ea8c4bca1507144dc6087ad0fb': {ERC4626Feature.kiloex_like}, '0x43e3e6ffb2e363e64cd480cbb7cd0cf47bc6b477': {ERC4626Feature.kiloex_like}, '0x6e7a6eb5feec64bf6401a744757aba89c5c7e813': {ERC4626Feature.kiloex_like}, '0xa40e085d0584eed39daaa077fcc4cd153ae9a5b0': {ERC4626Feature.kiloex_like}}

KiloEx Hybrid Vaults reuse a Gains-compatible contract surface. Classify known deployments by address instead of the generic maxDiscountP() probe.

AAVE_ATOKEN_VAULTS_BY_CHAIN: dict[int, frozenset[eth_typing.evm.HexAddress]] = {1: frozenset({'0x010190578dffba6380f30b5c7c0b3b9aee7d9cc1', '0x04da4b99ffc82f0e44ded14c3539a6fdad08e2fe', '0x09a2a86a4570bda567a58c3fc2421678b0b49fc4', '0x16f1894adb7498da9df9b18b99a1777ed72c6419', '0x16fe34a39fd82eda94376b9ca55fe1ecf2802434', '0x2ee1dcb6806daaf883146761d135432d8c1223a4', '0x36b22e03bc9f8d08109ca4bb36241e3bfb7077fa', '0x3aa807b06a496d08a930c9e028248426a1238264', '0x415e5ac92aa395427cc287f0510f3a7beaac9caf', '0x4543bcaf294820ec9d5b973ce557a9a7ce022468', '0x4763d306c0b073dd50fb0907a19cc1f597f04115', '0x53485973afb5f11dfc304776fe762a5f944353c7', '0x6a1800a2ba6a542b015690d5a98959e049d55704', '0x7a69e552616ac38d212cea26467a8afb42d8facd', '0x7c15e25ad5a219030a2f748fbd68eeea36191e29', '0xa5ac3b049d91f46ad5b2eaf46154b6849ef8836b', '0xad0702c6b51689c67b7dd5142da041661c1cd4d1', '0xb1ea329f0b79d0b213957569594ca2a9de637215', '0xb5d3002e79adb74d4a7a5e7bc7923a03fde320db', '0xb829831fd41f3a9b89e16462756c2393651f1c6d', '0xbc370b5b13233e5c7241a750f6a88316a8469d2b', '0xc41a49cfadc574dce1c1255c4669bf00e2ae33f8', '0xdbeb19dfccd30b94df7a122512ffc20aa9101aa3', '0xe9d881f0d5312119b94cf60cb9cf361ee012c1d7', '0xfaccbbe7b83c340db7a416f6155ad8ba9674107a', '0xfbdc620f1410c13dcb1e53db20cdac367790e18b', '0xfdeb3cf6f7ead01d9c6468dce89082021ecb1238', '0xfe2870319b5db8443ed80b717f6a777991a3f625'}), 10: frozenset({'0x18f831d3d795ac8fc2138f79f9c476c64e0a440d', '0x23be1786d4ca421219acc64f1ca8f7114480f379', '0x50cff7e5c7d76a1e8a089625178614c0de63cbe8', '0x6dcecf33b429feeca46d3a1795094a0b81f7986a', '0xe478fadfc2b8f26fa1c4231069793d007a52d30e'}), 56: frozenset({'0x010190578dffba6380f30b5c7c0b3b9aee7d9cc1', '0x04d77868f6dbf9d5cc910d149f0622893cb706ba', '0x2c6984c29f0d04438f9c8c9e4b613098776d97b3', '0x2ee1dcb6806daaf883146761d135432d8c1223a4', '0x36b22e03bc9f8d08109ca4bb36241e3bfb7077fa', '0x42fd8d4e5274cac0dacf6fcca80dc5c253a35d0b', '0x43408ba0e12353344b5758c516183b19579589ad', '0x4543bcaf294820ec9d5b973ce557a9a7ce022468', '0x474d27825116fcf617c6ac4da476769fbcbfd62f', '0x4763d306c0b073dd50fb0907a19cc1f597f04115', '0x50cff7e5c7d76a1e8a089625178614c0de63cbe8', '0x5defdde3c35222a1ae3c2ed388a8c0664f461aee', '0x60eba6aba19389f79ee4d974b1a93c3c5c825ee7', '0x7c15e25ad5a219030a2f748fbd68eeea36191e29', '0x8e684882ce2085ba1d0905ea736c44f966ed3b78', '0xad0702c6b51689c67b7dd5142da041661c1cd4d1', '0xc41a49cfadc574dce1c1255c4669bf00e2ae33f8', '0xdfd5f62748eb4f8e16296100e2a80f58b1196e69', '0xebf2ad5e3bcf30228a4caa4485eeb41fa73d6d84', '0xfdeb3cf6f7ead01d9c6468dce89082021ecb1238', '0xfe2870319b5db8443ed80b717f6a777991a3f625'}), 100: frozenset({'0x9f40ca84a70685d2c48003b9dec27b3d98ace348'}), 137: frozenset({'0x04d77868f6dbf9d5cc910d149f0622893cb706ba', '0x1f810098716f47507f6c4fee7a032c5461004db8', '0x2ee1dcb6806daaf883146761d135432d8c1223a4', '0x36b22e03bc9f8d08109ca4bb36241e3bfb7077fa', '0x42fd8d4e5274cac0dacf6fcca80dc5c253a35d0b', '0x548db1b10d62c25cf39f47b980989a0cbee08d66', '0x88f6d430aed64062391d7343024e3fbf55604682', '0x8e684882ce2085ba1d0905ea736c44f966ed3b78', '0xad0702c6b51689c67b7dd5142da041661c1cd4d1', '0xda848e1fa5a5b6fc22cc6563fde4e761ea97e171', '0xdaf742cf0526d190598fea7adbd6c0fab6bf48e5', '0xebf2ad5e3bcf30228a4caa4485eeb41fa73d6d84'}), 8453: frozenset({'0x05c9bfebe153540fdf2749d20d0903b942887215', '0x09f2675ca6d422ee6bbbca0c156b0ead36dea364', '0x0fa3c7bbc28aae2391effc853b33a77e24db65d8', '0x18ed89d5adac015ec8faaa513f8f4f3abfdc4fb1', '0x21cfee84158fde9ddb89f3404e2ec2148d3f0b91', '0x2a9cff5e49612945813acc1e428e9dfd0a07040b', '0x373f209b719f1e738c7fe4e80997a94ba7a25344', '0x4cc1950a1861caca5af3e46deb541febc30da7a8', '0x5a38d0a4f33d2b352169fe1803898cf0b9c50c1f', '0x5c4a2e6cb536d271aee396409a870abfd42647c4', '0x606eee2c9f86c9f2172b3a8fa6bb249f02a0a396', '0x76924dff2160383d1ffeafe032f3c8a217413c11', '0x9520c52b9a4cf0863c0bf61d88fa6e7f6f8d0cb8', '0xac939fafcdc611cd813a08c47ed1a66fe7798a6e', '0xade93c638474f1197ea37818ee72251b7a7dad18', '0xb3dcf17ab965d3e3eb9976ed233af6461de2dfd6', '0xb75b9fedea62517600711317149d59ba43f4cdfe', '0xbe5e98d89a730520a9bdcaa7d33cf123742945b2', '0xc535f4afca6871610d8b78b83f5537ea9f795c60', '0xc797e22436e5d1e2d646bed8c427f5c76205986b', '0xc90be3abb83c2370a31724fe036deda1d26d1b21', '0xcccae05e8d9cfff2edc75ac4a49b29eb86567425', '0xd120faa78b69a363570aa8c14299fb703020b0a0', '0xd81745a0864733f4ff134be4c7dd94de0d6bf73a', '0xe5c88c0f64a30b2788825909bf659e9e18c72179', '0xf8e36333a43fabd6d6335354d2a88afa4953ad95'}), 42161: frozenset({'0x03ee88c9769f2c61a93f1cbaffe89549a9405df1', '0x05c9bfebe153540fdf2749d20d0903b942887215', '0x36b22e03bc9f8d08109ca4bb36241e3bfb7077fa', '0x3e7aaeec48fc9197ccf207f1852918c40925a0ff', '0x4543bcaf294820ec9d5b973ce557a9a7ce022468', '0x50cff7e5c7d76a1e8a089625178614c0de63cbe8', '0x68f30a3f6b95c0e7c526d7c480590d86952c7fd9', '0x750763ea6f9135d1035951c7c6f7b46364a2f5c1', '0x8e8ee3b6d44d546618a4f780e8ab4d1b6e09856b', '0xae30d1534a6056425927f22e2314eaf10dbb645f', '0xbf528c77200d82c7536cd7161ff9def6d2e33e09', '0xc64f11e3b6b8ced8fa6930c87b84640352d9a757', '0xcd9d2a2c74e49cfafb024006be614b04c82d5273', '0xfe2870319b5db8443ed80b717f6a777991a3f625', '0xffa8a407f067f44fb06de7fae075c8857346a94e'}), 43114: frozenset({'0x09a858562f28d5a443e3e13f8a8cf70d7a1d16ed', '0x0f9769fc8fedded4ce61457543bcb8ded621dcf3', '0x2e0d7d85d0a68ed1d7dd17d44419a17b76c5f166', '0x3c9a197cd40873cddede4e30fc1c88fd7817aa18', '0x637ad57ad1a2028f61b72277cdf5d851419f3df9', '0x7433478146a2055ae0c3d426cd2a89f2f0e1dce3', '0x74f6730babb9d2e43f091f0ee3c1d5a071bd7dff', '0x8be669c95cf6c814743b3b6b8941ab3a3b66d2c3', '0x91d83ca9b146cbf2f556d52393b5394c2f22ea34', '0xee9655aee14a8615989fc19016cf217eb536a76e', '0xf371fc948f7e6e2dd431b807d0a68185b696bf18'})}

Aave V3 ATokenVault deployments, identified by the Aave-specific ATOKEN() accessor. Addresses are chain-aware because several addresses are deployed on more than one chain.

Smart contract source: https://github.com/aave/aave-vault/blob/main/src/ATokenVault.sol

FRANKENCOIN_HARDCODED_PROTOCOLS = {'0x6165946250dd04740ab1409217e95a4f38374fe9': {ERC4626Feature.frankencoin_like}, '0x637f00cab9665cb07d91bfb9c6f3fa8fabfef8bc': {ERC4626Feature.frankencoin_like}, '0xa09ebdf8a01b9ef04149319d64f83b9c01a5b585': {ERC4626Feature.frankencoin_like}, '0xe5f130253ff137f9917c0107659a4c5262abf6b0': {ERC4626Feature.frankencoin_like}}

Frankencoin hardcoded classification flags.

VAULT_STREET_HARDCODED_PROTOCOLS = {'0x7ea76108975ec0998b9bc2db04b4eca986400dd7': {ERC4626Feature.vault_street_like}}

Vault Street hardcoded classification flags.

primeUSD is a non-ERC-4626 token whose NAV comes from a separate oracle.

FRAX_STAKING_HARDCODED_PROTOCOLS = {'0x03cb4438d015b9646d666316b617a694410c216d': {ERC4626Feature.frax_staking_like}, '0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32': {ERC4626Feature.frax_staking_like}, '0xcf62f905562626cfcdd2261162a51fd02fc9c5b6': {ERC4626Feature.frax_staking_like}}

Frax stablecoin staking vaults use shared linear-reward implementations, so the reviewed sFRAX and sfrxUSD deployments are routed by address.

NARA_HARDCODED_PROTOCOLS = {'0x1aa23cdfc941f6b54251c72012a9bfa4bf5394d6': {ERC4626Feature.nara_like}}

NaraUSD+ is Nara’s only reviewed production staking vault.

ROYCO_CHAIN_IDS = {1, 146, 999, 8453, 42161, 43114, 80094, 98866, 11155111, 21000000}

Royco chains that may host WrappedVault or tranche vault markets.

Based on Royco vault/explore and market/explore API rows, plus locally observed Royco vault rows that may temporarily disappear from the API response.

MELLOW_CORE_CHAIN_IDS = {1, 143, 9745, 42161}

Mellow Core chains with official Core deployments.

Source: https://docs.mellow.finance/core-vaults/core-deployments

CHAIN_RESTRICTED_PROBES: dict[str, set[int]] = {'DEPLOYER_ADDRESS': {1, 42161}, 'POOL': {999}, 'SAY_TRADER_ROLE': {42161}, 'SPOKE_REVISION': {1}, 'agent': {}, 'aggregateVault': {42161}, 'borrowed_token': {1, 10, 42161}, 'bridgedSupply': {42161}, 'claimableKeeper': {137, 42161}, 'depositController': {1, 56, 42161}, 'getAssetCount': {1, 143, 9745, 42161}, 'getGrossTVL': {42161}, 'getPerformanceFeeData': {1, 8453, 42161}, 'getRawNAV': {1, 146, 999, 8453, 42161, 43114, 80094, 98866, 11155111, 21000000}, 'marketManager': {143}, 'outputToLp0Route': {}, 'poolId': {1, 8453, 42161}, 'previewRateAfterDeposit': {1, 42161, 80094}, 'queue': {1, 143}, 'repoTokenHoldings': {1, 9745, 43114}, 'routerRegistry': {8453}, 'shareManager': {1, 143, 9745, 42161}, 'strategist': {5000}, 'strategy': {1, 143}, 'validateComponentRatios': {42161}, 'vaultManager': {5000}, 'wards': {1, 8453, 42161}}

Chain restrictions for protocols deployed on a known limited chain set.

Maps probe function names to the set of chain IDs where that protocol is deployed. Probes for these protocols will be skipped on chains not in their set.

Data source: https://top-defi-vaults.tradingstrategy.ai/top_vaults_by_chain.json Data checked: 2026-01-13

When changing vault classification probes, remember that already discovered vaults keep stored feature flags in vault-metadata-db.pickle and reader progress in reader-state pickle files. Manually purge or repair the database and rescan affected vaults; see scripts/erc-4626/purge-royco-tranche-data.py for an example.

class VaultFeatureProbe

Bases: object

Results of a multicall probing to a vault address.

Method generated by attrs for class VaultFeatureProbe.

__init__(address, features)

Method generated by attrs for class VaultFeatureProbe.

Parameters
Return type

None

create_probe_calls(addresses, share_probe_amount=1000000, chain_id=None)

Create calls that call each vault address using multicall.

  • Because ERC standards are such a shit show, and nobody is using good interface standard, we figure out the vault type by probing it with various calls

  • Skips protocol-specific probes for protocols only deployed on certain chains (see CHAIN_RESTRICTED_PROBES for the list)

Parameters
  • addresses (collections.abc.Iterable[eth_typing.evm.HexAddress]) – Iterable of vault contract addresses to probe.

  • share_probe_amount – Amount used for convertToShares() probe call.

  • chain_id (Optional[int]) – If provided, filters out probe calls for protocols that are not deployed on this chain. This reduces unnecessary RPC calls when scanning chains where certain protocols don’t exist. Protocols with a known limited deployment set have their probes skipped on other chains. If None, all probes are generated (no filtering).

Return type

collections.abc.Iterable[eth_defi.event_reader.multicall_batcher.EncodedCall]

identify_vault_features(address, calls, debug_text, chain_id=None)

Based on multicall results, create the feature flags for the vault..

Parameters
Return type

set[eth_defi.erc_4626.core.ERC4626Feature]

probe_vaults(chain_id, web3factory, addresses, block_identifier, max_workers=8, progress_bar_desc=None)

Perform multicalls against each vault address to extract the features of the vault smart contract.

Returns

Iterator of what vault smart contract features we detected for each potential vault address

Parameters
Return type

collections.abc.Iterable[eth_defi.erc_4626.classification.VaultFeatureProbe]

detect_vault_features(web3, address, verbose=True)

Detect the ERC-4626 features of a vault smart contract.

  • Protocols: Harvest, Lagoon, etc.

  • Does support ERC-7540

  • Very slow, only use in scripts and tutorials.

  • Use to pass to create_vault_instance() to get a correct Python proxy class for the vault institated.

Example:

features = detect_vault_features(web3, spec.vault_address, verbose=False)
logger.info("Detected vault features: %s", features)

vault = create_vault_instance(
    web3,
    spec.vault_address,
    features=features,
)
Parameters
Return type

set[eth_defi.erc_4626.core.ERC4626Feature]

create_vault_instance(web3, address, features=None, token_cache=None, auto_detect=False, default_block_identifier=None, require_denomination_token=False)

Create a new vault instance class based on the detected features.

  • Get a protocol-specific Python instance that can e.g. read the fees of the vault (not standardised).

See also - detect_vault_features() to determine features for a vault address

Parameters
  • features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) –

    Previously/manually extracted vault feature flags for the type.

    Give empty set for generic ERC-4626 vault class.

  • auto_detect (bool) –

    Auto-detect the vault protocol.

    Very slow, do not use except in tutorials and scripts. Prefer to manually pass feature.

  • default_block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, hexbytes.main.HexBytes, int]]) –

    Override block identifier for on-chain metadata reads.

    Set to "latest" for freshly deployed vaults whose contracts do not exist at the safe-cached block number.

  • require_denomination_token (bool) – If True, accessing denomination_token will raise RuntimeError when the on-chain lookup returns None.

  • web3 (web3.main.Web3) –

  • address (Union[eth_typing.evm.HexAddress, str]) –

  • token_cache (Optional[dict]) –

Returns

None if the vault creation is not supported

Return type

Optional[eth_defi.vault.base.VaultBase]

create_vault_instance_autodetect(web3, vault_address, token_cache=None)

Create any vault instance.

  • Probes smart contract call first to identify what kind of vault we are dealing with

Parameters
Return type

eth_defi.vault.base.VaultBase

HARDCODED_PROTOCOLS = {'0x0000000f2eb9f69274678c76222b35eec7588a65': {ERC4626Feature.yo_like}, '0x007115416ab6c266329a03b09a8aa39ac2ef7d9d': {ERC4626Feature.midas_like}, '0x00be76740759518db9c51bc59ec1993f2ffa4648': {ERC4626Feature.aera_like}, '0x015a70185a80d8c8c034e3d360e25a14c7fb8cf0': {ERC4626Feature.crystalclear_like}, '0x01ba69727e2860b37bc1a2bd56999c1afb4c15d8': {ERC4626Feature.yieldnest_like}, '0x030b69280892c888670edcdcd8b69fd8026a0bf3': {ERC4626Feature.midas_like}, '0x03cb4438d015b9646d666316b617a694410c216d': {ERC4626Feature.frax_staking_like}, '0x052e7d7fbb4cf3be81a4ffc182bcc0fd802417ae': {ERC4626Feature.basevol_like}, '0x056b269eb1f75477a8666ae8c7fe01b64dd55ecc': {ERC4626Feature.threejane_like}, '0x057ced81348d57aad579a672d521d7b4396e8a61': {ERC4626Feature.midas_like}, '0x06a317991f2f479a6213278b32d17a126fcab501': {ERC4626Feature.midas_like}, '0x06a491e3efee37eb191d0434f54be6e42509f9d3': {ERC4626Feature.spectra_usdn_wrapper_like}, '0x06d47f3fb376649c3a9dafe069b3d6e35572219e': {ERC4626Feature.avant_like}, '0x06fd9d03b3d0f18e4919919b72d30c582f0a97e5': {ERC4626Feature.hyperlend_like}, '0x08dcdbf7bade91ccd42cb2a4ea8e5d199d285957': {ERC4626Feature.forty_acres_like}, '0x09864f52b035ae22ee739dfa5c748fa080d07bd8': {ERC4626Feature.oda_fact_like}, '0x09cea16a2563c2d7d807c86f5b8da760389b5915': {ERC4626Feature.liquid_royalty_like}, '0x0a640e217a3c5579b920f740b556f44b6e9820c5': {ERC4626Feature.midas_like}, '0x0a72ed3c34352ab2dd912b30f2252638c873d6f0': {ERC4626Feature.midas_like}, '0x0b9342c15143e8f54a83f887c280a922f4c48771': {ERC4626Feature.ember_like}, '0x0ff79b6d6c0fb5faf54bd26db5ce97062a105f81': {ERC4626Feature.renalta_like}, '0x1202f5c7b4b9e47a1a484e8b270be34dbbc75055': {ERC4626Feature.resolv_like}, '0x124d00b1ce4453ffc5a5f65ce83af13a7709bac7': {ERC4626Feature.forty_acres_like}, '0x130f99c2396e02dbaaa4c1643b10e06ecfe7edab': {ERC4626Feature.midas_like}, '0x136471a34f6ef19fe571effc1ca711fdb8e49f2b': {ERC4626Feature.usyc_like}, '0x141f0e9ed8ba2295254c9df9476cce7bc29172b1': {ERC4626Feature.midas_like}, '0x17bc8ffd82b8a36e737ca1141c025089589b915e': {ERC4626Feature.midas_like}, '0x184cfda782ce61366010cab23294fb22fa6189f5': {ERC4626Feature.midas_like}, '0x19ebd191f7a24ece672ba13a302212b5ef7f35cb': {ERC4626Feature.yieldfi_like}, '0x1aa23cdfc941f6b54251c72012a9bfa4bf5394d6': {ERC4626Feature.nara_like}, '0x1b19c19393e2d034d8ff31ff34c81252fcbbee92': {ERC4626Feature.ondo_like}, '0x1b463561f264114f9d4db6ff9ee2771b33076b13': {ERC4626Feature.crystalclear_like}, '0x1c2757c1fef1038428b5bef062495ce94bbe92b2': {ERC4626Feature.midas_like}, '0x1c3f35f7883fc4ea8c4bca1507144dc6087ad0fb': {ERC4626Feature.kiloex_like}, '0x1c8ee940b654bfced403f2a44c1603d5be0f50fa': {ERC4626Feature.midas_like}, '0x1ce7d9942ff78c328a4181b9f3826fee6d845a97': {ERC4626Feature.yieldfi_like}, '0x1efae1f600947ca5dc0e87aa18657f36c559a40b': {ERC4626Feature.crystalclear_like}, '0x1fecf3d9d4fee7f2c02917a66028a48c6706c179': {ERC4626Feature.wisdomtree_like}, '0x20226607b4fa64228abf3072ce561d6257683464': {ERC4626Feature.midas_like}, '0x20d419a8e12c45f88fda7c5760bb6923cee27f98': {ERC4626Feature.ostium_like}, '0x231f66c336512e897855420a2788b83e164c6adf': {ERC4626Feature.crystalclear_like}, '0x237c717df1b60501f8d029d3fe7385fd090df180': {ERC4626Feature.libeara_like}, '0x238a700ed6165261cf8b2e544ba797bc11e466ba': {ERC4626Feature.midas_like}, '0x2448cf256192ee8e122e52026758ae28398afb4f': {ERC4626Feature.midas_like}, '0x2540bddc5e854419496192688e8257c5ded7ad78': {ERC4626Feature.midas_like}, '0x27329b57666413b84dcb872fe611edbfe9a1a9ad': {ERC4626Feature.midas_like}, '0x27bfb8d29af693865e3926e752b2f56c7a33a2a8': {ERC4626Feature.midas_like}, '0x28b3a8fb53b741a8fd78c0fb9a6b2393d896a43d': {ERC4626Feature.spark_like}, '0x28e60b466a075cecef930d29f7f1b0facf48f950': {ERC4626Feature.spectra_erc4626_wrapper_like}, '0x2a8c22e3b10036f3aef5875d04f8441d4188b656': {ERC4626Feature.midas_like}, '0x2b13311fd553e74b421d4ccc96e348f71e179dcf': {ERC4626Feature.ember_like}, '0x2bf11d2e04bc40daa95c24b8b90ec4f5c57dd326': {ERC4626Feature.midas_like}, '0x2d7acd39b634b50cd37883fe374e1f430e27ea50': {ERC4626Feature.crystalclear_like}, '0x2e3c5e514eef46727de1fe44618027a9b70d92fc': {ERC4626Feature.yieldfi_like}, '0x2fe058ccf29f123f9dd2aec0418aa66a877d8e50': {ERC4626Feature.midas_like}, '0x318ca1ee088effc96fa67c1bb50c7893c3c4feaa': {ERC4626Feature.crystalclear_like}, '0x34bdda6beb128130158811e5b881da67902325b2': {ERC4626Feature.midas_like}, '0x356b8d89c1e1239cbbb9de4815c39a1474d5ba7d': {ERC4626Feature.maple_like}, '0x373152feef81cc59502da2c8de877b3d5ae2e342': {ERC4626Feature.ember_like}, '0x3a0a97dca5e6cacc258490d5ece453412f8e1883': {ERC4626Feature.liquid_royalty_like}, '0x3ccff8c929b497c1ff96592b8ff592b45963e732': {ERC4626Feature.foxify_like}, '0x3ddc84940ab509c11b20b76b466933f40b750dc9': {ERC4626Feature.franklin_like}, '0x3ed6aa32c930253fc990de58ff882b9186cd0072': {ERC4626Feature.cap_like}, '0x4089dc8b6637218f13465d28950a82a7e90cbe27': {ERC4626Feature.midas_like}, '0x43415eb6ff9db7e26a15b704e7a3edce97d31c4e': {ERC4626Feature.superstate_like}, '0x438982ea288763370946625fd76c2508ee1fb229': {ERC4626Feature.csigma_like}, '0x43e3e6ffb2e363e64cd480cbb7cd0cf47bc6b477': {ERC4626Feature.kiloex_like}, '0x441794d6a8f9a3739f5d4e98a728937b33489d29': {ERC4626Feature.midas_like}, '0x444868b6e8079ac2c55eea115250f92c2b2c4d14': {ERC4626Feature.dolomite_like}, '0x462be06b03641f0880f694ebc82295572837ba53': {ERC4626Feature.midas_like}, '0x4772d2e014f9fc3a820c444e3313968e9a5c8121': {ERC4626Feature.yieldfi_like}, '0x48e284d0729eb1925066307072758d95dbbb49c4': {ERC4626Feature.midas_like}, '0x4d0ff6a0dd9f7316b674fb37993a3ce28bea340e': {ERC4626Feature.hyperdrive_hl_like}, '0x4e72025984424e52838cf8953e2863eff036b67a': {ERC4626Feature.midas_like}, '0x50293dd8889b931eb3441d2664dce8396640b419': {ERC4626Feature.libeara_like}, '0x50bd66d59911f5e086ec87ae43c811e0d059dd11': {ERC4626Feature.sbold_like}, '0x50d59b785df23728d9948804f8ca3543237a1495': {ERC4626Feature.csigma_like}, '0x513bd45be7643fe6c30c41cd4b327e8e341aaf9a': {ERC4626Feature.midas_like}, '0x548857309befb6fb6f20a9c5a56c9023d892785b': {ERC4626Feature.midas_like}, '0x54a4fc78431f9201824643e99bec891bb7462a1d': {ERC4626Feature.sygnum_like}, '0x5743aec1f06e896544d1638e0febd15098855cb5': {ERC4626Feature.hyperdrive_hl_like}, '0x57c3571f10767e49c9d7b60feb6c67804783b7ae': {ERC4626Feature.wstgbp_like}, '0x5a42864b14c0c8241ef5ab62dae975b163a2e0c1': {ERC4626Feature.midas_like}, '0x5c9e1c4d60dba50a68cbe3b0c1b5731a6fd08af6': {ERC4626Feature.midas_like}, '0x5e105266db42f78fa814322bce7f388b4c2e61eb': {ERC4626Feature.midas_like}, '0x5fa487bca6158c64046b2813623e20755091da0b': {ERC4626Feature.theo_itoken_like}, '0x605a84861ee603e385b01b9048bea6a86118db0a': {ERC4626Feature.midas_like}, '0x616185600989bf8339b58ac9e539d49536598343': {ERC4626Feature.midas_like}, '0x6165946250dd04740ab1409217e95a4f38374fe9': {ERC4626Feature.frankencoin_like}, '0x61896940f60a536f1d3dae9580524542d58d3683': {ERC4626Feature.midas_like}, '0x637f00cab9665cb07d91bfb9c6f3fa8fabfef8bc': {ERC4626Feature.frankencoin_like}, '0x6593bb7272237f36444dee44df46ab3b0233a9a0': {ERC4626Feature.aera_like}, '0x67e1f506b148d0fc95a4e3ffb49068ceb6855c05': {ERC4626Feature.midas_like}, '0x6a7c6aa2b8b8a6a891de552bdeffa87c3f53bd46': {ERC4626Feature.oda_fact_like}, '0x6b35f2e4c9d4c1da0edaf7fd7dc90d9bca4b0873': {ERC4626Feature.midas_like}, '0x6b6b870c7f449266a9f40f94eca5a6ff9b0857e4': {ERC4626Feature.midas_like}, '0x6b88f2975b784531db1159d37cff9f1629e93fa8': {ERC4626Feature.crystalclear_like}, '0x6e7a6eb5feec64bf6401a744757aba89c5c7e813': {ERC4626Feature.kiloex_like}, '0x6eb6724d8d3d4ff9e24d872e8c38403169dc05f8': {ERC4626Feature.midas_like}, '0x6f6046e59501e484152d46045ba5eecf1cab8935': {ERC4626Feature.secured_finance_like}, '0x7077ef67fe49ffb1260b893f2cd8475eeb72bbbb': {ERC4626Feature.aera_like}, '0x72ee42bd660e4f676106c3718b00af06257c9d35': {ERC4626Feature.hyperdrive_hl_like}, '0x762fd99ee22742deecb8eecb12165752d9a18164': {ERC4626Feature.midas_like}, '0x766255b53ae70fa39a18aa296f41fab17db6a810': {ERC4626Feature.midas_like}, '0x76cc16608aa7cd32631bb151801bb095313f7bbd': {ERC4626Feature.midas_like}, '0x7788a3538c5fc7f9c7c8a74eac4c898fc8d87d92': {ERC4626Feature.usdx_money_like}, '0x7cf9dec92ca9fd46f8d86e7798b72624bc116c05': {ERC4626Feature.midas_like}, '0x7d7f72d393f242da6e22d3b970491c06742984ff': {ERC4626Feature.cap_like}, '0x7e1916fa3bb694d4e7a038771e8fe97222e775ca': {ERC4626Feature.ember_like}, '0x7ea76108975ec0998b9bc2db04b4eca986400dd7': {ERC4626Feature.vault_street_like}, '0x7f2b789ac6d93521fae86cbc838efcfc4f2b004b': {ERC4626Feature.hyperdrive_hl_like}, '0x80128dbb9f07b93dde62a6daeadb69ed14a7d354': {ERC4626Feature.spark_like}, '0x8041ba598f0e656ebe80c67289efb42c09e86ae3': {ERC4626Feature.aera_like}, '0x80ac24aa929eaf5013f6436cda2a7ba190f5cc0b': {ERC4626Feature.maple_like}, '0x80c080acd48ed66a35ae8a24bc1198672215a9bd': {ERC4626Feature.asseto_like}, '0x80cae1bb1b90980148c5bc9c5701b69fafe7d6b2': {ERC4626Feature.midas_like}, '0x81e064d0eb539de7c3170edf38c1a42cbd752a76': {ERC4626Feature.midas_like}, '0x821fc97196d47566b618d27515df2c5201cc4125': {ERC4626Feature.ember_like}, '0x827ce7e8e35861d9ac7fe002755767b695a5594a': {ERC4626Feature.midas_like}, '0x82b394c5d4eac1b9755eb33bf70ad6d08b2d59f4': {ERC4626Feature.basevol_like}, '0x83cd3d0e9f027b70cb4833b5c251f6fb62cfd9b0': {ERC4626Feature.aera_like}, '0x83f20f44975d03b1b09e64809b757c47f942beea': {ERC4626Feature.sky_like}, '0x841eeb3e2489b2282b0e14202dc8bd8f7624e29a': {ERC4626Feature.midas_like}, '0x85d38585c3ac08268f598282a84b7c0ddfc0d04f': {ERC4626Feature.libeara_like}, '0x87c9053c819bb28e0d73d33059e1b3da80afb0cf': {ERC4626Feature.midas_like}, '0x8858a307a85982c2b3cb2ace1720237f2f09c39b': {ERC4626Feature.midas_like}, '0x887d57a509070a0843c6418eb5cffc090dcbbe95': {<ERC4626Feature.zerolend_like: 'zerolend_like'>, <ERC4626Feature.royco_like: 'royco_like'>}, '0x890a5122aa1da30fec4286de7904ff808f0bd74a': {ERC4626Feature.mainstreet_like}, '0x89c08a6f468ca5af65e7d48bc091e5c4025b42c2': {ERC4626Feature.crystalclear_like}, '0x8ba9da757d1d66c58b1ae7e2ed6c04087348a82d': {ERC4626Feature.usdd_like}, '0x8c213ee79581ff4984583c6a801e5263418c4b86': {ERC4626Feature.centrifuge_tranche_like}, '0x8e2c2c9def45efb9bd3c448945830ddb254154be': {ERC4626Feature.midas_like}, '0x9004b9890d6b901a17f734efe028b1be5bd6cd22': {ERC4626Feature.midas_like}, '0x90276e9d4a023b5229e0c2e9d4b2a83fe3a2b48c': {ERC4626Feature.franklin_like}, '0x9114650a2b8f8598a6b6aa1cb2837e145f59f9fd': {ERC4626Feature.midas_like}, '0x926a8a63fa1e1fdbbeb811a0319933b1a0f1edbb': {ERC4626Feature.midas_like}, '0x9271a5c684330b2a6775e96b3c140fc1dc3c89be': {ERC4626Feature.hyperdrive_hl_like}, '0x943109dc7c950da4592d85ebd4cfed007af64670': {ERC4626Feature.forgeyields_like}, '0x949a7250bb55eb79bc6bcc97fcd1c473db3e6f29': {ERC4626Feature.midas_like}, '0x94bf32bd7de56e80778530919292beff503ec9e6': {ERC4626Feature.midas_like}, '0x953972ea0c1703c58f09fb6fd2477fdcf0fee074': {ERC4626Feature.ember_like}, '0x96f6ef951840721adbf46ac996b59e0235cb985c': {ERC4626Feature.ondo_like}, '0x98cd770b4e9905b1263f0c9ae6cde34e1923508e': {ERC4626Feature.forgeyields_like}, '0x99cd4ec3f88a45940936f469e4bb72a2a701eeb9': {ERC4626Feature.sky_like}, '0x9b5528528656dbc094765e2abb79f293c21191b9': {ERC4626Feature.midas_like}, '0x9be9294722f8aad37b11a9792be2c782182cafa2': {ERC4626Feature.ember_like}, '0x9d39a5de30e57443bff2a8307a4256c8797a3497': {ERC4626Feature.ethena_like}, '0x9fb442d6b612a6dcd2acc67bb53771ef1d9f661a': {ERC4626Feature.midas_like}, '0xa01227a26a7710bc75071286539e47adb6dea417': {ERC4626Feature.midas_like}, '0xa09ebdf8a01b9ef04149319d64f83b9c01a5b585': {ERC4626Feature.frankencoin_like}, '0xa1150cd4a014e06f5e0a6ec9453fe0208da5adab': {ERC4626Feature.midas_like}, '0xa194082aabb75dd1ca9dc1ba573a5528beb8c2fb': {ERC4626Feature.domination_finance_like}, '0xa19f6e0df08a7917f2f8a33db66d0af31ff5eca6': {ERC4626Feature.midas_like}, '0xa3931d71877c0e7a3148cb7eb4463524fec27fbd': {ERC4626Feature.sky_like}, '0xa40e085d0584eed39daaa077fcc4cd153ae9a5b0': {ERC4626Feature.kiloex_like}, '0xa48cfd53263ade6abdb0ac75287cc0d5a2eee17f': {ERC4626Feature.midas_like}, '0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32': {ERC4626Feature.frax_staking_like}, '0xa7a31e6a81300120b7c4488ec3126bc1ad11f320': {ERC4626Feature.deltr_like}, '0xad4748098c2a771cc034d7dfc10fad9f9ed605fd': {ERC4626Feature.midas_like}, '0xaeaad6d9b096829e5f3804a747c9fdd6677d78f0': {ERC4626Feature.hyperdrive_hl_like}, '0xaf801b65239b4de90f73e26f9bd1260943a5e248': {ERC4626Feature.midas_like}, '0xb250c9e0f7be4cff13f94374c993ac445a1385fe': {ERC4626Feature.eth_strategy_like}, '0xb31bea5c2a43f942a3800558b1aa25978da75f8a': {ERC4626Feature.midas_like}, '0xb39c200d3094c05e048a8f13b69a221db56d012a': {ERC4626Feature.midas_like}, '0xb44169e66c898ff70029f9cf2fdb9685d7bc99c6': {ERC4626Feature.crystalclear_like}, '0xb45ad160634c528cc3d2926d9807104fa3157305': {ERC4626Feature.inverse_finance_like}, '0xb64c014307622eb15046c66ff71d04258f5963dc': {ERC4626Feature.midas_like}, '0xb920ed46dec7455d0caf52b357d9a9f55b4daeca': {ERC4626Feature.ember_like}, '0xb99b6df96d4d5448cc0a5b3e0ef7896df9507cf5': {ERC4626Feature.forty_acres_like}, '0xb9c1344105faa4681bc7ffd68c5c526da61f2ae8': {ERC4626Feature.aarna_like}, '0xbb51e2a15a9158ebe2b0ceb8678511e063ab7a55': {ERC4626Feature.midas_like}, '0xbc65ad17c5c0a2a4d159fa5a503f4992c7b545fe': {ERC4626Feature.spark_like}, '0xc0485c4bafb594ae1457820fb6e5b67e8a04bcfd': {ERC4626Feature.forty_acres_like}, '0xc26af85ede9cc25d449bcebef866bb85afd5d346': {ERC4626Feature.libeara_like}, '0xc344db27feba7f0a881a50f0f702a525a44f2368': {ERC4626Feature.midas_like}, '0xc38421e5577250eba177bc5bc832e747bea13ee0': {ERC4626Feature.liquid_royalty_like}, '0xc462f87f78abdd27b1e41c9ede862275d2c7f36b': {ERC4626Feature.midas_like}, '0xc470e9fc12a60f72c543516dc23de1f55c29e3d5': {ERC4626Feature.midas_like}, '0xc5d6a7b61d18afa11435a889557b068bb9f29930': {ERC4626Feature.usdd_like}, '0xc6135d59f8d10c9c035963ce9037b3635170d716': {ERC4626Feature.midas_like}, '0xc7990369da608c2f4903715e3bd22f2970536c29': {ERC4626Feature.mainstreet_like}, '0xc8495eaff71d3a563b906295fcf2f685b1783085': {ERC4626Feature.midas_like}, '0xc8739fbbd54c587a2ad43b50cbcc30ae34fe9e34': {ERC4626Feature.midas_like}, '0xc9f01b5c6048b064e6d925d1c2d7206d4feef8a3': {ERC4626Feature.yearn_tokenised_strategy}, '0xca5921df65e2e1b0b98ae91c0187ba80d4124898': {ERC4626Feature.midas_like}, '0xcc476b1a49bcdf5192561e87b6fb8ea78aa28c13': {ERC4626Feature.midas_like}, '0xcc56410e1a136af0eceb7241c6ae394f4d8b581c': {ERC4626Feature.atoma_like}, '0xcc5c22c7a6bcc25e66726aef011dde74289ed203': {ERC4626Feature.midas_like}, '0xccbad2823328bccaea6476df3aa529316ab7474a': {ERC4626Feature.midas_like}, '0xcf62f905562626cfcdd2261162a51fd02fc9c5b6': {ERC4626Feature.frax_staking_like}, '0xd0ee0cf300dfb598270cd7f4d0c6e0d8f6e13f29': {ERC4626Feature.altura_like}, '0xd385ba55a22ac732cf435c5b5c3a1dfe5939ba4d': {ERC4626Feature.midas_like}, '0xd5d097f278a735d0a3c609deee71234cac14b47e': {ERC4626Feature.csigma_like}, '0xd66d69c288d9a6fd735d7be8b2e389970fc4fd42': {ERC4626Feature.midas_like}, '0xd90f6bfed23ffde40106fc4498dd2e9edb95e4e7': {ERC4626Feature.midas_like}, '0xdbdc1ef57537e34680b898e1febd3d68c7389bcb': {ERC4626Feature.infinifi_like}, '0xdd629e5241cbc5919847783e6c96b2de4754e438': {ERC4626Feature.midas_like}, '0xde770c84fe66e063336b31737cfe9790f18c4087': {ERC4626Feature.spark_like}, '0xde88c15bbc9c4254a147a964f1fc937bae12712e': {ERC4626Feature.ember_like}, '0xe2e7a17dff93280dec073c995595155283e3c372': {ERC4626Feature.spark_like}, '0xe34e510b1ef2e97911a646f120bd0da2ca4ac0ff': {ERC4626Feature.basevol_like}, '0xe4880249745eac5f1ed9d8f7df844792d560e750': {ERC4626Feature.spiko_like}, '0xe5f130253ff137f9917c0107659a4c5262abf6b0': {ERC4626Feature.frankencoin_like}, '0xe68f4e819ad09f2e0e668297cc1a905994808d38': {ERC4626Feature.midas_like}, '0xe70b5eb021dc3af653d61fd792d8f0b60f36c493': {ERC4626Feature.midas_like}, '0xe7ba07519dfa06e60059563f484d6090dedf21b3': {ERC4626Feature.midas_like}, '0xe9d33286f0e37f517b1204aa6da085564414996d': {ERC4626Feature.maple_aqru_like}, '0xebfc8c2fe73c431ef2a371aea9132110aab50dca': {ERC4626Feature.yuzu_money_like}, '0xecacb5434f05a548faf92a31874e0c014beeee91': {ERC4626Feature.midas_like}, '0xedca8230366b9eaff06becdd1d261577836aa507': {ERC4626Feature.forgeyields_like}, '0xf0db6f529581e7f6ebac7a7f6882923c00fc3a66': {ERC4626Feature.sygnum_like}, '0xf1be2622fd0f34d520ab31019a4ad054a2c4b1e0': {ERC4626Feature.basevol_like}, '0xf2d2d55daf93b0660297eaa10969ebe90ead5ce8': {ERC4626Feature.dolomite_like}, '0xf3190a3ecc109f88e7947b849b281918c798a0c4': {ERC4626Feature.ember_like}, '0xf4f447e6afa04c9d11ef0e2fc0d7f19c24ee55de': {ERC4626Feature.yieldfi_like}, '0xf689555121e529ff0463e191f9bd9d1e496164a7': {ERC4626Feature.threejane_like}, '0xf7cf282ec810fded974f99c0163e792f432892bc': {ERC4626Feature.midas_like}, '0xf91c31299e998c5127bc5f11e4a657fc0cf358cd': {ERC4626Feature.midas_like}, '0xf94f97677914d298844ec8fa590fab09ccc324d0': {ERC4626Feature.usdd_like}, '0xffa36b4b011d87d89fef3098ab30fef7bcc3571e': {ERC4626Feature.midas_like}}

Handle problematic protocols.

Some protocols cannot be detected by their vault smart contract structure, because they are using copy-paste smart contracts. For these, we need to do by vault contract address whitelisting here.