From 804d1dba7c482c8cbd0d745efdec641cecbc385c Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 3 Jun 2025 14:45:09 -0500 Subject: [PATCH 01/12] example/opacity --- contracts/opacity_verifier/Cargo.toml | 6 ++++++ contracts/opacity_verifier/src/lib.rs | 15 +++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 contracts/opacity_verifier/Cargo.toml create mode 100644 contracts/opacity_verifier/src/lib.rs diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml new file mode 100644 index 00000000..d37d3659 --- /dev/null +++ b/contracts/opacity_verifier/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "opacity_verifier" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/contracts/opacity_verifier/src/lib.rs b/contracts/opacity_verifier/src/lib.rs new file mode 100644 index 00000000..4930ec8a --- /dev/null +++ b/contracts/opacity_verifier/src/lib.rs @@ -0,0 +1,15 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} + From 64ff113b4abdd325e6b5eb190d8460bcda1c2b6f Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 26 Jun 2025 18:54:24 +0100 Subject: [PATCH 02/12] signature verification --- contracts/opacity_verifier/Cargo.toml | 19 +++++- contracts/opacity_verifier/examples/schema.rs | 10 ++++ contracts/opacity_verifier/src/contract.rs | 58 +++++++++++++++++++ contracts/opacity_verifier/src/error.rs | 16 +++++ contracts/opacity_verifier/src/lib.rs | 21 +++---- contracts/opacity_verifier/src/msg.rs | 30 ++++++++++ contracts/opacity_verifier/src/query.rs | 36 ++++++++++++ contracts/opacity_verifier/src/state.rs | 6 ++ 8 files changed, 181 insertions(+), 15 deletions(-) create mode 100644 contracts/opacity_verifier/examples/schema.rs create mode 100644 contracts/opacity_verifier/src/contract.rs create mode 100644 contracts/opacity_verifier/src/error.rs create mode 100644 contracts/opacity_verifier/src/msg.rs create mode 100644 contracts/opacity_verifier/src/query.rs create mode 100644 contracts/opacity_verifier/src/state.rs diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index d37d3659..69a0af39 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -1,6 +1,23 @@ [package] name = "opacity_verifier" version = "0.1.0" -edition = "2024" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# enable feature if you want to disable entry points +library = [] [dependencies] +alloy-signer = "1.0.13" +hex = { workspace = true } +cosmwasm-std = { workspace = true } +cosmwasm-schema = { workspace = true } +cw-storage-plus = { workspace = true } +thiserror = { workspace = true } +alloy-primitives = "1.2.1" +cw2 = { workspace = true } + diff --git a/contracts/opacity_verifier/examples/schema.rs b/contracts/opacity_verifier/examples/schema.rs new file mode 100644 index 00000000..32fa0452 --- /dev/null +++ b/contracts/opacity_verifier/examples/schema.rs @@ -0,0 +1,10 @@ +use cosmwasm_schema::write_api; +use opacity_verifier::msg::*; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + query: QueryMsg, + execute: ExecuteMsg, + }; +} diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs new file mode 100644 index 00000000..550d1821 --- /dev/null +++ b/contracts/opacity_verifier/src/contract.rs @@ -0,0 +1,58 @@ +use cosmwasm_std::{to_json_binary, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdResult}; +use crate::error::{ContractError, ContractResult}; +use crate::msg::{QueryMsg, ExecuteMsg, InstantiateMsg}; +use crate::{query, CONTRACT_NAME, CONTRACT_VERSION}; +use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn instantiate( + deps: DepsMut, + _env: Env, + _info: MessageInfo, + msg: InstantiateMsg, +) -> ContractResult { + cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; + ADMIN.save(deps.storage, &msg.admin)?; + for key in msg.allow_list { + VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, key, &Empty{})?; + } + Ok(Response::new().add_event(Event::new("create_opacity_verifier").add_attributes( vec![ + ("admin", msg.admin.into_string()), + ]))) +} + + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn execute( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> ContractResult { + let admin = ADMIN.load(deps.storage)?; + if info.sender != admin { + return Err(ContractError::Unauthorized {}); + } + match msg { + ExecuteMsg::UpdateAdmin { admin } => { + ADMIN.save(deps.storage, &admin)?; + } + ExecuteMsg::UpdateAllowList { keys } => { + VERIFICATION_KEY_ALLOW_LIST.clear(deps.storage); + for key in keys { + VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, key, &Empty{})?; + } + } + } + Ok(Response::default()) +} + +#[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::Verify { signature, message } => to_json_binary( + &query::verify_query(deps.storage, signature, message)?), + QueryMsg::VerificationKeys {} => to_json_binary(&query::verification_keys(deps.storage)?), + QueryMsg::Admin {} => to_json_binary(&query::admin(deps.storage)?), + } +} \ No newline at end of file diff --git a/contracts/opacity_verifier/src/error.rs b/contracts/opacity_verifier/src/error.rs new file mode 100644 index 00000000..867a7af7 --- /dev/null +++ b/contracts/opacity_verifier/src/error.rs @@ -0,0 +1,16 @@ +#[derive(Debug, thiserror::Error)] +pub enum ContractError { + #[error(transparent)] + Std(#[from] cosmwasm_std::StdError), + + #[error(transparent)] + HexError(#[from] hex::FromHexError), + + #[error(transparent)] + AlloySignatureError(#[from] alloy_primitives::SignatureError), + + #[error("only the admin can call this method")] + Unauthorized, +} + +pub type ContractResult = Result; diff --git a/contracts/opacity_verifier/src/lib.rs b/contracts/opacity_verifier/src/lib.rs index 4930ec8a..3d8b0457 100644 --- a/contracts/opacity_verifier/src/lib.rs +++ b/contracts/opacity_verifier/src/lib.rs @@ -1,15 +1,8 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub mod contract; +pub mod msg; +mod query; +mod state; +mod error; +pub const CONTRACT_NAME: &str = "opacity_verifier"; +pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/contracts/opacity_verifier/src/msg.rs b/contracts/opacity_verifier/src/msg.rs new file mode 100644 index 00000000..dddae094 --- /dev/null +++ b/contracts/opacity_verifier/src/msg.rs @@ -0,0 +1,30 @@ +use cosmwasm_std::Addr; +use cosmwasm_schema::{cw_serde, QueryResponses}; + +#[cw_serde] +pub struct InstantiateMsg { + pub admin: Addr, + pub allow_list: Vec, +} + +#[cw_serde] +pub enum ExecuteMsg { + UpdateAdmin { admin: Addr }, + UpdateAllowList { keys: Vec }, +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(bool)] + Verify { + signature: String, + message: String, + }, + + #[returns(Vec)] + VerificationKeys {}, + + #[returns(Addr)] + Admin {} +} \ No newline at end of file diff --git a/contracts/opacity_verifier/src/query.rs b/contracts/opacity_verifier/src/query.rs new file mode 100644 index 00000000..401af200 --- /dev/null +++ b/contracts/opacity_verifier/src/query.rs @@ -0,0 +1,36 @@ +use alloy_signer::Signature; +use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; +use crate::error::ContractResult; +use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; + +pub fn verify(store: &dyn Storage, signature: String, message: String) -> ContractResult { + // 1. Get the signature and message from the response + let signature_hex = signature.trim_start_matches("0x"); + let signature_bytes = hex::decode(signature_hex)?; + + // 2. Recover the public key + let signature = Signature::try_from(signature_bytes.as_slice())?; + let recovered_address = signature.recover_address_from_msg(message.as_bytes())?; + + // 3. Fetch and check against allowlist + let key_found = VERIFICATION_KEY_ALLOW_LIST.has(store, recovered_address.to_string()); + Ok(key_found) +} + +pub fn verify_query(store: &dyn Storage, signature: String, message: String) -> StdResult { + match verify(store, signature, message) { + Ok(b) => Ok(b), + Err(error) => Err(StdError::generic_err(error.to_string())), + } +} + +pub fn verification_keys(store: &dyn Storage) -> StdResult> { + Ok(VERIFICATION_KEY_ALLOW_LIST + .keys(store, None, None, Order::Ascending) + .map(|k| k.unwrap()) + .collect()) +} + +pub fn admin(store: &dyn Storage) -> StdResult { + ADMIN.load(store) +} \ No newline at end of file diff --git a/contracts/opacity_verifier/src/state.rs b/contracts/opacity_verifier/src/state.rs new file mode 100644 index 00000000..d57c8a98 --- /dev/null +++ b/contracts/opacity_verifier/src/state.rs @@ -0,0 +1,6 @@ +use cosmwasm_std::{Addr, Empty}; +use cw_storage_plus::{Item, Map}; + +pub const VERIFICATION_KEY_ALLOW_LIST: Map = Map::new("verification_key_allow_list"); + +pub const ADMIN: Item = Item::new("admin"); \ No newline at end of file From 141f949d428408ed2bfa2603a4173dc69cee511a Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 30 Jun 2025 12:30:37 +0200 Subject: [PATCH 03/12] opacity verification --- contracts/opacity_hash_map/Cargo.toml | 20 +++++ contracts/opacity_hash_map/examples/schema.rs | 11 +++ contracts/opacity_hash_map/src/contract.rs | 76 +++++++++++++++++++ contracts/opacity_hash_map/src/error.rs | 13 ++++ contracts/opacity_hash_map/src/lib.rs | 7 ++ contracts/opacity_hash_map/src/msg.rs | 27 +++++++ contracts/opacity_hash_map/src/state.rs | 7 ++ contracts/opacity_verifier/Cargo.toml | 2 + contracts/opacity_verifier/src/contract.rs | 51 +++++++++++++ contracts/opacity_verifier/src/msg.rs | 2 +- contracts/opacity_verifier/src/query.rs | 6 +- 11 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 contracts/opacity_hash_map/Cargo.toml create mode 100644 contracts/opacity_hash_map/examples/schema.rs create mode 100644 contracts/opacity_hash_map/src/contract.rs create mode 100644 contracts/opacity_hash_map/src/error.rs create mode 100644 contracts/opacity_hash_map/src/lib.rs create mode 100644 contracts/opacity_hash_map/src/msg.rs create mode 100644 contracts/opacity_hash_map/src/state.rs diff --git a/contracts/opacity_hash_map/Cargo.toml b/contracts/opacity_hash_map/Cargo.toml new file mode 100644 index 00000000..5d417675 --- /dev/null +++ b/contracts/opacity_hash_map/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "opacity-hash-map" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +# enable feature if you want to disable entry points +library = [] + +[dependencies] +cosmwasm-schema = { workspace = true } +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } +thiserror = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +opacity_verifier = { path = "../opacity_verifier", features = ["library"] } \ No newline at end of file diff --git a/contracts/opacity_hash_map/examples/schema.rs b/contracts/opacity_hash_map/examples/schema.rs new file mode 100644 index 00000000..30af25ca --- /dev/null +++ b/contracts/opacity_hash_map/examples/schema.rs @@ -0,0 +1,11 @@ +use cosmwasm_schema::write_api; +use opacity_hash_map::msg::*; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + query: QueryMsg, + execute: ExecuteMsg, + migrate: MigrateMsg, + }; +} diff --git a/contracts/opacity_hash_map/src/contract.rs b/contracts/opacity_hash_map/src/contract.rs new file mode 100644 index 00000000..bad575d7 --- /dev/null +++ b/contracts/opacity_hash_map/src/contract.rs @@ -0,0 +1,76 @@ +use crate::error::ContractError; +use crate::error::ContractResult; +use crate::msg::InstantiateMsg; +use crate::msg::{ExecuteMsg, QueryMsg}; +use crate::state::{USER_MAP, OPACITY_VERIFIER}; +use cosmwasm_std::{entry_point, to_json_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult, WasmMsg}; +use serde_json::Value; +use crate::error::ContractError::VerificationError; + +#[entry_point] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + OPACITY_VERIFIER.save(deps.storage, &msg.opacity_verifier)?; + Ok(Response::new() + .add_attribute("method", "instantiate") + .add_attribute("owner", info.sender)) +} +#[entry_point] +pub fn execute( + deps: DepsMut, + _: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> ContractResult { + match msg { + ExecuteMsg::Update { message, signature } => { + // validate JSON + let value = serde_json::from_str::(&message)?; + + let verified: bool = deps.querier.query_wasm_smart( + OPACITY_VERIFIER.load(deps.storage)?, + &opacity_verifier::msg::QueryMsg::Verify { + message, + signature + } + )?; + + if verified { + USER_MAP.save(deps.storage, info.sender, &value)?; + } else { + return Err(VerificationError) + } + + Ok(Response::default()) + } + } +} + +#[entry_point] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::GetValueByUser { address } => { + let value = USER_MAP.load(deps.storage, address)?; + to_json_binary(&value) + } + QueryMsg::GetUsers {} => { + let mut addrs: Vec = Vec::new(); + for addr in USER_MAP.keys(deps.storage, None, None, Order::Ascending) { + addrs.push(addr?) + } + to_json_binary(&addrs) + } + QueryMsg::GetMap {} => { + let mut response: Vec<(Addr, Value)> = Vec::new(); + for item in USER_MAP.range(deps.storage, None, None, Order::Ascending) { + let (key, value) = item?; + response.push((key, value)) + } + to_json_binary(&response) + } + } +} diff --git a/contracts/opacity_hash_map/src/error.rs b/contracts/opacity_hash_map/src/error.rs new file mode 100644 index 00000000..d659af97 --- /dev/null +++ b/contracts/opacity_hash_map/src/error.rs @@ -0,0 +1,13 @@ +#[derive(Debug, thiserror::Error)] +pub enum ContractError { + #[error(transparent)] + Std(#[from] cosmwasm_std::StdError), + + #[error(transparent)] + JsonError(#[from] serde_json::Error), + + #[error("Invalid proof")] + VerificationError +} + +pub type ContractResult = Result; diff --git a/contracts/opacity_hash_map/src/lib.rs b/contracts/opacity_hash_map/src/lib.rs new file mode 100644 index 00000000..4708c2c4 --- /dev/null +++ b/contracts/opacity_hash_map/src/lib.rs @@ -0,0 +1,7 @@ +extern crate core; + +#[cfg(not(feature = "library"))] +pub mod contract; +mod error; +pub mod msg; +mod state; diff --git a/contracts/opacity_hash_map/src/msg.rs b/contracts/opacity_hash_map/src/msg.rs new file mode 100644 index 00000000..142772ff --- /dev/null +++ b/contracts/opacity_hash_map/src/msg.rs @@ -0,0 +1,27 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::Addr; +use opacity_verifier::msg::QueryMsg::Verify; + +#[cw_serde] +pub struct InstantiateMsg { + pub opacity_verifier: Addr, +} + +#[cw_serde] +pub enum ExecuteMsg { + Update { message: String, signature: String }, +} + +#[cw_serde] +#[derive(QueryResponses)] +pub enum QueryMsg { + #[returns(Vec)] + GetUsers {}, + #[returns(String)] + GetValueByUser { address: Addr }, + #[returns(Vec<(Addr, String)>)] + GetMap {}, +} + +#[cw_serde] +pub struct MigrateMsg {} diff --git a/contracts/opacity_hash_map/src/state.rs b/contracts/opacity_hash_map/src/state.rs new file mode 100644 index 00000000..4026177a --- /dev/null +++ b/contracts/opacity_hash_map/src/state.rs @@ -0,0 +1,7 @@ +use cosmwasm_std::Addr; +use cw_storage_plus::{Item, Map}; +use serde_json::Value; + +pub const USER_MAP: Map = Map::new("user_map"); + +pub const OPACITY_VERIFIER: Item = Item::new("opacity_verifier"); \ No newline at end of file diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index 69a0af39..d5b00036 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -21,3 +21,5 @@ thiserror = { workspace = true } alloy-primitives = "1.2.1" cw2 = { workspace = true } +[dev-dependencies] +cw-orch = "0.28.0" \ No newline at end of file diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs index 550d1821..61bcd6f9 100644 --- a/contracts/opacity_verifier/src/contract.rs +++ b/contracts/opacity_verifier/src/contract.rs @@ -55,4 +55,55 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { QueryMsg::VerificationKeys {} => to_json_binary(&query::verification_keys(deps.storage)?), QueryMsg::Admin {} => to_json_binary(&query::admin(deps.storage)?), } +} + +#[cfg(test)] +mod tests { + use std::fmt::format; + use super::*; + use cosmwasm_std::{Addr}; + use cw_orch::interface; + use cw_orch::prelude::*; + + #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] + pub struct OpacityVerifier; + + impl Uploadable for OpacityVerifier { + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty( + crate::contract::execute, + crate::contract::instantiate, + crate::contract::query, + ) + ) + } + } + + #[test] + fn test_verify_proof() { + let allowlist_keys_raw = ["322df8c3146a9891c8d63deec562db5f325f7a28","3ac1e280b6b5d8e15cf428229eccb20d9b824a53","5a29af4859ebc29ac0819c178bd293ba7f7bdfcf","9b776cbbd434d7d8f32b8cb369c37442760457b5","90cbfa246fb5bd65192aeaaa41483e311a13f109","ae16d88cd1f4ba016da8909ebc7c9c4a4fb112b8","8a4ca92581fb9b569ef8152c70a031569ee971b5","bdd5b7410abf138da1008906191188f4b5543be7","5d92cf96045bb80d869ee7bfa5d894be4782cfab","7775b5ffbcd55e7fce07672895145c5961ff828f","cf203ffb676fad5c8924ceebe91ebe3e617f01af"]; + let allowlist_keys: Vec = allowlist_keys_raw.iter().map(|x| format!("0x{}", x.to_string())).collect(); + + let sender = Addr::unchecked("sender"); + // Create a new mock chain (backed by cw-multi-test) + let chain = Mock::new(&sender); + + let opacity_verifier: OpacityVerifier = OpacityVerifier::new("opacity_verifier", chain); + opacity_verifier.upload().unwrap(); + + let verifier_init_msg = InstantiateMsg { + admin: sender, + allow_list: allowlist_keys, + }; + + opacity_verifier.instantiate(&verifier_init_msg, None, &[]).unwrap(); + + let verifier_query_msg = QueryMsg::Verify { + signature: "0x67054ee2d920f5fe11e9c34dd20257b4bb7e9549a85aef98be9f98c564838ded3d7a84864342eac1d1991abb4becb82a4cf8476d010dfc05ce973566d1fbffe91c".to_string(), + message: r#"{"body":"{\"login\":\"mvid\",\"id\":74642,\"node_id\":\"MDQ6VXNlcjc0NjQy\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/74642?v=4\",\"gravatar_id\":\"\",\"url\":\"https://api.github.com/users/mvid\",\"html_url\":\"https://github.com/mvid\",\"followers_url\":\"https://api.github.com/users/mvid/followers\",\"following_url\":\"https://api.github.com/users/mvid/following{/other_user}\",\"gists_url\":\"https://api.github.com/users/mvid/gists{/gist_id}\",\"starred_url\":\"https://api.github.com/users/mvid/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/mvid/subscriptions\",\"organizations_url\":\"https://api.github.com/users/mvid/orgs\",\"repos_url\":\"https://api.github.com/users/mvid/repos\",\"events_url\":\"https://api.github.com/users/mvid/events{/privacy}\",\"received_events_url\":\"https://api.github.com/users/mvid/received_events\",\"type\":\"User\",\"user_view_type\":\"private\",\"site_admin\":false,\"name\":\"Mantas Vidutis\",\"company\":\"Turbines Consulting, LLC\",\"blog\":\"turbines.io\",\"location\":\"San Francisco, CA\",\"email\":\"mantas.a.vidutis@gmail.com\",\"hireable\":true,\"bio\":\"Software Consultant\",\"twitter_username\":null,\"notification_email\":\"mantas.a.vidutis@gmail.com\",\"public_repos\":41,\"public_gists\":4,\"followers\":44,\"following\":60,\"created_at\":\"2009-04-17T02:12:05Z\",\"updated_at\":\"2025-06-21T08:03:51Z\",\"private_gists\":24,\"total_private_repos\":6,\"owned_private_repos\":6,\"disk_usage\":38482,\"collaborators\":1,\"two_factor_authentication\":true,\"plan\":{\"name\":\"pro\",\"space\":976562499,\"collaborators\":0,\"private_repos\":9999}}","cookies":{},"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","cache-control":"private, max-age=60, s-maxage=60","content-length":"1497","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Fri, 27 Jun 2025 17:32:15 GMT","etag":"\"a9d561910da5ada4f578f0e92f6af450dd3df9a449030bd90abbc7e6da9bc7df\"","last-modified":"Sat, 21 Jun 2025 08:03:51 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With","x-accepted-oauth-scopes":"","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"793D:54EE8:1DC7644:1E7E84C:685ED59F","x-oauth-client-id":"Ov23liqmohfBdEpL34Ii","x-oauth-scopes":"read:user, user:email","x-ratelimit-limit":"5000","x-ratelimit-remaining":"4999","x-ratelimit-reset":"1751049135","x-ratelimit-resource":"core","x-ratelimit-used":"1","x-xss-protection":"0"},"status":200,"url":"api.github.com/user","url_params":{}}"#.to_string(), + }; + let verification_response: bool = opacity_verifier.query(&verifier_query_msg).unwrap(); + assert!(verification_response) + } } \ No newline at end of file diff --git a/contracts/opacity_verifier/src/msg.rs b/contracts/opacity_verifier/src/msg.rs index dddae094..6e173e64 100644 --- a/contracts/opacity_verifier/src/msg.rs +++ b/contracts/opacity_verifier/src/msg.rs @@ -17,7 +17,7 @@ pub enum ExecuteMsg { #[derive(QueryResponses)] pub enum QueryMsg { #[returns(bool)] - Verify { + Verify { signature: String, message: String, }, diff --git a/contracts/opacity_verifier/src/query.rs b/contracts/opacity_verifier/src/query.rs index 401af200..3f0dae10 100644 --- a/contracts/opacity_verifier/src/query.rs +++ b/contracts/opacity_verifier/src/query.rs @@ -1,4 +1,5 @@ use alloy_signer::Signature; +use alloy_primitives::utils::eip191_hash_message; use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; use crate::error::ContractResult; use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; @@ -11,9 +12,10 @@ pub fn verify(store: &dyn Storage, signature: String, message: String) -> Contra // 2. Recover the public key let signature = Signature::try_from(signature_bytes.as_slice())?; let recovered_address = signature.recover_address_from_msg(message.as_bytes())?; - + let recovered_address_lower = recovered_address.to_string().to_lowercase(); + // 3. Fetch and check against allowlist - let key_found = VERIFICATION_KEY_ALLOW_LIST.has(store, recovered_address.to_string()); + let key_found = VERIFICATION_KEY_ALLOW_LIST.has(store, recovered_address_lower); Ok(key_found) } From 4da4b4775c502e43cbfc7e7d7580c623a2b8fd77 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 30 Jun 2025 17:20:59 +0200 Subject: [PATCH 04/12] disable getrandom --- contracts/opacity_hash_map/src/contract.rs | 2 +- contracts/opacity_hash_map/src/msg.rs | 1 - contracts/opacity_verifier/Cargo.toml | 1 + contracts/opacity_verifier/src/lib.rs | 11 +++++++++++ contracts/opacity_verifier/src/query.rs | 1 - 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/contracts/opacity_hash_map/src/contract.rs b/contracts/opacity_hash_map/src/contract.rs index bad575d7..dfd42415 100644 --- a/contracts/opacity_hash_map/src/contract.rs +++ b/contracts/opacity_hash_map/src/contract.rs @@ -3,7 +3,7 @@ use crate::error::ContractResult; use crate::msg::InstantiateMsg; use crate::msg::{ExecuteMsg, QueryMsg}; use crate::state::{USER_MAP, OPACITY_VERIFIER}; -use cosmwasm_std::{entry_point, to_json_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult, WasmMsg}; +use cosmwasm_std::{entry_point, to_json_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult}; use serde_json::Value; use crate::error::ContractError::VerificationError; diff --git a/contracts/opacity_hash_map/src/msg.rs b/contracts/opacity_hash_map/src/msg.rs index 142772ff..cb9ec9c7 100644 --- a/contracts/opacity_hash_map/src/msg.rs +++ b/contracts/opacity_hash_map/src/msg.rs @@ -1,6 +1,5 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::Addr; -use opacity_verifier::msg::QueryMsg::Verify; #[cw_serde] pub struct InstantiateMsg { diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index d5b00036..c1d09501 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -20,6 +20,7 @@ cw-storage-plus = { workspace = true } thiserror = { workspace = true } alloy-primitives = "1.2.1" cw2 = { workspace = true } +getrandom = { workspace = true } [dev-dependencies] cw-orch = "0.28.0" \ No newline at end of file diff --git a/contracts/opacity_verifier/src/lib.rs b/contracts/opacity_verifier/src/lib.rs index 3d8b0457..9cd2b3a2 100644 --- a/contracts/opacity_verifier/src/lib.rs +++ b/contracts/opacity_verifier/src/lib.rs @@ -6,3 +6,14 @@ mod error; pub const CONTRACT_NAME: &str = "opacity_verifier"; pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); + +// the random function must be disabled in cosmwasm +use core::num::NonZeroU32; +use getrandom::Error; + +pub fn always_fail(_buf: &mut [u8]) -> Result<(), Error> { + let code = NonZeroU32::new(Error::CUSTOM_START).unwrap(); + Err(Error::from(code)) +} +use getrandom::register_custom_getrandom; +register_custom_getrandom!(always_fail); diff --git a/contracts/opacity_verifier/src/query.rs b/contracts/opacity_verifier/src/query.rs index 3f0dae10..c791b126 100644 --- a/contracts/opacity_verifier/src/query.rs +++ b/contracts/opacity_verifier/src/query.rs @@ -1,5 +1,4 @@ use alloy_signer::Signature; -use alloy_primitives::utils::eip191_hash_message; use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; use crate::error::ContractResult; use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; From f453877fef357f51ebc8dadb0453503e3ab818e3 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 30 Jun 2025 18:01:45 +0200 Subject: [PATCH 05/12] update edition --- README.md | 2 +- contracts/opacity_hash_map/Cargo.toml | 2 +- contracts/opacity_verifier/Cargo.toml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 04f84bcf..7f097280 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ node scripts/convert.js docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.16.1 + cosmwasm/optimizer:0.17.0 ``` diff --git a/contracts/opacity_hash_map/Cargo.toml b/contracts/opacity_hash_map/Cargo.toml index 5d417675..a98d603b 100644 --- a/contracts/opacity_hash_map/Cargo.toml +++ b/contracts/opacity_hash_map/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "opacity-hash-map" version = "0.1.0" -edition = "2021" +edition = "2024" [lib] crate-type = ["cdylib", "rlib"] diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index c1d09501..d896c189 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "opacity_verifier" version = "0.1.0" -edition = "2021" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] @@ -12,7 +12,7 @@ crate-type = ["cdylib", "rlib"] library = [] [dependencies] -alloy-signer = "1.0.13" +alloy-signer = "1.0.16" hex = { workspace = true } cosmwasm-std = { workspace = true } cosmwasm-schema = { workspace = true } From d53b851d1852d9e831221e9b7078bb5d32b326e6 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 30 Jun 2025 19:05:53 +0200 Subject: [PATCH 06/12] recover addr directly --- README.md | 2 +- contracts/opacity_verifier/Cargo.toml | 3 +- contracts/opacity_verifier/src/contract.rs | 13 +++-- contracts/opacity_verifier/src/error.rs | 14 ++++- contracts/opacity_verifier/src/eth_crypto.rs | 56 ++++++++++++++++++++ contracts/opacity_verifier/src/lib.rs | 1 + contracts/opacity_verifier/src/query.rs | 29 ++++++---- 7 files changed, 96 insertions(+), 22 deletions(-) create mode 100644 contracts/opacity_verifier/src/eth_crypto.rs diff --git a/README.md b/README.md index 7f097280..04f84bcf 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ node scripts/convert.js docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/optimizer:0.17.0 + cosmwasm/optimizer:0.16.1 ``` diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index d896c189..ef2531b8 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -12,15 +12,14 @@ crate-type = ["cdylib", "rlib"] library = [] [dependencies] -alloy-signer = "1.0.16" hex = { workspace = true } cosmwasm-std = { workspace = true } cosmwasm-schema = { workspace = true } cw-storage-plus = { workspace = true } thiserror = { workspace = true } -alloy-primitives = "1.2.1" cw2 = { workspace = true } getrandom = { workspace = true } +tiny-keccak = { workspace = true } [dev-dependencies] cw-orch = "0.28.0" \ No newline at end of file diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs index 61bcd6f9..b8cbd150 100644 --- a/contracts/opacity_verifier/src/contract.rs +++ b/contracts/opacity_verifier/src/contract.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{to_json_binary, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdResult}; +use cosmwasm_std::{to_json_binary, Api, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdResult}; use crate::error::{ContractError, ContractResult}; use crate::msg::{QueryMsg, ExecuteMsg, InstantiateMsg}; use crate::{query, CONTRACT_NAME, CONTRACT_VERSION}; @@ -51,7 +51,7 @@ pub fn execute( pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { match msg { QueryMsg::Verify { signature, message } => to_json_binary( - &query::verify_query(deps.storage, signature, message)?), + &query::verify_query(deps.storage, deps.api, signature, message)?), QueryMsg::VerificationKeys {} => to_json_binary(&query::verification_keys(deps.storage)?), QueryMsg::Admin {} => to_json_binary(&query::admin(deps.storage)?), } @@ -59,7 +59,6 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { #[cfg(test)] mod tests { - use std::fmt::format; use super::*; use cosmwasm_std::{Addr}; use cw_orch::interface; @@ -72,9 +71,9 @@ mod tests { fn wrapper() -> Box> { Box::new( ContractWrapper::new_with_empty( - crate::contract::execute, - crate::contract::instantiate, - crate::contract::query, + execute, + instantiate, + query, ) ) } @@ -83,7 +82,7 @@ mod tests { #[test] fn test_verify_proof() { let allowlist_keys_raw = ["322df8c3146a9891c8d63deec562db5f325f7a28","3ac1e280b6b5d8e15cf428229eccb20d9b824a53","5a29af4859ebc29ac0819c178bd293ba7f7bdfcf","9b776cbbd434d7d8f32b8cb369c37442760457b5","90cbfa246fb5bd65192aeaaa41483e311a13f109","ae16d88cd1f4ba016da8909ebc7c9c4a4fb112b8","8a4ca92581fb9b569ef8152c70a031569ee971b5","bdd5b7410abf138da1008906191188f4b5543be7","5d92cf96045bb80d869ee7bfa5d894be4782cfab","7775b5ffbcd55e7fce07672895145c5961ff828f","cf203ffb676fad5c8924ceebe91ebe3e617f01af"]; - let allowlist_keys: Vec = allowlist_keys_raw.iter().map(|x| format!("0x{}", x.to_string())).collect(); + let allowlist_keys: Vec = allowlist_keys_raw.iter().map(|x| x.to_string()).collect(); let sender = Addr::unchecked("sender"); // Create a new mock chain (backed by cw-multi-test) diff --git a/contracts/opacity_verifier/src/error.rs b/contracts/opacity_verifier/src/error.rs index 867a7af7..ed0973b9 100644 --- a/contracts/opacity_verifier/src/error.rs +++ b/contracts/opacity_verifier/src/error.rs @@ -7,10 +7,22 @@ pub enum ContractError { HexError(#[from] hex::FromHexError), #[error(transparent)] - AlloySignatureError(#[from] alloy_primitives::SignatureError), + UTF8Error(#[from] std::str::Utf8Error), + + #[error(transparent)] + RecoverPubkeyError(#[from] cosmwasm_std::RecoverPubkeyError), + + // #[error(transparent)] + // AlloySignatureError(#[from] alloy_primitives::SignatureError), #[error("only the admin can call this method")] Unauthorized, + + #[error("short signature")] + ShortSignature, + + #[error("recovery id can only be one of 0, 1, 27, 28")] + InvalidRecoveryId, } pub type ContractResult = Result; diff --git a/contracts/opacity_verifier/src/eth_crypto.rs b/contracts/opacity_verifier/src/eth_crypto.rs new file mode 100644 index 00000000..abbf1594 --- /dev/null +++ b/contracts/opacity_verifier/src/eth_crypto.rs @@ -0,0 +1,56 @@ +//! An Ethereum signature has a total length of 65 parts, consisting of three +//! parts: +//! - r: 32 bytes +//! - s: 32 bytes +//! - v: 1 byte +//! +//! r and s together are known as the recoverable signature. v is known as the +//! recovery id, which can take the value of one of 0, 1, 27, and 28. +//! +//! In order to verify a signature, we attempt to recover the signer's pubkey. +//! If the recovered key matches the signer's address, we consider the signature +//! valid. +//! +//! The address is the last 20 bytes of the hash keccak256(pubkey_bytes). +//! +//! Before a message is signed, it is prefixed with the bytes: b"\x19Ethereum Signed Message:\n". +//! +//! Adapted from +//! - sig verification: +//! https://github.com/gakonst/ethers-rs/blob/master/ethers-core/src/types/signature.rs +//! - hash: +//! https://github.com/gakonst/ethers-rs/blob/master/ethers-core/src/utils/hash.rs + +use tiny_keccak::{Hasher, Keccak}; + +use crate::error::{ContractError, ContractResult}; + +pub fn hash_message(msg: &[u8]) -> [u8; 32] { + const PREFIX: &str = "\x19Ethereum Signed Message:\n"; + + let mut bytes = vec![]; + bytes.extend_from_slice(PREFIX.as_bytes()); + bytes.extend_from_slice(msg.len().to_string().as_bytes()); + bytes.extend_from_slice(msg); + + keccak256(&bytes) +} + +pub fn keccak256(bytes: &[u8]) -> [u8; 32] { + let mut output = [0u8; 32]; + + let mut hasher = Keccak::v256(); + hasher.update(bytes); + hasher.finalize(&mut output); + + output +} + +pub fn normalize_recovery_id(id: u8) -> ContractResult { + match id { + 0 | 1 => Ok(id), + 27 => Ok(0), + 28 => Ok(1), + _ => Err(ContractError::InvalidRecoveryId), + } +} diff --git a/contracts/opacity_verifier/src/lib.rs b/contracts/opacity_verifier/src/lib.rs index 9cd2b3a2..524f4315 100644 --- a/contracts/opacity_verifier/src/lib.rs +++ b/contracts/opacity_verifier/src/lib.rs @@ -3,6 +3,7 @@ pub mod msg; mod query; mod state; mod error; +mod eth_crypto; pub const CONTRACT_NAME: &str = "opacity_verifier"; pub const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/contracts/opacity_verifier/src/query.rs b/contracts/opacity_verifier/src/query.rs index c791b126..77b51553 100644 --- a/contracts/opacity_verifier/src/query.rs +++ b/contracts/opacity_verifier/src/query.rs @@ -1,25 +1,32 @@ -use alloy_signer::Signature; -use cosmwasm_std::{Addr, Order, StdError, StdResult, Storage}; -use crate::error::ContractResult; +use cosmwasm_std::{Addr, Api, Order, StdError, StdResult, Storage}; +use crate::error::{ContractError, ContractResult}; use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; -pub fn verify(store: &dyn Storage, signature: String, message: String) -> ContractResult { +pub fn verify(api: &dyn Api, store: &dyn Storage, signature: String, message: String) -> ContractResult { // 1. Get the signature and message from the response let signature_hex = signature.trim_start_matches("0x"); - let signature_bytes = hex::decode(signature_hex)?; + let sig_bytes = hex::decode(signature_hex)?; + if sig_bytes.len() < 65 { + return Err(ContractError::ShortSignature); + } // 2. Recover the public key - let signature = Signature::try_from(signature_bytes.as_slice())?; - let recovered_address = signature.recover_address_from_msg(message.as_bytes())?; - let recovered_address_lower = recovered_address.to_string().to_lowercase(); - + let msg_hash_bytes = crate::eth_crypto::hash_message(message.as_bytes()); + let recoverable_sig = &sig_bytes[..64]; + let recovery_id = crate::eth_crypto::normalize_recovery_id(sig_bytes[64])?; + + let pk_bytes = api.secp256k1_recover_pubkey(&msg_hash_bytes, recoverable_sig, recovery_id)?; + let hash = crate::eth_crypto::keccak256(&pk_bytes[1..]); + let recovered_addr = &hash[12..]; + let recovered_address_lower = hex::encode(recovered_addr); + // 3. Fetch and check against allowlist let key_found = VERIFICATION_KEY_ALLOW_LIST.has(store, recovered_address_lower); Ok(key_found) } -pub fn verify_query(store: &dyn Storage, signature: String, message: String) -> StdResult { - match verify(store, signature, message) { +pub fn verify_query(store: &dyn Storage, api: &dyn Api, signature: String, message: String) -> StdResult { + match verify(api, store, signature, message) { Ok(b) => Ok(b), Err(error) => Err(StdError::generic_err(error.to_string())), } From 609897eceeb1cb278e8148b87a938d6b8f2b291a Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 30 Jun 2025 21:02:20 +0200 Subject: [PATCH 07/12] inline eth resolver --- Cargo.toml | 4 ++-- contracts/opacity_hash_map/Cargo.toml | 5 +++-- contracts/opacity_verifier/Cargo.toml | 9 +++++---- contracts/opacity_verifier/src/contract.rs | 2 +- contracts/treasury/Cargo.toml | 3 ++- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4874cc87..80ad61f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "contracts/*", ] +resolver = "2" [profile.release] opt-level = 3 # Use slightly better optimizations. @@ -13,7 +14,6 @@ cosmwasm-schema = "2.1.1" cosmwasm-std = { version = "2.1.1", features = ["stargate", "cosmwasm_2_0"] } cw2 = "2.0.0" cw-storage-plus = "2.0.0" -cw-utils = "2.0.0" hex = "0.4" sha2 = { version = "0.10.8", features = ["oid"]} thiserror = "1" @@ -24,9 +24,9 @@ schemars = "0.8.10" ripemd = "0.1.3" bech32 = "0.9.1" base64 = "0.21.4" -phf = { version = "0.11.2", features = ["macros"] } rsa = { version = "0.9.2" } getrandom = { version = "0.2.10", features = ["custom"] } p256 = {version = "0.13.2", features = ["ecdsa-core", "arithmetic", "serde"]} cosmos-sdk-proto = {package = "xion-cosmos-sdk-proto", version = "0.26.1", default-features = false, features = ["std", "cosmwasm", "xion", "serde"]} url = "2.5.2" +base64ct = "=1.7.2" # can't upgrade until after version 2024 \ No newline at end of file diff --git a/contracts/opacity_hash_map/Cargo.toml b/contracts/opacity_hash_map/Cargo.toml index a98d603b..7936798d 100644 --- a/contracts/opacity_hash_map/Cargo.toml +++ b/contracts/opacity_hash_map/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "opacity-hash-map" version = "0.1.0" -edition = "2024" +edition = "2021" [lib] crate-type = ["cdylib", "rlib"] @@ -17,4 +17,5 @@ cw-storage-plus = { workspace = true } thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -opacity_verifier = { path = "../opacity_verifier", features = ["library"] } \ No newline at end of file +opacity_verifier = { path = "../opacity_verifier", features = ["library"] } +base64ct = { workspace = true } \ No newline at end of file diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index ef2531b8..cdf1aec7 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "opacity_verifier" version = "0.1.0" -edition = "2024" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] @@ -12,14 +12,15 @@ crate-type = ["cdylib", "rlib"] library = [] [dependencies] -hex = { workspace = true } -cosmwasm-std = { workspace = true } +hex = { workspace = true } +cosmwasm-std = { workspace = true } cosmwasm-schema = { workspace = true } cw-storage-plus = { workspace = true } thiserror = { workspace = true } cw2 = { workspace = true } -getrandom = { workspace = true } +getrandom = { workspace = true } tiny-keccak = { workspace = true } +base64ct = { workspace = true } [dev-dependencies] cw-orch = "0.28.0" \ No newline at end of file diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs index b8cbd150..b1bdbbd7 100644 --- a/contracts/opacity_verifier/src/contract.rs +++ b/contracts/opacity_verifier/src/contract.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{to_json_binary, Api, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdResult}; +use cosmwasm_std::{to_json_binary, Binary, Deps, DepsMut, Empty, Env, Event, MessageInfo, Response, StdResult}; use crate::error::{ContractError, ContractResult}; use crate::msg::{QueryMsg, ExecuteMsg, InstantiateMsg}; use crate::{query, CONTRACT_NAME, CONTRACT_VERSION}; diff --git a/contracts/treasury/Cargo.toml b/contracts/treasury/Cargo.toml index 12bfa79e..0caede53 100644 --- a/contracts/treasury/Cargo.toml +++ b/contracts/treasury/Cargo.toml @@ -21,4 +21,5 @@ serde = { workspace = true } serde_json = { workspace = true } schemars = { workspace = true } cosmos-sdk-proto = { workspace = true } -url = { workspace = true } \ No newline at end of file +url = { workspace = true } +base64ct = { workspace = true } \ No newline at end of file From bd4d3842cbf2ab6537b4cfb09fa6642320cf103e Mon Sep 17 00:00:00 2001 From: Ash Date: Wed, 8 Oct 2025 11:55:49 -0700 Subject: [PATCH 08/12] update --- Cargo.lock | 395 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 392 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e87368f..b5aa06da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,31 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "abstract-cw-multi-test" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e09b032e3379899df1872e6a8e38ce31d1d446bb26adfe7d3ff432b0fe0bf4c1" +dependencies = [ + "anyhow", + "bech32 0.11.0", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw-utils", + "cw20-ics20", + "hex", + "itertools 0.13.0", + "log", + "prost", + "schemars", + "serde", + "serde_json", + "sha2", + "thiserror", + "tiny-keccak", +] + [[package]] name = "ahash" version = "0.8.12" @@ -173,9 +198,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "8faa168b8c4ffca39c2699e772943af41ec2b75fb1683dda07b28a6d285c53dc" [[package]] name = "bech32" @@ -189,6 +214,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + [[package]] name = "block-buffer" version = "0.10.4" @@ -231,6 +262,25 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "cosmos-sdk-proto" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d0afc4daf81936e6ef5a2cf76f00c913ba5bc385d58ae1e09644e25d16b0381" +dependencies = [ + "prost", + "tendermint-proto 0.39.1", +] + [[package]] name = "cosmwasm-core" version = "2.2.2" @@ -409,6 +459,110 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "cw-controllers" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c1804013d21060b994dea28a080f9eab78a3bcb6b617f05e7634b0600bf7b1" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "cw-utils", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-orch" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb8dfb35ae85f05874dcb6b2526b41dfa9007db83a3ccad451b4536a544cc1c" +dependencies = [ + "anyhow", + "cosmwasm-std", + "cw-orch-contract-derive", + "cw-orch-core", + "cw-orch-fns-derive", + "cw-orch-mock", + "cw-orch-traits", + "cw-utils", + "hex", + "log", + "schemars", + "serde", + "thiserror", +] + +[[package]] +name = "cw-orch-contract-derive" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad52865e313bb7ed3f3938f7ad9d566e430fb6143a63476c22bed505ea78cd7" +dependencies = [ + "convert_case", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "cw-orch-core" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd60ffab817101418b26b6bceadfdfc430dad4219c7e4cd972f8838e21190981" +dependencies = [ + "abstract-cw-multi-test", + "anyhow", + "cosmos-sdk-proto", + "cosmwasm-std", + "cw-storage-plus", + "cw-utils", + "dirs", + "log", + "serde", + "serde_json", + "sha2", + "thiserror", +] + +[[package]] +name = "cw-orch-fns-derive" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194e944e6bcb51a53f99e2b0a510ecc8919605b9a83d93641748cf1b163315f6" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "cw-orch-mock" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce639c909e59fc1505f56772b9a37057a54d3c5a20f7a4c197cd518a27ce9770" +dependencies = [ + "abstract-cw-multi-test", + "cosmwasm-std", + "cw-orch-core", + "cw-utils", + "log", + "serde", + "sha2", +] + +[[package]] +name = "cw-orch-traits" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ccb1670cc49a7a10c425ba1072cb607eb00d8085f97692877b9bdb00d14dd3d" +dependencies = [ + "cw-orch-core", + "prost-types", +] + [[package]] name = "cw-storage-plus" version = "2.0.0" @@ -420,6 +574,19 @@ dependencies = [ "serde", ] +[[package]] +name = "cw-utils" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07dfee7f12f802431a856984a32bce1cb7da1e6c006b5409e3981035ce562dec" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw2" version = "2.0.0" @@ -435,6 +602,38 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw20" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a42212b6bf29bbdda693743697c621894723f35d3db0d5df930be22903d0e27c" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-utils", + "schemars", + "serde", +] + +[[package]] +name = "cw20-ics20" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80a9e377dbbd1ffb3b6a8a2dbf9128609a6458a3292f88f99e0b6840a7e9762e" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-controllers", + "cw-storage-plus", + "cw-utils", + "cw2", + "cw20", + "schemars", + "semver", + "serde", + "thiserror", +] + [[package]] name = "der" version = "0.7.10" @@ -499,6 +698,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -809,6 +1029,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -857,12 +1086,28 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", +] + [[package]] name = "litemap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + [[package]] name = "memchr" version = "2.7.5" @@ -938,6 +1183,42 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "opacity-hash-map" +version = "0.1.0" +dependencies = [ + "base64ct", + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "opacity_verifier", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "opacity_verifier" +version = "0.1.0" +dependencies = [ + "base64ct", + "cosmwasm-schema", + "cosmwasm-std", + "cw-orch", + "cw-storage-plus", + "cw2", + "getrandom", + "hex", + "thiserror", + "tiny-keccak", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "p256" version = "0.13.2" @@ -1059,6 +1340,15 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + [[package]] name = "quote" version = "1.0.40" @@ -1117,6 +1407,17 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1424,6 +1725,21 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "tendermint-proto" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3abf34ecf33125621519e9952688e7a59a98232d51538037ba21fbe526a802" +dependencies = [ + "bytes", + "flex-error", + "prost", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + [[package]] name = "tendermint-proto" version = "0.40.4" @@ -1511,6 +1827,7 @@ dependencies = [ name = "treasury" version = "0.1.0" dependencies = [ + "base64ct", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", @@ -1535,6 +1852,12 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -1583,6 +1906,72 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "writeable" version = "0.6.1" @@ -1622,7 +2011,7 @@ dependencies = [ "informalsystems-pbjson", "prost", "serde", - "tendermint-proto", + "tendermint-proto 0.40.4", ] [[package]] From 91e2c244fce322511e49f5d915e6c21dfd7afff3 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 9 Oct 2025 13:41:36 -0700 Subject: [PATCH 09/12] address validation --- Cargo.lock | 3 --- Cargo.toml | 4 ++-- contracts/opacity_verifier/Cargo.toml | 1 - contracts/opacity_verifier/src/contract.rs | 12 ++++++++---- contracts/opacity_verifier/src/msg.rs | 4 ++-- contracts/treasury/Cargo.toml | 1 - {contracts => examples}/opacity_hash_map/Cargo.toml | 3 +-- .../opacity_hash_map/examples/schema.rs | 0 .../opacity_hash_map/src/contract.rs | 0 .../opacity_hash_map/src/error.rs | 0 {contracts => examples}/opacity_hash_map/src/lib.rs | 0 {contracts => examples}/opacity_hash_map/src/msg.rs | 0 .../opacity_hash_map/src/state.rs | 0 13 files changed, 13 insertions(+), 15 deletions(-) rename {contracts => examples}/opacity_hash_map/Cargo.toml (80%) rename {contracts => examples}/opacity_hash_map/examples/schema.rs (100%) rename {contracts => examples}/opacity_hash_map/src/contract.rs (100%) rename {contracts => examples}/opacity_hash_map/src/error.rs (100%) rename {contracts => examples}/opacity_hash_map/src/lib.rs (100%) rename {contracts => examples}/opacity_hash_map/src/msg.rs (100%) rename {contracts => examples}/opacity_hash_map/src/state.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index b5aa06da..300410a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1187,7 +1187,6 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" name = "opacity-hash-map" version = "0.1.0" dependencies = [ - "base64ct", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", @@ -1201,7 +1200,6 @@ dependencies = [ name = "opacity_verifier" version = "0.1.0" dependencies = [ - "base64ct", "cosmwasm-schema", "cosmwasm-std", "cw-orch", @@ -1827,7 +1825,6 @@ dependencies = [ name = "treasury" version = "0.1.0" dependencies = [ - "base64ct", "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", diff --git a/Cargo.toml b/Cargo.toml index 991dacd5..ff180fb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "contracts/*", + "examples/*", ] resolver = "2" @@ -28,5 +29,4 @@ rsa = { version = "0.9.2" } getrandom = { version = "0.2.10", features = ["custom"] } p256 = {version = "0.13.2", features = ["ecdsa-core", "arithmetic", "serde"]} cosmos-sdk-proto = {package = "xion-cosmos-sdk-proto", version = "0.26.1", default-features = false, features = ["std", "cosmwasm", "xion", "serde"]} -url = "2.5.2" -base64ct = "=1.7.2" # can't upgrade until after version 2024 \ No newline at end of file +url = "2.5.2" \ No newline at end of file diff --git a/contracts/opacity_verifier/Cargo.toml b/contracts/opacity_verifier/Cargo.toml index cdf1aec7..fe4c776d 100644 --- a/contracts/opacity_verifier/Cargo.toml +++ b/contracts/opacity_verifier/Cargo.toml @@ -20,7 +20,6 @@ thiserror = { workspace = true } cw2 = { workspace = true } getrandom = { workspace = true } tiny-keccak = { workspace = true } -base64ct = { workspace = true } [dev-dependencies] cw-orch = "0.28.0" \ No newline at end of file diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs index b1bdbbd7..ae9dbe9e 100644 --- a/contracts/opacity_verifier/src/contract.rs +++ b/contracts/opacity_verifier/src/contract.rs @@ -12,12 +12,13 @@ pub fn instantiate( msg: InstantiateMsg, ) -> ContractResult { cw2::set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; - ADMIN.save(deps.storage, &msg.admin)?; + let admin = deps.api.addr_validate(&msg.admin)?; + ADMIN.save(deps.storage, &admin)?; for key in msg.allow_list { VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, key, &Empty{})?; } Ok(Response::new().add_event(Event::new("create_opacity_verifier").add_attributes( vec![ - ("admin", msg.admin.into_string()), + ("admin", admin.to_string()), ]))) } @@ -35,7 +36,8 @@ pub fn execute( } match msg { ExecuteMsg::UpdateAdmin { admin } => { - ADMIN.save(deps.storage, &admin)?; + let new_admin = deps.api.addr_validate(&admin)?; + ADMIN.save(deps.storage, &new_admin)?; } ExecuteMsg::UpdateAllowList { keys } => { VERIFICATION_KEY_ALLOW_LIST.clear(deps.storage); @@ -81,6 +83,7 @@ mod tests { #[test] fn test_verify_proof() { + // response from https://verifier.opacity.network/api/public-keys let allowlist_keys_raw = ["322df8c3146a9891c8d63deec562db5f325f7a28","3ac1e280b6b5d8e15cf428229eccb20d9b824a53","5a29af4859ebc29ac0819c178bd293ba7f7bdfcf","9b776cbbd434d7d8f32b8cb369c37442760457b5","90cbfa246fb5bd65192aeaaa41483e311a13f109","ae16d88cd1f4ba016da8909ebc7c9c4a4fb112b8","8a4ca92581fb9b569ef8152c70a031569ee971b5","bdd5b7410abf138da1008906191188f4b5543be7","5d92cf96045bb80d869ee7bfa5d894be4782cfab","7775b5ffbcd55e7fce07672895145c5961ff828f","cf203ffb676fad5c8924ceebe91ebe3e617f01af"]; let allowlist_keys: Vec = allowlist_keys_raw.iter().map(|x| x.to_string()).collect(); @@ -92,7 +95,8 @@ mod tests { opacity_verifier.upload().unwrap(); let verifier_init_msg = InstantiateMsg { - admin: sender, + // Use a valid bech32 address for admin; this matches the mock sender prefix + admin: "cosmwasm1pgm8hyk0pvphmlvfjc8wsvk4daluz5tgrw6pu5mfpemk74uxnx9qlm3aqg".to_string(), allow_list: allowlist_keys, }; diff --git a/contracts/opacity_verifier/src/msg.rs b/contracts/opacity_verifier/src/msg.rs index 6e173e64..b7213610 100644 --- a/contracts/opacity_verifier/src/msg.rs +++ b/contracts/opacity_verifier/src/msg.rs @@ -3,13 +3,13 @@ use cosmwasm_schema::{cw_serde, QueryResponses}; #[cw_serde] pub struct InstantiateMsg { - pub admin: Addr, + pub admin: String, pub allow_list: Vec, } #[cw_serde] pub enum ExecuteMsg { - UpdateAdmin { admin: Addr }, + UpdateAdmin { admin: String }, UpdateAllowList { keys: Vec }, } diff --git a/contracts/treasury/Cargo.toml b/contracts/treasury/Cargo.toml index 0caede53..67ec5bd5 100644 --- a/contracts/treasury/Cargo.toml +++ b/contracts/treasury/Cargo.toml @@ -22,4 +22,3 @@ serde_json = { workspace = true } schemars = { workspace = true } cosmos-sdk-proto = { workspace = true } url = { workspace = true } -base64ct = { workspace = true } \ No newline at end of file diff --git a/contracts/opacity_hash_map/Cargo.toml b/examples/opacity_hash_map/Cargo.toml similarity index 80% rename from contracts/opacity_hash_map/Cargo.toml rename to examples/opacity_hash_map/Cargo.toml index 7936798d..3729039d 100644 --- a/contracts/opacity_hash_map/Cargo.toml +++ b/examples/opacity_hash_map/Cargo.toml @@ -17,5 +17,4 @@ cw-storage-plus = { workspace = true } thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -opacity_verifier = { path = "../opacity_verifier", features = ["library"] } -base64ct = { workspace = true } \ No newline at end of file +opacity_verifier = { path = "../../contracts/opacity_verifier", features = ["library"] } diff --git a/contracts/opacity_hash_map/examples/schema.rs b/examples/opacity_hash_map/examples/schema.rs similarity index 100% rename from contracts/opacity_hash_map/examples/schema.rs rename to examples/opacity_hash_map/examples/schema.rs diff --git a/contracts/opacity_hash_map/src/contract.rs b/examples/opacity_hash_map/src/contract.rs similarity index 100% rename from contracts/opacity_hash_map/src/contract.rs rename to examples/opacity_hash_map/src/contract.rs diff --git a/contracts/opacity_hash_map/src/error.rs b/examples/opacity_hash_map/src/error.rs similarity index 100% rename from contracts/opacity_hash_map/src/error.rs rename to examples/opacity_hash_map/src/error.rs diff --git a/contracts/opacity_hash_map/src/lib.rs b/examples/opacity_hash_map/src/lib.rs similarity index 100% rename from contracts/opacity_hash_map/src/lib.rs rename to examples/opacity_hash_map/src/lib.rs diff --git a/contracts/opacity_hash_map/src/msg.rs b/examples/opacity_hash_map/src/msg.rs similarity index 100% rename from contracts/opacity_hash_map/src/msg.rs rename to examples/opacity_hash_map/src/msg.rs diff --git a/contracts/opacity_hash_map/src/state.rs b/examples/opacity_hash_map/src/state.rs similarity index 100% rename from contracts/opacity_hash_map/src/state.rs rename to examples/opacity_hash_map/src/state.rs From 87bb5d3e8fd93de24b1b48300b09fb0471246dae Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 9 Oct 2025 13:45:59 -0700 Subject: [PATCH 10/12] verify address structure for signing keys --- contracts/opacity_verifier/src/contract.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/contracts/opacity_verifier/src/contract.rs b/contracts/opacity_verifier/src/contract.rs index ae9dbe9e..eab8e976 100644 --- a/contracts/opacity_verifier/src/contract.rs +++ b/contracts/opacity_verifier/src/contract.rs @@ -4,6 +4,17 @@ use crate::msg::{QueryMsg, ExecuteMsg, InstantiateMsg}; use crate::{query, CONTRACT_NAME, CONTRACT_VERSION}; use crate::state::{ADMIN, VERIFICATION_KEY_ALLOW_LIST}; +fn normalize_addr_hex(s: &str) -> Result { + let s = s.trim_start_matches("0x").to_ascii_lowercase(); + if s.len() != 40 { + return Err(crate::error::ContractError::Std(cosmwasm_std::StdError::generic_err( + "address hex must be 40 chars", + ))); + } + let _ = hex::decode(&s)?; // ensure valid hex + Ok(s) +} + #[cfg_attr(not(feature = "library"), cosmwasm_std::entry_point)] pub fn instantiate( deps: DepsMut, @@ -15,7 +26,8 @@ pub fn instantiate( let admin = deps.api.addr_validate(&msg.admin)?; ADMIN.save(deps.storage, &admin)?; for key in msg.allow_list { - VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, key, &Empty{})?; + let k = normalize_addr_hex(&key)?; + VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, k, &Empty{})?; } Ok(Response::new().add_event(Event::new("create_opacity_verifier").add_attributes( vec![ ("admin", admin.to_string()), @@ -42,7 +54,8 @@ pub fn execute( ExecuteMsg::UpdateAllowList { keys } => { VERIFICATION_KEY_ALLOW_LIST.clear(deps.storage); for key in keys { - VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, key, &Empty{})?; + let k = normalize_addr_hex(&key)?; + VERIFICATION_KEY_ALLOW_LIST.save(deps.storage, k, &Empty{})?; } } } From da30495ca1b5577800b93c655d59db0602c29ec2 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 9 Oct 2025 14:20:06 -0700 Subject: [PATCH 11/12] opacity updated --- Cargo.lock | 2690 +++++++++++++++++++++- examples/opacity_key_updater/Cargo.toml | 19 + examples/opacity_key_updater/README.md | 52 + examples/opacity_key_updater/src/main.rs | 265 +++ 4 files changed, 2914 insertions(+), 112 deletions(-) create mode 100644 examples/opacity_key_updater/Cargo.toml create mode 100644 examples/opacity_key_updater/README.md create mode 100644 examples/opacity_key_updater/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 300410a8..18c37c32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,11 +22,26 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "thiserror", "tiny-keccak", ] +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "ahash" version = "0.8.12" @@ -45,6 +60,21 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.99" @@ -92,7 +122,7 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "digest", + "digest 0.10.7", "itertools 0.10.5", "num-bigint", "num-traits", @@ -146,7 +176,7 @@ checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-serialize-derive", "ark-std", - "digest", + "digest 0.10.7", "num-bigint", ] @@ -172,18 +202,152 @@ dependencies = [ "rayon", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 1.0.2", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals 0.3.0", + "bitcoin_hashes 0.14.0", +] + [[package]] name = "base64" version = "0.21.7" @@ -214,12 +378,121 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bip32" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" +dependencies = [ + "bs58", + "hmac", + "k256", + "rand_core", + "ripemd", + "secp256k1 0.27.0", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "bip39" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand", + "rand_core", + "serde", + "unicode-normalization", +] + +[[package]] +name = "bitcoin" +version = "0.32.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda569d741b895131a88ee5589a467e73e9c4718e958ac9308e4f7dc44b6945" +dependencies = [ + "base58ck", + "bech32 0.11.0", + "bitcoin-internals 0.3.0", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes 0.14.0", + "hex-conservative 0.2.1", + "hex_lit", + "secp256k1 0.29.1", +] + +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals 0.3.0", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals 0.2.0", + "hex-conservative 0.1.2", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.1", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -235,6 +508,21 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e31ea183f6ee62ac8b8a8cf7feddd766317adfb13ff469de57ce033efd6a790" +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2 0.10.9", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "byteorder" version = "1.5.0" @@ -250,12 +538,36 @@ dependencies = [ "serde", ] +[[package]] +name = "cc" +version = "1.2.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link 0.1.3", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -271,6 +583,32 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cosmos-sdk-proto" version = "0.24.0" @@ -279,6 +617,29 @@ checksum = "1d0afc4daf81936e6ef5a2cf76f00c913ba5bc385d58ae1e09644e25d16b0381" dependencies = [ "prost", "tendermint-proto 0.39.1", + "tonic", +] + +[[package]] +name = "cosmrs" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af28a0ee4149da7cea0486fd7e3fbddea7dd81625279fdc521141ffb07fbd482" +dependencies = [ + "bip32", + "cosmos-sdk-proto", + "ecdsa", + "eyre", + "k256", + "rand_core", + "serde", + "serde_json", + "signature", + "subtle-encoding", + "tendermint", + "tendermint-rpc", + "thiserror", + "tokio", ] [[package]] @@ -299,7 +660,7 @@ dependencies = [ "ark-serialize", "cosmwasm-core", "curve25519-dalek", - "digest", + "digest 0.10.7", "ecdsa", "ed25519-zebra", "k256", @@ -307,7 +668,7 @@ dependencies = [ "p256", "rand_core", "rayon", - "sha2", + "sha2 0.10.9", "thiserror", ] @@ -365,7 +726,7 @@ dependencies = [ "schemars", "serde", "serde-json-wasm", - "sha2", + "sha2 0.10.9", "static_assertions", "thiserror", ] @@ -379,6 +740,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -441,7 +811,7 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "rustc_version", "subtle", @@ -459,6 +829,19 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "curve25519-dalek-ng" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core", + "subtle-ng", + "zeroize", +] + [[package]] name = "cw-controllers" version = "2.0.0" @@ -481,11 +864,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bb8dfb35ae85f05874dcb6b2526b41dfa9007db83a3ccad451b4536a544cc1c" dependencies = [ "anyhow", + "cosmrs", "cosmwasm-std", "cw-orch-contract-derive", "cw-orch-core", + "cw-orch-daemon", "cw-orch-fns-derive", "cw-orch-mock", + "cw-orch-networks", "cw-orch-traits", "cw-utils", "hex", @@ -493,6 +879,7 @@ dependencies = [ "schemars", "serde", "thiserror", + "tokio", ] [[package]] @@ -522,8 +909,55 @@ dependencies = [ "log", "serde", "serde_json", - "sha2", + "sha2 0.10.9", + "thiserror", +] + +[[package]] +name = "cw-orch-daemon" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc63b5ac1a6095c0d8803925b08b5353ab3a129f40a9d7d5a61a55c4bd81ae13" +dependencies = [ + "anyhow", + "async-recursion", + "base16", + "base64 0.22.1", + "bech32 0.11.0", + "bip39", + "bitcoin", + "chrono", + "cosmrs", + "cosmwasm-std", + "cw-orch-core", + "cw-orch-networks", + "cw-orch-traits", + "dirs", + "ed25519-dalek", + "eyre", + "file-lock", + "flate2", + "hex", + "http 1.3.1", + "lazy_static", + "libc-print", + "log", + "once_cell", + "prost", + "prost-types", + "rand_core", + "reqwest 0.12.23", + "ring", + "ripemd", + "schemars", + "serde", + "serde_json", + "sha2 0.10.9", "thiserror", + "tokio", + "toml", + "tonic", + "uid", ] [[package]] @@ -550,7 +984,17 @@ dependencies = [ "cw-utils", "log", "serde", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "cw-orch-networks" +version = "0.24.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab644b0b5a6c7450d18e04874e569b27464fdb0a3c90732f5f94b895f627892e" +dependencies = [ + "cw-orch-core", + "serde", ] [[package]] @@ -686,13 +1130,22 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -716,7 +1169,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -743,7 +1196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "serdect", @@ -757,9 +1210,38 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ + "pkcs8", + "serde", "signature", ] +[[package]] +name = "ed25519-consensus" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" +dependencies = [ + "curve25519-dalek-ng", + "hex", + "rand_core", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + [[package]] name = "ed25519-zebra" version = "4.0.3" @@ -771,7 +1253,7 @@ dependencies = [ "hashbrown 0.14.5", "hex", "rand_core", - "sha2", + "sha2 0.10.9", "zeroize", ] @@ -789,7 +1271,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -802,6 +1284,47 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "ff" version = "0.13.1" @@ -818,15 +1341,63 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "file-lock" +version = "2.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "040b48f80a749da50292d0f47a1e2d5bf1d772f52836c07f64bfccc62ba6e664" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "flex-error" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c606d892c9de11507fa0dcffc116434f94e105d0bbdc4e405b61519464c49d7b" dependencies = [ + "eyre", "paste", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -836,6 +1407,67 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -852,12 +1484,32 @@ name = "getrandom" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "group" version = "0.13.0" @@ -869,6 +1521,50 @@ dependencies = [ "subtle", ] +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.11.4", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap 2.11.4", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -888,19 +1584,270 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + [[package]] name = "hmac" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.7.0", + "hyper-util", + "rustls 0.23.32", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.7.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.5.10", + "system-configuration 0.6.1", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", ] [[package]] @@ -1011,31 +1958,84 @@ dependencies = [ ] [[package]] -name = "informalsystems-pbjson" -version = "0.7.0" +name = "indenter" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" -dependencies = [ - "base64 0.21.7", - "serde", -] +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] -name = "itertools" -version = "0.10.5" +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "either", + "autocfg", + "hashbrown 0.12.3", ] [[package]] -name = "itertools" -version = "0.13.0" +name = "indexmap" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ - "either", + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "informalsystems-pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa4a0980c8379295100d70854354e78df2ee1c6ca0f96ffe89afeb3140e3a3d" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", ] [[package]] @@ -1053,6 +2053,16 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "k256" version = "0.13.4" @@ -1062,7 +2072,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -1080,6 +2090,15 @@ version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +[[package]] +name = "libc-print" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a660208db49e35faf57b37484350f1a61072f2a5becf0592af6015d9ddd4b0" +dependencies = [ + "libc", +] + [[package]] name = "libm" version = "0.2.15" @@ -1092,28 +2111,93 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags", + "bitflags 2.9.4", "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + [[package]] name = "litemap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -1177,6 +2261,15 @@ dependencies = [ "libm", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -1196,6 +2289,23 @@ dependencies = [ "thiserror", ] +[[package]] +name = "opacity_key_updater" +version = "0.1.0" +dependencies = [ + "cosmwasm-std", + "cw-orch", + "hex", + "opacity_verifier", + "reqwest 0.11.27", + "serde", + "serde_json", + "sha2 0.10.9", + "thiserror", + "tokio", + "url", +] + [[package]] name = "opacity_verifier" version = "0.1.0" @@ -1205,12 +2315,62 @@ dependencies = [ "cw-orch", "cw-storage-plus", "cw2", - "getrandom", + "getrandom 0.2.16", "hex", "thiserror", "tiny-keccak", ] +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -1227,7 +2387,30 @@ dependencies = [ "elliptic-curve", "primeorder", "serdect", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", ] [[package]] @@ -1236,6 +2419,33 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "peg" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fca" + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -1251,6 +2461,38 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkcs1" version = "0.7.5" @@ -1272,6 +2514,12 @@ dependencies = [ "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "potential_utf" version = "0.1.3" @@ -1356,12 +2604,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", "rand_chacha", "rand_core", ] @@ -1382,7 +2637,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] @@ -1405,17 +2660,108 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags 2.9.4", +] + [[package]] name = "redox_users" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.16", "libredox", "thiserror", ] +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-rustls 0.27.7", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tower 0.5.2", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -1426,13 +2772,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "ripemd" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1464,7 +2824,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", - "digest", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -1477,6 +2837,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1487,21 +2853,157 @@ dependencies = [ ] [[package]] -name = "ryu" -version = "1.0.20" +name = "rustix" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] [[package]] -name = "schemars" -version = "0.8.22" +name = "rustls" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ - "dyn-clone", - "schemars_derive", - "serde", - "serde_json", + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.7", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", ] [[package]] @@ -1516,6 +3018,22 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sec1" version = "0.7.3" @@ -1531,6 +3049,79 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "secp256k1-sys 0.8.2", +] + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes 0.14.0", + "secp256k1-sys 0.10.1", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.27" @@ -1610,6 +3201,38 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serdect" version = "0.2.0" @@ -1620,6 +3243,19 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "sha2" version = "0.10.9" @@ -1628,7 +3264,22 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", ] [[package]] @@ -1637,16 +3288,42 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core", ] +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -1690,6 +3367,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "subtle-ng" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" + [[package]] name = "syn" version = "1.0.109" @@ -1712,6 +3395,21 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -1724,84 +3422,217 @@ dependencies = [ ] [[package]] -name = "tendermint-proto" -version = "0.39.1" +name = "system-configuration" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3abf34ecf33125621519e9952688e7a59a98232d51538037ba21fbe526a802" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bytes", - "flex-error", - "prost", - "serde", - "serde_bytes", - "subtle-encoding", - "time", + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", ] [[package]] -name = "tendermint-proto" -version = "0.40.4" +name = "system-configuration" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c40e13d39ca19082d8a7ed22de7595979350319833698f8b1080f29620a094" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bytes", - "flex-error", - "prost", - "serde", - "serde_bytes", - "subtle-encoding", - "time", + "bitflags 2.9.4", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", ] [[package]] -name = "thiserror" -version = "1.0.69" +name = "system-configuration-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "thiserror-impl", + "core-foundation-sys", + "libc", ] [[package]] -name = "thiserror-impl" -version = "1.0.69" +name = "system-configuration-sys" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "core-foundation-sys", + "libc", ] [[package]] -name = "time" -version = "0.3.43" +name = "tempfile" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "time-core", - "time-macros", + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.52.0", ] [[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" +name = "tendermint" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2f3afea7809ffaaf1e5d9c3c9997cb3a834df7e94fbfab2fad2bc4577f1cde41" dependencies = [ - "num-conv", - "time-core", -] - + "bytes", + "digest 0.10.7", + "ed25519", + "ed25519-consensus", + "flex-error", + "futures", + "k256", + "num-traits", + "once_cell", + "prost", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.9", + "signature", + "subtle", + "subtle-encoding", + "tendermint-proto 0.39.1", + "time", + "zeroize", +] + +[[package]] +name = "tendermint-config" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8add7b85b0282e5901521f78fe441956ac1e2752452f4e1f2c0ce7e1f10d485" +dependencies = [ + "flex-error", + "serde", + "serde_json", + "tendermint", + "toml", + "url", +] + +[[package]] +name = "tendermint-proto" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3abf34ecf33125621519e9952688e7a59a98232d51538037ba21fbe526a802" +dependencies = [ + "bytes", + "flex-error", + "prost", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.40.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c40e13d39ca19082d8a7ed22de7595979350319833698f8b1080f29620a094" +dependencies = [ + "bytes", + "flex-error", + "prost", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-rpc" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9693f42544bf3b41be3cbbfa418650c86e137fb8f5a57981659a84b677721ecf" +dependencies = [ + "async-trait", + "bytes", + "flex-error", + "futures", + "getrandom 0.2.16", + "peg", + "pin-project", + "rand", + "reqwest 0.11.27", + "semver", + "serde", + "serde_bytes", + "serde_json", + "subtle", + "subtle-encoding", + "tendermint", + "tendermint-config", + "tendermint-proto 0.39.1", + "thiserror", + "time", + "tokio", + "tracing", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "time" +version = "0.3.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -1821,6 +3652,276 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2 0.6.0", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.32", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.11.4", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-native-certs 0.8.1", + "rustls-pemfile 2.2.0", + "socket2 0.5.10", + "tokio", + "tokio-rustls 0.26.4", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + [[package]] name = "treasury" version = "0.1.0" @@ -1837,18 +3938,39 @@ dependencies = [ "xion-cosmos-sdk-proto", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "uid" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7041bb797d82c5728d3a4a40432809095d8acc59bdd9e67426a2529b3b80c9be" + [[package]] name = "unicode-ident" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -1861,6 +3983,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.7" @@ -1891,25 +4019,274 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -1918,13 +4295,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1933,42 +4326,115 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + [[package]] name = "writeable" version = "0.6.1" @@ -1985,7 +4451,7 @@ dependencies = [ "cosmwasm-std", "cw-storage-plus", "cw2", - "getrandom", + "getrandom 0.2.16", "hex", "p256", "ripemd", @@ -1993,7 +4459,7 @@ dependencies = [ "schemars", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "thiserror", "tiny-keccak", "xion-cosmos-sdk-proto", diff --git a/examples/opacity_key_updater/Cargo.toml b/examples/opacity_key_updater/Cargo.toml new file mode 100644 index 00000000..4926b7ef --- /dev/null +++ b/examples/opacity_key_updater/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "opacity_key_updater" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls"] } +tokio = { version = "1", features = ["macros", "rt-multi-thread", "time"] } +thiserror = { workspace = true } +hex = { workspace = true } +url = { workspace = true } +sha2 = { workspace = true } +# Use the contract crate for message types +opacity_verifier = { path = "../../contracts/opacity_verifier" } +# On-chain submission dependencies (always compiled; enable via DRY_RUN=false at runtime) +cw-orch = { version = "0.28.0", features = ["daemon"] } +cosmwasm-std = { workspace = true } diff --git a/examples/opacity_key_updater/README.md b/examples/opacity_key_updater/README.md new file mode 100644 index 00000000..31a0fadd --- /dev/null +++ b/examples/opacity_key_updater/README.md @@ -0,0 +1,52 @@ +Opacity Key Updater (off-chain) + +This is a small Rust CLI that periodically polls Opacity’s public signing key endpoint and, when a change is detected, submits an admin execute to the on-chain `opacity_verifier` contract to update its allowlist. + +Features +- Polls an HTTP endpoint for the list of Ethereum addresses used by Opacity. +- Normalizes addresses to lowercase, without `0x`, and validates hex length (20 bytes). +- Detects changes vs a locally persisted snapshot and only submits when needed. +- Dry-run mode by default (prints the execute message JSON and stores the new snapshot). +- On-chain submission is enabled at runtime by setting DRY_RUN=false (requires chain config env vars). +- Endpoint shape: accepts either a top-level JSON array of strings, or a JSON object with the array located at the configured field name (set via KEYS_FIELD). + +Build +- Default (no on-chain submission code): + cargo build -p opacity_key_updater + + +Run (dry-run default) +By default, the tool runs in dry-run mode and will not broadcast a transaction. + +Environment variables: +- KEYS_URL: The public keys endpoint. Default: https://verifier.opacity.network/api/public-keys +- KEYS_FIELD: Field name within a JSON object that contains the array of keys (e.g., `allowlistedKeys`). If the endpoint returns an object and KEYS_FIELD is not set, the tool will error. Not used for top-level arrays. Default: unset. +- POLL_INTERVAL_SECS: Poll interval seconds. Default: 5 +- STATE_PATH: Path to a local state file. Default: .opacity_keys_state.json +- DRY_RUN: Set to `false` or `0` to enable submissions (requires chain config below). + +Chain submission (requires DRY_RUN=false): +- CONTRACT_ADDRESS: Address of the deployed opacity_verifier contract (bech32). +- RPC_ENDPOINT: Tendermint RPC endpoint (e.g., https://rpc.xion-testnet-1.burnt.com). +- GRPC_ENDPOINT: gRPC endpoint (optional; defaults to derived from RPC). +- CHAIN_ID: Chain id (e.g., xion-testnet-1). +- GAS_DENOM: Gas denom (e.g., uxion). +- GAS_PRICE: Gas price (e.g., 0.025uxion). Default: 0.025{GAS_DENOM}. +- BECH32_PREFIX: Bech32 prefix for addresses (e.g., xion). +- ADMIN_MNEMONIC: Mnemonic of the admin address (must match the contract admin on-chain). + +Examples +1) Run as a dry-run one-shot (Ctrl+C to stop): + DRY_RUN=true cargo run -p opacity_key_updater + +2) Run with real submissions: + DRY_RUN=false \ + CONTRACT_ADDRESS="xion1..." \ + RPC_ENDPOINT="https://rpc.xion-testnet-1.burnt.com" \ + CHAIN_ID="xion-testnet-1" \ + GAS_DENOM="uxion" \ + BECH32_PREFIX="xion" \ + ADMIN_MNEMONIC="" \ + cargo run -p opacity_key_updater + +Note: The tool persists a snapshot of the keys in `STATE_PATH` and only submits when changes are detected. It also normalizes uploaded keys to exactly match the contract’s normalization logic. diff --git a/examples/opacity_key_updater/src/main.rs b/examples/opacity_key_updater/src/main.rs new file mode 100644 index 00000000..9c0f0638 --- /dev/null +++ b/examples/opacity_key_updater/src/main.rs @@ -0,0 +1,265 @@ +use std::{collections::BTreeSet, env, fs, path::PathBuf, time::Duration}; + +use opacity_verifier::msg::ExecuteMsg; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum UpdaterError { + #[error(transparent)] + Reqwest(#[from] reqwest::Error), + #[error(transparent)] + Io(#[from] std::io::Error), + #[error(transparent)] + SerdeJson(#[from] serde_json::Error), + #[error("address hex must be 40 chars")] + BadHexLen, + #[error("invalid hex address: {0}")] + BadHex(String), + #[error("CONFIG: CONTRACT_ADDRESS must be set to submit updates")] + MissingContract, + #[error("unexpected response shape: {0}")] + UnexpectedShape(String), +} + +#[derive(Clone, Debug)] +struct Config { + keys_url: String, + keys_field: Option, + poll_secs: u64, + state_path: PathBuf, + dry_run: bool, + // chain submission configuration (used when DRY_RUN=false) + contract_addr: Option, + rpc_endpoint: Option, + grpc_endpoint: Option, + chain_id: Option, + gas_denom: Option, + gas_price: Option, + bech32_prefix: Option, + admin_mnemonic: Option, +} + +impl Config { + fn from_env() -> Self { + let keys_url = env::var("KEYS_URL").unwrap_or_else(|_| "https://verifier.opacity.network/api/public-keys".to_string()); + let keys_field = env::var("KEYS_FIELD").ok(); + let poll_secs = env::var("POLL_INTERVAL_SECS").ok().and_then(|s| s.parse().ok()).unwrap_or(5); + let state_path = env::var("STATE_PATH").map(PathBuf::from).unwrap_or_else(|_| PathBuf::from(".opacity_keys_state.json")); + let dry_run = env::var("DRY_RUN").ok().map(|v| v == "1" || v.eq_ignore_ascii_case("true")).unwrap_or(true); + + let contract_addr = env::var("CONTRACT_ADDRESS").ok(); + let rpc_endpoint = env::var("RPC_ENDPOINT").ok(); + let grpc_endpoint = env::var("GRPC_ENDPOINT").ok(); + let chain_id = env::var("CHAIN_ID").ok(); + let gas_denom = env::var("GAS_DENOM").ok(); + let gas_price = env::var("GAS_PRICE").ok(); // e.g., "0.025uxion" + let bech32_prefix = env::var("BECH32_PREFIX").ok(); + let admin_mnemonic = env::var("ADMIN_MNEMONIC").ok(); + + Self { keys_url, keys_field, poll_secs, state_path, dry_run, contract_addr, rpc_endpoint, grpc_endpoint, chain_id, gas_denom, gas_price, bech32_prefix, admin_mnemonic } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct State { + keys: BTreeSet, + hash: String, +} + +async fn fetch_keys(url: &str, keys_field: Option<&str>) -> Result, UpdaterError> { + let client = reqwest::Client::builder().build()?; + let res = client.get(url).send().await?.error_for_status()?; + // Accept either a top-level array of strings, or an object with the configured field name + let v: serde_json::Value = res.json().await?; + if let Some(arr) = v.as_array() { + let keys: Vec = arr.iter().filter_map(|x| x.as_str().map(|s| s.to_string())).collect(); + return Ok(keys); + } + if let Some(obj) = v.as_object() { + if let Some(name) = keys_field { + if let Some(arr) = obj.get(name).and_then(|k| k.as_array()) { + let keys: Vec = arr.iter().filter_map(|x| x.as_str().map(|s| s.to_string())).collect(); + return Ok(keys); + } + return Err(UpdaterError::UnexpectedShape(format!( + "object did not contain configured KEYS_FIELD='{}' as an array; available fields = {:?}", + name, + obj.keys().cloned().collect::>() + ))); + } + return Err(UpdaterError::UnexpectedShape(format!( + "object response without configured KEYS_FIELD; set KEYS_FIELD to the array field name. Available fields = {:?}", + obj.keys().cloned().collect::>() + ))); + } + Err(UpdaterError::UnexpectedShape(format!("top-level type: {}", v.to_string()))) +} + +fn normalize_addr_hex(s: &str) -> Result { + let s = s.trim().trim_start_matches("0x").to_ascii_lowercase(); + if s.len() != 40 { return Err(UpdaterError::BadHexLen); } + hex::decode(&s).map_err(|_| UpdaterError::BadHex(s.clone()))?; + Ok(s) +} + +fn hash_keys(set: &BTreeSet) -> String { + let mut hasher = Sha256::new(); + for k in set.iter() { + hasher.update(k.as_bytes()); + hasher.update(&[0u8]); + } + let out = hasher.finalize(); + hex::encode(out) +} + +fn load_state(path: &PathBuf) -> Result, UpdaterError> { + if !path.exists() { return Ok(None); } + let data = fs::read(path)?; + let st: State = serde_json::from_slice(&data)?; + Ok(Some(st)) +} + +fn save_state(path: &PathBuf, state: &State) -> Result<(), UpdaterError> { + let tmp = serde_json::to_vec_pretty(state)?; + fs::write(path, tmp)?; + Ok(()) +} + +async fn submit_update(cfg: &Config, keys: Vec) -> Result<(), UpdaterError> { + use cw_orch::prelude::*; + use std::collections::BTreeSet; + + let contract_addr = cfg.contract_addr.clone().ok_or(UpdaterError::MissingContract)?; + let chain_id = cfg.chain_id.clone().expect("CHAIN_ID required when submitting"); + let gas_denom = cfg.gas_denom.clone().expect("GAS_DENOM required when submitting"); + let rpc = cfg.rpc_endpoint.clone().expect("RPC_ENDPOINT required when submitting"); + let grpc = cfg.grpc_endpoint.clone().unwrap_or_else(|| rpc.replace("http", "https")); + let prefix = cfg.bech32_prefix.clone().expect("BECH32_PREFIX required when submitting"); + let mnemonic = cfg.admin_mnemonic.clone().expect("ADMIN_MNEMONIC required when submitting"); + let gas_price = cfg.gas_price.clone().unwrap_or_else(|| format!("0.025{}", gas_denom)); + + // Build chain info + use cw_orch::daemon::{Daemon, DaemonBuilder}; + use cw_orch::environment::{ChainInfoOwned, NetworkInfoOwned, ChainKind}; + + let mut chain = ChainInfoOwned::default(); + chain.chain_id = chain_id.clone(); + chain.gas_denom = gas_denom.clone(); + chain.gas_price = 0.0; // overridden by DaemonBuilder::gas_price below + chain.grpc_urls = vec![grpc.clone()]; + chain.lcd_url = None; + chain.fcd_url = None; + chain.network_info = NetworkInfoOwned { chain_name: chain_id.clone(), pub_address_prefix: prefix.clone(), coin_type: 118 }; + chain.kind = ChainKind::Unspecified; + + // Parse numeric gas price (e.g., "0.025uxion" -> 0.025) + let gp_num: f64 = gas_price + .chars() + .take_while(|c| c.is_ascii_digit() || *c == '.') + .collect::() + .parse() + .unwrap_or(0.025); + + let mut builder = DaemonBuilder::new(chain); + builder.grpc_url(grpc.clone()); + builder.mnemonic(&mnemonic); + builder.gas(Some(&gas_denom), Some(gp_num)); + + let daemon = builder + .build() + .expect("failed to build daemon"); + + #[cw_orch::interface(opacity_verifier::msg::InstantiateMsg, opacity_verifier::msg::ExecuteMsg, opacity_verifier::msg::QueryMsg, cosmwasm_std::Empty)] + struct OpacityVerifier; + + let contract: OpacityVerifier = OpacityVerifier::new(&contract_addr, daemon); + + // Before submitting, pull current on-chain keys and compare + let onchain_keys: Vec = contract + .query(&opacity_verifier::msg::QueryMsg::VerificationKeys {}) + .expect("failed to query VerificationKeys"); + + let mut onchain_set: BTreeSet = BTreeSet::new(); + for k in onchain_keys { + // Normalize just in case, though contract already stores normalized + let n = normalize_addr_hex(&k).unwrap_or_else(|_| k); + onchain_set.insert(n); + } + + let mut new_set: BTreeSet = BTreeSet::new(); + for k in keys.iter() { + let n = normalize_addr_hex(k).unwrap_or_else(|_| k.clone()); + new_set.insert(n); + } + + if onchain_set == new_set { + println!("On-chain allowlist already up to date ({} keys). Skipping submit.", new_set.len()); + return Ok(()); + } + + // Execute update + contract + .execute(&ExecuteMsg::UpdateAllowList { keys }, &[]) + .expect("failed to submit UpdateAllowList"); + + Ok(()) +} + + +#[tokio::main] +async fn main() -> Result<(), UpdaterError> { + let cfg = Config::from_env(); + println!("opacity_key_updater started. Polling {} every {}s. Dry-run: {}. Keys field: {}", cfg.keys_url, cfg.poll_secs, cfg.dry_run, cfg.keys_field.as_deref().unwrap_or("")); + + loop { + if let Err(e) = run_once(&cfg).await { + eprintln!("[WARN] run_once failed: {e}"); + } + tokio::time::sleep(Duration::from_secs(cfg.poll_secs)).await; + } +} + +async fn run_once(cfg: &Config) -> Result<(), UpdaterError> { + let raw = fetch_keys(&cfg.keys_url, cfg.keys_field.as_deref()).await?; + let mut set: BTreeSet = BTreeSet::new(); + for k in raw { + let n = normalize_addr_hex(&k)?; + set.insert(n); + } + + let new_hash = hash_keys(&set); + + let prev = load_state(&cfg.state_path)?; + if let Some(prev) = prev { + if prev.hash == new_hash { + println!("No change detected ({} keys).", set.len()); + return Ok(()); + } else { + let removed: Vec<_> = prev.keys.difference(&set).cloned().collect(); + let added: Vec<_> = set.difference(&prev.keys).cloned().collect(); + println!("Change detected: +{} / -{} (total now {}).", added.len(), removed.len(), set.len()); + if cfg.dry_run { + println!("DRY-RUN: would submit UpdateAllowList with {} keys.", set.len()); + // Still write state so subsequent run only submits once when toggling off dry-run + save_state(&cfg.state_path, &State { keys: set.clone(), hash: new_hash })?; + } else { + // Submit update then persist + submit_update(cfg, set.iter().cloned().collect()).await?; + save_state(&cfg.state_path, &State { keys: set.clone(), hash: new_hash })?; + } + } + } else { + println!("No previous state; treating as first run with {} keys.", set.len()); + if cfg.dry_run { + println!("DRY-RUN: would submit initial UpdateAllowList with {} keys.", set.len()); + save_state(&cfg.state_path, &State { keys: set.clone(), hash: new_hash })?; + } else { + submit_update(cfg, set.iter().cloned().collect()).await?; + save_state(&cfg.state_path, &State { keys: set.clone(), hash: new_hash })?; + } + } + + Ok(()) +} From 56c6495a51f8011eabf7eb6377d217982e6c077a Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 9 Oct 2025 14:23:22 -0700 Subject: [PATCH 12/12] move updater --- Cargo.toml | 1 + {examples => scripts}/opacity_key_updater/Cargo.toml | 0 {examples => scripts}/opacity_key_updater/README.md | 0 {examples => scripts}/opacity_key_updater/src/main.rs | 0 4 files changed, 1 insertion(+) rename {examples => scripts}/opacity_key_updater/Cargo.toml (100%) rename {examples => scripts}/opacity_key_updater/README.md (100%) rename {examples => scripts}/opacity_key_updater/src/main.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index ff180fb3..b98396a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "contracts/*", "examples/*", + "scripts/*" ] resolver = "2" diff --git a/examples/opacity_key_updater/Cargo.toml b/scripts/opacity_key_updater/Cargo.toml similarity index 100% rename from examples/opacity_key_updater/Cargo.toml rename to scripts/opacity_key_updater/Cargo.toml diff --git a/examples/opacity_key_updater/README.md b/scripts/opacity_key_updater/README.md similarity index 100% rename from examples/opacity_key_updater/README.md rename to scripts/opacity_key_updater/README.md diff --git a/examples/opacity_key_updater/src/main.rs b/scripts/opacity_key_updater/src/main.rs similarity index 100% rename from examples/opacity_key_updater/src/main.rs rename to scripts/opacity_key_updater/src/main.rs