Skip to content

Commit

Permalink
Encoders first draft (#137)
Browse files Browse the repository at this point in the history
* Encoders first draft

* PoolId introduced

* PoolLoader introduced

* PoolLoaders introduced. First draft

* swapline_encoder bugfix

* swap opcodes encoders refactored

* pre-release, tests

* taplo fix

---------

Co-authored-by: dexloom <xdexloom@gmail.com>
  • Loading branch information
dexloom and dexloom authored Dec 12, 2024
1 parent 077cfd9 commit fb50c0b
Show file tree
Hide file tree
Showing 87 changed files with 2,939 additions and 938 deletions.
12 changes: 3 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 1 addition & 6 deletions bin/gasbench/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,11 @@ clap.workspace = true
colored.workspace = true
env_logger.workspace = true
eyre.workspace = true
lazy_static.workspace = true
serde.workspace = true
serde_json.workspace = true
tokio.workspace = true
tracing.workspace = true

alloy-consensus.workspace = true
alloy-network.workspace = true
alloy-primitives.workspace = true
alloy-provider.workspace = true
Expand All @@ -28,15 +26,12 @@ alloy-transport.workspace = true
revm.workspace = true

loom-core-actors.workspace = true
loom-core-actors-macros.workspace = true
loom-defi-abi.workspace = true
loom-defi-address-book.workspace = true
loom-defi-market.workspace = true
loom-defi-pools.workspace = true
loom-defi-preloader.workspace = true
loom-evm-db.workspace = true
loom-evm-utils.workspace = true
loom-execution-multicaller.workspace = true
loom-node-debug-provider.workspace = true
loom-types-blockchain.workspace = true
loom-types-entities.workspace = true
loom-types-events.workspace = true
23 changes: 17 additions & 6 deletions bin/gasbench/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,16 @@ use crate::soltest::create_sol_test;
use loom_node_debug_provider::AnvilDebugProviderFactory;

use loom_defi_address_book::UniswapV2PoolAddress;
use loom_types_entities::{Market, MarketState, PoolWrapper, Swap, SwapAmountType, SwapLine};
use loom_types_entities::{Market, MarketState, PoolId, PoolWrapper, Swap, SwapAmountType, SwapLine};

use loom_core_actors::SharedState;
use loom_defi_preloader::preload_market_state;
use loom_evm_db::LoomDBType;
use loom_evm_utils::{BalanceCheater, NWETH};
use loom_execution_multicaller::{MulticallerDeployer, MulticallerEncoder, MulticallerSwapEncoder};
use loom_execution_multicaller::pool_opcodes_encoder::ProtocolSwapOpcodesEncoderV2;
use loom_execution_multicaller::{
MulticallerDeployer, MulticallerEncoder, MulticallerSwapEncoder, ProtocolABIEncoderV2, SwapLineEncoder, SwapStepEncoder,
};

mod cli;
mod dto;
Expand Down Expand Up @@ -78,7 +81,15 @@ async fn main() -> Result<()> {

let market_state_instance = SharedState::new(market_state_instance);

let encoder = Arc::new(MulticallerSwapEncoder::new(multicaller_address));
let abi_encoder = ProtocolABIEncoderV2::default();

let swap_opcodes_encoder = ProtocolSwapOpcodesEncoderV2::default();

let swap_line_encoder = SwapLineEncoder::new(multicaller_address, Arc::new(abi_encoder), Arc::new(swap_opcodes_encoder));

let swap_step_encoder = SwapStepEncoder::new(multicaller_address, swap_line_encoder);

let swap_encoder = Arc::new(MulticallerSwapEncoder::new(multicaller_address, swap_step_encoder));

//preload state
preload_market_state(client.clone(), vec![multicaller_address], vec![], vec![], market_state_instance.clone(), None).await?;
Expand All @@ -91,7 +102,7 @@ async fn main() -> Result<()> {
// Getting swap directions
let pool_address: Address = UniswapV2PoolAddress::WETH_USDT;

let pool = market.get_pool(&pool_address).ok_or_eyre("POOL_NOT_FOUND")?;
let pool = market.get_pool(&PoolId::Address(pool_address)).ok_or_eyre("POOL_NOT_FOUND")?;

let swap_directions = pool.get_swap_directions();

Expand Down Expand Up @@ -137,8 +148,8 @@ async fn main() -> Result<()> {
}
let swap = Swap::BackrunSwapLine(swapline);

let calls = encoder.make_calls(&swap)?;
let (to, payload) = encoder.encode_calls(calls)?;
let calls = swap_encoder.make_calls(&swap)?;
let (to, payload) = swap_encoder.encode_calls(calls)?;

calldata_map.insert(swap_path.into(), payload.clone());

Expand Down
107 changes: 72 additions & 35 deletions bin/gasbench/src/preloader.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
use alloy_network::Network;
use alloy_network::Ethereum;
use alloy_provider::Provider;
use alloy_transport::Transport;
use loom_core_actors::SharedState;
use loom_defi_address_book::{
CurveMetapoolAddress, CurvePoolAddress, PancakeV2PoolAddress, PancakeV3PoolAddress, TokenAddressEth, UniswapV2PoolAddress,
UniswapV3PoolAddress,
};
use loom_defi_market::fetch_and_add_pool_by_address;
use loom_defi_market::fetch_and_add_pool_by_pool_id;
use loom_defi_pools::PoolLoadersBuilder;
use loom_node_debug_provider::DebugProviderExt;
use loom_types_entities::pool_config::PoolsConfig;
use loom_types_entities::{Market, MarketState, PoolClass, Token};
use revm::{Database, DatabaseCommit, DatabaseRef};
use std::sync::Arc;

pub async fn preload_pools<P, T, N, DB>(
client: P,
market: SharedState<Market>,
market_state: SharedState<MarketState<DB>>,
) -> eyre::Result<()>
pub async fn preload_pools<P, T, DB>(client: P, market: SharedState<Market>, market_state: SharedState<MarketState<DB>>) -> eyre::Result<()>
where
N: Network,
T: Transport + Clone,
P: Provider<T, N> + DebugProviderExt<T, N> + Send + Sync + Clone + 'static,
P: Provider<T, Ethereum> + DebugProviderExt<T, Ethereum> + Send + Sync + Clone + 'static,
DB: DatabaseRef + DatabaseCommit + Database + Send + Sync + Clone + 'static,
{
let mut market_instance = market.write().await;
Expand All @@ -35,90 +33,129 @@ where

drop(market_instance);

fetch_and_add_pool_by_address(client.clone(), market.clone(), market_state.clone(), CurvePoolAddress::ETH_BTC_USD, PoolClass::Curve)
.await?;
let pool_loaders = Arc::new(PoolLoadersBuilder::default_pool_loaders(client.clone(), PoolsConfig::default()));

fetch_and_add_pool_by_address(client.clone(), market.clone(), market_state.clone(), CurvePoolAddress::USDT_BTC_ETH, PoolClass::Curve)
.await?;
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
pool_loaders.clone(),
CurvePoolAddress::ETH_BTC_USD.into(),
PoolClass::Curve,
)
.await?;

fetch_and_add_pool_by_address(client.clone(), market.clone(), market_state.clone(), CurvePoolAddress::DAI_USDC_USDT, PoolClass::Curve)
.await?;
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
pool_loaders.clone(),
CurvePoolAddress::USDT_BTC_ETH.into(),
PoolClass::Curve,
)
.await?;

fetch_and_add_pool_by_address(client.clone(), market.clone(), market_state.clone(), CurveMetapoolAddress::LUSD, PoolClass::Curve)
.await?;
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
pool_loaders.clone(),
CurvePoolAddress::DAI_USDC_USDT.into(),
PoolClass::Curve,
)
.await?;

fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
pool_loaders.clone(),
CurveMetapoolAddress::LUSD.into(),
PoolClass::Curve,
)
.await?;

fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV3PoolAddress::WETH_USDT_3000,
pool_loaders.clone(),
UniswapV3PoolAddress::WETH_USDT_3000.into(),
PoolClass::UniswapV3,
)
.await?;

fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
PancakeV2PoolAddress::WETH_USDT,
pool_loaders.clone(),
PancakeV2PoolAddress::WETH_USDT.into(),
PoolClass::UniswapV2,
)
.await?;
fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV2PoolAddress::WETH_USDT,
pool_loaders.clone(),
UniswapV2PoolAddress::WETH_USDT.into(),
PoolClass::UniswapV2,
)
.await?;
fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
PancakeV3PoolAddress::USDC_USDT_100,
pool_loaders.clone(),
PancakeV3PoolAddress::USDC_USDT_100.into(),
PoolClass::UniswapV3,
)
.await?;

fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV3PoolAddress::USDC_WETH_3000,
pool_loaders.clone(),
UniswapV3PoolAddress::USDC_WETH_3000.into(),
PoolClass::UniswapV3,
)
.await?;
fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV3PoolAddress::USDC_WETH_500,
pool_loaders.clone(),
UniswapV3PoolAddress::USDC_WETH_500.into(),
PoolClass::UniswapV3,
)
.await?;
fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV3PoolAddress::WBTC_USDT_3000,
pool_loaders.clone(),
UniswapV3PoolAddress::WBTC_USDT_3000.into(),
PoolClass::UniswapV3,
)
.await?;
fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV3PoolAddress::USDC_USDT_100,
pool_loaders.clone(),
UniswapV3PoolAddress::USDC_USDT_100.into(),
PoolClass::UniswapV3,
)
.await?;

fetch_and_add_pool_by_address(
fetch_and_add_pool_by_pool_id(
client.clone(),
market.clone(),
market_state.clone(),
UniswapV2PoolAddress::LUSD_WETH,
pool_loaders.clone(),
UniswapV2PoolAddress::LUSD_WETH.into(),
PoolClass::UniswapV2,
)
.await?;
Expand Down
Loading

0 comments on commit fb50c0b

Please sign in to comment.