Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deterministic testing integration #671

Open
wants to merge 41 commits into
base: release-candidate
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
7f689e4
Adds deterministic testing for Ethereum
mikewcasale Mar 1, 2024
608e03b
adding test data
mikewcasale Mar 1, 2024
d250e3b
Create static_pool_data_testing.csv
mikewcasale Mar 1, 2024
0134d33
minor bug fixes
NIXBNT Mar 3, 2024
ada8b74
adding missing args parameter to function
mikewcasale Mar 3, 2024
9f5df66
added option to not delete old logs
mikewcasale Mar 3, 2024
c781636
minor fixes
mikewcasale Mar 3, 2024
98424b3
Update multicaller.py
mikewcasale Mar 11, 2024
c58f5d9
change constant names per @barakman
mikewcasale Mar 11, 2024
69f5535
Update dtest_token.py
mikewcasale Mar 11, 2024
578a5f7
Update dtest_constants.py
mikewcasale Mar 11, 2024
e7d869d
Update run_deterministic_tests.py
mikewcasale Mar 11, 2024
c61bef5
Update dtest_pool.py
mikewcasale Mar 11, 2024
46001f3
Update requirements.txt
mikewcasale Mar 11, 2024
e19eb48
Update run_deterministic_tests.py
mikewcasale Mar 12, 2024
775e251
Update run_deterministic_tests.py
mikewcasale Mar 12, 2024
290e693
bugfixes and update gitignore
mikewcasale Mar 26, 2024
85195f6
path handling bugfix
NIXBNT Mar 26, 2024
cf2bb0d
add strategy_ids to the logging
NIXBNT Mar 26, 2024
5380e84
Fix python 3.8 type-hint
mikewcasale Mar 28, 2024
3c95f60
Cleanup run script for readability
mikewcasale Mar 28, 2024
5a6518c
Addressing comment about this class not being a constant. see https:/…
mikewcasale Mar 28, 2024
77a9308
fixes recursive symlink error when invoking ./run_tests script
mikewcasale Mar 28, 2024
9f495a6
addresses comment https://github.com/bancorprotocol/fastlane-bot/pull…
mikewcasale Mar 28, 2024
8541f60
addresses comment about file docstrings new format
mikewcasale Mar 28, 2024
af5c22f
changes print statements to use the logger, addresses comment https:/…
mikewcasale Mar 28, 2024
f68f95b
addresses comment https://github.com/bancorprotocol/fastlane-bot/pull…
mikewcasale Mar 28, 2024
4b8e5dc
Update the docstring for the script
mikewcasale Mar 28, 2024
3832f0f
addresses comment about cleaner constants imports https://github.com/…
mikewcasale Mar 28, 2024
573ef3e
addresses comment https://github.com/bancorprotocol/fastlane-bot/pull…
mikewcasale Mar 28, 2024
23865a5
addressing comment https://github.com/bancorprotocol/fastlane-bot/pul…
mikewcasale Mar 28, 2024
26c5e96
this has been addressed - https://github.com/bancorprotocol/fastlane-…
mikewcasale Mar 28, 2024
66b327a
addressing comment https://github.com/bancorprotocol/fastlane-bot/pul…
mikewcasale Mar 28, 2024
fc1fe82
addressing comments and moving constant
mikewcasale Mar 28, 2024
dcccf98
addressing comment https://github.com/bancorprotocol/fastlane-bot/pul…
mikewcasale Mar 28, 2024
d5c6300
addressing comment https://github.com/bancorprotocol/fastlane-bot/pul…
mikewcasale Mar 28, 2024
ed7a3ea
data files for det testing
NIXBNT May 23, 2024
834d429
small changes for deterministic tests
NIXBNT May 23, 2024
5c1c137
fixed merge mistake
NIXBNT May 23, 2024
c97312f
update bot logging w structs
NIXBNT May 23, 2024
101550f
fix merge mistake
NIXBNT May 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ latest_pool_data.json
missing_events.json
*.log
logs/*
logs_dtest/*
/token_details.csv
/fastlane_bot/data/blockchain_data/*/token_detail/
missing_tokens_df.csv
Expand Down
81 changes: 78 additions & 3 deletions fastlane_bot/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ def _run(
)
return

tx_hash, tx_receipt = self._handle_trade_instructions(CCm, arb_mode, r, replay_from_block)
tx_hash, tx_receipt, log_dict = self._handle_trade_instructions(CCm, arb_mode, r, replay_from_block)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No changes in this file until PR #651 is merged


