Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat(multisig-prover) & feat(voting-verifier): add Stacks specific encoding, custom ITS support, as well as stacks-clarity custom package #6

Open
wants to merge 45 commits into
base: stacks_ampd_v2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
6713d40
Add new package for stacks clarity with code from stacks core. Add ne…
raress96 Oct 11, 2024
3eae912
Add needed clarity types for serializing Clarity Messages.
raress96 Oct 11, 2024
0c9363d
Add most needed code to stacks-clarity package.
raress96 Oct 14, 2024
accc7b5
Implement data hash generation for stacks messages.
raress96 Oct 14, 2024
2f4a6f8
Implement payload digest for messages and verifier set.
raress96 Oct 15, 2024
f0f3d70
Working tests for stacks payload hashing.
raress96 Oct 15, 2024
02b348f
Add code for execute data for Stacks.
raress96 Oct 15, 2024
7af8520
Tests for stacks execute data.
raress96 Oct 15, 2024
314d702
Implement verify verifier set handler for stacks.
raress96 Oct 16, 2024
c5fd0bc
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Oct 16, 2024
b4d542b
Add update source gateway address to voting verifier.
raress96 Oct 16, 2024
e557d8f
Add tests for update source gateway.
raress96 Oct 17, 2024
773db1f
Add todo to remove update source gateway address.
raress96 Oct 22, 2024
53713ea
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Oct 24, 2024
f1daab0
Merge branch 'stacks_ampd_its' into stacks_contracts
raress96 Oct 24, 2024
67ce9a6
Add migration and error if trying to construct proof for its hub mess…
raress96 Oct 24, 2024
eb59774
Start work on encoding its payload to clarity.
raress96 Oct 24, 2024
a858ef7
Implement all its hub payload conversions for stacks.
raress96 Oct 25, 2024
5a2ca5b
Handle ITS hub payload encoding in stacks multisig prover.
raress96 Oct 25, 2024
7fb9d4c
Merge branch 'stacks_ampd_its' into stacks_contracts_its
raress96 Oct 28, 2024
f85130e
Merge branch 'stacks_ampd_its' into stacks_contracts_its
raress96 Oct 28, 2024
4ddcde0
Update types to be consistent with clarity.
raress96 Oct 28, 2024
c226f3c
Merge pull request #4 from Trust-Machines/stacks_contracts_its
raress96 Oct 29, 2024
6c44266
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Oct 29, 2024
62cc3df
Temporary change axelarnet chain name.
raress96 Oct 30, 2024
745cd49
Fix stacks its deploy token manager clarity payload in multisig prove…
raress96 Oct 31, 2024
3d75de7
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Nov 4, 2024
59a7250
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Nov 8, 2024
266ca8b
Temporary remove deploy token manager support.
raress96 Nov 8, 2024
5c9fa40
Merge branch 'stacks_ampd' into stacks_contracts
raress96 Nov 20, 2024
c8b4ec4
Remove its hub deploy token manager references.
raress96 Nov 20, 2024
26e9186
Merge branch 'main' into stacks_contracts
raress96 Nov 25, 2024
b5e0f41
Fix for cosm wasm contracts not compiling.
raress96 Nov 25, 2024
2c7ccbd
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Dec 12, 2024
b9ffd5a
Start working on adding VerifyMessageWithPayload to the Gateway and V…
raress96 Dec 12, 2024
d167b80
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Dec 12, 2024
9c495cf
Implement abi converting in Voting Verifier for Stacks.
raress96 Dec 13, 2024
6a29db2
Add migration.
raress96 Dec 13, 2024
967ca55
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Dec 13, 2024
2e275ef
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Jan 13, 2025
c6fc005
Remove update source gateway endpoint.
raress96 Jan 14, 2025
a90047a
Remove migrations for voting verifier.
raress96 Jan 23, 2025
304666d
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Jan 27, 2025
5559ca2
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Jan 31, 2025
1b6469d
Merge branch 'stacks_ampd_v2' into stacks_contracts_v2
raress96 Feb 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 51 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ service-registry = { version = "^1.1.0", path = "contracts/service-registry" }
service-registry-api = { version = "^1.0.0", path = "packages/service-registry-api" }
sha3 = { version = "0.10.8", default-features = false, features = [] }
signature-verifier-api = { version = "^1.0.0", path = "packages/signature-verifier-api" }
stacks-clarity = { version = "^1.0.0", path = "packages/stacks-clarity" }
stellar = { version = "^1.0.0", path = "external-gateways/stellar" }
stellar-xdr = { version = "21.2.0" }
strum = { version = "0.25", default-features = false, features = ["derive"] }
Expand Down
4 changes: 4 additions & 0 deletions contracts/gateway/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ pub fn execute(
ExecuteMsg::VerifyMessages(msgs) => {
execute::verify_messages(&verifier, msgs).change_context(Error::VerifyMessages)
}
ExecuteMsg::VerifyMessageWithPayload { message, payload } => {
execute::verify_message_with_payload(&verifier, message, payload)
.change_context(Error::VerifyMessages)
}
ExecuteMsg::RouteMessages(msgs) => {
let router = Router::new(config.router);

Expand Down
42 changes: 41 additions & 1 deletion contracts/gateway/src/contract/execute.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use axelar_wasm_std::{FnExt, VerificationStatus};
use cosmwasm_std::{CosmosMsg, Event, Response, Storage};
use cosmwasm_std::{CosmosMsg, Event, HexBinary, Response, Storage};
use error_stack::{Result, ResultExt};
use itertools::Itertools;
use router_api::client::Router;
Expand All @@ -19,6 +19,23 @@ pub fn verify_messages(
})
}

