From 1a6184493aca0307179ce81fb5624fc7d9ccc3b1 Mon Sep 17 00:00:00 2001 From: Ash Date: Thu, 29 May 2025 15:13:17 -0700 Subject: [PATCH 01/11] initial test --- contracts/reclaim_verifier/Cargo.toml | 23 ++++++ contracts/reclaim_verifier/src/contract.rs | 0 contracts/reclaim_verifier/src/error.rs | 10 +++ contracts/reclaim_verifier/src/lib.rs | 82 ++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 contracts/reclaim_verifier/Cargo.toml create mode 100644 contracts/reclaim_verifier/src/contract.rs create mode 100644 contracts/reclaim_verifier/src/error.rs create mode 100644 contracts/reclaim_verifier/src/lib.rs diff --git a/contracts/reclaim_verifier/Cargo.toml b/contracts/reclaim_verifier/Cargo.toml new file mode 100644 index 0000000..845de7c --- /dev/null +++ b/contracts/reclaim_verifier/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "reclaim-verifier" +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 } + +[dev-dependencies] +cw-orch = "0.28.0" +reclaim-cosmwasm = {git="https://github.com/reclaimprotocol/cosmwasm-sdk-onchain-integration", default-features = false, features = ["vanilla"]} diff --git a/contracts/reclaim_verifier/src/contract.rs b/contracts/reclaim_verifier/src/contract.rs new file mode 100644 index 0000000..e69de29 diff --git a/contracts/reclaim_verifier/src/error.rs b/contracts/reclaim_verifier/src/error.rs new file mode 100644 index 0000000..b62eef3 --- /dev/null +++ b/contracts/reclaim_verifier/src/error.rs @@ -0,0 +1,10 @@ +#[derive(Debug, thiserror::Error)] +pub enum ContractError { + #[error(transparent)] + Std(#[from] cosmwasm_std::StdError), + + #[error(transparent)] + JsonError(#[from] serde_json::Error), +} + +pub type ContractResult = Result; diff --git a/contracts/reclaim_verifier/src/lib.rs b/contracts/reclaim_verifier/src/lib.rs new file mode 100644 index 0000000..8324333 --- /dev/null +++ b/contracts/reclaim_verifier/src/lib.rs @@ -0,0 +1,82 @@ +extern crate core; + +// #[cfg(not(feature = "library"))] +// pub mod contract; +mod error; +// pub mod msg; +// mod state; + +#[cfg(test)] +mod tests { + use cosmwasm_std::{Addr, Empty}; + use cw_orch::interface; + use cw_orch::mock::Mock; + use cw_orch::prelude::*; + use reclaim_cosmwasm::claims::{ClaimInfo, CompleteClaimData, Proof, SignedClaim}; + use reclaim_cosmwasm::msg::{InstantiateMsg, QueryMsg, ExecuteMsg, ProofMsg}; + + #[interface(InstantiateMsg, QueryMsg, ExecuteMsg, Empty)] + pub struct ReclaimVerifier; + + // Implement the Uploadable trait so it can be uploaded to the mock. + impl Uploadable for ReclaimVerifier { + fn wrapper() -> Box> { + Box::new( + ContractWrapper::new_with_empty( + reclaim_cosmwasm::contract::execute, + reclaim_cosmwasm::contract::instantiate, + reclaim_cosmwasm::contract::query, + ) + ) + } + } + + #[test] + fn example_verification_test() { + let sender = Addr::unchecked("sender"); + // Create a new mock chain (backed by cw-multi-test) + let chain = Mock::new(&sender); + + let reclaim_verifier: ReclaimVerifier = ReclaimVerifier::new("test_verifier", chain); + + // Upload the contract + reclaim_verifier.upload().unwrap(); + + let reclaim_verifier_init_msg = InstantiateMsg { + owner: sender.to_string(), + }; + + reclaim_verifier.instantiate(&reclaim_verifier_init_msg, None, &[]).unwrap(); + + let signatures = Vec::from(["0x04fac06fb875a8a4896912461655f039b9b7726b1eacc1727f4b87c04b3971951387dc60b884e80e5c866722c1e34738a41c163f6c6bca2e33759a5ed34538201b".to_string()]); + + let claim_str = r#" + { + "owner": "0x612c00c6d44fa281beeea91805349519ef3c3e83", + "provider": "http", + "timestampS": 1748539856, + "epoch": 1, + "context": "{\"extractedParameters\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"providerHash\":\"0xd4fb71de874115b581e7c15fedd0f71b38fbfabf6894487d275fde2cca1d0ebb\"}", + "identifier": "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a", + "parameters": "{\"additionalClientOptions\":{},\"body\":\"\",\"geoLocation\":\"IN\",\"headers\":{\"Sec-Fetch-Mode\":\"same-origin\",\"Sec-Fetch-Site\":\"same-origin\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"},\"method\":\"GET\",\"paramValues\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"responseMatches\":[{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"screen_name\\\":\\\"{{screen_name}}\\\"\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"followers_count\\\":{{followers_count}}\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"created_at\\\":\\\"{{created_at}}\\\"\"}],\"responseRedactions\":[{\"jsonPath\":\"$.data.user.result.core.screen_name\",\"regex\":\"\\\"screen_name\\\":\\\"(.*)\\\"\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.legacy.followers_count\",\"regex\":\"\\\"followers_count\\\":(.*)\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.core.created_at\",\"regex\":\"\\\"created_at\\\":\\\"(.*)\\\"\",\"xPath\":\"\"}],\"url\":\"https://{{URL_PARAM_DOMAIN}}.com/i/api/graphql/{{URL_PARAMS_1}}/UserByScreenName?{{URL_PARAM_2_GRD}}\"}" + } + "#; + + let claim_info: ClaimInfo = serde_json::from_str(claim_str).unwrap(); + let claim_data: CompleteClaimData = serde_json::from_str(claim_str).unwrap(); + + let signed_claim = SignedClaim { + signatures, + claim: claim_data, + }; + + let proof = Proof { + claimInfo: claim_info, + signedClaim: signed_claim, + }; + + let proof_msg: ProofMsg = ProofMsg { + proof: proof, + }; + } +} \ No newline at end of file From dba64ac08630505db964dc2effd1a5a71c7ffa45 Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 3 Jun 2025 08:51:40 -0500 Subject: [PATCH 02/11] signature invalid --- contracts/reclaim_verifier/Cargo.toml | 5 ++--- contracts/reclaim_verifier/src/lib.rs | 28 ++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/contracts/reclaim_verifier/Cargo.toml b/contracts/reclaim_verifier/Cargo.toml index 845de7c..afb2ed4 100644 --- a/contracts/reclaim_verifier/Cargo.toml +++ b/contracts/reclaim_verifier/Cargo.toml @@ -12,12 +12,11 @@ library = [] [dependencies] cosmwasm-schema = { workspace = true } -cosmwasm-std = { workspace = true } -cw-storage-plus = { workspace = true } +cosmwasm-std = { version = "1.5.0"} thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } [dev-dependencies] -cw-orch = "0.28.0" +cw-orch = "0.24.1" reclaim-cosmwasm = {git="https://github.com/reclaimprotocol/cosmwasm-sdk-onchain-integration", default-features = false, features = ["vanilla"]} diff --git a/contracts/reclaim_verifier/src/lib.rs b/contracts/reclaim_verifier/src/lib.rs index 8324333..d898ae8 100644 --- a/contracts/reclaim_verifier/src/lib.rs +++ b/contracts/reclaim_verifier/src/lib.rs @@ -8,14 +8,15 @@ mod error; #[cfg(test)] mod tests { - use cosmwasm_std::{Addr, Empty}; + use cosmwasm_std::{Addr, Uint128}; use cw_orch::interface; use cw_orch::mock::Mock; use cw_orch::prelude::*; use reclaim_cosmwasm::claims::{ClaimInfo, CompleteClaimData, Proof, SignedClaim}; - use reclaim_cosmwasm::msg::{InstantiateMsg, QueryMsg, ExecuteMsg, ProofMsg}; + use reclaim_cosmwasm::msg::{InstantiateMsg, QueryMsg, ExecuteMsg, ProofMsg, GetAllEpochResponse, GetEpochResponse}; + use reclaim_cosmwasm::state::Witness; - #[interface(InstantiateMsg, QueryMsg, ExecuteMsg, Empty)] + #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] pub struct ReclaimVerifier; // Implement the Uploadable trait so it can be uploaded to the mock. @@ -46,7 +47,22 @@ mod tests { owner: sender.to_string(), }; - reclaim_verifier.instantiate(&reclaim_verifier_init_msg, None, &[]).unwrap(); + let instance = reclaim_verifier.instantiate(&reclaim_verifier_init_msg, None, None).unwrap(); + + // add reclaim epoch + let witness = Witness{ + address: "0x244897572368Eadf65bfBc5aec98D8e5443a9072".to_string(), + host: "".to_string() + }; + let app_epoch_msg = ExecuteMsg::AddEpoch { + witness: vec![witness], + minimum_witness: Uint128::one(), + }; + reclaim_verifier.execute(&app_epoch_msg, None).unwrap(); + + // query epochs + let epoch_response: GetEpochResponse = reclaim_verifier.query(&QueryMsg::GetEpoch {id: 1}).unwrap(); + println!("epoch response: {:?}", epoch_response); let signatures = Vec::from(["0x04fac06fb875a8a4896912461655f039b9b7726b1eacc1727f4b87c04b3971951387dc60b884e80e5c866722c1e34738a41c163f6c6bca2e33759a5ed34538201b".to_string()]); @@ -76,7 +92,9 @@ mod tests { }; let proof_msg: ProofMsg = ProofMsg { - proof: proof, + proof, }; + + reclaim_verifier.execute(&ExecuteMsg::VerifyProof(proof_msg), None).unwrap(); } } \ No newline at end of file From f1a71fa7c260b9a68180f36bda9726f97f060143 Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 3 Jun 2025 11:50:44 -0500 Subject: [PATCH 03/11] restructure proof data --- contracts/reclaim_verifier/src/lib.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/contracts/reclaim_verifier/src/lib.rs b/contracts/reclaim_verifier/src/lib.rs index d898ae8..7c11563 100644 --- a/contracts/reclaim_verifier/src/lib.rs +++ b/contracts/reclaim_verifier/src/lib.rs @@ -66,20 +66,15 @@ mod tests { let signatures = Vec::from(["0x04fac06fb875a8a4896912461655f039b9b7726b1eacc1727f4b87c04b3971951387dc60b884e80e5c866722c1e34738a41c163f6c6bca2e33759a5ed34538201b".to_string()]); - let claim_str = r#" - { - "owner": "0x612c00c6d44fa281beeea91805349519ef3c3e83", - "provider": "http", - "timestampS": 1748539856, - "epoch": 1, - "context": "{\"extractedParameters\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"providerHash\":\"0xd4fb71de874115b581e7c15fedd0f71b38fbfabf6894487d275fde2cca1d0ebb\"}", - "identifier": "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a", - "parameters": "{\"additionalClientOptions\":{},\"body\":\"\",\"geoLocation\":\"IN\",\"headers\":{\"Sec-Fetch-Mode\":\"same-origin\",\"Sec-Fetch-Site\":\"same-origin\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"},\"method\":\"GET\",\"paramValues\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"responseMatches\":[{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"screen_name\\\":\\\"{{screen_name}}\\\"\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"followers_count\\\":{{followers_count}}\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"created_at\\\":\\\"{{created_at}}\\\"\"}],\"responseRedactions\":[{\"jsonPath\":\"$.data.user.result.core.screen_name\",\"regex\":\"\\\"screen_name\\\":\\\"(.*)\\\"\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.legacy.followers_count\",\"regex\":\"\\\"followers_count\\\":(.*)\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.core.created_at\",\"regex\":\"\\\"created_at\\\":\\\"(.*)\\\"\",\"xPath\":\"\"}],\"url\":\"https://{{URL_PARAM_DOMAIN}}.com/i/api/graphql/{{URL_PARAMS_1}}/UserByScreenName?{{URL_PARAM_2_GRD}}\"}" - } - "#; - - let claim_info: ClaimInfo = serde_json::from_str(claim_str).unwrap(); - let claim_data: CompleteClaimData = serde_json::from_str(claim_str).unwrap(); + let claim_info: ClaimInfo = ClaimInfo { provider: "http".to_string(), + parameters: "{\"additionalClientOptions\":{},\"body\":\"\",\"geoLocation\":\"IN\",\"headers\":{\"Sec-Fetch-Mode\":\"same-origin\",\"Sec-Fetch-Site\":\"same-origin\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"},\"method\":\"GET\",\"paramValues\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"responseMatches\":[{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"screen_name\\\":\\\"{{screen_name}}\\\"\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"followers_count\\\":{{followers_count}}\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"created_at\\\":\\\"{{created_at}}\\\"\"}],\"responseRedactions\":[{\"jsonPath\":\"$.data.user.result.core.screen_name\",\"regex\":\"\\\"screen_name\\\":\\\"(.*)\\\"\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.legacy.followers_count\",\"regex\":\"\\\"followers_count\\\":(.*)\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.core.created_at\",\"regex\":\"\\\"created_at\\\":\\\"(.*)\\\"\",\"xPath\":\"\"}],\"url\":\"https://{{URL_PARAM_DOMAIN}}.com/i/api/graphql/{{URL_PARAMS_1}}/UserByScreenName?{{URL_PARAM_2_GRD}}\"}".to_string(), + context: "{\"extractedParameters\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"providerHash\":\"0xd4fb71de874115b581e7c15fedd0f71b38fbfabf6894487d275fde2cca1d0ebb\"}".to_string() + }; + let claim_data: CompleteClaimData = CompleteClaimData { identifier: "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a".to_string(), + owner: "0x612c00c6d44fa281beeea91805349519ef3c3e83".to_string(), + epoch: 1, + timestampS: 1748539856 + }; let signed_claim = SignedClaim { signatures, From 24c61db0123a02133a8850336eb97ba86896e90a Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 3 Jun 2025 13:23:30 -0500 Subject: [PATCH 04/11] formatting --- contracts/reclaim_verifier/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/reclaim_verifier/src/lib.rs b/contracts/reclaim_verifier/src/lib.rs index 7c11563..af16141 100644 --- a/contracts/reclaim_verifier/src/lib.rs +++ b/contracts/reclaim_verifier/src/lib.rs @@ -66,11 +66,13 @@ mod tests { let signatures = Vec::from(["0x04fac06fb875a8a4896912461655f039b9b7726b1eacc1727f4b87c04b3971951387dc60b884e80e5c866722c1e34738a41c163f6c6bca2e33759a5ed34538201b".to_string()]); - let claim_info: ClaimInfo = ClaimInfo { provider: "http".to_string(), + let claim_info: ClaimInfo = ClaimInfo { + provider: "http".to_string(), parameters: "{\"additionalClientOptions\":{},\"body\":\"\",\"geoLocation\":\"IN\",\"headers\":{\"Sec-Fetch-Mode\":\"same-origin\",\"Sec-Fetch-Site\":\"same-origin\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"},\"method\":\"GET\",\"paramValues\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"responseMatches\":[{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"screen_name\\\":\\\"{{screen_name}}\\\"\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"followers_count\\\":{{followers_count}}\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"created_at\\\":\\\"{{created_at}}\\\"\"}],\"responseRedactions\":[{\"jsonPath\":\"$.data.user.result.core.screen_name\",\"regex\":\"\\\"screen_name\\\":\\\"(.*)\\\"\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.legacy.followers_count\",\"regex\":\"\\\"followers_count\\\":(.*)\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.core.created_at\",\"regex\":\"\\\"created_at\\\":\\\"(.*)\\\"\",\"xPath\":\"\"}],\"url\":\"https://{{URL_PARAM_DOMAIN}}.com/i/api/graphql/{{URL_PARAMS_1}}/UserByScreenName?{{URL_PARAM_2_GRD}}\"}".to_string(), context: "{\"extractedParameters\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"providerHash\":\"0xd4fb71de874115b581e7c15fedd0f71b38fbfabf6894487d275fde2cca1d0ebb\"}".to_string() }; - let claim_data: CompleteClaimData = CompleteClaimData { identifier: "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a".to_string(), + let claim_data: CompleteClaimData = CompleteClaimData { + identifier: "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a".to_string(), owner: "0x612c00c6d44fa281beeea91805349519ef3c3e83".to_string(), epoch: 1, timestampS: 1748539856 From ce8d60ce2ce9a099e94421b46ac4977c824a1e61 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 16 Jun 2025 11:32:56 -0700 Subject: [PATCH 05/11] user map with reclaim verification --- .../Cargo.toml | 10 +- contracts/reclaim_user_map/examples/schema.rs | 11 +++ contracts/reclaim_user_map/src/contract.rs | 77 +++++++++++++++ .../src/error.rs | 6 ++ contracts/reclaim_user_map/src/lib.rs | 7 ++ contracts/reclaim_user_map/src/msg.rs | 28 ++++++ contracts/reclaim_user_map/src/state.rs | 7 ++ contracts/reclaim_verifier/src/contract.rs | 0 contracts/reclaim_verifier/src/lib.rs | 97 ------------------- 9 files changed, 140 insertions(+), 103 deletions(-) rename contracts/{reclaim_verifier => reclaim_user_map}/Cargo.toml (57%) create mode 100644 contracts/reclaim_user_map/examples/schema.rs create mode 100644 contracts/reclaim_user_map/src/contract.rs rename contracts/{reclaim_verifier => reclaim_user_map}/src/error.rs (68%) create mode 100644 contracts/reclaim_user_map/src/lib.rs create mode 100644 contracts/reclaim_user_map/src/msg.rs create mode 100644 contracts/reclaim_user_map/src/state.rs delete mode 100644 contracts/reclaim_verifier/src/contract.rs delete mode 100644 contracts/reclaim_verifier/src/lib.rs diff --git a/contracts/reclaim_verifier/Cargo.toml b/contracts/reclaim_user_map/Cargo.toml similarity index 57% rename from contracts/reclaim_verifier/Cargo.toml rename to contracts/reclaim_user_map/Cargo.toml index afb2ed4..cc807f4 100644 --- a/contracts/reclaim_verifier/Cargo.toml +++ b/contracts/reclaim_user_map/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "reclaim-verifier" +name = "reclaim-user-map" version = "0.1.0" edition = "2021" @@ -12,11 +12,9 @@ library = [] [dependencies] cosmwasm-schema = { workspace = true } -cosmwasm-std = { version = "1.5.0"} +cosmwasm-std = { workspace = true } +cw-storage-plus = { workspace = true } thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } - -[dev-dependencies] -cw-orch = "0.24.1" -reclaim-cosmwasm = {git="https://github.com/reclaimprotocol/cosmwasm-sdk-onchain-integration", default-features = false, features = ["vanilla"]} +reclaim_xion = { package = "reclaim-xion", git = "https://github.com/reclaimprotocol/xion-sdk-onchain-integration.git"} \ No newline at end of file diff --git a/contracts/reclaim_user_map/examples/schema.rs b/contracts/reclaim_user_map/examples/schema.rs new file mode 100644 index 0000000..9681fbf --- /dev/null +++ b/contracts/reclaim_user_map/examples/schema.rs @@ -0,0 +1,11 @@ +use cosmwasm_schema::write_api; +use user_map::msg::*; + +fn main() { + write_api! { + instantiate: InstantiateMsg, + query: QueryMsg, + execute: ExecuteMsg, + migrate: MigrateMsg, + }; +} diff --git a/contracts/reclaim_user_map/src/contract.rs b/contracts/reclaim_user_map/src/contract.rs new file mode 100644 index 0000000..e838375 --- /dev/null +++ b/contracts/reclaim_user_map/src/contract.rs @@ -0,0 +1,77 @@ +use std::collections::HashMap; +use crate::error::ContractError; +use crate::error::ContractResult; +use crate::msg::InstantiateMsg; +use crate::msg::{ExecuteMsg, QueryMsg}; +use crate::state::{CLAIM_VALUE_KEY, USER_MAP, VERIFICATION_ADDR}; +use cosmwasm_std::{entry_point, to_json_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult, WasmMsg}; +use crate::error::ContractError::ClaimKeyInvalid; + +#[entry_point] +pub fn instantiate( + deps: DepsMut, + _env: Env, + info: MessageInfo, + msg: InstantiateMsg, +) -> Result { + deps.api.addr_validate(msg.verification_addr.as_str())?; + VERIFICATION_ADDR.save(deps.storage, &msg.verification_addr)?; + if msg.claim_key.is_empty() { + return Err(ClaimKeyInvalid) + } + CLAIM_VALUE_KEY.save(deps.storage, &msg.claim_key)?; + + 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 { value } => { + // validate JSON + let context: HashMap<&str, String> = serde_json::from_str(&value.proof.claimInfo.context)?; + let verified_value = match context.get(CLAIM_VALUE_KEY.load(deps.storage)?.as_str()) { + Some(v) => v.to_string(), + None => return Err(ContractError::JSONKeyMissing {}), + }; + + USER_MAP.save(deps.storage, info.sender, &verified_value)?; + Ok(Response::default().add_message(CosmosMsg::Wasm(WasmMsg::Execute { + contract_addr: VERIFICATION_ADDR.load(deps.storage)?.into_string(), + msg: to_json_binary(&reclaim_xion::msg::ExecuteMsg::VerifyProof(value))?, + funds: vec![], + }))) + } + } +} + +#[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, String)> = 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/reclaim_verifier/src/error.rs b/contracts/reclaim_user_map/src/error.rs similarity index 68% rename from contracts/reclaim_verifier/src/error.rs rename to contracts/reclaim_user_map/src/error.rs index b62eef3..963e917 100644 --- a/contracts/reclaim_verifier/src/error.rs +++ b/contracts/reclaim_user_map/src/error.rs @@ -5,6 +5,12 @@ pub enum ContractError { #[error(transparent)] JsonError(#[from] serde_json::Error), + + #[error("json key missing")] + JSONKeyMissing, + + #[error("claim key invalid")] + ClaimKeyInvalid, } pub type ContractResult = Result; diff --git a/contracts/reclaim_user_map/src/lib.rs b/contracts/reclaim_user_map/src/lib.rs new file mode 100644 index 0000000..4708c2c --- /dev/null +++ b/contracts/reclaim_user_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/reclaim_user_map/src/msg.rs b/contracts/reclaim_user_map/src/msg.rs new file mode 100644 index 0000000..5e97aee --- /dev/null +++ b/contracts/reclaim_user_map/src/msg.rs @@ -0,0 +1,28 @@ +use cosmwasm_schema::{cw_serde, QueryResponses}; +use cosmwasm_std::Addr; +use reclaim_xion::msg::ProofMsg; + +#[cw_serde] +pub struct InstantiateMsg { + pub verification_addr: Addr, + pub claim_key: String, +} + +#[cw_serde] +pub enum ExecuteMsg { + Update { value: ProofMsg }, +} + +#[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/reclaim_user_map/src/state.rs b/contracts/reclaim_user_map/src/state.rs new file mode 100644 index 0000000..cefa0dc --- /dev/null +++ b/contracts/reclaim_user_map/src/state.rs @@ -0,0 +1,7 @@ +use cosmwasm_std::Addr; +use cw_storage_plus::{Item, Map}; + +pub const USER_MAP: Map = Map::new("user_map"); + +pub const VERIFICATION_ADDR: Item = Item::new("verification_addr"); +pub const CLAIM_VALUE_KEY: Item = Item::new("claim_value_key"); \ No newline at end of file diff --git a/contracts/reclaim_verifier/src/contract.rs b/contracts/reclaim_verifier/src/contract.rs deleted file mode 100644 index e69de29..0000000 diff --git a/contracts/reclaim_verifier/src/lib.rs b/contracts/reclaim_verifier/src/lib.rs deleted file mode 100644 index af16141..0000000 --- a/contracts/reclaim_verifier/src/lib.rs +++ /dev/null @@ -1,97 +0,0 @@ -extern crate core; - -// #[cfg(not(feature = "library"))] -// pub mod contract; -mod error; -// pub mod msg; -// mod state; - -#[cfg(test)] -mod tests { - use cosmwasm_std::{Addr, Uint128}; - use cw_orch::interface; - use cw_orch::mock::Mock; - use cw_orch::prelude::*; - use reclaim_cosmwasm::claims::{ClaimInfo, CompleteClaimData, Proof, SignedClaim}; - use reclaim_cosmwasm::msg::{InstantiateMsg, QueryMsg, ExecuteMsg, ProofMsg, GetAllEpochResponse, GetEpochResponse}; - use reclaim_cosmwasm::state::Witness; - - #[interface(InstantiateMsg, ExecuteMsg, QueryMsg, Empty)] - pub struct ReclaimVerifier; - - // Implement the Uploadable trait so it can be uploaded to the mock. - impl Uploadable for ReclaimVerifier { - fn wrapper() -> Box> { - Box::new( - ContractWrapper::new_with_empty( - reclaim_cosmwasm::contract::execute, - reclaim_cosmwasm::contract::instantiate, - reclaim_cosmwasm::contract::query, - ) - ) - } - } - - #[test] - fn example_verification_test() { - let sender = Addr::unchecked("sender"); - // Create a new mock chain (backed by cw-multi-test) - let chain = Mock::new(&sender); - - let reclaim_verifier: ReclaimVerifier = ReclaimVerifier::new("test_verifier", chain); - - // Upload the contract - reclaim_verifier.upload().unwrap(); - - let reclaim_verifier_init_msg = InstantiateMsg { - owner: sender.to_string(), - }; - - let instance = reclaim_verifier.instantiate(&reclaim_verifier_init_msg, None, None).unwrap(); - - // add reclaim epoch - let witness = Witness{ - address: "0x244897572368Eadf65bfBc5aec98D8e5443a9072".to_string(), - host: "".to_string() - }; - let app_epoch_msg = ExecuteMsg::AddEpoch { - witness: vec![witness], - minimum_witness: Uint128::one(), - }; - reclaim_verifier.execute(&app_epoch_msg, None).unwrap(); - - // query epochs - let epoch_response: GetEpochResponse = reclaim_verifier.query(&QueryMsg::GetEpoch {id: 1}).unwrap(); - println!("epoch response: {:?}", epoch_response); - - let signatures = Vec::from(["0x04fac06fb875a8a4896912461655f039b9b7726b1eacc1727f4b87c04b3971951387dc60b884e80e5c866722c1e34738a41c163f6c6bca2e33759a5ed34538201b".to_string()]); - - let claim_info: ClaimInfo = ClaimInfo { - provider: "http".to_string(), - parameters: "{\"additionalClientOptions\":{},\"body\":\"\",\"geoLocation\":\"IN\",\"headers\":{\"Sec-Fetch-Mode\":\"same-origin\",\"Sec-Fetch-Site\":\"same-origin\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36\"},\"method\":\"GET\",\"paramValues\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"responseMatches\":[{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"screen_name\\\":\\\"{{screen_name}}\\\"\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"followers_count\\\":{{followers_count}}\"},{\"invert\":false,\"type\":\"contains\",\"value\":\"\\\"created_at\\\":\\\"{{created_at}}\\\"\"}],\"responseRedactions\":[{\"jsonPath\":\"$.data.user.result.core.screen_name\",\"regex\":\"\\\"screen_name\\\":\\\"(.*)\\\"\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.legacy.followers_count\",\"regex\":\"\\\"followers_count\\\":(.*)\",\"xPath\":\"\"},{\"jsonPath\":\"$.data.user.result.core.created_at\",\"regex\":\"\\\"created_at\\\":\\\"(.*)\\\"\",\"xPath\":\"\"}],\"url\":\"https://{{URL_PARAM_DOMAIN}}.com/i/api/graphql/{{URL_PARAMS_1}}/UserByScreenName?{{URL_PARAM_2_GRD}}\"}".to_string(), - context: "{\"extractedParameters\":{\"URL_PARAMS_1\":\"xWw45l6nX7DP2FKRyePXSw\",\"URL_PARAM_2_GRD\":\"variables=%7B%22screen_name%22%3A%22burnt9507278342%22%7D&features=%7B%22hidden_profile_subscriptions_enabled%22%3Atrue%2C%22profile_label_improvements_pcf_label_in_post_enabled%22%3Atrue%2C%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22subscriptions_verification_info_is_identity_verified_enabled%22%3Atrue%2C%22subscriptions_verification_info_verified_since_enabled%22%3Atrue%2C%22highlights_tweets_tab_ui_enabled%22%3Atrue%2C%22responsive_web_twitter_article_notes_tab_enabled%22%3Atrue%2C%22subscriptions_feature_can_gift_premium%22%3Atrue%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%7D&fieldToggles=%7B%22withAuxiliaryUserLabels%22%3Atrue%7D\",\"URL_PARAM_DOMAIN\":\"x\",\"created_at\":\"Wed Apr 23 16:06:50 +0000 2025\",\"followers_count\":\"0\",\"screen_name\":\"Burnt9507278342\"},\"providerHash\":\"0xd4fb71de874115b581e7c15fedd0f71b38fbfabf6894487d275fde2cca1d0ebb\"}".to_string() - }; - let claim_data: CompleteClaimData = CompleteClaimData { - identifier: "0x5fba1c86439db035389d90f8025739c54849db4cfb7cf91aa3fb02abd9c1f83a".to_string(), - owner: "0x612c00c6d44fa281beeea91805349519ef3c3e83".to_string(), - epoch: 1, - timestampS: 1748539856 - }; - - let signed_claim = SignedClaim { - signatures, - claim: claim_data, - }; - - let proof = Proof { - claimInfo: claim_info, - signedClaim: signed_claim, - }; - - let proof_msg: ProofMsg = ProofMsg { - proof, - }; - - reclaim_verifier.execute(&ExecuteMsg::VerifyProof(proof_msg), None).unwrap(); - } -} \ No newline at end of file From 89956d00598dc2086a0e3b77256fadec56a95e0f Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 16 Jun 2025 11:34:37 -0700 Subject: [PATCH 06/11] lint --- contracts/reclaim_user_map/examples/schema.rs | 2 +- contracts/reclaim_user_map/src/contract.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/reclaim_user_map/examples/schema.rs b/contracts/reclaim_user_map/examples/schema.rs index 9681fbf..bc318a0 100644 --- a/contracts/reclaim_user_map/examples/schema.rs +++ b/contracts/reclaim_user_map/examples/schema.rs @@ -1,5 +1,5 @@ use cosmwasm_schema::write_api; -use user_map::msg::*; +use reclaim_user_map::msg::*; fn main() { write_api! { diff --git a/contracts/reclaim_user_map/src/contract.rs b/contracts/reclaim_user_map/src/contract.rs index e838375..ffbbdbe 100644 --- a/contracts/reclaim_user_map/src/contract.rs +++ b/contracts/reclaim_user_map/src/contract.rs @@ -20,7 +20,7 @@ pub fn instantiate( return Err(ClaimKeyInvalid) } CLAIM_VALUE_KEY.save(deps.storage, &msg.claim_key)?; - + Ok(Response::new() .add_attribute("method", "instantiate") .add_attribute("owner", info.sender)) From 28fb08f375665b94fe19ac0b489c42bb0204a658 Mon Sep 17 00:00:00 2001 From: Burnt Val Date: Mon, 16 Jun 2025 18:05:10 -0400 Subject: [PATCH 07/11] getRandom disable --- contracts/reclaim_user_map/Cargo.toml | 1 + contracts/reclaim_user_map/src/lib.rs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/contracts/reclaim_user_map/Cargo.toml b/contracts/reclaim_user_map/Cargo.toml index cc807f4..d30b5b1 100644 --- a/contracts/reclaim_user_map/Cargo.toml +++ b/contracts/reclaim_user_map/Cargo.toml @@ -17,4 +17,5 @@ cw-storage-plus = { workspace = true } thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +getrandom = { workspace = true } reclaim_xion = { package = "reclaim-xion", git = "https://github.com/reclaimprotocol/xion-sdk-onchain-integration.git"} \ No newline at end of file diff --git a/contracts/reclaim_user_map/src/lib.rs b/contracts/reclaim_user_map/src/lib.rs index 4708c2c..dd94e38 100644 --- a/contracts/reclaim_user_map/src/lib.rs +++ b/contracts/reclaim_user_map/src/lib.rs @@ -5,3 +5,14 @@ pub mod contract; mod error; pub mod msg; mod state; + +// 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); From c87e387fa69ea62a83defadcf3c9f86dbf4cb005 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 16 Jun 2025 15:34:52 -0700 Subject: [PATCH 08/11] proper imports --- contracts/reclaim_user_map/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/reclaim_user_map/Cargo.toml b/contracts/reclaim_user_map/Cargo.toml index d30b5b1..eee7280 100644 --- a/contracts/reclaim_user_map/Cargo.toml +++ b/contracts/reclaim_user_map/Cargo.toml @@ -11,11 +11,11 @@ crate-type = ["cdylib", "rlib"] library = [] [dependencies] -cosmwasm-schema = { workspace = true } -cosmwasm-std = { workspace = true } -cw-storage-plus = { workspace = true } +cosmwasm-schema = "1.3.1" +cosmwasm-std = "1.3.1" +cw-storage-plus = "1.1.0" thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } getrandom = { workspace = true } -reclaim_xion = { package = "reclaim-xion", git = "https://github.com/reclaimprotocol/xion-sdk-onchain-integration.git"} \ No newline at end of file +reclaim_xion = { package = "reclaim-xion", git = "https://github.com/reclaimprotocol/xion-sdk-onchain-integration.git", features = ["library"]} \ No newline at end of file From 8563efb48076824748ed30980cd49e40b4f78990 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 16 Jun 2025 15:50:26 -0700 Subject: [PATCH 09/11] disable library header in follow on contract --- contracts/reclaim_user_map/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/reclaim_user_map/Cargo.toml b/contracts/reclaim_user_map/Cargo.toml index eee7280..7e4211e 100644 --- a/contracts/reclaim_user_map/Cargo.toml +++ b/contracts/reclaim_user_map/Cargo.toml @@ -18,4 +18,4 @@ thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } getrandom = { workspace = true } -reclaim_xion = { package = "reclaim-xion", git = "https://github.com/reclaimprotocol/xion-sdk-onchain-integration.git", features = ["library"]} \ No newline at end of file +reclaim_xion = { package = "reclaim-xion", git = "https://github.com/burnt-labs/xion-sdk-onchain-integration.git", features = ["library"], rev = "5c67c33d0575c2ede6d2512c5d724b52019974bb"} \ No newline at end of file From 0887cd522fbda353bbf9d61701b2a25bdfc1eefe Mon Sep 17 00:00:00 2001 From: Burnt Val Date: Tue, 17 Jun 2025 12:43:24 -0400 Subject: [PATCH 10/11] hash map type fix --- contracts/reclaim_user_map/src/contract.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/reclaim_user_map/src/contract.rs b/contracts/reclaim_user_map/src/contract.rs index ffbbdbe..eee4ef2 100644 --- a/contracts/reclaim_user_map/src/contract.rs +++ b/contracts/reclaim_user_map/src/contract.rs @@ -35,7 +35,7 @@ pub fn execute( match msg { ExecuteMsg::Update { value } => { // validate JSON - let context: HashMap<&str, String> = serde_json::from_str(&value.proof.claimInfo.context)?; + let context: HashMap<&str, serde_json::value::Value> = serde_json::from_str(&value.proof.claimInfo.context)?; let verified_value = match context.get(CLAIM_VALUE_KEY.load(deps.storage)?.as_str()) { Some(v) => v.to_string(), None => return Err(ContractError::JSONKeyMissing {}), From bf459dc071a8ceb4ca4a6cf49b59c4532aa4d783 Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 17 Jun 2025 09:50:18 -0700 Subject: [PATCH 11/11] extracted parameters nest --- contracts/reclaim_user_map/src/contract.rs | 11 +++++++++-- contracts/reclaim_user_map/src/error.rs | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/contracts/reclaim_user_map/src/contract.rs b/contracts/reclaim_user_map/src/contract.rs index eee4ef2..c283aa7 100644 --- a/contracts/reclaim_user_map/src/contract.rs +++ b/contracts/reclaim_user_map/src/contract.rs @@ -5,6 +5,7 @@ use crate::msg::InstantiateMsg; use crate::msg::{ExecuteMsg, QueryMsg}; use crate::state::{CLAIM_VALUE_KEY, USER_MAP, VERIFICATION_ADDR}; use cosmwasm_std::{entry_point, to_json_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Order, Response, StdResult, WasmMsg}; +use serde_json::Value; use crate::error::ContractError::ClaimKeyInvalid; #[entry_point] @@ -35,8 +36,14 @@ pub fn execute( match msg { ExecuteMsg::Update { value } => { // validate JSON - let context: HashMap<&str, serde_json::value::Value> = serde_json::from_str(&value.proof.claimInfo.context)?; - let verified_value = match context.get(CLAIM_VALUE_KEY.load(deps.storage)?.as_str()) { + let context: HashMap<&str, Value> = serde_json::from_str(&value.proof.claimInfo.context)?; + + let extracted_parameters = match context.get("extractedParameters") { + None => return Err(ContractError::ExtractedParametersMissing {}), + Some(v) => v + }; + + let verified_value = match extracted_parameters.get(CLAIM_VALUE_KEY.load(deps.storage)?.as_str()) { Some(v) => v.to_string(), None => return Err(ContractError::JSONKeyMissing {}), }; diff --git a/contracts/reclaim_user_map/src/error.rs b/contracts/reclaim_user_map/src/error.rs index 963e917..7ebab50 100644 --- a/contracts/reclaim_user_map/src/error.rs +++ b/contracts/reclaim_user_map/src/error.rs @@ -8,6 +8,9 @@ pub enum ContractError { #[error("json key missing")] JSONKeyMissing, + + #[error("extracted paramters missing")] + ExtractedParametersMissing, #[error("claim key invalid")] ClaimKeyInvalid,