if tx_hash:
tx_status = ["failed", "succeeded"][tx_receipt["status"]] if tx_receipt else "pending"
Expand All @@ -368,7 +368,13 @@ def _run(
if logging_path:
filename = f"tx_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.txt"
with open(os.path.join(logging_path, filename), "w") as f:
f.write(f"{tx_hash} {tx_status}: {tx_details}")
log_entry = {
"tx_hash": tx_hash,
"tx_status": tx_status,
"tx_details": tx_details,
"log_dict": log_dict
}
json.dump(log_entry, f, indent=4)

def validate_optimizer_trades(self, arb_opp, arb_finder):
"""
Expand Down Expand Up @@ -817,7 +823,7 @@ def _handle_trade_instructions(
self.ConfigObj.logger.info(
f"[bot._handle_trade_instructions] Opportunity with profit: {num_format(best_profit_gastkn)} does not meet minimum profit: {self.ConfigObj.DEFAULT_MIN_PROFIT_GAS_TOKEN}, discarding."
)
return None, None
return None, None, None

# Log the flashloan amount
self.ConfigObj.logger.debug(
Expand Down Expand Up @@ -855,6 +861,16 @@ def _handle_trade_instructions(

maximize_last_trade_per_tkn(route_struct=route_struct_processed)

# Use helper function to update the log dict
log_dict = self.update_log_dict(
arb_mode,
best_profit_gastkn,
best_profit_usd,
flashloan_struct,
route_struct_processed,
split_calculated_trade_instructions,
)

# Log the flashloan details
self.ConfigObj.logger.debug(
f"[bot._handle_trade_instructions] Flashloan of {fl_token_symbol}, amount: {flashloan_amount_wei}"
Expand All @@ -877,6 +893,7 @@ def _handle_trade_instructions(
expected_profit_gastkn=best_profit_gastkn,
expected_profit_usd=best_profit_usd,
flashloan_struct=flashloan_struct,
log_dict=log_dict
)

def get_tokens_in_exchange(
Expand Down Expand Up @@ -942,3 +959,61 @@ def run(
)
except self.NoArbAvailable as e:
self.ConfigObj.logger.info(e)

@staticmethod
def update_log_dict(
arb_mode: str,
best_profit_gastkn: Decimal,
best_profit_usd: Decimal,
flashloan_struct: List[Any],
route_struct: List[Any],
calculated_trade_instructions: List[Any],
) -> Dict[str, Any]:
"""
Update the log dictionary.

Parameters
----------
arb_mode: str
The arbitrage mode.
best_profit: Decimal
The best profit.
best_profit_usd: Decimal
The profit in USD.
flashloan_struct: List[Any]
The flashloan struct.
route_struct: List[Any]
The route struct.
calculated_trade_instructions: List[Any]
The calculated trade instructions.

Returns
-------
dict
The updated log dictionary.
"""
log_dict = {
"type": arb_mode,
"profit_gas_token": num_format(best_profit_gastkn),
"profit_usd": num_format(best_profit_usd),
"flashloan_struct": flashloan_struct,
"route_struct": route_struct,
"trades": [],
}

for idx, trade in enumerate(calculated_trade_instructions):
tknin = {trade.tknin_symbol: trade.tknin} if trade.tknin_symbol != trade.tknin else trade.tknin
tknout = {trade.tknout_symbol: trade.tknout} if trade.tknout_symbol != trade.tknout else trade.tknout
log_dict["trades"].append(
{
"trade_index": idx,
"exchange": trade.exchange_name,
"tkn_in": tknin,
"amount_in": num_format(trade.amtin),
"tkn_out": tknout,
"amt_out": num_format(trade.amtout),
"cid0": trade.cid[-10:],
}
)

return log_dict
14 changes: 14 additions & 0 deletions fastlane_bot/data/abi.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,20 @@
"stateMutability": "view",
"inputs": [],
"outputs": [{"internalType": "uint32", "name": "", "type": "uint32"}]
},
{
"type": "function",
"name": "deleteStrategy",
"stateMutability": "nonpayable",
"inputs": [{"internalType": "uint256","name": "strategyId","type": "uint256"}],
"outputs": []
},
{
"type":"function",
"name":"createStrategy",
"stateMutability":"payable",
"inputs":[{"internalType":"Token","name":"token0","type":"address"},{"internalType":"Token","name":"token1","type":"address"},{"components":[{"internalType":"uint128","name":"y","type":"uint128"},{"internalType":"uint128","name":"z","type":"uint128"},{"internalType":"uint64","name":"A","type":"uint64"},{"internalType":"uint64","name":"B","type":"uint64"}],"internalType":"structOrder[2]","name":"orders","type":"tuple[2]"}],
"outputs":[{"internalType":"uint256","name":"","type":"uint256"}]
Copy link
Collaborator

@barakman barakman May 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two contract functions (createStrategy and deleteStrategy) are functions which change the state of the contract (aka write functions).

They are not supposed to ever be used by the bot, even though they can technically be executed in read-only mode (aka static call).

If this is indeed how you're using them, then there is very likely a better way (i.e., calling an actual read function in the same contract).

}
]

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
cid,last_updated,last_updated_block,descr,pair_name,exchange_name,fee,fee_float,address,anchor,tkn0_address,tkn1_address,tkn0_decimals,tkn1_decimals,exchange_id,tkn0_symbol,tkn1_symbol,timestamp,tkn0_balance,tkn1_balance,liquidity,sqrt_price_q96,tick,tick_spacing,exchange,pool_type,tkn0_weight,tkn1_weight,tkn2_address,tkn2_decimals,tkn2_symbol,tkn2_balance,tkn2_weight,tkn3_address,tkn3_decimals,tkn3_symbol,tkn3_balance,tkn3_weight,tkn4_address,tkn4_decimals,tkn4_symbol,tkn4_balance,tkn4_weight,tkn5_address,tkn5_decimals,tkn5_symbol,tkn5_balance,tkn5_weight,tkn6_address,tkn6_decimals,tkn6_symbol,tkn6_balance,tkn6_weight,tkn7_address,tkn7_decimals,tkn7_symbol,tkn7_balance,tkn7_weight,test,exchange_type,pool_address,tkn0_setBalance,tkn1_setBalance,slots,param_lists,param_blockTimestampLast,param_blockTimestampLast_type,param_reserve0,param_reserve0_type,param_reserve1,param_reserve1_type,param_liquidity,param_liquidity_type,param_sqrtPriceX96,param_sqrtPriceX96_type,param_tick,param_tick_type,param_observationIndex,param_observationIndex_type,param_observationCardinality,param_observationCardinality_type,param_observationCardinalityNext,param_observationCardinalityNext_type,param_feeProtocol,param_feeProtocol_type,param_unlocked,param_unlocked_type
,,0,uniswap_v2 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.003,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v2,3000,0.003,0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc,,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,6,18,3,USDC,WETH,,,,,,,60,uniswap_v2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,uniswap_v2,0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc,49204613674917,21734090459912674200000,"[8,]","[['blockTimestampLast','reserve1','reserve0'],]",,uint32,49204613674917,uint112,21734090459912674200000,uint112,,,,,,,,,,,,,,,,
,,0,uniswap_v3 0x514910771AF9Ca656af840dff83E8264EcF986CA/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.003,0x514910771AF9Ca656af840dff83E8264EcF986CA/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v3,3000,0.003,0xa6Cc3C2531FdaA6Ae1A3CA84c2855806728693e8,,0x514910771AF9Ca656af840dff83E8264EcF986CA,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,18,18,4,LINK,WETH,,,,,,,60,uniswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,uniswap_v3,0xa6Cc3C2531FdaA6Ae1A3CA84c2855806728693e8,1312731411619255420525571,7101396323681156262130,"[4,0,]","[['liquidity'],['unlocked', 'feeProtocol', 'observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96']]",,,,,,,1456862313731161106039763,"uint128",6362445213301469813433370622,"uint160",-50441,"int24",85,"uint16",180,"uint16",180,"uint16",0,"uint8",True,bool
,,0,pancakeswap_v3 0x6B175474E89094C44Da98b954EedeAC495271d0F/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 0.0001,0x6B175474E89094C44Da98b954EedeAC495271d0F/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,pancakeswap_v3,100,0.0001,0xD9e497BD8f491fE163b42A62c296FB54CaEA74B7,,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,18,6,10,DAI,USDC,0,0,0,0,0,0,1,pancakeswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,pancakeswap_v3,0xD9e497BD8f491fE163b42A62c296FB54CaEA74B7,13653990890660798693042,135975525713,"[4,0,1,]","[['liquidity'],['observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96'],['unlocked', 'feeProtocol']]",,,,,,,1275240832730323472063,"uint128",79228147574959555694268,"uint160",-276325,"int24",0,"uint16",1,"uint16",1,"uint16",216272100,"uint32",True,bool
,,0,pancakeswap_v2 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.0025,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,pancakeswap_v2,2500,0.0025,0x4AB6702B3Ed3877e9b1f203f90cbEF13d663B0e8,,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,8,18,9,WBTC,WETH,0,0,0,,,,,pancakeswap_v2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,pancakeswap_v2,0x4AB6702B3Ed3877e9b1f203f90cbEF13d663B0e8,421419304,78852853048776778963,"[8,]","[['blockTimestampLast','reserve1','reserve0'],]",,uint32,421419304,uint112,78852853048776778963,uint112,,,,,,,,,,,,,,,,
,,0,uniswap_v3 0x6B175474E89094C44Da98b954EedeAC495271d0F/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.0005,0x6B175474E89094C44Da98b954EedeAC495271d0F/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v3,500,0.0005,0x60594a405d53811d3BC4766596EFD80fd545A270,,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,18,18,4,DAI,WETH,,,,,,,10,uniswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,uniswap_v3,0x60594a405d53811d3BC4766596EFD80fd545A270,2850299295281281234085971,1147049345011454055669,"[4,0,]","[['liquidity'],['unlocked', 'feeProtocol', 'observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96']]",,,,,,,451613902936689743409876,"uint128",1659826732499374354385938036,"uint160",-77317,"int24",110,"uint16",180,"uint16",180,"uint16",0,"uint8",True,bool
9 changes: 5 additions & 4 deletions fastlane_bot/helpers/txhelpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ def validate_and_submit_transaction(
src_address: str,
expected_profit_gastkn: Decimal,
expected_profit_usd: Decimal,
flashloan_struct: List[Dict]
flashloan_struct: List[Dict],
log_dict: Dict
) -> Tuple[Optional[str], Optional[dict]]:
"""
This method validates and submits a transaction to the arb contract.
Expand Down Expand Up @@ -104,7 +105,7 @@ def validate_and_submit_transaction(
self._update_transaction(tx)
except Exception as e:
self.cfg.logger.info(f"Transaction {dumps(tx, indent=4)}\nFailed with {e}")
return None, None
return None, None, None

tx["gas"] += self.cfg.DEFAULT_GAS_SAFETY_OFFSET

Expand Down Expand Up @@ -132,9 +133,9 @@ def validate_and_submit_transaction(
self.cfg.logger.info(f"Waiting for transaction {tx_hash} receipt")
tx_receipt = self._wait_for_transaction_receipt(tx_hash)
self.cfg.logger.info(f"Transaction receipt: {dumps(tx_receipt, indent=4)}")
return tx_hash, tx_receipt
return tx_hash, tx_receipt, log_dict
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Passing an additional input parameter just in order to return it seems futile.
You can easily determine on the caller function that log_dict is valid if and only if tx_hash and tx_receipt are valid.


return None, None
return None, None, None

def check_and_approve_tokens(self, tokens: List):
"""
Expand Down
6 changes: 6 additions & 0 deletions fastlane_bot/tests/_data/static_pool_data_testing.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
cid,last_updated,last_updated_block,descr,pair_name,exchange_name,fee,fee_float,address,anchor,tkn0_address,tkn1_address,tkn0_decimals,tkn1_decimals,exchange_id,tkn0_symbol,tkn1_symbol,timestamp,tkn0_balance,tkn1_balance,liquidity,sqrt_price_q96,tick,tick_spacing,exchange,pool_type,tkn0_weight,tkn1_weight,tkn2_address,tkn2_decimals,tkn2_symbol,tkn2_balance,tkn2_weight,tkn3_address,tkn3_decimals,tkn3_symbol,tkn3_balance,tkn3_weight,tkn4_address,tkn4_decimals,tkn4_symbol,tkn4_balance,tkn4_weight,tkn5_address,tkn5_decimals,tkn5_symbol,tkn5_balance,tkn5_weight,tkn6_address,tkn6_decimals,tkn6_symbol,tkn6_balance,tkn6_weight,tkn7_address,tkn7_decimals,tkn7_symbol,tkn7_balance,tkn7_weight,test,exchange_type,pool_address,tkn0_setBalance,tkn1_setBalance,slots,param_lists,param_blockTimestampLast,param_blockTimestampLast_type,param_reserve0,param_reserve0_type,param_reserve1,param_reserve1_type,param_liquidity,param_liquidity_type,param_sqrtPriceX96,param_sqrtPriceX96_type,param_tick,param_tick_type,param_observationIndex,param_observationIndex_type,param_observationCardinality,param_observationCardinality_type,param_observationCardinalityNext,param_observationCardinalityNext_type,param_feeProtocol,param_feeProtocol_type,param_unlocked,param_unlocked_type
,,0,uniswap_v2 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.003,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v2,3000,0.003,0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc,,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,6,18,3,USDC,WETH,,,,,,,60,uniswap_v2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,uniswap_v2,0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc,49204613674917,21734090459912674200000,"[8,]","[['blockTimestampLast','reserve1','reserve0'],]",,uint32,49204613674917,uint112,21734090459912674200000,uint112,,,,,,,,,,,,,,,,
,,0,uniswap_v3 0x514910771AF9Ca656af840dff83E8264EcF986CA/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.003,0x514910771AF9Ca656af840dff83E8264EcF986CA/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v3,3000,0.003,0xa6Cc3C2531FdaA6Ae1A3CA84c2855806728693e8,,0x514910771AF9Ca656af840dff83E8264EcF986CA,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,18,18,4,LINK,WETH,,,,,,,60,uniswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,uniswap_v3,0xa6Cc3C2531FdaA6Ae1A3CA84c2855806728693e8,1312731411619255420525571,7101396323681156262130,"[4,0,]","[['liquidity'],['unlocked', 'feeProtocol', 'observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96']]",,,,,,,1456862313731161106039763,"uint128",6362445213301469813433370622,"uint160",-50441,"int24",85,"uint16",180,"uint16",180,"uint16",0,"uint8",True,bool
,,0,pancakeswap_v3 0x6B175474E89094C44Da98b954EedeAC495271d0F/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 0.0001,0x6B175474E89094C44Da98b954EedeAC495271d0F/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,pancakeswap_v3,100,0.0001,0xD9e497BD8f491fE163b42A62c296FB54CaEA74B7,,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,18,6,10,DAI,USDC,0,0,0,0,0,0,1,pancakeswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,pancakeswap_v3,0xD9e497BD8f491fE163b42A62c296FB54CaEA74B7,13653990890660798693042,135975525713,"[4,0,1,]","[['liquidity'],['observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96'],['unlocked', 'feeProtocol']]",,,,,,,1275240832730323472063,"uint128",79228147574959555694268,"uint160",-276325,"int24",0,"uint16",1,"uint16",1,"uint16",216272100,"uint32",True,bool
,,0,pancakeswap_v2 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.0025,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,pancakeswap_v2,2500,0.0025,0x4AB6702B3Ed3877e9b1f203f90cbEF13d663B0e8,,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,8,18,9,WBTC,WETH,0,0,0,,,,,pancakeswap_v2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,pancakeswap_v2,0x4AB6702B3Ed3877e9b1f203f90cbEF13d663B0e8,421419304,78852853048776778963,"[8,]","[['blockTimestampLast','reserve1','reserve0'],]",,uint32,421419304,uint112,78852853048776778963,uint112,,,,,,,,,,,,,,,,
,,0,uniswap_v3 0x6B175474E89094C44Da98b954EedeAC495271d0F/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 0.0005,0x6B175474E89094C44Da98b954EedeAC495271d0F/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,uniswap_v3,500,0.0005,0x60594a405d53811d3BC4766596EFD80fd545A270,,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,18,18,4,DAI,WETH,,,,,,,10,uniswap_v3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,uniswap_v3,0x60594a405d53811d3BC4766596EFD80fd545A270,2850299295281281234085971,1147049345011454055669,"[4,0,]","[['liquidity'],['unlocked', 'feeProtocol', 'observationCardinalityNext', 'observationCardinality', 'observationIndex', 'tick', 'sqrtPriceX96']]",,,,,,,451613902936689743409876,"uint128",1659826732499374354385938036,"uint160",-77317,"int24",110,"uint16",180,"uint16",180,"uint16",0,"uint8",True,bool
Loading
Loading