pub fn verify_message_with_payload(
verifier: &voting_verifier::Client,
message: Message,
message_payload: HexBinary,
) -> Result<Response, Error> {
let message_status = verifier
.messages_status(vec![message])
.change_context(Error::MessageStatus)?
.remove(0);

let (cosm_message, events) = verify_with_payload(verifier, message_status, message_payload);

Ok(Response::new()
.add_messages(cosm_message)
.add_events(events))
}

pub fn route_incoming_messages(
verifier: &voting_verifier::Client,
router: &Router,
Expand Down Expand Up @@ -102,6 +119,29 @@ fn verify(
.then(|(msgs, events)| (verifier.verify_messages(msgs), events))
}

fn verify_with_payload(
verifier: &voting_verifier::Client,
message_status: MessageStatus,
message_payload: HexBinary,
) -> (Option<CosmosMsg>, Vec<Event>) {
let status = message_status.status;
let message = message_status.message;

let messages = vec![message.clone()];

let verifiable_messages = filter_verifiable_messages(status, &messages);
let events = into_verify_events(status, messages);

if verifiable_messages.is_empty() {
return (None, events);
}

(
Some(verifier.verify_message_with_payload(message, message_payload)),
events,
)
}

fn route(
router: &Router,
msgs_by_status: Vec<(VerificationStatus, Vec<Message>)>,
Expand Down
72 changes: 72 additions & 0 deletions contracts/gateway/tests/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,58 @@ fn successful_verify() {
goldie::assert_json!(responses);
}

#[test]
fn successful_verify_with_payload() {
let (test_cases, handler) = test_cases_for_correct_verifier();

let mut responses = vec![];
for msgs in test_cases {
let mut deps = mock_dependencies();
update_query_handler(&mut deps.querier, handler.clone());

instantiate_contract(deps.as_mut(), "verifier", "router");

for msg in msgs {
// check verification is idempotent
let response = iter::repeat(
execute(
deps.as_mut(),
mock_env(),
mock_info("sender", &[]),
ExecuteMsg::VerifyMessageWithPayload {
message: msg,
payload: HexBinary::from_hex("00").unwrap(),
},
)
.unwrap(),
)
.take(10)
.dedup()
.collect::<Vec<_>>();

assert_eq!(response.len(), 1);

responses.push(response[0].clone());
}
}

let golden_file = "tests/test_verify_with_payload.json";
#[cfg(feature = "generate_golden_files")]
{
let f = File::create(golden_file).unwrap();
serde_json::to_writer_pretty(f, &responses).unwrap();
}
#[cfg(not(feature = "generate_golden_files"))]
{
let f = File::open(golden_file).unwrap();
let expected_responses: Vec<Response> = serde_json::from_reader(f).unwrap();
assert_eq!(
serde_json::to_string_pretty(&responses).unwrap(),
serde_json::to_string_pretty(&expected_responses).unwrap()
);
}
}

#[test]
fn successful_route_incoming() {
let (test_cases, handler) = test_cases_for_correct_verifier();
Expand Down Expand Up @@ -175,6 +227,26 @@ fn verify_with_faulty_verifier_fails() {
assert!(response.is_err());
}

#[test]
fn verify_with_payload_with_faulty_verifier_fails() {
// if the mock querier is not overwritten, it will return an error
let mut deps = mock_dependencies();

instantiate_contract(deps.as_mut(), "verifier", "router");

let response = execute(
deps.as_mut(),
mock_env(),
mock_info("sender", &[]),
ExecuteMsg::VerifyMessageWithPayload {
message: generate_msgs("verifier in unreachable", 1).remove(0),
payload: HexBinary::from_hex("00").unwrap(),
},
);

assert!(response.is_err());
}

#[test]
fn route_incoming_with_faulty_verifier_fails() {
// if the mock querier is not overwritten, it will return an error
Expand Down
Loading
Loading