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:
5
propeller-swap-encoders/environment_dev.yaml
Normal file
5
propeller-swap-encoders/environment_dev.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
name: propeller-swap-encoders
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- python=3.9
|
||||
33
propeller-swap-encoders/propeller_swap_encoders/balancer.py
Normal file
33
propeller-swap-encoders/propeller_swap_encoders/balancer.py
Normal 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"],
|
||||
],
|
||||
)
|
||||
@@ -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"
|
||||
)
|
||||
35
propeller-swap-encoders/pyproject.toml
Normal file
35
propeller-swap-encoders/pyproject.toml
Normal 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"
|
||||
|
||||
4
propeller-swap-encoders/requirements.txt
Normal file
4
propeller-swap-encoders/requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
propeller-solver-core==0.1.0
|
||||
pyyaml==5.4.1
|
||||
pytest==6.2.4
|
||||
black==24.4.2
|
||||
Reference in New Issue
Block a user