feat: Add propeller swap encoders

- Add setup for package
- Add docs
- Add balancer implementation and test
- Add CI:
  - Add setup action
  - Add test and format CI
- Add CD: Publish python package to AWS
This commit is contained in:
Diana Carvalho
2024-08-29 13:11:07 +01:00
parent e4967b1880
commit 41f20f14b0
13 changed files with 318 additions and 3 deletions

View File

@@ -0,0 +1,5 @@
name: propeller-swap-encoders
channels:
- conda-forge
dependencies:
- python=3.9

View File

@@ -0,0 +1,33 @@
from typing import Any
from core.encoding.interface import SwapStructEncoder
from core.type_aliases import Address
from eth_abi.packed import encode_abi_packed
from hexbytes import HexBytes
class BalancerSwapStructEncoder(SwapStructEncoder):
def encode_swap_struct(
self, swap: dict[str, Any], receiver: Address, exact_out: bool, **kwargs
) -> 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"],
[
swap["sell_token"].address,
swap["buy_token"].address,
HexBytes(swap["pool_id"]),
receiver,
exact_out,
swap["token_approval_needed"],
],
)

View File

@@ -0,0 +1,48 @@
from core.models.evm.ethereum_token import EthereumToken
from propeller_swap_encoders.balancer import BalancerSwapStructEncoder
def test_encode_balancer():
WETH = EthereumToken(
symbol="WETH",
address="0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
decimals=18,
gas=0,
)
DAI = EthereumToken(
symbol="DAI", address="0x6b175474e89094c44da98b954eedeac495271d0f", decimals=18
)
bob = "0x000000000000000000000000000000000000007B"
swap = {
"pool_id": "0x06df3b2bbb68adc8b0e302443692037ed9f91b42000000000000000000000063",
"sell_token": DAI,
"buy_token": WETH,
"split": 0,
"sell_amount": 0,
"buy_amount": 100,
"token_approval_needed": False,
"pool_tokens": (),
"pool_type": "BalancerStablePoolState",
"curve_v2_pool_type": None,
"is_curve_tricrypto": None,
"quote": None,
"pool_fee": None,
}
balancer_encoder = BalancerSwapStructEncoder()
encoded = balancer_encoder.encode_swap_struct(swap, receiver=bob, exact_out=False)
assert (
encoded.hex()
==
# sell token
"6b175474e89094c44da98b954eedeac495271d0f"
# buy token
"c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
# pool address
"06df3b2bbb68adc8b0e302443692037ed9f91b42000000000000000000000063"
# receiver
"000000000000000000000000000000000000007b"
# exact_out
"00"
# token_approval_needed
"00"
)

View File

@@ -0,0 +1,35 @@
[build-system]
requires = ["setuptools>=60", "setuptools-scm>=8.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "propeller-swap-encoders"
version = "0.1.0"
description = ""
authors = [
{ name = "Propeller Heads" }
]
keywords = ["propeller-swap-encoders"]
classifiers = [
"Intended Audience :: Developers",
"Natural Language :: English",
"Programming Language :: Python :: 3.7",
]
readme = "README.md"
requires-python = ">=3.7"
dependencies = [
"propeller-solver-core==0.1.0",
]
[tool.setuptools.packages.find]
include = ["propeller_swap_encoders"]
[project.optional-dependencies]
testing = [
"pytest",
"pytest-runner"
]
[project.urls]
homepage = "https://github.com/propeller-heads/propeller-protocol-lib"

View File

@@ -0,0 +1,4 @@
propeller-solver-core==0.1.0
pyyaml==5.4.1
pytest==6.2.4
black==24.4.2