fix(ethereum): Remove hardcoded names for registry known addresses
What changed, and why it matters
This commit removes a long list of hardcoded friendly names (like 'Lido', 'Morpho', 'WalletConnect') that Trezor devices previously showed when signing Ethereum transactions to certain smart contracts. After the change, only a few built-in names remain (mainly 'WETH' and a test address), and most contracts will be shown to the user as raw addresses instead of recognizable labels. The change is framed as a cleanup to rely on an external registry rather than hardcoded names. It is not a direct security fix for a vulnerability, but it reduces the risk that a wrong or misleading hardcoded label could trick a user into trusting a malicious contract.
Treat as a hardening/cleanup change rather than an urgent vulnerability patch. Review whether the external ERC-7730 registry is now correctly populated with the removed names so users do not lose helpful context. Verify the translation signature update is legitimate and that no stale translation keys remain. Continue monitoring for the follow-up PR mentioned in the TODO to remove the remaining hardcoded WETH and Uniswap entries.
Security signals we found
Removal of hardcoded trust labels reduces attack surface for label-spoofing or stale-name confusion
User-visible display changes from friendly names to raw addresses for many DeFi contracts
No cryptographic, parsing, or memory-safety changes in the diff
TODO comment indicates remaining hardcoded entries are still planned for removal
Translations signature updated, suggesting the change affected user-facing strings
Evidence from the diff
The patch deletes roughly 40 hardcoded (chain_id, address, display_name) tuples from core/src/apps/ethereum/sc_constants.py and its Mako template, leaving only WETH deployments, a debug test address, and two Uniswap V3 Router entries. Tests are updated so that the previously ‘known’ stETH/Lido address now renders as its checksummed address rather than the friendly name. A TODO comment indicates the remaining hardcoded entries are intended to move to the clear-signing-erc7730-registry later. The translations signature file is also refreshed, likely because the removed names affected translation strings or metadata.
Changed components
core/src/apps/ethereum/sc_constants.pycore/src/apps/ethereum/sc_constants.py.makocore/tests/test_apps.ethereum.clear_signing.pycore/translations/signatures.jsonEthereum clear-signing / known-address display featureInspect captured patch +22 / −130
### core/src/apps/ethereum/sc_constants.py
@@ -22,50 +22,18 @@ def lookup_known_address(chain_id: int, address: bytes) -> str | None:
def _known_address_iterator() -> Iterator[tuple[int, bytes, str]]:
# NOTE: implementing the `_known_address_iterator` as a generator instead of an if-tree of `return` statements saves flash size (Same trick as in `apps.ethereum.tokens`.)
- yield (1, b"\x11\x11\x11\x12\x54\x21\xca\x6d\xc4\x52\xd2\x89\x31\x42\x80\xa0\xf8\x84\x2a\x65", "1inch Aggregation Router V6")
- yield (1, b"\x12\x31\xde\xb6\xf5\x74\x9e\xf6\xce\x69\x43\xa2\x75\xa1\xd3\xe7\x48\x6f\x4e\xae", "LiFI Diamond")
yield (1, b"\x68\xb3\x46\x58\x33\xfb\x72\xa7\x0e\xcd\xf4\x85\xe0\xe4\xc7\xbd\x86\x65\xfc\x45", "Uniswap V3 Router")
yield (1, b"\xe5\x92\x42\x7a\x0a\xec\xe9\x2d\xe3\xed\xee\x1f\x18\xe0\x15\x7c\x05\x86\x15\x64", "Uniswap V3 Router")
- yield (1, b"\x88\x9e\xdc\x2e\xda\xb5\xf4\x0e\x90\x2b\x86\x4a\xd4\xd7\xad\xe8\xe4\x12\xf9\xb1", "Lido")
- yield (1, b"\xae\x7a\xb9\x65\x20\xde\x3a\x18\xe5\xe1\x11\xb5\xea\xab\x09\x53\x12\xd7\xfe\x84", "Lido")
- yield (1, b"\xa8\x8f\x03\x29\xc2\xc4\xce\x51\xba\x3f\xc6\x19\xbb\xf4\x4e\xfe\x71\x20\xdd\x0d", "Lido")
- yield (1, b"\x7f\x39\xc5\x81\xf5\x95\xb5\x3c\x5c\xb1\x9b\xd0\xb3\xf8\xda\x6c\x93\x5e\x2c\xa0", "Lido")
- yield (1, b"\xbb\xbb\xbb\xbb\xbb\x9c\xc5\xe9\x0e\x3b\x3a\xf6\x4b\xda\xf6\x2c\x37\xee\xff\xcb", "Morpho")
- yield (8453, b"\xbb\xbb\xbb\xbb\xbb\x9c\xc5\xe9\x0e\x3b\x3a\xf6\x4b\xda\xf6\x2c\x37\xee\xff\xcb", "Morpho")
- yield (1, b"\x65\x66\x19\x41\x41\xee\xfa\x99\xaf\x43\xbb\x5a\xa7\x14\x60\xca\x2d\xc9\x02\x45", "Morpho")
- yield (8453, b"\x6b\xfd\x81\x37\xe7\x02\x54\x0e\x7a\x42\xb7\x41\x78\xa4\xa4\x9b\xa4\x39\x20\xc4", "Morpho")
- yield (1, b"\x57\x68\x34\xcb\x06\x8e\x67\x7d\xb4\xaf\xf6\xca\x24\x5c\x7b\xde\x16\xc3\x86\x7e", "Kiln")
- yield (1, b"\x00\x4c\x22\x6f\xff\x73\xaa\x94\xb7\x8a\x4d\xf1\xa0\xe8\x61\x79\x7b\xa1\x68\x19", "Kiln")
- yield (1, b"\x86\x59\xee\xff\x31\xcf\xcf\xf5\x80\xd3\x7a\xf8\xe7\xaf\x25\x0f\x89\x98\xaa\x83", "Kiln")
- yield (1, b"\x9d\x39\xa5\xde\x30\xe5\x74\x43\xbf\xf2\xa8\x30\x7a\x42\x56\xc8\x79\x7a\x34\x97", "Ethena")
- yield (1, b"\xce\x54\x85\xcf\xb2\x69\x14\xc5\xdc\xe0\x0b\x9b\xaf\x05\x80\x36\x4d\xaf\xc7\xa4", "StarkGate")
- yield (10, b"\x52\x1b\x4c\x06\x5b\xbd\xbe\x3e\x20\xb3\x72\x73\x40\x73\x09\x36\x91\x2d\xfa\x46", "WalletConnect")
- yield (10, b"\xef\x44\x61\x89\x1d\xfb\x3a\xc8\x57\x2c\xcf\x7c\x79\x46\x64\xa8\xdd\x92\x79\x45", "WalletConnect")
- yield (1, b"\xef\x44\x61\x89\x1d\xfb\x3a\xc8\x57\x2c\xcf\x7c\x79\x46\x64\xa8\xdd\x92\x79\x45", "WalletConnect")
- yield (8453, b"\xef\x44\x61\x89\x1d\xfb\x3a\xc8\x57\x2c\xcf\x7c\x79\x46\x64\xa8\xdd\x92\x79\x45", "WalletConnect")
- yield (1116, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x11", "Core Stake")
- yield (1116, b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10", "Core Stake")
- yield (1, b"\xb9\x29\xb8\x91\x53\xfc\x2e\xed\x44\x2e\x81\xe5\xa1\xad\xd4\xe2\xfa\x39\x02\x8f", "yield.xyz")
- yield (1, b"\x56\xd7\x83\xca\x8e\x0b\x99\x8c\x57\xa4\x28\xbf\x1c\x26\xa8\xba\xca\x50\x52\x4e", "yield.xyz")
- yield (1, b"\x85\x76\x79\xd6\x9f\xe5\x0e\x7b\x72\x2f\x94\xac\xd2\x62\x9d\x80\xc3\x55\x16\x3d", "yield.xyz")
- yield (1, b"\xf3\x0c\xf4\xed\x71\x2d\x37\x34\x16\x1f\xda\xab\x5b\x1d\xbb\x49\xfd\x2d\x0e\x5c", "yield.xyz")
- yield (1, b"\x5a\x10\xde\x50\x16\x01\x26\xa5\xf9\x36\x50\x6b\xd3\x42\xc5\x41\xac\x44\xe9\x43", "yield.xyz")
- yield (1, b"\x35\xb1\xca\x0f\x39\x89\x05\xcf\x75\x2e\x6f\xe1\x22\xb5\x1c\x88\x02\x2f\xca\x32", "yield.xyz")
- yield (1, b"\xd9\xe6\x98\x7d\x77\xbf\x2c\x6d\x06\x47\xb8\x18\x1f\xd6\x8a\x25\x9f\x83\x8c\x36", "yield.xyz")
- yield (1, b"\xd1\x4a\x87\x02\x51\x09\x01\x3b\x0a\x23\x54\xa7\x75\xcb\x33\x5f\x92\x6a\xf6\x5a", "yield.xyz")
- yield (1, b"\xa6\xe7\x68\xfe\xf2\xd1\xaf\x36\xc0\xcf\xdb\x27\x64\x22\xe7\x88\x1a\x83\xe9\x51", "yield.xyz")
- yield (1, b"\x46\x75\x85\xaa\xea\x86\x0f\x9d\x8b\x3b\x43\xbb\x99\x4e\x4d\xa8\xa9\x37\x88\xa7", "yield.xyz")
- yield (1, b"\x06\x99\x8a\xf8\xf3\x9f\xf8\x63\x0d\x1f\xb5\x15\xd2\x27\x81\xda\x4d\xc2\xca\x71", "yield.xyz")
- yield (1, b"\x87\x5e\x90\x14\x65\xa6\x39\xf2\xe7\x1f\xcf\xc1\x0f\x42\x6e\xd3\x2f\x5a\x90\x9a", "yield.xyz")
- yield (1, b"\x29\x05\xb3\x38\x7c\x95\x50\xea\x57\xfa\x3e\xe7\xd4\xb7\xe5\xab\xf3\xac\xd3\xd2", "yield.xyz")
- yield (1, b"\x15\xc2\xb3\xad\xca\x66\xe2\x6b\x6f\x23\x0b\x40\x23\xf5\x2a\x28\x5b\x7f\x99\x95", "yield.xyz")
+
for chain_id, addr in weth_deployments():
yield (chain_id, addr, "WETH")
if __debug__:
yield (1, b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", "Trezor Test. DO NOT USE")
+# TODO: We can update these addresses in the registry. With `Unwrap` also being added in this PR: https://github.com/ethereum/clear-signing-erc7730-registry/pull/3060
+# We can get rid of the hardcoded addresses and formatters.
def weth_deployments() -> Iterator[tuple[int, bytes]]:
"""Canonical WETH (Wrapped Ether) contract deployments: (chain_id, address)."""
yield (1, b"\xc0\x2a\xaa\x39\xb2\x23\xfe\x8d\x0a\x0e\x5c\x4f\x27\xea\xd9\x08\x3c\x75\x6c\xc2")
### core/src/apps/ethereum/sc_constants.py.mako
@@ -12,92 +12,11 @@ def fmt_addr(addr_hex: str) -> str:
data = "".join(f'\\x{b:02x}' for b in bytes.fromhex(addr_hex))
return f'b"{data}"'
-
KNOWN_ADDRESSES = [
- # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/1inch/calldata-AggregationRouterV6.json#L9
- (1, "111111125421cA6dc452d289314280a0f8842A65", "1inch Aggregation Router V6"),
- # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/lifi/calldata-LIFIDiamond.json
- (1, "1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE", "LiFI Diamond"),
# https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/uniswap/calldata-UniswapV3Router02.json#L6
(1, "68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", "Uniswap V3 Router"),
# https://etherscan.io/address/0xe592427a0aece92de3edee1f18e0157c05861564
(1, "e592427a0aece92de3edee1f18e0157c05861564", "Uniswap V3 Router"),
- # Lido
- # https://etherscan.io/address/0x889edc2edab5f40e902b864ad4d7ade8e412f9b1
- (1, "889edc2edab5f40e902b864ad4d7ade8e412f9b1", "Lido"),
- # https://etherscan.io/address/0xae7ab96520de3a18e5e111b5eaab095312d7fe84
- (1, "ae7ab96520de3a18e5e111b5eaab095312d7fe84", "Lido"),
- # https://etherscan.io/address/0xa88f0329c2c4ce51ba3fc619bbf44efe7120dd0d
- (1, "a88f0329c2c4ce51ba3fc619bbf44efe7120dd0d", "Lido"),
- # https://etherscan.io/address/0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
- (1, "7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", "Lido"),
- # Morpho
- # https://etherscan.io/address/0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb
- (1, "bbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb", "Morpho"),
- # https://basescan.org/address/0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb
- (8453, "bbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb", "Morpho"),
- # https://etherscan.io/address/0x6566194141eefa99af43bb5aa71460ca2dc90245
- (1, "6566194141eefa99af43bb5aa71460ca2dc90245", "Morpho"),
- # https://basescan.org/address/0x6bfd8137e702540e7a42b74178a4a49ba43920c4
- (8453, "6bfd8137e702540e7a42b74178a4a49ba43920c4", "Morpho"),
- # Kiln
- # https://etherscan.io/address/0x576834cb068e677db4aff6ca245c7bde16c3867e
- (1, "576834cb068e677db4aff6ca245c7bde16c3867e", "Kiln"),
- # https://etherscan.io/address/0x004c226fff73aa94b78a4df1a0e861797ba16819
- (1, "004c226fff73aa94b78a4df1a0e861797ba16819", "Kiln"),
- # Missing account tag on ethscan. But contract deployer is tagged as Kiln.
- # Fresh high value transactions.
- # https://etherscan.io/address/0x8659eeff31cfcff580d37af8e7af250f8998aa83
- (1, "8659eeff31cfcff580d37af8e7af250f8998aa83", "Kiln"),
- # Ethena
- # https://etherscan.io/address/0x9d39a5de30e57443bff2a8307a4256c8797a3497
- (1, "9d39a5de30e57443bff2a8307a4256c8797a3497", "Ethena"),
- # StarkGate
- # https://etherscan.io/address/0xce5485cfb26914c5dce00b9baf0580364dafc7a4
- (1, "ce5485cfb26914c5dce00b9baf0580364dafc7a4", "StarkGate"),
- # WalletConnect
- # https://optimistic.etherscan.io/address/0x521b4c065bbdbe3e20b3727340730936912dfa46
- (10, "521b4c065bbdbe3e20b3727340730936912dfa46", "WalletConnect"),
- # https://optimistic.etherscan.io/address/0xef4461891dfb3ac8572ccf7c794664a8dd927945
- (10, "ef4461891dfb3ac8572ccf7c794664a8dd927945", "WalletConnect"),
- # https://etherscan.io/address/0xef4461891dfb3ac8572ccf7c794664a8dd927945
- (1, "ef4461891dfb3ac8572ccf7c794664a8dd927945", "WalletConnect"),
- # https://basescan.org/address/0xef4461891dfb3ac8572ccf7c794664a8dd927945
- (8453, "ef4461891dfb3ac8572ccf7c794664a8dd927945", "WalletConnect"),
- # Core Stake
- # https://scan.coredao.org/address/0x0000000000000000000000000000000000001011
- (1116, "0000000000000000000000000000000000001011", "Core Stake"),
- # https://scan.coredao.org/address/0x0000000000000000000000000000000000001010
- (1116, "0000000000000000000000000000000000001010", "Core Stake"),
- # yield.xyz
- # https://etherscan.io/address/0xb929b89153fc2eed442e81e5a1add4e2fa39028f
- (1, "b929b89153fc2eed442e81e5a1add4e2fa39028f", "yield.xyz"),
- # https://etherscan.io/address/0x56d783ca8e0b998c57a428bf1c26a8baca50524e
- (1, "56d783ca8e0b998c57a428bf1c26a8baca50524e", "yield.xyz"),
- # https://etherscan.io/address/0x857679d69fe50e7b722f94acd2629d80c355163d
- (1, "857679d69fe50e7b722f94acd2629d80c355163d", "yield.xyz"),
- # https://etherscan.io/address/0xf30cf4ed712d3734161fdaab5b1dbb49fd2d0e5c
- (1, "f30cf4ed712d3734161fdaab5b1dbb49fd2d0e5c", "yield.xyz"),
- # https://etherscan.io/address/0x5a10de50160126a5f936506bd342c541ac44e943
- (1, "5a10de50160126a5f936506bd342c541ac44e943", "yield.xyz"),
- # https://etherscan.io/address/0x35b1ca0f398905cf752e6fe122b51c88022fca32
- (1, "35b1ca0f398905cf752e6fe122b51c88022fca32", "yield.xyz"),
- # https://etherscan.io/address/0xd9e6987d77bf2c6d0647b8181fd68a259f838c36
- (1, "d9e6987d77bf2c6d0647b8181fd68a259f838c36", "yield.xyz"),
- # https://etherscan.io/address/0xd14a87025109013b0a2354a775cb335f926af65a
- (1, "d14a87025109013b0a2354a775cb335f926af65a", "yield.xyz"),
- # https://etherscan.io/address/0xa6e768fef2d1af36c0cfdb276422e7881a83e951
- (1, "a6e768fef2d1af36c0cfdb276422e7881a83e951", "yield.xyz"),
- # https://etherscan.io/address/0x467585aaea860f9d8b3b43bb994e4da8a93788a7
- (1, "467585aaea860f9d8b3b43bb994e4da8a93788a7", "yield.xyz"),
- # https://etherscan.io/address/0x06998af8f39ff8630d1fb515d22781da4dc2ca71
- (1, "06998af8f39ff8630d1fb515d22781da4dc2ca71", "yield.xyz"),
- # https://etherscan.io/address/0x875e901465a639f2e71fcfc10f426ed32f5a909a
- (1, "875e901465a639f2e71fcfc10f426ed32f5a909a", "yield.xyz"),
- # https://etherscan.io/address/0x2905b3387c9550ea57fa3ee7d4b7e5abf3acd3d2
- (1, "2905b3387c9550ea57fa3ee7d4b7e5abf3acd3d2", "yield.xyz"),
- # https://etherscan.io/address/0x15c2b3adca66e26b6f230b4023f52a285b7f9995
- (1, "15c2b3adca66e26b6f230b4023f52a285b7f9995", "yield.xyz"),
]
# (chain_id, address) pairs for ETH staking pool (stake/unstake) contracts.
@@ -147,16 +66,19 @@ def lookup_known_address(chain_id: int, address: bytes) -> str | None:
def _known_address_iterator() -> Iterator[tuple[int, bytes, str]]:
# NOTE: implementing the `_known_address_iterator` as a generator instead of an if-tree of `return` statements saves flash size (Same trick as in `apps.ethereum.tokens`.)
-% for chain_id, addr, name in KNOWN_ADDRESSES:
+ % for chain_id, addr, name in KNOWN_ADDRESSES:
yield (${chain_id}, ${fmt_addr(addr)}, "${name}")
-% endfor
+ % endfor
+
for chain_id, addr in weth_deployments():
yield (chain_id, addr, "WETH")
if __debug__:
yield (1, ${fmt_addr("dddddddddddddddddddddddddddddddddddddddd")}, "Trezor Test. DO NOT USE")
+# TODO: We can update these addresses in the registry. With `Unwrap` also being added in this PR: https://github.com/ethereum/clear-signing-erc7730-registry/pull/3060
+# We can get rid of the hardcoded addresses and formatters.
def weth_deployments() -> Iterator[tuple[int, bytes]]:
"""Canonical WETH (Wrapped Ether) contract deployments: (chain_id, address)."""
% for chain_id, addr in WETH_DEPLOYMENTS:
### core/tests/test_apps.ethereum.clear_signing.py
@@ -1168,9 +1168,10 @@ def test_token_amount_no_token_source_rejected(self):
TRANSFER_SIG = b"\xa9\x05\x9c\xbb"
RECIPIENT = bytes.fromhex("d8da6bf26964af9d7eed9e03e53415d37aa96045")
- # stETH: mapped to "Lido" in KNOWN_ADDRESSES, exercising the provider /
- # callee name resolution. Will be updated once those definitions are removed.
+ # stETH: not in KNOWN_ADDRESSES, so the provider / callee is displayed as
+ # its checksummed address.
CALLEE = bytes.fromhex("ae7ab96520de3a18e5e111b5eaab095312d7fe84")
+ CALLEE_STR = "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84"
@staticmethod
def _msg(**kwargs):
@@ -1249,8 +1250,9 @@ def _expand(self, blob, formatter=None, callee=None, **parse_kwargs):
)
return fields
- def _assert_raw_fallback(self, fields, blob, callee_str="Lido"):
+ def _assert_raw_fallback(self, fields, blob, callee_str=None):
# the fallback is two rows: the callee, then the raw hex blob
+ callee_str = callee_str or self.CALLEE_STR
self.assertEqual(len(fields), 2)
self.assertEqual(fields[0][0][:2], ("Subcall to", callee_str))
self.assertEqual(fields[1][0][:2], ("Wrapped call", blob.hex()))
@@ -1308,7 +1310,7 @@ def test_calldata_nested_transfer(self):
self.assertEqual(len(fields), 4)
# built-in TRANSFER has no provider_name -> KNOWN_ADDRESSES fallback
- self.assertEqual(fields[0][0][:2], ("(Subcall) Provider", "Lido"))
+ self.assertEqual(fields[0][0][:2], ("(Subcall) Provider", self.CALLEE_STR))
self.assertEqual(fields[1][0][:2], ("(Subcall) Intent", "Send"))
(label, formatted, _), _, _ = fields[2]
self.assertEqual(label, "(Subcall) To")
@@ -1430,7 +1432,7 @@ def test_calldata_depth_capped_at_one(self):
clear_signing_definitions.all_display_formats = original
self.assertEqual(len(fields), 4)
- self.assertEqual(fields[0][0][:2], ("(Subcall) Provider", "Lido"))
+ self.assertEqual(fields[0][0][:2], ("(Subcall) Provider", self.CALLEE_STR))
self.assertEqual(fields[1][0][:2], ("(Subcall) Intent", "Middle"))
# the middle format's calldata field degraded to callee + raw hex
(label, formatted, _), _, _ = fields[2]
@@ -1581,7 +1583,7 @@ def test_calldata_array_of_subcalls(self):
self.assertEqual(len(fields), 8)
for n, group in ((1, fields[:4]), (2, fields[4:])):
prefix = f"(Subcall #{n}) "
- self.assertEqual(group[0][0][:2], (prefix + "Provider", "Lido"))
+ self.assertEqual(group[0][0][:2], (prefix + "Provider", self.CALLEE_STR))
self.assertEqual(group[1][0][:2], (prefix + "Intent", "Send"))
(label, formatted, _), _, _ = group[2]
self.assertEqual(label, prefix + "To")
@@ -1603,7 +1605,7 @@ def test_calldata_array_parallel_callees(self):
)
self.assertEqual(len(fields), 8)
- self.assertEqual(fields[0][0][:2], ("(Subcall #1) Provider", "Lido"))
+ self.assertEqual(fields[0][0][:2], ("(Subcall #1) Provider", self.CALLEE_STR))
(label, provider, _), _, _ = fields[4]
self.assertEqual(label, "(Subcall #2) Provider")
self.assertEqual(provider.lower(), "0x" + other_callee.hex())
@@ -1618,12 +1620,12 @@ def test_calldata_array_raw_fallback(self):
fields, _ = self._expand_array([bad_blob, good_blob])
self.assertEqual(len(fields), 6)
- self.assertEqual(fields[0][0][:2], ("(Subcall #1) To", "Lido"))
+ self.assertEqual(fields[0][0][:2], ("(Subcall #1) To", self.CALLEE_STR))
self.assertEqual(
fields[1][0][:2],
("(Subcall #1) Wrapped call", bad_blob.hex()),
)
- self.assertEqual(fields[2][0][:2], ("(Subcall #2) Provider", "Lido"))
+ self.assertEqual(fields[2][0][:2], ("(Subcall #2) Provider", self.CALLEE_STR))
def test_calldata_array_empty(self):
# An empty subcall array legitimately contributes no rows.
### core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "61908c342eb435dfa914864ac68f273b8c6e85259e1c9c8672aa980ef8749ab1",
- "datetime": "2026-09-30T17:25:29.042246+00:00",
- "commit": "f98f0cd6a321c3e82ca014911f36c426eb301442"
+ "merkle_root": "fcb37dfc8f6fd7cd1d20bd003cfa4383880a9fc64bbb8d24f5aa17fa1e20efb1",
+ "datetime": "2026-09-30T18:11:48.431502+00:00",
+ "commit": "88c6eb7f73a9859b8cb131b282b52be7acf1fc70"
},
"history": [
{Why this scored 24/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.