Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[kms] Add feature to sign ethereum transaction #276

Merged
merged 22 commits into from
Jun 16, 2024
11 changes: 10 additions & 1 deletion kms/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,27 @@ serde_json = "1.0"
thiserror = "1.0"
prost-types = "0.12"

# ethereum
ethers-core = { version = "2.0", optional = true}
ethers-signers = { version = "2.0", optional = true}
async-trait = { version = "0.1", optional = true }
k256 = { version = "0.13", features = ["pem"], optional = true}

[dev-dependencies]
tokio = { version="1.32", features=["rt-multi-thread"] }
serial_test = "3.1"
tracing-subscriber = { version="0.3.17", features=["env-filter"]}
ctor = "0.1"
tokio-util = {version ="0.7", features = ["codec"] }
google-cloud-auth = { path = "../foundation/auth", default-features=false }
hex-literal = "0.4"
ethers = "2.0"

[features]
default = ["default-tls", "auth"]
default-tls = ["google-cloud-auth?/default-tls"]
rustls-tls = ["google-cloud-auth?/rustls-tls"]
trace = []
auth = ["google-cloud-auth"]
external-account = ["google-cloud-auth?/external-account"]
external-account = ["google-cloud-auth?/external-account"]
eth = ["ethers-core", "ethers-signers", "async-trait", "k256"]
44 changes: 43 additions & 1 deletion kms/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ google-cloud-kms = "version"

// list
match client
.list_key_rings(
.list_key_rings(
ListKeyRingsRequest {
parent: "projects/qovery-gcp-tests/locations/europe-west9".to_string(),
page_size: 5,
Expand Down Expand Up @@ -121,3 +121,45 @@ google-cloud-kms = "version"
}
Err(err) => panic!("err: {:?}", err),
}
}
```

### Ethereum Integration

Enable 'eth' feature.

```toml
[dependencies]
google-cloud-kms = { version="version", features=["eth"] }
```

```rust
use ethers::prelude::SignerMiddleware;
use ethers::providers::{Http, Middleware, Provider};
use ethers_core::types::{TransactionReceipt, TransactionRequest};
use ethers_signers::Signer as EthSigner;
use google_cloud_kms::client::Client;
use google_cloud_kms::signer::ethereum::{Error, Signer};

pub async fn send_bnb(client: Client, key_name: &str, rpc_node: &str) {

// BSC testnet
let chain_id = 97;

let signer = Signer::new(client, key_name, chain_id, None).await.unwrap();
let provider = Provider::<Http>::try_from(rpc_node).unwrap();

let signer_address = signer.address();
let eth_client = SignerMiddleware::new_with_provider_chain(provider, signer).await.unwrap();

let tx = TransactionRequest::new()
.to(signer_address)
.value(100_000_000_000_000_u128)
.gas(1_500_000_u64)
.gas_price(4_000_000_000_u64)
.chain_id(chain_id);

let res = eth_client.send_transaction(tx, None).await.unwrap();
let receipt: TransactionReceipt = res.confirmations(3).await.unwrap().unwrap();
}
```
3 changes: 1 addition & 2 deletions kms/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ impl Default for ClientConfig {
}
}

#[derive(Clone)]
#[derive(Clone, Debug)]
pub struct Client {
kms_client: KmsGrpcClient,
}
Expand Down Expand Up @@ -93,7 +93,6 @@ impl Deref for Client {

#[cfg(test)]
mod tests {

use serial_test::serial;

use crate::grpc::kms::v1::{
Expand Down
2 changes: 1 addition & 1 deletion kms/src/grpc/apiv1/kms_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ fn default_setting() -> RetrySetting {
}
}

#[derive(Clone)]
#[derive(Clone, Debug)]
pub struct Client {
cm: Arc<ConnectionManager>,
}
Expand Down
40 changes: 39 additions & 1 deletion kms/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
//!
//! #### Key ring operations
//!
//! ```rust
//! ```
//! use std::collections::HashMap;
//! use prost_types::FieldMask;
//! use google_cloud_googleapis::cloud::kms::v1::{CreateKeyRingRequest, GetKeyRingRequest, ListKeyRingsRequest};
Expand Down Expand Up @@ -111,5 +111,43 @@
//! Err(err) => panic!("err: {:?}", err),
//! }
//!}
//!```
//!
//! ### Ethereum Integration
//!
//! Enable 'eth' feature.
//! google-cloud-kms = { version="version", features=["eth"] }
//!
//! ```
//! use ethers::prelude::SignerMiddleware;
//! use ethers::providers::{Http, Middleware, Provider};
//! use ethers_core::types::{TransactionReceipt, TransactionRequest};
//! use ethers_signers::Signer as EthSigner;
//! use google_cloud_kms::client::Client;
//! use google_cloud_kms::signer::ethereum::{Error, Signer};
//!
//! pub async fn send_bnb(client: Client, key_name: &str, rpc_node: &str) {
//!
//! // BSC testnet
//! let chain_id = 97;
//!
//! let signer = Signer::new(client, key_name, chain_id, None).await.unwrap();
//! let provider = Provider::<Http>::try_from(rpc_node).unwrap();
//! let signer_address = signer.address();
//!
//! let eth_client = SignerMiddleware::new_with_provider_chain(provider, signer).await.unwrap();
//!
//! let tx = TransactionRequest::new()
//! .to(signer_address)
//! .value(100_000_000_000_000_u128)
//! .gas(1_500_000_u64)
//! .gas_price(4_000_000_000_u64)
//! .chain_id(chain_id);
//!
//! let res = eth_client.send_transaction(tx, None).await.unwrap();
//! let receipt: TransactionReceipt = res.confirmations(3).await.unwrap().unwrap();
//! }
//! ```
pub mod client;
pub mod grpc;
pub mod signer;
Loading