diff --git a/.github/actions/setup_env/action.yaml b/.github/actions/setup_env/action.yaml index 4ab1828..986bdb1 100644 --- a/.github/actions/setup_env/action.yaml +++ b/.github/actions/setup_env/action.yaml @@ -14,7 +14,7 @@ runs: id: env-cache with: path: ${{ env.pythonLocation }} - key: ${{ env.pythonLocation }}-${{ hashFiles('./requirements/requirements_dev.txt') }}-${{ hashFiles('./requirements/requirements_data.txt') }}-${{ hashFiles('./requirements/requirements_api.txt') }}-${{ hashFiles('./requirements/requirements.txt') }}-${{ hashFiles('./requirements/requirements_internal.txt') }} + key: ${{ env.pythonLocation }}-${{ hashFiles('./propeller-swap-encoders/requirements.txt') }} - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4.0.1 @@ -28,5 +28,5 @@ runs: run: | aws codeartifact login --tool pip --domain propeller --domain-owner 827659017777 --repository protosim python -m pip install --upgrade pip - pip install -r propeller-swap-encoders/requirements.txt + pip install -r propeller-swap-encoders/requirements.txt --no-cache shell: bash diff --git a/docs/execution/swap-encoder.md b/docs/execution/swap-encoder.md index 8d8b8ba..6e68f82 100644 --- a/docs/execution/swap-encoder.md +++ b/docs/execution/swap-encoder.md @@ -31,16 +31,59 @@ class SwapStructEncoder(ABC): @abstractmethod def encode_swap_struct( - self, swap: dict[str, Any], receiver: Address, **kwargs + self, swap: dict[str, Any], receiver: Address, encoding_context: EncodingContext ) -> bytes: + """ + Parameters: + ---------- + swap + The swap to encode + receiver + The receiver of the buy token + encoding_context + Additional context information necessary for encoding + """ pass ``` - **encode_swap_struct** - **Purpose**: To encode the swap details into a bytes object that the SwapExecutor can use to execute the swap. - **Parameters**: - - `swap`: A dictionary containing the swap details, such as input/output token addresses, amounts, and pool information. + - `swap`: A dictionary containing the swap details. These are the fields present in this dict: + - `pool_id: str`: The identifier for the liquidity pool where the swap will occur. + - `sell_token: EthereumToken`: The token that will be sold in the swap (e.g., DAI). + - `buy_token: EthereumToken`: The token that will be bought in the swap (e.g., WETH). + - `split: float`: Indicates how the swap should be split between pools (often set to 0). + - `sell_amount: int`: The amount of the sell token to be used in the swap. + - `buy_amount: int`: The amount of the buy token to be received from the swap. + - `token_approval_needed: bool`: A boolean indicating if token approval is needed before the swap. + - `pool_tokens`: An optional tuple containing additional token data specific to the pool. + - `pool_type: str`: The type of pool where the swap will be executed (e.g., "BalancerStablePoolState"). - `receiver`: The address that will receive the output tokens from the swap. + - `encoding_context`: Additional context information necessary for encoding. + ```python + class EncodingContext(DefibotBaseModel): + exact_out: Optional[bool] = None + """Whether the amount encoded is the exact amount out""" + + in_transfer: bool = False + """Whether we need to transfer to the pool""" + + payment: bool = False + """Whether this is a payment (if so the pool will use transferFrom(msg.sender, ..))""" + + supply_owed_action_data: bytes = b"" + """Actions to perform with the owed amount using the USV3 callback.""" + + forward_received_action_data: bytes = b"" + """Actions to perform with the received amount using the USV3 callback.""" + + supply_owed_action_type: BatchRouterActionType = BatchRouterActionType.TRANSFER + """The action kind to take with the owed amount""" + + forward_received_action_type: BatchRouterActionType = BatchRouterActionType.SWAP + """The action kind to take with the received amount""" + ``` - `**kwargs`: Any additional protocol-specific parameters that need to be included in the encoding. - **Returns**: A bytes object containing the encoded swap data. diff --git a/propeller-swap-encoders/propeller_swap_encoders/balancer.py b/propeller-swap-encoders/propeller_swap_encoders/balancer.py index 1b9a2b2..4efcff5 100644 --- a/propeller-swap-encoders/propeller_swap_encoders/balancer.py +++ b/propeller-swap-encoders/propeller_swap_encoders/balancer.py @@ -1,6 +1,6 @@ from typing import Any -from core.encoding.interface import SwapStructEncoder +from core.encoding.interface import SwapStructEncoder, EncodingContext from core.type_aliases import Address from eth_abi.packed import encode_abi_packed from hexbytes import HexBytes @@ -8,18 +8,8 @@ from hexbytes import HexBytes class BalancerSwapStructEncoder(SwapStructEncoder): def encode_swap_struct( - self, swap: dict[str, Any], receiver: Address, exact_out: bool, **kwargs + self, swap: dict[str, Any], receiver: Address, encoding_context: EncodingContext ) -> bytes: - """ - Parameters: - ---------- - swap - The swap to encode - receiver - The receiver of the buy token - exact_out - Whether the amount encoded is the exact amount out - """ return encode_abi_packed( ["address", "address", "bytes32", "address", "bool", "bool"], [ @@ -27,7 +17,7 @@ class BalancerSwapStructEncoder(SwapStructEncoder): swap["buy_token"].address, HexBytes(swap["pool_id"]), receiver, - exact_out, + encoding_context.exact_out, swap["token_approval_needed"], ], ) diff --git a/propeller-swap-encoders/propeller_swap_encoders/tests/test_balancer.py b/propeller-swap-encoders/propeller_swap_encoders/tests/test_balancer.py index 6a226ad..071caf8 100644 --- a/propeller-swap-encoders/propeller_swap_encoders/tests/test_balancer.py +++ b/propeller-swap-encoders/propeller_swap_encoders/tests/test_balancer.py @@ -1,5 +1,6 @@ from core.models.evm.ethereum_token import EthereumToken from propeller_swap_encoders.balancer import BalancerSwapStructEncoder +from core.encoding.interface import EncodingContext def test_encode_balancer(): @@ -29,7 +30,9 @@ def test_encode_balancer(): "pool_fee": None, } balancer_encoder = BalancerSwapStructEncoder() - encoded = balancer_encoder.encode_swap_struct(swap, receiver=bob, exact_out=False) + encoded = balancer_encoder.encode_swap_struct( + swap, receiver=bob, encoding_context=EncodingContext(exact_out=False) + ) assert ( encoded.hex() ==