├── .gitignore ├── transactions ├── eip7702_empty_auth.json ├── eip1559_unsigned.json ├── eip1559_hex_vals.json ├── eip1559_signed.json ├── eip7702_unsigned.json └── eip7702_signed.json ├── Cargo.toml ├── LICENSE-MIT ├── README.md ├── src ├── main.rs ├── rlp.rs └── transaction.rs ├── tests └── integration_tests.rs ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | .run 4 | 5 | -------------------------------------------------------------------------------- /transactions/eip7702_empty_auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": 1, 3 | "nonce": 0, 4 | "maxPriorityFeePerGas": 373223425, 5 | "maxFeePerGas": 34714654540, 6 | "gasLimit": 63221, 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": 0, 9 | "data": "0x", 10 | "accessList": [], 11 | "authorizationList": [] 12 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "tx-util" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | alloy-primitives = { version = "0.7.6", features = ["serde"] } 8 | clap = { version = "4.5.4", features = ["derive"] } 9 | color-eyre = "0.6.3" 10 | hex = "0.4.3" 11 | k256 = "0.13.3" 12 | serde = { version = "1.0.203", features = ["derive"] } 13 | serde_json = "1.0.120" 14 | sha3 = "0.10.8" 15 | 16 | [dev-dependencies] 17 | assert_cmd = "2.0.14" 18 | -------------------------------------------------------------------------------- /transactions/eip1559_unsigned.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": 1, 3 | "nonce": 10, 4 | "maxPriorityFeePerGas": 373223425, 5 | "maxFeePerGas": 34714654540, 6 | "gasLimit": 63221, 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": 0, 9 | "data": "0x", 10 | "accessList": [ 11 | { 12 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 13 | "storageKeys": [ 14 | "0x0000000000000000000000000000000000000000000000000000000000000003" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /transactions/eip1559_hex_vals.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": "0x301824", 3 | "nonce": "0x0", 4 | "maxPriorityFeePerGas": "0x163ef001", 5 | "maxFeePerGas": "0x81527974c", 6 | "gasLimit": "0x186a0", 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": "0x0", 9 | "data": "0x", 10 | "accessList": [ 11 | { 12 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 13 | "storageKeys": [ 14 | "0x0000000000000000000000000000000000000000000000000000000000000003" 15 | ] 16 | } 17 | ], 18 | "yParity": true, 19 | "r": "0x52ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87c", 20 | "s": "0x5a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5" 21 | } -------------------------------------------------------------------------------- /transactions/eip1559_signed.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": 1, 3 | "nonce": 0, 4 | "maxPriorityFeePerGas": 373223425, 5 | "maxFeePerGas": 34714654540, 6 | "gasLimit": 63221, 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": 0, 9 | "data": "0xa9059cbb0000000000000000000000005a96834046c1dff63119eb0eed6330fc5007a1d700000000000000000000000000000000000000000000000000000001a1432720", 10 | "accessList": [ 11 | { 12 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 13 | "storageKeys": [ 14 | "0x0000000000000000000000000000000000000000000000000000000000000003" 15 | ] 16 | } 17 | ], 18 | "yParity": true, 19 | "r": "0x52ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87c", 20 | "s": "0x5a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5" 21 | } -------------------------------------------------------------------------------- /transactions/eip7702_unsigned.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": 1, 3 | "nonce": 0, 4 | "maxPriorityFeePerGas": 373223425, 5 | "maxFeePerGas": 34714654540, 6 | "gasLimit": 63221, 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": 0, 9 | "data": "0x", 10 | "accessList": [ 11 | { 12 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 13 | "storageKeys": [ 14 | "0x0000000000000000000000000000000000000000000000000000000000000003" 15 | ] 16 | } 17 | ], 18 | "authorizationList": [ 19 | { 20 | "chainId": 1, 21 | "address": "0xD571b8bcd11dF08F0459009Dd1bd664127A431Ee", 22 | "nonce": 2 23 | }, 24 | { 25 | "chainId": 1, 26 | "address": "0xD571b8bcd11dF08F0459009Dd1bd664127A431Ee", 27 | "nonce": null 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /transactions/eip7702_signed.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": 1, 3 | "nonce": 0, 4 | "maxPriorityFeePerGas": 373223425, 5 | "maxFeePerGas": 34714654540, 6 | "gasLimit": 63221, 7 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 8 | "amount": 0, 9 | "data": "0x", 10 | "accessList": [ 11 | { 12 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 13 | "storageKeys": [ 14 | "0x0000000000000000000000000000000000000000000000000000000000000003" 15 | ] 16 | } 17 | ], 18 | "authorizationList": [ 19 | { 20 | "chainId": 1, 21 | "address": "0xD571b8bcd11dF08F0459009Dd1bd664127A431Ee", 22 | "nonce": null, 23 | "yParity": true, 24 | "r": "0x52ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87c", 25 | "s": "0x5a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5" 26 | } 27 | ], 28 | "yParity": true, 29 | "r": "0x52ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87c", 30 | "s": "0x5a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5" 31 | } -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024-2024 Otim Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tx-util 2 | 3 | **Utility for rlp-encoding and signing new EIP-2718 typed transactions for testing** 4 | 5 | Currently supports type `0x2` and type `0x4` transactions. 6 | 7 | ## How does it work 8 | 9 | `tx-util` accepts json formatted transactions. A typical [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) transaction is defined as: 10 | 11 | ```json 12 | { 13 | "chainId": 1, 14 | "nonce": 10, 15 | "maxPriorityFeePerGas": 373223425, 16 | "maxFeePerGas": 34714654540, 17 | "gasLimit": 63221, 18 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 19 | "amount": 0, 20 | "data": "0x", 21 | "accessList": [ 22 | { 23 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 24 | "storageKeys": [ 25 | "0x0000000000000000000000000000000000000000000000000000000000000003" 26 | ] 27 | } 28 | ] 29 | } 30 | ``` 31 | 32 | A signed EIP-1559 tx can be created from this: 33 | 34 | ```shell 35 | cat eip1559_tx_file | tx-util encode-tx --tx-type 2 --signer 0x... 36 | ``` 37 | 38 | ### EIP-7702 39 | 40 | `tx-util` can also sign [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) transactions and their authorizations. 41 | 42 | ```json 43 | { 44 | "chainId": 1, 45 | "nonce": 0, 46 | "maxPriorityFeePerGas": 373223425, 47 | "maxFeePerGas": 34714654540, 48 | "gasLimit": 63221, 49 | "destination": "0x695461EF560Fa4d3a3e7332c9bfcEC261c11a1B6", 50 | "amount": 0, 51 | "data": "0x", 52 | "accessList": [ 53 | { 54 | "address": "0x8DfDf61F2Eb938b207c228b01a2918b196992ABf", 55 | "storageKeys": [ 56 | "0x0000000000000000000000000000000000000000000000000000000000000003" 57 | ] 58 | } 59 | ], 60 | "authorizationList": [ 61 | { 62 | "chainId": 1, 63 | "address": "0xD571b8bcd11dF08F0459009Dd1bd664127A431Ee", 64 | "nonce": 2 65 | }, 66 | { 67 | "chainId": 1, 68 | "address": "0xD571b8bcd11dF08F0459009Dd1bd664127A431Ee", 69 | "nonce": null 70 | } 71 | ] 72 | } 73 | ``` 74 | 75 | The number of `--authorizer` must match the number of items in the `authorization_list`: 76 | 77 | ```shell 78 | cat eip7702_auth_file | tx-util encode-tx --tx-type 4 \ 79 | --signer 0x... \ 80 | --authorizer 0x... \ 81 | --authorizer 0x... 82 | ``` 83 | 84 | ## Installation 85 | 86 | Installation requires the [rust toolchain](https://rustup.rs/): 87 | 88 | ```shell 89 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 90 | ``` 91 | 92 | `tx-util` can be installed with `cargo`: 93 | 94 | ```shell 95 | cd /path/to/repo 96 | cargo install --path . 97 | ``` 98 | 99 | #### Uninstall 100 | 101 | ```shell 102 | cargo uninstall tx-util 103 | ``` 104 | 105 | ## Disclaimer 106 | 107 | **This utility has not been checked for correctness and should not be used to generate transactions for mainnet. It is for testing purposes only.** 108 | 109 | ## Getting help 110 | 111 | Issues and PRs are welcome. We can also be reached at `gm@otim.xyz` if you have any additional questions. 112 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | //! # tx-util 2 | 3 | #![warn( 4 | missing_docs, 5 | non_ascii_idents, 6 | unreachable_pub, 7 | unused_crate_dependencies, 8 | unused_results, 9 | unused_qualifications, 10 | nonstandard_style, 11 | rustdoc::all 12 | )] 13 | #![deny(rust_2018_idioms, unsafe_code)] 14 | 15 | mod rlp; 16 | mod transaction; 17 | 18 | use crate::rlp::RlpItem; 19 | use clap::{CommandFactory, Parser, Subcommand}; 20 | use color_eyre::eyre::{eyre, Result}; 21 | use std::{io, iter::zip}; 22 | use transaction::{Eip1559, Eip7702}; 23 | 24 | #[cfg(test)] 25 | use assert_cmd as _; 26 | 27 | /// WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 28 | /// Do not use this for generating transactions for the Ethereum mainnet. This tool is 29 | /// meant for generating test transactions only. It provides no guarantees of security 30 | /// or correctness nor has it been audited. Use at your own risk. 31 | #[derive(Parser, Debug)] 32 | #[command(author, version, about, long_about = None, verbatim_doc_comment)] 33 | struct Args { 34 | #[command(subcommand)] 35 | command: Option, 36 | } 37 | 38 | #[derive(Subcommand, Debug)] 39 | enum Commands { 40 | /// Encodes an EIP-2718 transaction into an rlp-encoded hex value from stdin. 41 | /// 42 | /// Accepts json input with a `type` field followed by valid tranaction fields. 43 | /// 44 | /// This currently accepts types `2` and `4` only. 45 | /// 46 | /// ```no_run 47 | /// { 48 | /// "type": 2, 49 | /// "chainId": 1337, 50 | /// "nonce": 0, 51 | /// ... 52 | /// } 53 | /// ``` 54 | #[command(long_about, verbatim_doc_comment)] 55 | EncodeTx { 56 | /// Transaction type. Types `2` and `4` accepted. 57 | #[arg(long, short = 't')] 58 | tx_type: u8, 59 | 60 | /// A private key in hex encoding `0x...`. This is required 61 | /// if the transaction does not contain a signature. 62 | #[arg(long)] 63 | signer: Option, 64 | 65 | /// For type 4 transactions only. 66 | /// 67 | /// A list of private keys in hex encoding `0x...`. These are 68 | /// required if the elements of the `authorization_list` are not 69 | /// already signed. 70 | /// 71 | /// If present, the number of keys supplied here must be equal to 72 | /// the number of items in the `authorization_list`. 73 | #[arg(long = "authorizer")] 74 | authorizers: Vec, 75 | }, 76 | } 77 | 78 | fn main() -> Result<()> { 79 | color_eyre::install()?; 80 | let args = Args::parse(); 81 | 82 | match args.command { 83 | Some(Commands::EncodeTx { 84 | tx_type, 85 | signer, 86 | authorizers, 87 | }) => match tx_type { 88 | 0x2 => { 89 | let stdin = io::read_to_string(io::stdin())?; 90 | let tx: Eip1559 = serde_json::from_str(stdin.trim())?; 91 | let ast: RlpItem = if tx.signature.is_none() { 92 | let signer = 93 | signer.ok_or(eyre!("a `--signer` is required to sign this transaction"))?; 94 | let signer = hex::decode(signer.trim().trim_start_matches("0x"))?; 95 | if signer.len() != 32 { 96 | Err(eyre!("the supplied `--signer` is invalid"))?; 97 | } 98 | tx.sign(signer).into() 99 | } else { 100 | tx.into() 101 | }; 102 | let mut bytes: Vec = ast.into(); 103 | bytes.insert(0, 2); 104 | print!("0x{}", hex::encode(bytes)); 105 | } 106 | 0x4 => { 107 | let stdin = io::read_to_string(io::stdin())?; 108 | let mut tx: Eip7702 = serde_json::from_str(stdin.trim())?; 109 | if tx.authorization_list.iter().any(|a| a.signature.is_none()) { 110 | if tx.authorization_list.len() != authorizers.len() { 111 | Err(eyre!("the number of `--authorizer` must be equal to the number of items in the `authorization_list`"))?; 112 | } 113 | let mut signers = Vec::new(); 114 | for a in authorizers { 115 | let signer = hex::decode(a.trim().trim_start_matches("0x"))?; 116 | if signer.len() != 32 { 117 | Err(eyre!("a supplied `--authorizer` is invalid"))?; 118 | } 119 | signers.push(signer); 120 | } 121 | tx.authorization_list = zip(tx.authorization_list, signers) 122 | .map(|(auth, signer)| auth.sign(signer)) 123 | .collect::>(); 124 | } 125 | let ast: RlpItem = if tx.signature.is_none() { 126 | let signer = 127 | signer.ok_or(eyre!("a `--signer` is required to sign this transaction"))?; 128 | let signer = hex::decode(signer.trim().trim_start_matches("0x"))?; 129 | tx.sign(signer).into() 130 | } else { 131 | tx.into() 132 | }; 133 | let mut bytes: Vec = ast.into(); 134 | bytes.insert(0, 4); 135 | print!("0x{}", hex::encode(bytes)); 136 | } 137 | _ => Err(eyre!("invalid transaction type`"))?, 138 | }, 139 | None => Args::command().print_help().unwrap(), 140 | } 141 | Ok(()) 142 | } 143 | -------------------------------------------------------------------------------- /tests/integration_tests.rs: -------------------------------------------------------------------------------- 1 | use assert_cmd::Command; 2 | 3 | static EIP_1559_UNSIGNED: &str = include_str!(concat!( 4 | env!("CARGO_MANIFEST_DIR"), 5 | "/transactions/eip1559_unsigned.json" 6 | )); 7 | 8 | static EIP_1559_SIGNED: &str = include_str!(concat!( 9 | env!("CARGO_MANIFEST_DIR"), 10 | "/transactions/eip1559_signed.json" 11 | )); 12 | 13 | static EIP_1559_HEX_VALS: &str = include_str!(concat!( 14 | env!("CARGO_MANIFEST_DIR"), 15 | "/transactions/eip1559_hex_vals.json" 16 | )); 17 | 18 | static EIP_7702_UNSIGNED: &str = include_str!(concat!( 19 | env!("CARGO_MANIFEST_DIR"), 20 | "/transactions/eip7702_unsigned.json" 21 | )); 22 | 23 | static EIP_7702_SIGNED: &str = include_str!(concat!( 24 | env!("CARGO_MANIFEST_DIR"), 25 | "/transactions/eip7702_signed.json" 26 | )); 27 | 28 | static EIP_7702_EMPTY_AUTH: &str = include_str!(concat!( 29 | env!("CARGO_MANIFEST_DIR"), 30 | "/transactions/eip7702_empty_auth.json" 31 | )); 32 | 33 | static SIGNER: &str = "34954993d403229ee2e01cf6fa8222224935bc47f9534b0c0ea8054764375501"; 34 | 35 | #[test] 36 | fn it_runs() { 37 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 38 | cmd.assert().success(); 39 | } 40 | 41 | #[test] 42 | fn it_encodes_1559() { 43 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 44 | let assert = cmd 45 | .arg("encode-tx") 46 | .args(&["--tx-type", "2"]) 47 | .write_stdin(EIP_1559_SIGNED) 48 | .assert(); 49 | assert.success().stdout("0x02f8e9018084163ef00185081527974c82f6f594695461ef560fa4d3a3e7332c9bfcec261c11a1b680b844a9059cbb0000000000000000000000005a96834046c1dff63119eb0eed6330fc5007a1d700000000000000000000000000000000000000000000000000000001a1432720f838f7948dfdf61f2eb938b207c228b01a2918b196992abfe1a0000000000000000000000000000000000000000000000000000000000000000301a052ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87ca05a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5"); 50 | } 51 | 52 | #[test] 53 | fn it_signs_1559() { 54 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 55 | let assert = cmd 56 | .arg("encode-tx") 57 | .args(&["--tx-type", "2"]) 58 | .args(&["--signer", SIGNER]) 59 | .write_stdin(EIP_1559_UNSIGNED) 60 | .assert(); 61 | assert.success().stdout("0x02f8a4010a84163ef00185081527974c82f6f594695461ef560fa4d3a3e7332c9bfcec261c11a1b68080f838f7948dfdf61f2eb938b207c228b01a2918b196992abfe1a0000000000000000000000000000000000000000000000000000000000000000301a0efa0ed9132e900d5dd195698e4a7c14f08dc03c2b3e62b8b9a87b7e08a57c400a00ef4dc89b0c9f4b8e2fdd377e4ed0c3c4c7813a1562c8ada05ebab04925935e7"); 62 | } 63 | 64 | #[test] 65 | fn it_encodes_1559_hex() { 66 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 67 | let assert = cmd 68 | .arg("encode-tx") 69 | .args(&["--tx-type", "2"]) 70 | .write_stdin(EIP_1559_HEX_VALS) 71 | .assert(); 72 | assert.success().stdout("0x02f8a8833018248084163ef00185081527974c830186a094695461ef560fa4d3a3e7332c9bfcec261c11a1b68080f838f7948dfdf61f2eb938b207c228b01a2918b196992abfe1a0000000000000000000000000000000000000000000000000000000000000000301a052ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87ca05a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5"); 73 | } 74 | 75 | #[test] 76 | fn it_fails_no_singer_1559() { 77 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 78 | let assert = cmd 79 | .arg("encode-tx") 80 | .args(&["--tx-type", "2"]) 81 | .write_stdin(EIP_1559_UNSIGNED) 82 | .assert(); 83 | assert.code(1); 84 | } 85 | 86 | #[test] 87 | fn it_encodes_7702() { 88 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 89 | let assert = cmd 90 | .arg("encode-tx") 91 | .args(&["--tx-type", "4"]) 92 | .write_stdin(EIP_7702_SIGNED) 93 | .assert(); 94 | assert.success().stdout("0x04f90102018084163ef00185081527974c82f6f594695461ef560fa4d3a3e7332c9bfcec261c11a1b68080f838f7948dfdf61f2eb938b207c228b01a2918b196992abfe1a00000000000000000000000000000000000000000000000000000000000000003f85cf85a0194d571b8bcd11df08f0459009dd1bd664127a431eec001a052ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87ca05a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d501a052ee022a326abb33e6bebab1fa694043371ab41a7a985ea23d48bd78502be87ca05a0f69dc8009a1e449bfbc8b13220bc40337da1325c261afdac1803f26d0e9d5"); 95 | } 96 | 97 | #[test] 98 | fn it_signs_7702_empty_auth() { 99 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 100 | let assert = cmd 101 | .arg("encode-tx") 102 | .args(&["--tx-type", "4"]) 103 | .args(&["--signer", SIGNER]) 104 | .write_stdin(EIP_7702_EMPTY_AUTH) 105 | .assert(); 106 | assert.success().stdout("0x04f86c018084163ef00185081527974c82f6f594695461ef560fa4d3a3e7332c9bfcec261c11a1b68080c0c080a08159b9bdfa233442f45941fa56c0f95c825feadc44a2a0162962e893d93946d6a002225482ae77cccf26f2aa6264f1e34b9815be29678e920c2833f57da2649ebd"); 107 | } 108 | 109 | #[test] 110 | fn it_signs_7702_and_auths() { 111 | let mut cmd = Command::cargo_bin("tx-util").unwrap(); 112 | let assert = cmd 113 | .arg("encode-tx") 114 | .args(&["--tx-type", "4"]) 115 | .args(&["--signer", SIGNER]) 116 | .args(&["--authorizer", SIGNER]) 117 | .args(&["--authorizer", SIGNER]) 118 | .write_stdin(EIP_7702_UNSIGNED) 119 | .assert(); 120 | assert.success().stdout("0x04f9015f018084163ef00185081527974c82f6f594695461ef560fa4d3a3e7332c9bfcec261c11a1b68080f838f7948dfdf61f2eb938b207c228b01a2918b196992abfe1a00000000000000000000000000000000000000000000000000000000000000003f8b9f85b0194d571b8bcd11df08f0459009dd1bd664127a431eec10201a0af224f2d45206ef8ed6974fa17337fb148396e2531b14161b04b00d9e63ee34ca03885e8dfcacc288e2519c8be92ad0fb20b78158506fcb0b62829303e48fed13af85a0194d571b8bcd11df08f0459009dd1bd664127a431eec080a050debd048f0d6ab6932a8a7cc5778084fdd8e3d87d51c5b2642942119250ce3ca075c956d12726ff2512ffafe150a06a96fe7664da02d62c0db863c5ff7772135b01a0644c1e935ccdd3a71f6894ab30db8107dad0bbe177c86c447ea2e5900033b3a7a01e01ae276a58089667756d23c9a24c0fdf1d694e3d92de6560222f8dd8b79456"); 121 | } 122 | -------------------------------------------------------------------------------- /src/rlp.rs: -------------------------------------------------------------------------------- 1 | use alloy_primitives::{Bytes, U256, U64}; 2 | use core::panic; 3 | use std::{collections::VecDeque, fmt}; 4 | 5 | #[derive(Clone)] 6 | pub(crate) enum RlpItem { 7 | Data(Vec), 8 | List(Vec), 9 | } 10 | 11 | #[allow(dead_code)] 12 | impl RlpItem { 13 | pub(crate) fn data(&self) -> &[u8] { 14 | match self { 15 | RlpItem::Data(data) => data, 16 | _ => panic!("not data"), 17 | } 18 | } 19 | 20 | pub(crate) fn list(&self) -> &[RlpItem] { 21 | match self { 22 | RlpItem::List(list) => list, 23 | _ => panic!("not a list"), 24 | } 25 | } 26 | } 27 | 28 | impl From<&[u8]> for RlpItem { 29 | fn from(value: &[u8]) -> Self { 30 | RlpItem::Data(value.to_vec()) 31 | } 32 | } 33 | 34 | impl From for RlpItem { 35 | fn from(value: bool) -> Self { 36 | RlpItem::Data(if value { vec![0x1] } else { vec![] }) 37 | } 38 | } 39 | 40 | impl From for bool { 41 | fn from(value: RlpItem) -> Self { 42 | match value.data() { 43 | [0x1] => true, 44 | [] => false, 45 | _ => panic!("invalid boolean value"), 46 | } 47 | } 48 | } 49 | 50 | impl From for RlpItem { 51 | fn from(value: U64) -> Self { 52 | RlpItem::Data( 53 | value 54 | .to_be_bytes::<8>() 55 | .into_iter() 56 | .skip_while(|b| *b == 0x0) 57 | .collect::>(), 58 | ) 59 | } 60 | } 61 | 62 | impl From for U64 { 63 | fn from(value: RlpItem) -> Self { 64 | U64::from_be_slice(value.data()) 65 | } 66 | } 67 | 68 | impl From for RlpItem { 69 | fn from(value: U256) -> Self { 70 | RlpItem::Data( 71 | value 72 | .to_be_bytes::<32>() 73 | .into_iter() 74 | .skip_while(|b| *b == 0x0) 75 | .collect::>(), 76 | ) 77 | } 78 | } 79 | 80 | impl From for U256 { 81 | fn from(value: RlpItem) -> Self { 82 | U256::from_be_slice(value.data()) 83 | } 84 | } 85 | 86 | impl From for RlpItem { 87 | fn from(value: Bytes) -> Self { 88 | RlpItem::Data(value.iter().cloned().collect::>().as_slice().into()) 89 | } 90 | } 91 | 92 | impl From for Vec { 93 | fn from(value: RlpItem) -> Self { 94 | let mut bytes = Vec::new(); 95 | match value { 96 | RlpItem::Data(mut data) => match data.len() { 97 | 1 if data[0] <= 0x7F => { 98 | bytes.push(data[0]); 99 | } 100 | 0..=55 => { 101 | bytes.push(0x80 + data.len() as u8); 102 | bytes.append(&mut data); 103 | } 104 | 56.. => { 105 | let mut len = data 106 | .len() 107 | .to_be_bytes() 108 | .into_iter() 109 | .skip_while(|b| *b == 0x0) 110 | .collect::>(); 111 | bytes.push(0xB7 + len.len() as u8); 112 | bytes.append(&mut len); 113 | bytes.append(&mut data); 114 | } 115 | }, 116 | RlpItem::List(list) => { 117 | let mut encoded = list 118 | .into_iter() 119 | .flat_map(Into::>::into) 120 | .collect::>(); 121 | match encoded.len() { 122 | 0..=55 => { 123 | bytes.push(0xC0 + encoded.len() as u8); 124 | bytes.append(&mut encoded); 125 | } 126 | 56.. => { 127 | let mut len = encoded 128 | .len() 129 | .to_be_bytes() 130 | .into_iter() 131 | .skip_while(|b| *b == 0x0) 132 | .collect::>(); 133 | bytes.push(0xF7 + len.len() as u8); 134 | bytes.append(&mut len); 135 | bytes.append(&mut encoded); 136 | } 137 | } 138 | } 139 | } 140 | bytes 141 | } 142 | } 143 | 144 | impl From<&mut VecDeque> for RlpItem { 145 | fn from(value: &mut VecDeque) -> Self { 146 | let byte = value.pop_front().expect("no more bytes"); 147 | match byte { 148 | 0x00..=0x7F => RlpItem::Data(vec![byte]), 149 | 0x80..=0xBF => { 150 | let len = match byte { 151 | 0x80..=0xB7 => byte as u64 - 0x80, 152 | 0xB8..=0xBF => { 153 | let len = byte - 0xB7; 154 | let len = value.drain(0..len as usize).collect::>(); 155 | len.into_iter().fold(0u64, |a, b| a * 256 + b as u64) 156 | } 157 | _ => unreachable!(), 158 | }; 159 | let item = value.drain(0..len as usize).collect::>(); 160 | RlpItem::Data(item) 161 | } 162 | 0xC0..=0xFF => { 163 | let len = match byte { 164 | 0xC0..=0xF7 => byte as u64 - 0xC0, 165 | 0xF8..=0xFF => { 166 | let len = byte - 0xF7; 167 | let len = value.drain(0..len as usize).collect::>(); 168 | len.into_iter().fold(0u64, |a, b| a * 256 + b as u64) 169 | } 170 | _ => unreachable!(), 171 | }; 172 | let mut items = value.drain(0..len as usize).collect::>(); 173 | let mut rlp_vals = Vec::new(); 174 | while !items.is_empty() { 175 | rlp_vals.push(Into::::into(&mut items)); 176 | } 177 | RlpItem::List(rlp_vals) 178 | } 179 | } 180 | } 181 | } 182 | 183 | impl fmt::Debug for RlpItem { 184 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 185 | fn fmt_rlp(item: &RlpItem, f: &mut fmt::Formatter<'_>, depth: usize) -> fmt::Result { 186 | match item { 187 | RlpItem::Data(data) => { 188 | if data.is_empty() { 189 | write!(f, "{:indent$}0x", "", indent = depth) 190 | } else { 191 | write!( 192 | f, 193 | "{:indent$}0x{}", 194 | "", 195 | hex::encode(data).trim_start_matches('0'), 196 | indent = depth 197 | ) 198 | } 199 | } 200 | RlpItem::List(list) => match list.len() { 201 | 0 => write!(f, "{:indent$}[]", "", indent = depth), 202 | _ => { 203 | writeln!(f, "{:indent$}[", "", indent = depth)?; 204 | for item in list.iter() { 205 | fmt_rlp(item, f, depth + 2)?; 206 | writeln!(f)?; 207 | } 208 | write!(f, "{:indent$}]", "", indent = depth) 209 | } 210 | }, 211 | } 212 | } 213 | fmt_rlp(self, f, 0) 214 | } 215 | } 216 | 217 | #[cfg(test)] 218 | mod tests { 219 | use super::*; 220 | 221 | #[test] 222 | fn test_bool() { 223 | let a: RlpItem = true.into(); 224 | let a: Vec = a.into(); 225 | let mut a = VecDeque::::from(a); 226 | let a = Into::::into(&mut a); 227 | let a: bool = a.into(); 228 | assert_eq!(a, true); 229 | 230 | let a: RlpItem = false.into(); 231 | let a: Vec = a.into(); 232 | let mut a = VecDeque::::from(a); 233 | let a = Into::::into(&mut a); 234 | let a: bool = a.into(); 235 | assert_eq!(a, false); 236 | } 237 | 238 | #[test] 239 | fn test_u64() { 240 | let a: RlpItem = U64::from(0u64).into(); 241 | let a: Vec = a.into(); 242 | let mut a = VecDeque::::from(a); 243 | let a = Into::::into(&mut a); 244 | let a: U64 = a.into(); 245 | assert_eq!(a, U64::from(0u64)); 246 | 247 | let a: RlpItem = U64::from(123456u64).into(); 248 | let a: Vec = a.into(); 249 | let mut a = VecDeque::::from(a); 250 | let a = Into::::into(&mut a); 251 | let a: U64 = a.into(); 252 | assert_eq!(a, U64::from(123456u64)); 253 | } 254 | 255 | #[test] 256 | fn test_u256() { 257 | let a: RlpItem = U256::from(0u64).into(); 258 | let a: Vec = a.into(); 259 | let mut a = VecDeque::::from(a); 260 | let a = Into::::into(&mut a); 261 | let a: U256 = a.into(); 262 | assert_eq!(a, U256::from(0u64)); 263 | 264 | let a: RlpItem = U256::from(123456u64).into(); 265 | let a: Vec = a.into(); 266 | let mut a = VecDeque::::from(a); 267 | let a = Into::::into(&mut a); 268 | let a: U256 = a.into(); 269 | assert_eq!(a, U256::from(123456u64)); 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /src/transaction.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::vec_init_then_push)] 2 | 3 | use crate::rlp::RlpItem; 4 | use alloy_primitives::{Address, Bytes, FixedBytes, U256, U64}; 5 | use k256::ecdsa::{signature::hazmat::PrehashSigner, SigningKey}; 6 | use serde::{Deserialize, Serialize}; 7 | use sha3::{Digest, Keccak256}; 8 | use std::vec; 9 | 10 | const EIP1559_TX_TYPE: u8 = 2; 11 | const EIP7702_TX_TYPE: u8 = 4; 12 | const AUTHORIZATION_MAGIC: u8 = 5; 13 | 14 | /// An [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) Transaction 15 | /// ```no_run 16 | /// 0x02 || rlp([ 17 | /// chain_id, 18 | /// nonce, 19 | /// max_priority_fee_per_gas, 20 | /// max_fee_per_gas, 21 | /// gas_limit, 22 | /// destination, 23 | /// amount, 24 | /// data, 25 | /// access_list, 26 | /// y_parity, 27 | /// r, 28 | /// s 29 | /// ]) 30 | /// ``` 31 | #[allow(missing_docs)] 32 | #[derive(Clone, Default, Serialize, Deserialize)] 33 | #[serde(rename_all = "camelCase")] 34 | pub(crate) struct Eip1559 { 35 | pub(crate) chain_id: U256, 36 | pub(crate) nonce: U64, 37 | pub(crate) max_priority_fee_per_gas: U256, 38 | pub(crate) max_fee_per_gas: U256, 39 | pub(crate) gas_limit: U256, 40 | pub(crate) destination: Address, 41 | pub(crate) amount: U256, 42 | pub(crate) data: Bytes, 43 | pub(crate) access_list: Vec, 44 | #[serde(flatten)] 45 | pub(crate) signature: Option, 46 | } 47 | 48 | /// An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Transaction 49 | /// 50 | /// See [`Authorization`] for `authorization_list` 51 | /// ```no_run 52 | /// 0x04 || rlp([ 53 | /// chain_id, 54 | /// nonce, 55 | /// max_priority_fee_per_gas, 56 | /// max_fee_per_gas, 57 | /// gas_limit, 58 | /// destination, 59 | /// amount, 60 | /// data, 61 | /// access_list, 62 | /// authorization_list, 63 | /// y_parity, 64 | /// r, 65 | /// s 66 | /// ]) 67 | /// ``` 68 | #[derive(Clone, Default, Serialize, Deserialize)] 69 | #[serde(rename_all = "camelCase")] 70 | pub(crate) struct Eip7702 { 71 | pub(crate) chain_id: U256, 72 | pub(crate) nonce: U64, 73 | pub(crate) max_priority_fee_per_gas: U256, 74 | pub(crate) max_fee_per_gas: U256, 75 | pub(crate) gas_limit: U256, 76 | pub(crate) destination: Address, 77 | pub(crate) amount: U256, 78 | pub(crate) data: Bytes, 79 | pub(crate) access_list: Vec, 80 | pub(crate) authorization_list: Vec, 81 | #[serde(flatten)] 82 | pub(crate) signature: Option, 83 | } 84 | 85 | /// An [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) Access List Item 86 | /// ```no_run 87 | /// rlp([ 88 | /// address, 89 | /// [ 90 | /// storage_key, 91 | /// ... 92 | /// ] 93 | /// ]) 94 | /// ``` 95 | #[derive(Clone, Default, Serialize, Deserialize)] 96 | #[serde(rename_all = "camelCase")] 97 | pub(crate) struct AccessListItem { 98 | pub(crate) address: Address, 99 | pub(crate) storage_keys: Vec>, 100 | } 101 | 102 | /// An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Authorization 103 | /// ```no_run 104 | /// rlp([ 105 | /// chain_id, 106 | /// address, 107 | /// [ 108 | /// nonce 109 | /// ], 110 | /// y_parity, 111 | /// r, 112 | /// s 113 | /// ]) 114 | /// ``` 115 | #[derive(Clone, Default, Serialize, Deserialize)] 116 | #[serde(rename_all = "camelCase")] 117 | pub(crate) struct Authorization { 118 | pub(crate) chain_id: U256, 119 | pub(crate) address: Address, 120 | pub(crate) nonce: Option, 121 | #[serde(flatten)] 122 | pub(crate) signature: Option, 123 | } 124 | 125 | /// A Signature 126 | #[derive(Clone, Default, Serialize, Deserialize)] 127 | #[serde(rename_all = "camelCase")] 128 | pub(crate) struct Signature { 129 | pub(crate) y_parity: bool, 130 | pub(crate) r: U256, 131 | pub(crate) s: U256, 132 | } 133 | 134 | impl From for RlpItem { 135 | fn from(value: Eip1559) -> Self { 136 | let mut items = Vec::new(); 137 | items.push(value.chain_id.into()); 138 | items.push(value.nonce.into()); 139 | items.push(value.max_priority_fee_per_gas.into()); 140 | items.push(value.max_fee_per_gas.into()); 141 | items.push(value.gas_limit.into()); 142 | items.push(value.destination.as_slice().into()); 143 | items.push(value.amount.into()); 144 | items.push(value.data.into()); 145 | items.push(value.access_list.into()); 146 | if let Some(signature) = value.signature { 147 | let mut rlp: Vec = signature.into(); 148 | items.append(&mut rlp); 149 | } 150 | RlpItem::List(items) 151 | } 152 | } 153 | 154 | impl From for RlpItem { 155 | fn from(value: Eip7702) -> Self { 156 | let mut items = Vec::new(); 157 | items.push(value.chain_id.into()); 158 | items.push(value.nonce.into()); 159 | items.push(value.max_priority_fee_per_gas.into()); 160 | items.push(value.max_fee_per_gas.into()); 161 | items.push(value.gas_limit.into()); 162 | items.push(value.destination.as_slice().into()); 163 | items.push(value.amount.into()); 164 | items.push(value.data.into()); 165 | items.push(value.access_list.into()); 166 | items.push(value.authorization_list.into()); 167 | if let Some(signature) = value.signature { 168 | let mut rlp: Vec = signature.into(); 169 | items.append(&mut rlp); 170 | } 171 | RlpItem::List(items) 172 | } 173 | } 174 | 175 | impl From> for RlpItem { 176 | fn from(value: Vec) -> Self { 177 | let mut items = Vec::new(); 178 | for item in value { 179 | items.push(RlpItem::List(vec![ 180 | RlpItem::Data(item.address.as_slice().into()), 181 | RlpItem::List( 182 | item.storage_keys 183 | .into_iter() 184 | .map(|k| RlpItem::Data(k.as_slice().into())) 185 | .collect::>(), 186 | ), 187 | ])) 188 | } 189 | RlpItem::List(items) 190 | } 191 | } 192 | 193 | impl From> for RlpItem { 194 | fn from(value: Vec) -> Self { 195 | let mut items = Vec::new(); 196 | for item in value { 197 | items.push(item.into()) 198 | } 199 | RlpItem::List(items) 200 | } 201 | } 202 | 203 | impl From for RlpItem { 204 | fn from(value: Authorization) -> Self { 205 | let mut items = Vec::new(); 206 | items.push(value.chain_id.into()); 207 | items.push(value.address.as_slice().into()); 208 | // EIP-7702 optional nonce is encoded as an empty list 209 | items.push(RlpItem::List( 210 | value.nonce.map(|n| vec![n.into()]).unwrap_or_default(), 211 | )); 212 | if let Some(signature) = value.signature { 213 | let mut rlp: Vec = signature.into(); 214 | items.append(&mut rlp); 215 | } 216 | RlpItem::List(items) 217 | } 218 | } 219 | 220 | impl From for Vec { 221 | fn from(value: Signature) -> Self { 222 | let mut items = Vec::new(); 223 | items.push(value.y_parity.into()); 224 | items.push(value.r.into()); 225 | items.push(value.s.into()); 226 | items 227 | } 228 | } 229 | 230 | fn sign_payload(mut payload: Vec, magic: u8, signer: Vec) -> Signature { 231 | payload.insert(0, magic); 232 | 233 | let mut hasher = Keccak256::new(); 234 | hasher.update(&payload); 235 | let hash = hasher.finalize(); 236 | 237 | let signer = SigningKey::from_slice(&signer).unwrap(); 238 | let (signature, recovery_id) = signer.sign_prehash(&hash).unwrap(); 239 | 240 | Signature { 241 | y_parity: recovery_id.is_y_odd(), 242 | r: U256::from_be_slice(signature.r().to_bytes().as_slice()), 243 | s: U256::from_be_slice(signature.s().to_bytes().as_slice()), 244 | } 245 | } 246 | 247 | impl Authorization { 248 | pub(crate) fn sign(self, signer: Vec) -> Self { 249 | let mut auth = self.clone(); 250 | auth.signature = None; 251 | 252 | let rlp: RlpItem = auth.clone().into(); 253 | 254 | auth.signature = Some(sign_payload(rlp.into(), AUTHORIZATION_MAGIC, signer)); 255 | auth 256 | } 257 | } 258 | 259 | impl Eip1559 { 260 | pub(crate) fn sign(self, signer: Vec) -> Self { 261 | let mut tx = self.clone(); 262 | tx.signature = None; 263 | 264 | let rlp: RlpItem = tx.clone().into(); 265 | 266 | tx.signature = Some(sign_payload(rlp.into(), EIP1559_TX_TYPE, signer)); 267 | tx 268 | } 269 | } 270 | 271 | impl Eip7702 { 272 | pub(crate) fn sign(self, signer: Vec) -> Self { 273 | let mut tx = self.clone(); 274 | tx.signature = None; 275 | 276 | let rlp: RlpItem = tx.clone().into(); 277 | 278 | tx.signature = Some(sign_payload(rlp.into(), EIP7702_TX_TYPE, signer)); 279 | tx 280 | } 281 | } 282 | 283 | #[cfg(test)] 284 | mod tests { 285 | use super::*; 286 | 287 | static EIP_1559_UNSIGNED: &str = include_str!(concat!( 288 | env!("CARGO_MANIFEST_DIR"), 289 | "/transactions/eip1559_unsigned.json" 290 | )); 291 | 292 | static EIP_1559_SIGNED: &str = include_str!(concat!( 293 | env!("CARGO_MANIFEST_DIR"), 294 | "/transactions/eip1559_signed.json" 295 | )); 296 | 297 | static EIP_1559_HEX_VALS: &str = include_str!(concat!( 298 | env!("CARGO_MANIFEST_DIR"), 299 | "/transactions/eip1559_hex_vals.json" 300 | )); 301 | 302 | static EIP_7702_UNSIGNED: &str = include_str!(concat!( 303 | env!("CARGO_MANIFEST_DIR"), 304 | "/transactions/eip7702_unsigned.json" 305 | )); 306 | 307 | static EIP_7702_SIGNED: &str = include_str!(concat!( 308 | env!("CARGO_MANIFEST_DIR"), 309 | "/transactions/eip7702_signed.json" 310 | )); 311 | 312 | static EIP_7702_EMPTY_AUTH: &str = include_str!(concat!( 313 | env!("CARGO_MANIFEST_DIR"), 314 | "/transactions/eip7702_empty_auth.json" 315 | )); 316 | 317 | #[test] 318 | fn deserialize_eip1559() { 319 | // valid tx 320 | let _tx: Eip1559 = serde_json::from_str(EIP_1559_UNSIGNED).unwrap(); 321 | 322 | // signed tx 323 | let _tx: Eip1559 = serde_json::from_str(EIP_1559_SIGNED).unwrap(); 324 | } 325 | 326 | #[test] 327 | fn deserialize_eip1559_hex() { 328 | let _tx: Eip1559 = serde_json::from_str(EIP_1559_HEX_VALS).unwrap(); 329 | } 330 | 331 | #[test] 332 | fn deserialize_eip7702() { 333 | let _tx: Eip7702 = serde_json::from_str(EIP_7702_UNSIGNED).unwrap(); 334 | 335 | // signed 336 | let _tx: Eip7702 = serde_json::from_str(EIP_7702_SIGNED).unwrap(); 337 | 338 | // empty auth 339 | let _tx: Eip7702 = serde_json::from_str(EIP_7702_EMPTY_AUTH).unwrap(); 340 | } 341 | } 342 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2024 Otim Contributors 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "alloy-primitives" 22 | version = "0.7.6" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "f783611babedbbe90db3478c120fb5f5daacceffc210b39adc0af4fe0da70bad" 25 | dependencies = [ 26 | "alloy-rlp", 27 | "bytes", 28 | "cfg-if", 29 | "const-hex", 30 | "derive_more", 31 | "hex-literal", 32 | "itoa", 33 | "k256", 34 | "keccak-asm", 35 | "proptest", 36 | "rand", 37 | "ruint", 38 | "serde", 39 | "tiny-keccak", 40 | ] 41 | 42 | [[package]] 43 | name = "alloy-rlp" 44 | version = "0.3.7" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" 47 | dependencies = [ 48 | "arrayvec", 49 | "bytes", 50 | ] 51 | 52 | [[package]] 53 | name = "anstream" 54 | version = "0.6.14" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 57 | dependencies = [ 58 | "anstyle", 59 | "anstyle-parse", 60 | "anstyle-query", 61 | "anstyle-wincon", 62 | "colorchoice", 63 | "is_terminal_polyfill", 64 | "utf8parse", 65 | ] 66 | 67 | [[package]] 68 | name = "anstyle" 69 | version = "1.0.7" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" 72 | 73 | [[package]] 74 | name = "anstyle-parse" 75 | version = "0.2.4" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 78 | dependencies = [ 79 | "utf8parse", 80 | ] 81 | 82 | [[package]] 83 | name = "anstyle-query" 84 | version = "1.0.3" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" 87 | dependencies = [ 88 | "windows-sys", 89 | ] 90 | 91 | [[package]] 92 | name = "anstyle-wincon" 93 | version = "3.0.3" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 96 | dependencies = [ 97 | "anstyle", 98 | "windows-sys", 99 | ] 100 | 101 | [[package]] 102 | name = "ark-ff" 103 | version = "0.3.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" 106 | dependencies = [ 107 | "ark-ff-asm 0.3.0", 108 | "ark-ff-macros 0.3.0", 109 | "ark-serialize 0.3.0", 110 | "ark-std 0.3.0", 111 | "derivative", 112 | "num-bigint", 113 | "num-traits", 114 | "paste", 115 | "rustc_version 0.3.3", 116 | "zeroize", 117 | ] 118 | 119 | [[package]] 120 | name = "ark-ff" 121 | version = "0.4.2" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" 124 | dependencies = [ 125 | "ark-ff-asm 0.4.2", 126 | "ark-ff-macros 0.4.2", 127 | "ark-serialize 0.4.2", 128 | "ark-std 0.4.0", 129 | "derivative", 130 | "digest 0.10.7", 131 | "itertools", 132 | "num-bigint", 133 | "num-traits", 134 | "paste", 135 | "rustc_version 0.4.0", 136 | "zeroize", 137 | ] 138 | 139 | [[package]] 140 | name = "ark-ff-asm" 141 | version = "0.3.0" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" 144 | dependencies = [ 145 | "quote", 146 | "syn 1.0.109", 147 | ] 148 | 149 | [[package]] 150 | name = "ark-ff-asm" 151 | version = "0.4.2" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" 154 | dependencies = [ 155 | "quote", 156 | "syn 1.0.109", 157 | ] 158 | 159 | [[package]] 160 | name = "ark-ff-macros" 161 | version = "0.3.0" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" 164 | dependencies = [ 165 | "num-bigint", 166 | "num-traits", 167 | "quote", 168 | "syn 1.0.109", 169 | ] 170 | 171 | [[package]] 172 | name = "ark-ff-macros" 173 | version = "0.4.2" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" 176 | dependencies = [ 177 | "num-bigint", 178 | "num-traits", 179 | "proc-macro2", 180 | "quote", 181 | "syn 1.0.109", 182 | ] 183 | 184 | [[package]] 185 | name = "ark-serialize" 186 | version = "0.3.0" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" 189 | dependencies = [ 190 | "ark-std 0.3.0", 191 | "digest 0.9.0", 192 | ] 193 | 194 | [[package]] 195 | name = "ark-serialize" 196 | version = "0.4.2" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" 199 | dependencies = [ 200 | "ark-std 0.4.0", 201 | "digest 0.10.7", 202 | "num-bigint", 203 | ] 204 | 205 | [[package]] 206 | name = "ark-std" 207 | version = "0.3.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" 210 | dependencies = [ 211 | "num-traits", 212 | "rand", 213 | ] 214 | 215 | [[package]] 216 | name = "ark-std" 217 | version = "0.4.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" 220 | dependencies = [ 221 | "num-traits", 222 | "rand", 223 | ] 224 | 225 | [[package]] 226 | name = "arrayvec" 227 | version = "0.7.4" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 230 | 231 | [[package]] 232 | name = "assert_cmd" 233 | version = "2.0.14" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" 236 | dependencies = [ 237 | "anstyle", 238 | "bstr", 239 | "doc-comment", 240 | "predicates", 241 | "predicates-core", 242 | "predicates-tree", 243 | "wait-timeout", 244 | ] 245 | 246 | [[package]] 247 | name = "auto_impl" 248 | version = "1.2.0" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" 251 | dependencies = [ 252 | "proc-macro2", 253 | "quote", 254 | "syn 2.0.66", 255 | ] 256 | 257 | [[package]] 258 | name = "autocfg" 259 | version = "1.3.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 262 | 263 | [[package]] 264 | name = "backtrace" 265 | version = "0.3.71" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 268 | dependencies = [ 269 | "addr2line", 270 | "cc", 271 | "cfg-if", 272 | "libc", 273 | "miniz_oxide", 274 | "object", 275 | "rustc-demangle", 276 | ] 277 | 278 | [[package]] 279 | name = "base16ct" 280 | version = "0.2.0" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 283 | 284 | [[package]] 285 | name = "base64ct" 286 | version = "1.6.0" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 289 | 290 | [[package]] 291 | name = "bit-set" 292 | version = "0.5.3" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 295 | dependencies = [ 296 | "bit-vec", 297 | ] 298 | 299 | [[package]] 300 | name = "bit-vec" 301 | version = "0.6.3" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 304 | 305 | [[package]] 306 | name = "bitflags" 307 | version = "2.6.0" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 310 | 311 | [[package]] 312 | name = "bitvec" 313 | version = "1.0.1" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 316 | dependencies = [ 317 | "funty", 318 | "radium", 319 | "tap", 320 | "wyz", 321 | ] 322 | 323 | [[package]] 324 | name = "block-buffer" 325 | version = "0.10.4" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 328 | dependencies = [ 329 | "generic-array", 330 | ] 331 | 332 | [[package]] 333 | name = "bstr" 334 | version = "1.9.1" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" 337 | dependencies = [ 338 | "memchr", 339 | "regex-automata", 340 | "serde", 341 | ] 342 | 343 | [[package]] 344 | name = "byte-slice-cast" 345 | version = "1.2.2" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" 348 | 349 | [[package]] 350 | name = "byteorder" 351 | version = "1.5.0" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 354 | 355 | [[package]] 356 | name = "bytes" 357 | version = "1.6.0" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 360 | dependencies = [ 361 | "serde", 362 | ] 363 | 364 | [[package]] 365 | name = "cc" 366 | version = "1.0.104" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" 369 | 370 | [[package]] 371 | name = "cfg-if" 372 | version = "1.0.0" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 375 | 376 | [[package]] 377 | name = "clap" 378 | version = "4.5.4" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" 381 | dependencies = [ 382 | "clap_builder", 383 | "clap_derive", 384 | ] 385 | 386 | [[package]] 387 | name = "clap_builder" 388 | version = "4.5.2" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" 391 | dependencies = [ 392 | "anstream", 393 | "anstyle", 394 | "clap_lex", 395 | "strsim", 396 | ] 397 | 398 | [[package]] 399 | name = "clap_derive" 400 | version = "4.5.4" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" 403 | dependencies = [ 404 | "heck", 405 | "proc-macro2", 406 | "quote", 407 | "syn 2.0.66", 408 | ] 409 | 410 | [[package]] 411 | name = "clap_lex" 412 | version = "0.7.0" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 415 | 416 | [[package]] 417 | name = "color-eyre" 418 | version = "0.6.3" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" 421 | dependencies = [ 422 | "backtrace", 423 | "color-spantrace", 424 | "eyre", 425 | "indenter", 426 | "once_cell", 427 | "owo-colors", 428 | "tracing-error", 429 | ] 430 | 431 | [[package]] 432 | name = "color-spantrace" 433 | version = "0.2.1" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" 436 | dependencies = [ 437 | "once_cell", 438 | "owo-colors", 439 | "tracing-core", 440 | "tracing-error", 441 | ] 442 | 443 | [[package]] 444 | name = "colorchoice" 445 | version = "1.0.1" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" 448 | 449 | [[package]] 450 | name = "const-hex" 451 | version = "1.12.0" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" 454 | dependencies = [ 455 | "cfg-if", 456 | "cpufeatures", 457 | "hex", 458 | "proptest", 459 | "serde", 460 | ] 461 | 462 | [[package]] 463 | name = "const-oid" 464 | version = "0.9.6" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 467 | 468 | [[package]] 469 | name = "convert_case" 470 | version = "0.4.0" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 473 | 474 | [[package]] 475 | name = "cpufeatures" 476 | version = "0.2.12" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 479 | dependencies = [ 480 | "libc", 481 | ] 482 | 483 | [[package]] 484 | name = "crunchy" 485 | version = "0.2.2" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 488 | 489 | [[package]] 490 | name = "crypto-bigint" 491 | version = "0.5.5" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 494 | dependencies = [ 495 | "generic-array", 496 | "rand_core", 497 | "subtle", 498 | "zeroize", 499 | ] 500 | 501 | [[package]] 502 | name = "crypto-common" 503 | version = "0.1.6" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 506 | dependencies = [ 507 | "generic-array", 508 | "typenum", 509 | ] 510 | 511 | [[package]] 512 | name = "der" 513 | version = "0.7.9" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 516 | dependencies = [ 517 | "const-oid", 518 | "zeroize", 519 | ] 520 | 521 | [[package]] 522 | name = "derivative" 523 | version = "2.2.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 526 | dependencies = [ 527 | "proc-macro2", 528 | "quote", 529 | "syn 1.0.109", 530 | ] 531 | 532 | [[package]] 533 | name = "derive_more" 534 | version = "0.99.18" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 537 | dependencies = [ 538 | "convert_case", 539 | "proc-macro2", 540 | "quote", 541 | "rustc_version 0.4.0", 542 | "syn 2.0.66", 543 | ] 544 | 545 | [[package]] 546 | name = "difflib" 547 | version = "0.4.0" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" 550 | 551 | [[package]] 552 | name = "digest" 553 | version = "0.9.0" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 556 | dependencies = [ 557 | "generic-array", 558 | ] 559 | 560 | [[package]] 561 | name = "digest" 562 | version = "0.10.7" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 565 | dependencies = [ 566 | "block-buffer", 567 | "const-oid", 568 | "crypto-common", 569 | "subtle", 570 | ] 571 | 572 | [[package]] 573 | name = "doc-comment" 574 | version = "0.3.3" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 577 | 578 | [[package]] 579 | name = "ecdsa" 580 | version = "0.16.9" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 583 | dependencies = [ 584 | "der", 585 | "digest 0.10.7", 586 | "elliptic-curve", 587 | "rfc6979", 588 | "signature", 589 | "spki", 590 | ] 591 | 592 | [[package]] 593 | name = "either" 594 | version = "1.13.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 597 | 598 | [[package]] 599 | name = "elliptic-curve" 600 | version = "0.13.8" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 603 | dependencies = [ 604 | "base16ct", 605 | "crypto-bigint", 606 | "digest 0.10.7", 607 | "ff", 608 | "generic-array", 609 | "group", 610 | "pkcs8", 611 | "rand_core", 612 | "sec1", 613 | "subtle", 614 | "zeroize", 615 | ] 616 | 617 | [[package]] 618 | name = "equivalent" 619 | version = "1.0.1" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 622 | 623 | [[package]] 624 | name = "errno" 625 | version = "0.3.9" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 628 | dependencies = [ 629 | "libc", 630 | "windows-sys", 631 | ] 632 | 633 | [[package]] 634 | name = "eyre" 635 | version = "0.6.12" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" 638 | dependencies = [ 639 | "indenter", 640 | "once_cell", 641 | ] 642 | 643 | [[package]] 644 | name = "fastrand" 645 | version = "2.1.0" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 648 | 649 | [[package]] 650 | name = "fastrlp" 651 | version = "0.3.1" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" 654 | dependencies = [ 655 | "arrayvec", 656 | "auto_impl", 657 | "bytes", 658 | ] 659 | 660 | [[package]] 661 | name = "ff" 662 | version = "0.13.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" 665 | dependencies = [ 666 | "rand_core", 667 | "subtle", 668 | ] 669 | 670 | [[package]] 671 | name = "fixed-hash" 672 | version = "0.8.0" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" 675 | dependencies = [ 676 | "byteorder", 677 | "rand", 678 | "rustc-hex", 679 | "static_assertions", 680 | ] 681 | 682 | [[package]] 683 | name = "fnv" 684 | version = "1.0.7" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 687 | 688 | [[package]] 689 | name = "funty" 690 | version = "2.0.0" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 693 | 694 | [[package]] 695 | name = "generic-array" 696 | version = "0.14.7" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 699 | dependencies = [ 700 | "typenum", 701 | "version_check", 702 | "zeroize", 703 | ] 704 | 705 | [[package]] 706 | name = "getrandom" 707 | version = "0.2.15" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 710 | dependencies = [ 711 | "cfg-if", 712 | "libc", 713 | "wasi", 714 | ] 715 | 716 | [[package]] 717 | name = "gimli" 718 | version = "0.28.1" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 721 | 722 | [[package]] 723 | name = "group" 724 | version = "0.13.0" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 727 | dependencies = [ 728 | "ff", 729 | "rand_core", 730 | "subtle", 731 | ] 732 | 733 | [[package]] 734 | name = "hashbrown" 735 | version = "0.14.5" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 738 | 739 | [[package]] 740 | name = "heck" 741 | version = "0.5.0" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 744 | 745 | [[package]] 746 | name = "hex" 747 | version = "0.4.3" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 750 | dependencies = [ 751 | "serde", 752 | ] 753 | 754 | [[package]] 755 | name = "hex-literal" 756 | version = "0.4.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" 759 | 760 | [[package]] 761 | name = "hmac" 762 | version = "0.12.1" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 765 | dependencies = [ 766 | "digest 0.10.7", 767 | ] 768 | 769 | [[package]] 770 | name = "impl-codec" 771 | version = "0.6.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" 774 | dependencies = [ 775 | "parity-scale-codec", 776 | ] 777 | 778 | [[package]] 779 | name = "impl-trait-for-tuples" 780 | version = "0.2.2" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" 783 | dependencies = [ 784 | "proc-macro2", 785 | "quote", 786 | "syn 1.0.109", 787 | ] 788 | 789 | [[package]] 790 | name = "indenter" 791 | version = "0.3.3" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 794 | 795 | [[package]] 796 | name = "indexmap" 797 | version = "2.2.6" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 800 | dependencies = [ 801 | "equivalent", 802 | "hashbrown", 803 | ] 804 | 805 | [[package]] 806 | name = "is_terminal_polyfill" 807 | version = "1.70.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 810 | 811 | [[package]] 812 | name = "itertools" 813 | version = "0.10.5" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 816 | dependencies = [ 817 | "either", 818 | ] 819 | 820 | [[package]] 821 | name = "itoa" 822 | version = "1.0.11" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 825 | 826 | [[package]] 827 | name = "k256" 828 | version = "0.13.3" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" 831 | dependencies = [ 832 | "cfg-if", 833 | "ecdsa", 834 | "elliptic-curve", 835 | "once_cell", 836 | "sha2", 837 | "signature", 838 | ] 839 | 840 | [[package]] 841 | name = "keccak" 842 | version = "0.1.5" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" 845 | dependencies = [ 846 | "cpufeatures", 847 | ] 848 | 849 | [[package]] 850 | name = "keccak-asm" 851 | version = "0.1.1" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" 854 | dependencies = [ 855 | "digest 0.10.7", 856 | "sha3-asm", 857 | ] 858 | 859 | [[package]] 860 | name = "lazy_static" 861 | version = "1.5.0" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 864 | 865 | [[package]] 866 | name = "libc" 867 | version = "0.2.155" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 870 | 871 | [[package]] 872 | name = "libm" 873 | version = "0.2.8" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 876 | 877 | [[package]] 878 | name = "linux-raw-sys" 879 | version = "0.4.14" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 882 | 883 | [[package]] 884 | name = "memchr" 885 | version = "2.7.2" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 888 | 889 | [[package]] 890 | name = "miniz_oxide" 891 | version = "0.7.4" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 894 | dependencies = [ 895 | "adler", 896 | ] 897 | 898 | [[package]] 899 | name = "num-bigint" 900 | version = "0.4.6" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 903 | dependencies = [ 904 | "num-integer", 905 | "num-traits", 906 | ] 907 | 908 | [[package]] 909 | name = "num-integer" 910 | version = "0.1.46" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 913 | dependencies = [ 914 | "num-traits", 915 | ] 916 | 917 | [[package]] 918 | name = "num-traits" 919 | version = "0.2.19" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 922 | dependencies = [ 923 | "autocfg", 924 | "libm", 925 | ] 926 | 927 | [[package]] 928 | name = "object" 929 | version = "0.32.2" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 932 | dependencies = [ 933 | "memchr", 934 | ] 935 | 936 | [[package]] 937 | name = "once_cell" 938 | version = "1.19.0" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 941 | 942 | [[package]] 943 | name = "owo-colors" 944 | version = "3.5.0" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 947 | 948 | [[package]] 949 | name = "parity-scale-codec" 950 | version = "3.6.12" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" 953 | dependencies = [ 954 | "arrayvec", 955 | "bitvec", 956 | "byte-slice-cast", 957 | "impl-trait-for-tuples", 958 | "parity-scale-codec-derive", 959 | "serde", 960 | ] 961 | 962 | [[package]] 963 | name = "parity-scale-codec-derive" 964 | version = "3.6.12" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" 967 | dependencies = [ 968 | "proc-macro-crate", 969 | "proc-macro2", 970 | "quote", 971 | "syn 1.0.109", 972 | ] 973 | 974 | [[package]] 975 | name = "paste" 976 | version = "1.0.15" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 979 | 980 | [[package]] 981 | name = "pest" 982 | version = "2.7.10" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" 985 | dependencies = [ 986 | "memchr", 987 | "thiserror", 988 | "ucd-trie", 989 | ] 990 | 991 | [[package]] 992 | name = "pin-project-lite" 993 | version = "0.2.14" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 996 | 997 | [[package]] 998 | name = "pkcs8" 999 | version = "0.10.2" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1002 | dependencies = [ 1003 | "der", 1004 | "spki", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "ppv-lite86" 1009 | version = "0.2.17" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1012 | 1013 | [[package]] 1014 | name = "predicates" 1015 | version = "3.1.0" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" 1018 | dependencies = [ 1019 | "anstyle", 1020 | "difflib", 1021 | "predicates-core", 1022 | ] 1023 | 1024 | [[package]] 1025 | name = "predicates-core" 1026 | version = "1.0.6" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" 1029 | 1030 | [[package]] 1031 | name = "predicates-tree" 1032 | version = "1.0.9" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" 1035 | dependencies = [ 1036 | "predicates-core", 1037 | "termtree", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "primitive-types" 1042 | version = "0.12.2" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" 1045 | dependencies = [ 1046 | "fixed-hash", 1047 | "impl-codec", 1048 | "uint", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "proc-macro-crate" 1053 | version = "3.1.0" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" 1056 | dependencies = [ 1057 | "toml_edit", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "proc-macro2" 1062 | version = "1.0.84" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" 1065 | dependencies = [ 1066 | "unicode-ident", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "proptest" 1071 | version = "1.5.0" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" 1074 | dependencies = [ 1075 | "bit-set", 1076 | "bit-vec", 1077 | "bitflags", 1078 | "lazy_static", 1079 | "num-traits", 1080 | "rand", 1081 | "rand_chacha", 1082 | "rand_xorshift", 1083 | "regex-syntax", 1084 | "rusty-fork", 1085 | "tempfile", 1086 | "unarray", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "quick-error" 1091 | version = "1.2.3" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1094 | 1095 | [[package]] 1096 | name = "quote" 1097 | version = "1.0.36" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1100 | dependencies = [ 1101 | "proc-macro2", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "radium" 1106 | version = "0.7.0" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 1109 | 1110 | [[package]] 1111 | name = "rand" 1112 | version = "0.8.5" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1115 | dependencies = [ 1116 | "libc", 1117 | "rand_chacha", 1118 | "rand_core", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "rand_chacha" 1123 | version = "0.3.1" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1126 | dependencies = [ 1127 | "ppv-lite86", 1128 | "rand_core", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "rand_core" 1133 | version = "0.6.4" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1136 | dependencies = [ 1137 | "getrandom", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "rand_xorshift" 1142 | version = "0.3.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" 1145 | dependencies = [ 1146 | "rand_core", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "regex-automata" 1151 | version = "0.4.7" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 1154 | 1155 | [[package]] 1156 | name = "regex-syntax" 1157 | version = "0.8.4" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 1160 | 1161 | [[package]] 1162 | name = "rfc6979" 1163 | version = "0.4.0" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 1166 | dependencies = [ 1167 | "hmac", 1168 | "subtle", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "rlp" 1173 | version = "0.5.2" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" 1176 | dependencies = [ 1177 | "bytes", 1178 | "rustc-hex", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "ruint" 1183 | version = "1.12.3" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" 1186 | dependencies = [ 1187 | "alloy-rlp", 1188 | "ark-ff 0.3.0", 1189 | "ark-ff 0.4.2", 1190 | "bytes", 1191 | "fastrlp", 1192 | "num-bigint", 1193 | "num-traits", 1194 | "parity-scale-codec", 1195 | "primitive-types", 1196 | "proptest", 1197 | "rand", 1198 | "rlp", 1199 | "ruint-macro", 1200 | "serde", 1201 | "valuable", 1202 | "zeroize", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "ruint-macro" 1207 | version = "1.2.1" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" 1210 | 1211 | [[package]] 1212 | name = "rustc-demangle" 1213 | version = "0.1.24" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1216 | 1217 | [[package]] 1218 | name = "rustc-hex" 1219 | version = "2.1.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" 1222 | 1223 | [[package]] 1224 | name = "rustc_version" 1225 | version = "0.3.3" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" 1228 | dependencies = [ 1229 | "semver 0.11.0", 1230 | ] 1231 | 1232 | [[package]] 1233 | name = "rustc_version" 1234 | version = "0.4.0" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1237 | dependencies = [ 1238 | "semver 1.0.23", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "rustix" 1243 | version = "0.38.34" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 1246 | dependencies = [ 1247 | "bitflags", 1248 | "errno", 1249 | "libc", 1250 | "linux-raw-sys", 1251 | "windows-sys", 1252 | ] 1253 | 1254 | [[package]] 1255 | name = "rusty-fork" 1256 | version = "0.3.0" 1257 | source = "registry+https://github.com/rust-lang/crates.io-index" 1258 | checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" 1259 | dependencies = [ 1260 | "fnv", 1261 | "quick-error", 1262 | "tempfile", 1263 | "wait-timeout", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "ryu" 1268 | version = "1.0.18" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1271 | 1272 | [[package]] 1273 | name = "sec1" 1274 | version = "0.7.3" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 1277 | dependencies = [ 1278 | "base16ct", 1279 | "der", 1280 | "generic-array", 1281 | "pkcs8", 1282 | "subtle", 1283 | "zeroize", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "semver" 1288 | version = "0.11.0" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" 1291 | dependencies = [ 1292 | "semver-parser", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "semver" 1297 | version = "1.0.23" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 1300 | 1301 | [[package]] 1302 | name = "semver-parser" 1303 | version = "0.10.2" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" 1306 | dependencies = [ 1307 | "pest", 1308 | ] 1309 | 1310 | [[package]] 1311 | name = "serde" 1312 | version = "1.0.203" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" 1315 | dependencies = [ 1316 | "serde_derive", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "serde_derive" 1321 | version = "1.0.203" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" 1324 | dependencies = [ 1325 | "proc-macro2", 1326 | "quote", 1327 | "syn 2.0.66", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "serde_json" 1332 | version = "1.0.120" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" 1335 | dependencies = [ 1336 | "itoa", 1337 | "ryu", 1338 | "serde", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "sha2" 1343 | version = "0.10.8" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1346 | dependencies = [ 1347 | "cfg-if", 1348 | "cpufeatures", 1349 | "digest 0.10.7", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "sha3" 1354 | version = "0.10.8" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 1357 | dependencies = [ 1358 | "digest 0.10.7", 1359 | "keccak", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "sha3-asm" 1364 | version = "0.1.1" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" 1367 | dependencies = [ 1368 | "cc", 1369 | "cfg-if", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "sharded-slab" 1374 | version = "0.1.7" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1377 | dependencies = [ 1378 | "lazy_static", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "signature" 1383 | version = "2.2.0" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1386 | dependencies = [ 1387 | "digest 0.10.7", 1388 | "rand_core", 1389 | ] 1390 | 1391 | [[package]] 1392 | name = "spki" 1393 | version = "0.7.3" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1396 | dependencies = [ 1397 | "base64ct", 1398 | "der", 1399 | ] 1400 | 1401 | [[package]] 1402 | name = "static_assertions" 1403 | version = "1.1.0" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1406 | 1407 | [[package]] 1408 | name = "strsim" 1409 | version = "0.11.1" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1412 | 1413 | [[package]] 1414 | name = "subtle" 1415 | version = "2.5.0" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1418 | 1419 | [[package]] 1420 | name = "syn" 1421 | version = "1.0.109" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1424 | dependencies = [ 1425 | "proc-macro2", 1426 | "quote", 1427 | "unicode-ident", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "syn" 1432 | version = "2.0.66" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" 1435 | dependencies = [ 1436 | "proc-macro2", 1437 | "quote", 1438 | "unicode-ident", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "tap" 1443 | version = "1.0.1" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 1446 | 1447 | [[package]] 1448 | name = "tempfile" 1449 | version = "3.10.1" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1452 | dependencies = [ 1453 | "cfg-if", 1454 | "fastrand", 1455 | "rustix", 1456 | "windows-sys", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "termtree" 1461 | version = "0.4.1" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" 1464 | 1465 | [[package]] 1466 | name = "thiserror" 1467 | version = "1.0.61" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 1470 | dependencies = [ 1471 | "thiserror-impl", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "thiserror-impl" 1476 | version = "1.0.61" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 1479 | dependencies = [ 1480 | "proc-macro2", 1481 | "quote", 1482 | "syn 2.0.66", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "thread_local" 1487 | version = "1.1.8" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1490 | dependencies = [ 1491 | "cfg-if", 1492 | "once_cell", 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "tiny-keccak" 1497 | version = "2.0.2" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 1500 | dependencies = [ 1501 | "crunchy", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "toml_datetime" 1506 | version = "0.6.6" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" 1509 | 1510 | [[package]] 1511 | name = "toml_edit" 1512 | version = "0.21.1" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" 1515 | dependencies = [ 1516 | "indexmap", 1517 | "toml_datetime", 1518 | "winnow", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "tracing" 1523 | version = "0.1.40" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1526 | dependencies = [ 1527 | "pin-project-lite", 1528 | "tracing-core", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "tracing-core" 1533 | version = "0.1.32" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1536 | dependencies = [ 1537 | "once_cell", 1538 | "valuable", 1539 | ] 1540 | 1541 | [[package]] 1542 | name = "tracing-error" 1543 | version = "0.2.0" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" 1546 | dependencies = [ 1547 | "tracing", 1548 | "tracing-subscriber", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "tracing-subscriber" 1553 | version = "0.3.18" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1556 | dependencies = [ 1557 | "sharded-slab", 1558 | "thread_local", 1559 | "tracing-core", 1560 | ] 1561 | 1562 | [[package]] 1563 | name = "tx-util" 1564 | version = "0.1.0" 1565 | dependencies = [ 1566 | "alloy-primitives", 1567 | "assert_cmd", 1568 | "clap", 1569 | "color-eyre", 1570 | "hex", 1571 | "k256", 1572 | "serde", 1573 | "serde_json", 1574 | "sha3", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "typenum" 1579 | version = "1.17.0" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1582 | 1583 | [[package]] 1584 | name = "ucd-trie" 1585 | version = "0.1.6" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" 1588 | 1589 | [[package]] 1590 | name = "uint" 1591 | version = "0.9.5" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" 1594 | dependencies = [ 1595 | "byteorder", 1596 | "crunchy", 1597 | "hex", 1598 | "static_assertions", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "unarray" 1603 | version = "0.1.4" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" 1606 | 1607 | [[package]] 1608 | name = "unicode-ident" 1609 | version = "1.0.12" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1612 | 1613 | [[package]] 1614 | name = "utf8parse" 1615 | version = "0.2.1" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1618 | 1619 | [[package]] 1620 | name = "valuable" 1621 | version = "0.1.0" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 1624 | 1625 | [[package]] 1626 | name = "version_check" 1627 | version = "0.9.4" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1630 | 1631 | [[package]] 1632 | name = "wait-timeout" 1633 | version = "0.2.0" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 1636 | dependencies = [ 1637 | "libc", 1638 | ] 1639 | 1640 | [[package]] 1641 | name = "wasi" 1642 | version = "0.11.0+wasi-snapshot-preview1" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1645 | 1646 | [[package]] 1647 | name = "windows-sys" 1648 | version = "0.52.0" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1651 | dependencies = [ 1652 | "windows-targets", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "windows-targets" 1657 | version = "0.52.5" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 1660 | dependencies = [ 1661 | "windows_aarch64_gnullvm", 1662 | "windows_aarch64_msvc", 1663 | "windows_i686_gnu", 1664 | "windows_i686_gnullvm", 1665 | "windows_i686_msvc", 1666 | "windows_x86_64_gnu", 1667 | "windows_x86_64_gnullvm", 1668 | "windows_x86_64_msvc", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "windows_aarch64_gnullvm" 1673 | version = "0.52.5" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 1676 | 1677 | [[package]] 1678 | name = "windows_aarch64_msvc" 1679 | version = "0.52.5" 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" 1681 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 1682 | 1683 | [[package]] 1684 | name = "windows_i686_gnu" 1685 | version = "0.52.5" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 1688 | 1689 | [[package]] 1690 | name = "windows_i686_gnullvm" 1691 | version = "0.52.5" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 1694 | 1695 | [[package]] 1696 | name = "windows_i686_msvc" 1697 | version = "0.52.5" 1698 | source = "registry+https://github.com/rust-lang/crates.io-index" 1699 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 1700 | 1701 | [[package]] 1702 | name = "windows_x86_64_gnu" 1703 | version = "0.52.5" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 1706 | 1707 | [[package]] 1708 | name = "windows_x86_64_gnullvm" 1709 | version = "0.52.5" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 1712 | 1713 | [[package]] 1714 | name = "windows_x86_64_msvc" 1715 | version = "0.52.5" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 1718 | 1719 | [[package]] 1720 | name = "winnow" 1721 | version = "0.5.40" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 1724 | dependencies = [ 1725 | "memchr", 1726 | ] 1727 | 1728 | [[package]] 1729 | name = "wyz" 1730 | version = "0.5.1" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 1733 | dependencies = [ 1734 | "tap", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "zeroize" 1739 | version = "1.8.1" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1742 | dependencies = [ 1743 | "zeroize_derive", 1744 | ] 1745 | 1746 | [[package]] 1747 | name = "zeroize_derive" 1748 | version = "1.4.2" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" 1751 | dependencies = [ 1752 | "proc-macro2", 1753 | "quote", 1754 | "syn 2.0.66", 1755 | ] 1756 | --------------------------------------------------------------------------------