fix(core): scope allocation of clear signing definitions
What changed, and why it matters
This commit changes how Trezor's Ethereum 'clear signing' helper data is loaded in memory. Previously, all definitions were stored in a permanent module-level list that MicroPython's garbage collector could not reclaim. The patch wraps them in a generator function so they are created on demand and can be freed afterward. The stated goal is to avoid memory pressure, not to fix a security bug. There is no direct evidence of an exploitable vulnerability in the diff itself.
Treat as a routine robustness improvement. Review whether the generator correctly yields the same set of formats as the old list (including __debug__ test formats) and verify no iterator exhaustion bug was introduced. No urgent security response is warranted based solely on this commit.
Security signals we found
Memory pressure reduction: module-level rooted objects moved to generator-local scope to become collectable.
No input validation, parsing, or cryptographic logic changed; only object lifetime and import scoping.
No explicit security relevance disclosed by vendor; commit message frames change as a fix for garbage collection.
Potential denial-of-service class (memory exhaustion) is the closest security concern, but no exploit path is shown.
Evidence from the diff
The patch refactors clear_signing_definitions.py from a module-level ALL_DISPLAY_FORMATS list populated at import time to an all_display_formats() generator that yields DisplayFormat objects inside a function scope. It also moves imports of formatter/parser symbols and unhexlify into that function, and updates clear_signing.py to iterate over the generator. The commit message says this is so the objects ‘will be garbage-collected.’ On MicroPython, module-level globals are rooted and survive collection; local objects created during iteration can be reclaimed once the generator is exhausted. The change is therefore a memory-management/robustness improvement rather than a patch for a demonstrated memory-exhaustion exploit.
Changed components
core/src/apps/ethereum/clear_signing.pycore/src/apps/ethereum/clear_signing_definitions.pyInspect captured patch +1086 / −1084
diff --git a/core/src/apps/ethereum/clear_signing.py b/core/src/apps/ethereum/clear_signing.py
index 6a1790d1..b4d6f32b 100644
--- a/core/src/apps/ethereum/clear_signing.py
+++ b/core/src/apps/ethereum/clear_signing.py
@@ -14,7 +14,7 @@ from .helpers import (
if TYPE_CHECKING:
from buffer_types import AnyBytes
- from typing import Callable, Generator, Iterable, Sequence
+ from typing import Callable, Iterable, Sequence
from trezor.messages import (
EthereumABIValueInfo,
@@ -976,19 +976,11 @@ async def try_confirm(
payment_request_verifier: PaymentRequestVerifier | None,
) -> bool:
from .clear_signing_definitions import (
- ALL_DISPLAY_FORMATS,
APPROVE_DISPLAY_FORMAT,
TRANSFER_DISPLAY_FORMAT,
+ all_display_formats,
)
- def iter_formats() -> Generator[DisplayFormat, None, None]:
- yield from ALL_DISPLAY_FORMATS
-
- if __debug__:
- from .clear_signing_definitions import _test_formats
-
- yield from _test_formats()
-
if not address_bytes:
return False
@@ -998,7 +990,7 @@ async def try_confirm(
func_sig = bytes(data[0:SC_FUNC_SIG_BYTES])
display_format = None
- for f in iter_formats():
+ for f in all_display_formats():
# Start by trying built-in definitions...
if f.func_sig == func_sig and f.matches_context(msg.chain_id, address_bytes):
display_format = f
diff --git a/core/src/apps/ethereum/clear_signing_definitions.py b/core/src/apps/ethereum/clear_signing_definitions.py
index 72c08d2f..39964bbc 100644
--- a/core/src/apps/ethereum/clear_signing_definitions.py
+++ b/core/src/apps/ethereum/clear_signing_definitions.py
@@ -1,29 +1,13 @@
-from micropython import const
from typing import Generator
-from ubinascii import unhexlify
from .clear_signing import (
AddressNameFormatter,
- AmountFormatter,
- Array,
Atomic,
- BindingContext,
ContainerPath,
- DateFormatter,
DisplayFormat,
- Dynamic,
FieldDefinition,
- RawFormatter,
TokenAmountFormatter,
- Tuple,
- UnitFormatter,
parse_address,
- parse_bool,
- parse_bytes,
- parse_bytes32,
- parse_string,
- parse_uint24,
- parse_uint160,
parse_uint256,
)
@@ -49,7 +33,7 @@ APPROVE_DISPLAY_FORMAT = DisplayFormat(
),
],
)
-SC_FUNC_APPROVE_REVOKE_AMOUNT = const(0)
+SC_FUNC_APPROVE_REVOKE_AMOUNT = 0
TRANSFER_DISPLAY_FORMAT = DisplayFormat(
binding_context=None,
@@ -77,610 +61,794 @@ if __debug__:
b"transfer(address,uint256)"
)
-ALL_DISPLAY_FORMATS = [APPROVE_DISPLAY_FORMAT, TRANSFER_DISPLAY_FORMAT]
+def all_display_formats() -> Generator[DisplayFormat, None, None]:
-# https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/1inch/calldata-AggregationRouterV6.json#L9
-ONEINCH_ADDRESS = unhexlify("111111125421cA6dc452d289314280a0f8842A65")
-ONEINCH_CHAINS = [
- 1,
- 10,
- 56,
- 100,
- 137,
- 146,
- 250,
- 8217,
- 8453,
- 42161,
- 43114,
- 59144,
- 1313161554,
-]
+ from ubinascii import unhexlify
-# $.metadata.constants.addressAsEth and addressAsNull from common-AggregationRouterV6.json
-ONEINCH_NATIVE_CURRENCY_ADDRESSES = [
- unhexlify("EeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"),
- unhexlify("0000000000000000000000000000000000000000"),
-]
+ from .clear_signing import (
+ AmountFormatter,
+ Array,
+ BindingContext,
+ DateFormatter,
+ Dynamic,
+ RawFormatter,
+ Tuple,
+ UnitFormatter,
+ parse_bool,
+ parse_bytes,
+ parse_bytes32,
+ parse_string,
+ parse_uint24,
+ parse_uint160,
+ )
-ONEINCH_CONTEXT = BindingContext(
- [(chain, ONEINCH_ADDRESS) for chain in ONEINCH_CHAINS],
-)
+ yield APPROVE_DISPLAY_FORMAT
+ yield TRANSFER_DISPLAY_FORMAT
-# Rationale for the omitted "Minimum to Receive" (minReturn) field in the
-# unoswap / unoswapTo / ethUnoswap* definitions below:
-# Unlike `swap` (whose `desc` struct carries both srcToken and dstToken), these
-# functions encode only the source token; the destination token is implied by
-# the pool routing packed into the `dex` argument(s) and cannot be recovered
-# from the calldata. The ERC-7730 registry therefore gives their minReturn no
-# tokenPath, so we have no decimals/symbol to format it as a token amount and
-# omit the field rather than display a bare, tokenless integer. (`swap` keeps
-# its minReturnAmount because its dstToken is available.)
+ # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/1inch/calldata-AggregationRouterV6.json#L9
+ ONEINCH_ADDRESS = unhexlify("111111125421cA6dc452d289314280a0f8842A65")
+ ONEINCH_CHAINS = [
+ 1,
+ 10,
+ 56,
+ 100,
+ 137,
+ 146,
+ 250,
+ 8217,
+ 8453,
+ 42161,
+ 43114,
+ 59144,
+ 1313161554,
+ ]
-_FUNC_SIG = unhexlify("07ed2379")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swap(address,(address,address,address,address,uint256,uint256,uint256),bytes)"
+ # $.metadata.constants.addressAsEth and addressAsNull from common-AggregationRouterV6.json
+ ONEINCH_NATIVE_CURRENCY_ADDRESSES = [
+ unhexlify("EeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"),
+ unhexlify("0000000000000000000000000000000000000000"),
+ ]
+
+ ONEINCH_CONTEXT = BindingContext(
+ [(chain, ONEINCH_ADDRESS) for chain in ONEINCH_CHAINS],
)
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_address), # executor
- Tuple(
- (
- parse_address, # srcToken
- parse_address, # dstToken
- parse_address, # srcReceiver
- parse_address, # dstReceiver
- parse_uint256, # amount
- parse_uint256, # minReturnAmount
- parse_uint256, # flags
- ),
- is_dynamic=False,
- ), # desc
- Dynamic(parse_bytes), # data
- ],
- field_definitions=[
- FieldDefinition(
- (1, 4), # desc.amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(1, 0), # desc.srcToken
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+
+ # Rationale for the omitted "Minimum to Receive" (minReturn) field in the
+ # unoswap / unoswapTo / ethUnoswap* definitions below:
+ # Unlike `swap` (whose `desc` struct carries both srcToken and dstToken), these
+ # functions encode only the source token; the destination token is implied by
+ # the pool routing packed into the `dex` argument(s) and cannot be recovered
+ # from the calldata. The ERC-7730 registry therefore gives their minReturn no
+ # tokenPath, so we have no decimals/symbol to format it as a token amount and
+ # omit the field rather than display a bare, tokenless integer. (`swap` keeps
+ # its minReturnAmount because its dstToken is available.)
+
+ _FUNC_SIG = unhexlify("07ed2379")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swap(address,(address,address,address,address,uint256,uint256,uint256),bytes)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_address), # executor
+ Tuple(
+ (
+ parse_address, # srcToken
+ parse_address, # dstToken
+ parse_address, # srcReceiver
+ parse_address, # dstReceiver
+ parse_uint256, # amount
+ parse_uint256, # minReturnAmount
+ parse_uint256, # flags
+ ),
+ is_dynamic=False,
+ ), # desc
+ Dynamic(parse_bytes), # data
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (1, 4), # desc.amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(1, 0), # desc.srcToken
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (1, 5), # desc.minReturnAmount
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(1, 1), # desc.dstToken
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ FieldDefinition(
+ (1, 5), # desc.minReturnAmount
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(1, 1), # desc.dstToken
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (1, 3), "Beneficiary", AddressNameFormatter # desc.dstReceiver
- ),
- ],
+ FieldDefinition(
+ (1, 3), "Beneficiary", AddressNameFormatter # desc.dstReceiver
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("83800a8e")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(b"unoswap(uint256,uint256,uint256,uint256)")
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_bytes32), # dex
- ],
- field_definitions=[
- FieldDefinition(
- (1,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(0, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("83800a8e")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswap(uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_bytes32), # dex
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (1,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(0, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (3, (-20,)), # dex.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (3, (-20,)), # dex.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("e2c95c82")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"unoswapTo(uint256,uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_bytes32), # dex
- ],
- field_definitions=[
- FieldDefinition(
- (2,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(1, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("e2c95c82")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswapTo(uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_bytes32), # dex
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (2,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(1, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (4, (-20,)), # dex.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (4, (-20,)), # dex.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("8770ba91")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"unoswap2(uint256,uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_bytes32), # dex2
- ],
- field_definitions=[
- FieldDefinition(
- (1,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(0, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("8770ba91")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswap2(uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_bytes32), # dex2
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (1,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(0, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (4, (-20,)), # dex2.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (4, (-20,)), # dex2.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("19367472")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"unoswap3(uint256,uint256,uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_uint256), # dex2
- Atomic(parse_bytes32), # dex3
- ],
- field_definitions=[
- FieldDefinition(
- (1,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(0, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("19367472")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswap3(uint256,uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_uint256), # dex2
+ Atomic(parse_bytes32), # dex3
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (1,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(0, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (5, (-20,)), # dex3.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (5, (-20,)), # dex3.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("ea76dddf")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_bytes32), # dex2
- ],
- field_definitions=[
- FieldDefinition(
- (2,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(1, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("ea76dddf")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswapTo2(uint256,uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_bytes32), # dex2
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (2,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(1, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (5, (-20,)), # dex2.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (5, (-20,)), # dex2.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("f7a70056")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_bytes32), # token
- Atomic(parse_uint256), # amount
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_uint256), # dex2
- Atomic(parse_bytes32), # dex3
- ],
- field_definitions=[
- FieldDefinition(
- (2,), # amount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(1, (-20,)), # token.[-20:]
- native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ _FUNC_SIG = unhexlify("f7a70056")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"unoswapTo3(uint256,uint256,uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_bytes32), # token
+ Atomic(parse_uint256), # amount
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_uint256), # dex2
+ Atomic(parse_bytes32), # dex3
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (2,), # amount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(1, (-20,)), # token.[-20:]
+ native_currency_address=ONEINCH_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (6, (-20,)), # dex3.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (6, (-20,)), # dex3.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("a76dfc3b")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(b"ethUnoswap(uint256,uint256)")
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_uint256), # minReturn
- Atomic(parse_bytes32), # dex
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (1, (-20,)), # dex.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ _FUNC_SIG = unhexlify("a76dfc3b")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(b"ethUnoswap(uint256,uint256)")
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_bytes32), # dex
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (1, (-20,)), # dex.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("89af926a")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(b"ethUnoswap2(uint256,uint256,uint256)")
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_bytes32), # dex2
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (2, (-20,)), # dex2.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ _FUNC_SIG = unhexlify("89af926a")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(b"ethUnoswap2(uint256,uint256,uint256)")
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_bytes32), # dex2
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (2, (-20,)), # dex2.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("188ac35d")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"ethUnoswap3(uint256,uint256,uint256,uint256)"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_uint256), # dex2
- Atomic(parse_bytes32), # dex3
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- ContainerPath.From, # @.from
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (3, (-20,)), # dex3.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ _FUNC_SIG = unhexlify("188ac35d")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"ethUnoswap3(uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_uint256), # dex2
+ Atomic(parse_bytes32), # dex3
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ ContainerPath.From, # @.from
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (3, (-20,)), # dex3.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("175accdc")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(b"ethUnoswapTo(uint256,uint256,uint256)")
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_uint256), # minReturn
- Atomic(parse_bytes32), # dex
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (2, (-20,)), # dex.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+ _FUNC_SIG = unhexlify("175accdc")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(b"ethUnoswapTo(uint256,uint256,uint256)")
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_bytes32), # dex
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (2, (-20,)), # dex.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("0f449d71")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"ethUnoswapTo2(uint256,uint256,uint256,uint256)"
+ _FUNC_SIG = unhexlify("0f449d71")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"ethUnoswapTo2(uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_bytes32), # dex2
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (3, (-20,)), # dex2.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_bytes32), # dex2
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (3, (-20,)), # dex2.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+
+ _FUNC_SIG = unhexlify("493189f0")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256)"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=ONEINCH_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes32), # to
+ Atomic(parse_uint256), # minReturn
+ Atomic(parse_uint256), # dex
+ Atomic(parse_uint256), # dex2
+ Atomic(parse_bytes32), # dex3
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to Send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (0, (-20,)), # to.[-20:]
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ FieldDefinition(
+ (4, (-20,)), # dex3.[-20:]
+ "Last Pool",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("493189f0")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"ethUnoswapTo3(uint256,uint256,uint256,uint256,uint256)"
+ # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/lifi/calldata-LIFIDiamond.json
+ LIFI_ADDRESS = unhexlify("1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE")
+ # Chains where the LiFi diamond is deployed at the canonical LIFI_ADDRESS.
+ LIFI_CHAINS = [
+ 1,
+ 10,
+ 25,
+ 56,
+ 100,
+ 106,
+ 122,
+ 137,
+ 204,
+ 250,
+ 252,
+ 288,
+ 1284,
+ 1285,
+ 5000,
+ 8453,
+ 9001,
+ 34443,
+ 42161,
+ 42170,
+ 42220,
+ 43114,
+ 81457,
+ 534352,
+ 1313161554,
+ 1666600000,
+ ]
+ # Chains where the LiFi diamond is deployed at a non-canonical address.
+ LIFI_ALT_DEPLOYMENTS = [
+ (324, unhexlify("341e94069f53234fe6dabef707ad424830525715")), # zkSync Era
+ (1088, unhexlify("24ca98fb6972f5ee05f0db00595c7f68d9fafd68")), # Metis
+ (59144, unhexlify("de1e598b81620773454588b85d6b5d4eec32573e")), # Linea
+ (167004, unhexlify("3a9a5dba8fe1c4da98187ce4755701bca182f63b")),
+ ]
+
+ LIFI_CONTEXT = BindingContext(
+ [(chain, LIFI_ADDRESS) for chain in LIFI_CHAINS] + LIFI_ALT_DEPLOYMENTS,
)
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=ONEINCH_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes32), # to
- Atomic(parse_uint256), # minReturn
- Atomic(parse_uint256), # dex
- Atomic(parse_uint256), # dex2
- Atomic(parse_bytes32), # dex3
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to Send",
- AmountFormatter,
- ),
- FieldDefinition(
- (0, (-20,)), # to.[-20:]
- "Beneficiary",
- AddressNameFormatter,
- ),
- FieldDefinition(
- (4, (-20,)), # dex3.[-20:]
- "Last Pool",
- AddressNameFormatter,
- ),
- ],
+
+ LIFI_NATIVE_CURRENCY_ADDRESSES = [
+ unhexlify("EeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"),
+ unhexlify("0000000000000000000000000000000000000000"),
+ ]
+
+ _FUNC_SIG = unhexlify("5fd9ae2e")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensMultipleV3ERC20ToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
+ Array(
+ Tuple(
+ (
+ parse_address, # callTo
+ parse_address, # approveTo
+ parse_address, # sendingAssetId
+ parse_address, # receivingAssetId
+ parse_uint256, # fromAmount
+ parse_bytes, # callData
+ parse_bool, # requiresDeposit
+ ),
+ is_dynamic=False,
+ )
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (5, 0, 4), # _swapData.[0].fromAmount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
+ ),
+ ),
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(5, -1, 3), # _swapData.[-1].receivingAssetId
+ ),
+ ),
+ FieldDefinition(
+ (3,), # _receiver
+ "Recipient",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-
-# https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/lifi/calldata-LIFIDiamond.json
-LIFI_ADDRESS = unhexlify("1231DEB6f5749EF6cE6943a275A1D3E7486F4EaE")
-# Chains where the LiFi diamond is deployed at the canonical LIFI_ADDRESS.
-LIFI_CHAINS = [
- 1,
- 10,
- 25,
- 56,
- 100,
- 106,
- 122,
- 137,
- 204,
- 250,
- 252,
- 288,
- 1284,
- 1285,
- 5000,
- 8453,
- 9001,
- 34443,
- 42161,
- 42170,
- 42220,
- 43114,
- 81457,
- 534352,
- 1313161554,
- 1666600000,
-]
-# Chains where the LiFi diamond is deployed at a non-canonical address.
-LIFI_ALT_DEPLOYMENTS = [
- (324, unhexlify("341e94069f53234fe6dabef707ad424830525715")), # zkSync Era
- (1088, unhexlify("24ca98fb6972f5ee05f0db00595c7f68d9fafd68")), # Metis
- (59144, unhexlify("de1e598b81620773454588b85d6b5d4eec32573e")), # Linea
- (167004, unhexlify("3a9a5dba8fe1c4da98187ce4755701bca182f63b")),
-]
-
-LIFI_CONTEXT = BindingContext(
- [(chain, LIFI_ADDRESS) for chain in LIFI_CHAINS] + LIFI_ALT_DEPLOYMENTS,
-)
-LIFI_NATIVE_CURRENCY_ADDRESSES = [
- unhexlify("EeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"),
- unhexlify("0000000000000000000000000000000000000000"),
-]
+ _FUNC_SIG = unhexlify("2c57e884")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensMultipleV3ERC20ToNative(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
+ Array(
+ Tuple(
+ (
+ parse_address, # callTo
+ parse_address, # approveTo
+ parse_address, # sendingAssetId
+ parse_address, # receivingAssetId
+ parse_uint256, # fromAmount
+ parse_bytes, # callData
+ parse_bool, # requiresDeposit
+ ),
+ is_dynamic=False,
+ )
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (5, 0, 4), # _swapData.[0].fromAmount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
+ ),
+ ),
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum Amount to receive",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (3,), # _receiver
+ "Receiver",
+ AddressNameFormatter,
+ ),
+ ],
+ )
+ )
-_FUNC_SIG = unhexlify("5fd9ae2e")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensMultipleV3ERC20ToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
+ _FUNC_SIG = unhexlify("736eac0b")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensMultipleV3NativeToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
+ Array(
+ Tuple(
+ (
+ parse_address, # callTo
+ parse_address, # approveTo
+ parse_address, # sendingAssetId
+ parse_address, # receivingAssetId
+ parse_uint256, # fromAmount
+ parse_bytes, # callData
+ parse_bool, # requiresDeposit
+ ),
+ is_dynamic=False,
+ )
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to send",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(5, -1, 3), # _swapData.[-1].receivingAssetId
+ ),
+ ),
+ FieldDefinition(
+ (3,), # _receiver
+ "Recipient",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Array(
+
+ _FUNC_SIG = unhexlify("4666fc80")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensSingleV3ERC20ToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
Tuple(
(
parse_address, # callTo
@@ -691,51 +859,47 @@ ALL_DISPLAY_FORMATS.append(
parse_bytes, # callData
parse_bool, # requiresDeposit
),
- is_dynamic=False,
- )
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- (5, 0, 4), # _swapData.[0].fromAmount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
+ is_dynamic=True,
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (5, 4), # _swapData.fromAmount
+ "Amount to Send",
+ TokenAmountFormatter(token_path=(5, 2)), # _swapData.sendingAssetId
),
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(5, -1, 3), # _swapData.[-1].receivingAssetId
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(5, 3)
+ ), # _swapData.receivingAssetId
),
- ),
- FieldDefinition(
- (3,), # _receiver
- "Recipient",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (3,), # _receiver
+ "Recipient",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("2c57e884")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensMultipleV3ERC20ToNative(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Array(
+ _FUNC_SIG = unhexlify("733214a3")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensSingleV3ERC20ToNative(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
Tuple(
(
parse_address, # callTo
@@ -746,49 +910,47 @@ ALL_DISPLAY_FORMATS.append(
parse_bytes, # callData
parse_bool, # requiresDeposit
),
- is_dynamic=False,
- )
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- (5, 0, 4), # _swapData.[0].fromAmount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
+ is_dynamic=True,
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (5, 4), # _swapData.fromAmount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(5, 2), # _swapData.sendingAssetId
+ ),
),
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum Amount to receive",
- AmountFormatter,
- ),
- FieldDefinition(
- (3,), # _receiver
- "Receiver",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum Amount to receive",
+ AmountFormatter,
+ ),
+ FieldDefinition(
+ (3,), # _receiver
+ "Receiver",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("736eac0b")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensMultipleV3NativeToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Array(
+ _FUNC_SIG = unhexlify("af7060fd")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensSingleV3NativeToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmountOut
Tuple(
(
parse_address, # callTo
@@ -799,452 +961,300 @@ ALL_DISPLAY_FORMATS.append(
parse_bytes, # callData
parse_bool, # requiresDeposit
),
- is_dynamic=False,
- )
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to send",
- AmountFormatter,
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(5, -1, 3), # _swapData.[-1].receivingAssetId
+ is_dynamic=True,
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ ContainerPath.Value, # @.value
+ "Amount to send",
+ AmountFormatter,
),
- ),
- FieldDefinition(
- (3,), # _receiver
- "Recipient",
- AddressNameFormatter,
- ),
- ],
- )
-)
-
-_FUNC_SIG = unhexlify("4666fc80")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensSingleV3ERC20ToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Tuple(
- (
- parse_address, # callTo
- parse_address, # approveTo
- parse_address, # sendingAssetId
- parse_address, # receivingAssetId
- parse_uint256, # fromAmount
- parse_bytes, # callData
- parse_bool, # requiresDeposit
- ),
- is_dynamic=True,
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- (5, 4), # _swapData.fromAmount
- "Amount to Send",
- TokenAmountFormatter(token_path=(5, 2)), # _swapData.sendingAssetId
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum to Receive",
- TokenAmountFormatter(token_path=(5, 3)), # _swapData.receivingAssetId
- ),
- FieldDefinition(
- (3,), # _receiver
- "Recipient",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (4,), # _minAmountOut
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(5, 3), # _swapData.receivingAssetId
+ ),
+ ),
+ FieldDefinition(
+ (3,), # _receiver
+ "Recipient",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("733214a3")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensSingleV3ERC20ToNative(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Tuple(
- (
- parse_address, # callTo
- parse_address, # approveTo
- parse_address, # sendingAssetId
- parse_address, # receivingAssetId
- parse_uint256, # fromAmount
- parse_bytes, # callData
- parse_bool, # requiresDeposit
- ),
- is_dynamic=True,
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- (5, 4), # _swapData.fromAmount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(5, 2), # _swapData.sendingAssetId
+ _FUNC_SIG = unhexlify("4630a0d8")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"swapTokensGeneric(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=LIFI_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Atomic(parse_bytes), # _transactionId
+ Dynamic(parse_string), # _integrator
+ Dynamic(parse_string), # _referrer
+ Atomic(parse_address), # _receiver
+ Atomic(parse_uint256), # _minAmount
+ Array(
+ Tuple(
+ (
+ parse_address, # callTo
+ parse_address, # approveTo
+ parse_address, # sendingAssetId
+ parse_address, # receivingAssetId
+ parse_uint256, # fromAmount
+ parse_bytes, # callData
+ parse_bool, # requiresDeposit
+ ),
+ is_dynamic=False,
+ )
+ ), # _swapData
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (
+ 5,
+ 0,
+ 4,
+ ), # _swapData.[0].fromAmount
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
+ native_currency_address=LIFI_NATIVE_CURRENCY_ADDRESSES,
+ ),
),
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum Amount to receive",
- AmountFormatter,
- ),
- FieldDefinition(
- (3,), # _receiver
- "Receiver",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (4,), # _minAmount,
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(5, -1, 3), # # _swapData.[-1].receivingAssetId
+ native_currency_address=LIFI_NATIVE_CURRENCY_ADDRESSES,
+ ),
+ ),
+ FieldDefinition(
+ (3,), # receiver
+ "Recipient",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("af7060fd")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensSingleV3NativeToERC20(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool))"
+ # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/uniswap/calldata-UniswapV3Router02.json#L6
+ UNISWAP_V3_ROUTER_ADDRESS = unhexlify("68b3465833fb72A70ecDF485E0e4C7bD8665Fc45")
+ UNISWAP_V3_ROUTER_CHAINS = [1]
+
+ # https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/uniswap/calldata-UniswapV3Router02.json
+
+ UNISWAP_CONTEXT = BindingContext(
+ [(chain, UNISWAP_V3_ROUTER_ADDRESS) for chain in UNISWAP_V3_ROUTER_CHAINS],
)
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmountOut
- Tuple(
- (
- parse_address, # callTo
- parse_address, # approveTo
- parse_address, # sendingAssetId
- parse_address, # receivingAssetId
- parse_uint256, # fromAmount
- parse_bytes, # callData
- parse_bool, # requiresDeposit
- ),
- is_dynamic=True,
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- ContainerPath.Value, # @.value
- "Amount to send",
- AmountFormatter,
- ),
- FieldDefinition(
- (4,), # _minAmountOut
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(5, 3), # _swapData.receivingAssetId
+
+ _FUNC_SIG = unhexlify("b858183f")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"exactInput((bytes,address,uint256,uint256))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=UNISWAP_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Tuple(
+ (
+ parse_bytes, # path
+ parse_address, # recipient
+ parse_uint256, # amountIn
+ parse_uint256, # amountOutMinimum
+ ),
+ is_dynamic=True,
+ ), # params
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (0, 2), # params.amountIn
+ "Amount to Send",
+ TokenAmountFormatter(
+ token_path=(0, 0, (0, 20)), # params.path.[0:20]
+ ),
),
- ),
- FieldDefinition(
- (3,), # _receiver
- "Recipient",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (0, 3), # params.amountOutMinimum
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(0, 0, (-20,)), # params.path.[-20:]
+ ),
+ ),
+ FieldDefinition(
+ (0, 1), # params.recipient
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("4630a0d8")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"swapTokensGeneric(bytes32,string,string,address,uint256,(address,address,address,address,uint256,bytes,bool)[])"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=LIFI_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Atomic(parse_bytes), # _transactionId
- Dynamic(parse_string), # _integrator
- Dynamic(parse_string), # _referrer
- Atomic(parse_address), # _receiver
- Atomic(parse_uint256), # _minAmount
- Array(
+ _FUNC_SIG = unhexlify("04e45aaf")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=UNISWAP_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
Tuple(
(
- parse_address, # callTo
- parse_address, # approveTo
- parse_address, # sendingAssetId
- parse_address, # receivingAssetId
- parse_uint256, # fromAmount
- parse_bytes, # callData
- parse_bool, # requiresDeposit
+ parse_address, # tokenIn
+ parse_address, # tokenOut
+ parse_uint24, # fee
+ parse_address, # recipient
+ parse_uint256, # amountIn
+ parse_uint256, # amountOutMinimum
+ parse_uint160, # sqrtPriceLimitX96
),
is_dynamic=False,
- )
- ), # _swapData
- ],
- field_definitions=[
- FieldDefinition(
- (
- 5,
- 0,
- 4,
- ), # _swapData.[0].fromAmount
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(5, 0, 2), # _swapData.[0].sendingAssetId
- native_currency_address=LIFI_NATIVE_CURRENCY_ADDRESSES,
+ ), # params
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (0, 4), # amountIn
+ "Send",
+ TokenAmountFormatter(
+ token_path=(0, 0), # params.tokenIn
+ ),
),
- ),
- FieldDefinition(
- (4,), # _minAmount,
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(5, -1, 3), # # _swapData.[-1].receivingAssetId
- native_currency_address=LIFI_NATIVE_CURRENCY_ADDRESSES,
+ FieldDefinition(
+ (0, 5), # amountOutMinimum
+ "Minimum to Receive",
+ TokenAmountFormatter(
+ token_path=(0, 1), # params.tokenOut
+ ),
),
- ),
- FieldDefinition(
- (3,), # receiver
- "Recipient",
- AddressNameFormatter,
- ),
- ],
- ),
-)
-
-# https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/uniswap/calldata-UniswapV3Router02.json#L6
-UNISWAP_V3_ROUTER_ADDRESS = unhexlify("68b3465833fb72A70ecDF485E0e4C7bD8665Fc45")
-UNISWAP_V3_ROUTER_CHAINS = [1]
-
-# https://github.com/LedgerHQ/clear-signing-erc7730-registry/blob/master/registry/uniswap/calldata-UniswapV3Router02.json
-
-UNISWAP_CONTEXT = BindingContext(
- [(chain, UNISWAP_V3_ROUTER_ADDRESS) for chain in UNISWAP_V3_ROUTER_CHAINS],
-)
-
-_FUNC_SIG = unhexlify("b858183f")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(b"exactInput((bytes,address,uint256,uint256))")
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=UNISWAP_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Tuple(
- (
- parse_bytes, # path
- parse_address, # recipient
- parse_uint256, # amountIn
- parse_uint256, # amountOutMinimum
- ),
- is_dynamic=True,
- ), # params
- ],
- field_definitions=[
- FieldDefinition(
- (0, 2), # params.amountIn
- "Amount to Send",
- TokenAmountFormatter(
- token_path=(0, 0, (0, 20)), # params.path.[0:20]
+ FieldDefinition(
+ (0, 2), # fee
+ "Uniswap fee",
+ UnitFormatter(decimals=4, base="%", prefix=False),
),
- ),
- FieldDefinition(
- (0, 3), # params.amountOutMinimum
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(0, 0, (-20,)), # params.path.[-20:]
+ FieldDefinition(
+ (0, 3), # recipient
+ "Beneficiary",
+ AddressNameFormatter,
),
- ),
- FieldDefinition(
- (0, 1), # params.recipient
- "Beneficiary",
- AddressNameFormatter,
- ),
- ],
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("04e45aaf")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"exactInputSingle((address,address,uint24,address,uint256,uint256,uint160))"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=UNISWAP_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Tuple(
- (
- parse_address, # tokenIn
- parse_address, # tokenOut
- parse_uint24, # fee
- parse_address, # recipient
- parse_uint256, # amountIn
- parse_uint256, # amountOutMinimum
- parse_uint160, # sqrtPriceLimitX96
- ),
- is_dynamic=False,
- ), # params
- ],
- field_definitions=[
- FieldDefinition(
- (0, 4), # amountIn
- "Send",
- TokenAmountFormatter(
- token_path=(0, 0), # params.tokenIn
+ _FUNC_SIG = unhexlify("09b81346")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"exactOutput((bytes,address,uint256,uint256))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=UNISWAP_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Tuple(
+ (
+ parse_bytes, # path
+ parse_address, # recipient
+ parse_uint256, # amountOut
+ parse_uint256, # amountInMaximum
+ ),
+ is_dynamic=True,
+ ), # params
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (0, 3), # params.amountInMaximum
+ "Maximum Amount In",
+ TokenAmountFormatter(
+ token_path=(0, 0, (-20,)), # params.path.[-20:]
+ ),
),
- ),
- FieldDefinition(
- (0, 5), # amountOutMinimum
- "Minimum to Receive",
- TokenAmountFormatter(
- token_path=(0, 1), # params.tokenOut
+ FieldDefinition(
+ (0, 2), # params.amountOut
+ "Amount to Receive",
+ TokenAmountFormatter(
+ token_path=(0, 0, (0, 20)), # params.path.[0:20]
+ ),
),
- ),
- FieldDefinition(
- (0, 2), # fee
- "Uniswap fee",
- UnitFormatter(decimals=4, base="%", prefix=False),
- ),
- FieldDefinition(
- (0, 3), # recipient
- "Beneficiary",
- AddressNameFormatter,
- ),
- ],
+ FieldDefinition(
+ (0, 1), # params.recipient
+ "Beneficiary",
+ AddressNameFormatter,
+ ),
+ ],
+ )
)
-)
-_FUNC_SIG = unhexlify("09b81346")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"exactOutput((bytes,address,uint256,uint256))"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=UNISWAP_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Tuple(
- (
- parse_bytes, # path
- parse_address, # recipient
- parse_uint256, # amountOut
- parse_uint256, # amountInMaximum
- ),
- is_dynamic=True,
- ), # params
- ],
- field_definitions=[
- FieldDefinition(
- (0, 3), # params.amountInMaximum
- "Maximum Amount In",
- TokenAmountFormatter(
- token_path=(0, 0, (-20,)), # params.path.[-20:]
+ _FUNC_SIG = unhexlify("5023b4df")
+ if __debug__:
+ assert _FUNC_SIG == base58.keccak_32(
+ b"exactOutputSingle((address,address,uint24,address,uint256,uint256,uint160))"
+ )
+ yield (
+ DisplayFormat(
+ binding_context=UNISWAP_CONTEXT,
+ func_sig=_FUNC_SIG,
+ intent="Swap",
+ parameter_definitions=[
+ Tuple(
+ (
+ parse_address, # tokenIn
+ parse_address, # tokenOut
+ parse_uint24, # fee
+ parse_address, # recipient
+ parse_uint256, # amountOut
+ parse_uint256, # amountInMaximum
+ parse_uint160, # sqrtPriceLimitX96
+ ),
+ is_dynamic=False,
+ ), # params
+ ],
+ field_definitions=[
+ FieldDefinition(
+ (0, 5), # amountInMaximum
+ "Maximum Amount In",
+ TokenAmountFormatter(
+ token_path=(0, 0), # params.tokenIn
+ ),
),
- ),
- FieldDefinition(
- (0, 2), # params.amountOut
- "Amount to Receive",
- TokenAmountFormatter(
- token_path=(0, 0, (0, 20)), # params.path.[0:20]
+ FieldDefinition(
+ (0, 4), # amountOut
+ "Amount to Receive",
+ TokenAmountFormatter(
+ token_path=(0, 1), # params.tokenOut
+ ),
),
- ),
- FieldDefinition(
- (0, 1), # params.recipient
- "Beneficiary",
- AddressNameFormatter,
- ),
- ],
- )
-)
-
-_FUNC_SIG = unhexlify("5023b4df")
-if __debug__:
- assert _FUNC_SIG == base58.keccak_32(
- b"exactOutputSingle((address,address,uint24,address,uint256,uint256,uint160))"
- )
-ALL_DISPLAY_FORMATS.append(
- DisplayFormat(
- binding_context=UNISWAP_CONTEXT,
- func_sig=_FUNC_SIG,
- intent="Swap",
- parameter_definitions=[
- Tuple(
- (
- parse_address, # tokenIn
- parse_address, # tokenOut
- parse_uint24, # fee
- parse_address, # recipient
- parse_uint256, # amountOut
- parse_uint256, # amountInMaximum
- parse_uint160, # sqrtPriceLimitX96
- ),
- is_dynamic=False,
- ), # params
- ],
- field_definitions=[
- FieldDefinition(
- (0, 5), # amountInMaximum
- "Maximum Amount In",
- TokenAmountFormatter(
- token_path=(0, 0), # params.tokenIn
+ FieldDefinition(
+ (0, 2), # fee
+ "Uniswap fee",
+ UnitFormatter(decimals=4, base="%", prefix=False),
),
- ),
- FieldDefinition(
- (0, 4), # amountOut
- "Amount to Receive",
- TokenAmountFormatter(
- token_path=(0, 1), # params.tokenOut
+ FieldDefinition(
+ (0, 3), # recipient
+ "Beneficiary",
+ AddressNameFormatter,
),
- ),
- FieldDefinition(
- (0, 2), # fee
- "Uniswap fee",
- UnitFormatter(decimals=4, base="%", prefix=False),
- ),
- FieldDefinition(
- (0, 3), # recipient
- "Beneficiary",
- AddressNameFormatter,
- ),
- ],
- ),
-)
-
+ ],
+ )
+ )
-if __debug__:
+ if __debug__:
- def _test_formats() -> Generator[DisplayFormat, None, None]:
# One contract to test it all would have been easier. But Caesar has a paragraph limit.
# * TREZOR_TEST_SCALARS_DESCRIPTOR - scalar/atomic formatters
# * TREZOR_TEST_TOKEN_DESCRIPTOR - token-amount resolution (path + const)
Why this scored 27/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.