Skip to content

Commit a187606

Browse files
authored
Merge pull request #2 from hyperlane-xyz/aggregation_verify
fix: aggregation_ism_metadata parsing fix
2 parents 7eda841 + 8c36c3f commit a187606

File tree

2 files changed

+120
-24
lines changed

2 files changed

+120
-24
lines changed

cairo/crates/contracts/src/libs/aggregation_ism_metadata.cairo

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,8 @@ pub mod aggregation_ism_metadata {
3232
Result::Ok((start, end)) => (start, end),
3333
Result::Err(_) => (0, 0),
3434
};
35-
let mut bytes_array = BytesTrait::new(496, array![]);
36-
loop {
37-
if ((end - start) <= 16) {
38-
let (_, res) = _metadata.read_u128_packed(start, end - start);
39-
bytes_array.append_u128(res);
40-
break ();
41-
}
42-
let (_, res) = _metadata.read_u128_packed(start, BYTES_PER_ELEMENT.into());
43-
bytes_array.append_u128(res);
44-
start = start + BYTES_PER_ELEMENT.into()
45-
};
46-
bytes_array
35+
let (_, res) = _metadata.read_bytes(start, end - start);
36+
res
4737
}
4838
/// Returns whether or not metadata was provided for the ISM at _index
4939
/// Dev: Callers must ensure _index is less than the number of metadatas provided
@@ -102,21 +92,55 @@ mod test {
10292
0x00000000000000000000000000000000,
10393
],
10494
);
95+
let mut expected_result = array![0xAAAAAAAAAAAAAAAABBBBCCCC00000000_u256];
96+
let mut cur_idx = 0;
97+
while (cur_idx != 1) {
98+
let result = AggregationIsmMetadata::metadata_at(encoded_metadata.clone(), 0);
99+
assert(
100+
*BytesTrait::data(result.clone())[0] == *expected_result.at(cur_idx).low,
101+
'Agg metadata extract failed',
102+
);
103+
cur_idx += 1;
104+
};
105+
}
106+
107+
#[test]
108+
fn test_metadata_not_padded() {
109+
let encoded_metadata = BytesTrait::new(
110+
141,
111+
array![
112+
0x000000080000008d071e1b5e54086bbd,
113+
0xe2b7a131a2c913f442485974c32df56e,
114+
0xe47f9456b3270daebe22faba5bc0223a,
115+
0x7e3077adcd04391f2ccdd2b2ad2eac2d,
116+
0x71c3f04755d5d95d000000015dcbf07f,
117+
0xa1898b0d8b64991f099e8478268fb36e,
118+
0x0e5fe7832aa345da8b8888645622786d,
119+
0x53d898c95d75d37a582de78deda23497,
120+
0x7d806349eac6653e9190d11a1c,
121+
],
122+
);
105123
let mut expected_result = array![
106-
0xAAAAAAAAAAAAAAAABBBBCCCC_u256, 0xDDDDDDDDEEEEEEEE_u256, 0xFFFFFFFF00000000_u256,
124+
0x071E1B5E54086BBDE2B7A131A2C913F4_u256,
125+
0x42485974C32DF56EE47F9456B3270DAE_u256,
126+
0xbe22faba5bc0223a7e3077adcd04391f_u256,
127+
0x2ccdd2b2ad2eac2d71c3f04755d5d95d_u256,
128+
0x000000015dcbf07fa1898b0d8b64991f_u256,
129+
0x099e8478268fb36e0e5fe7832aa345da_u256,
130+
0x8B8888645622786D53D898C95D75D37A_u256,
131+
0x582DE78DEDA234970000007D806349EA_u256,
132+
0xC6653E91900000000000000000000000_u256,
107133
];
134+
let result = AggregationIsmMetadata::metadata_at(encoded_metadata.clone(), 0);
135+
108136
let mut cur_idx = 0;
109-
loop {
110-
if (cur_idx == 3) {
111-
break ();
112-
}
113-
let result = AggregationIsmMetadata::metadata_at(encoded_metadata.clone(), cur_idx);
137+
while (cur_idx != 9) {
114138
assert(
115-
*BytesTrait::data(result.clone())[0] == *expected_result.at(cur_idx.into()).low,
139+
*BytesTrait::data(result.clone())[cur_idx] == *expected_result.at(cur_idx).low,
116140
'Agg metadata extract failed',
117141
);
118142
cur_idx += 1;
119-
};
143+
}
120144
}
121145

122146
#[test]

cairo/crates/contracts/tests/isms/test_aggregation.cairo

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
use alexandria_bytes::BytesTrait;
2-
use contracts::interfaces::{IAggregationDispatcherTrait, ModuleType};
1+
use alexandria_bytes::{Bytes, BytesTrait};
2+
use contracts::interfaces::{
3+
IAggregationDispatcher, IAggregationDispatcherTrait, IInterchainSecurityModuleDispatcher,
4+
IInterchainSecurityModuleDispatcherTrait, IValidatorConfigurationDispatcher,
5+
IValidatorConfigurationDispatcherTrait, ModuleType,
6+
};
37
use contracts::isms::aggregation::aggregation;
48
use contracts::libs::message::{HYPERLANE_VERSION, Message};
59
use contracts::utils::utils::U256TryIntoContractAddress;
610

7-
use openzeppelin::access::ownable::interface::IOwnableDispatcher;
8-
use snforge_std::{CheatSpan, cheat_caller_address};
11+
use openzeppelin::access::ownable::interface::{IOwnableDispatcher, IOwnableDispatcherTrait};
12+
use snforge_std::{
13+
CheatSpan, ContractClassTrait, DeclareResultTrait, EventSpy, cheat_caller_address,
14+
cheatcodes::contract_class::ContractClass, declare, spy_events,
15+
};
16+
17+
18+
use starknet::ContractAddress;
919
use super::super::setup::{
1020
CONTRACT_MODULES, DESTINATION_DOMAIN, LOCAL_DOMAIN, MODULES, OWNER, VALID_OWNER,
1121
VALID_RECIPIENT, build_messageid_metadata, get_message_and_signature, setup_aggregation,
@@ -104,3 +114,65 @@ fn test_aggregation_verify() {
104114
assert(aggregation.verify(concat_metadata, message), 'Aggregation: verify failed');
105115
}
106116

117+
118+
#[test]
119+
fn test_aggregation_verify_e2e() {
120+
let aggregation_threshold = 1;
121+
122+
// MESSAGEID
123+
let message_body = BytesTrait::new(11, array![0x68656C6C6F20776F726C640000000000]);
124+
let metadata = BytesTrait::new(
125+
144,
126+
array![
127+
0x000000080000008d071e1b5e54086bbd,
128+
0xe2b7a131a2c913f442485974c32df56e,
129+
0xe47f9456b3270daebe22faba5bc0223a,
130+
0x7e3077adcd04391f2ccdd2b2ad2eac2d,
131+
0x71c3f04755d5d95d000000015dcbf07f,
132+
0xa1898b0d8b64991f099e8478268fb36e,
133+
0x0e5fe7832aa345da8b8888645622786d,
134+
0x53d898c95d75d37a582de78deda23497,
135+
0x7d806349eac6653e9190d11a1c000000,
136+
],
137+
);
138+
let message = Message {
139+
version: HYPERLANE_VERSION,
140+
nonce: 0,
141+
origin: 23448593,
142+
sender: 0x00b3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca,
143+
destination: 23448594,
144+
recipient: 0x0777c88c0822f31828c97688a219af6b6689cae7bc90a7aa71437956dfed16a1,
145+
body: message_body.clone(),
146+
};
147+
148+
let multisig_threshold = 1;
149+
let validators_array: Array<felt252> = array![
150+
0x15d34aaf54267db7d7c367839aaf71a00a2c6a65.try_into().unwrap(),
151+
];
152+
153+
// Deploy the messageid contract at a specific address
154+
let specific_address: ContractAddress =
155+
0x045133e4b0a40aa7992bfb5d7f552b767be1b070af81f0313adf8e01cf3ab32c
156+
.try_into()
157+
.unwrap();
158+
let messageid_class = declare("messageid_multisig_ism").unwrap().contract_class();
159+
let mut parameters = Default::default();
160+
let owner: felt252 = 0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca
161+
.try_into()
162+
.unwrap();
163+
Serde::serialize(@owner, ref parameters);
164+
Serde::serialize(@validators_array.span(), ref parameters);
165+
Serde::serialize(@multisig_threshold, ref parameters);
166+
messageid_class.deploy_at(@parameters, specific_address);
167+
168+
let messageid_ism = IInterchainSecurityModuleDispatcher { contract_address: specific_address };
169+
// println!("E2E test messageid_ism: {}", messageid_ism.contract_address());
170+
171+
let aggregation = setup_aggregation(
172+
array![messageid_ism.contract_address.into()].span(),
173+
aggregation_threshold.try_into().unwrap(),
174+
);
175+
176+
assert(aggregation.verify(metadata, message), 'Aggregation: verify failed');
177+
}
178+

0 commit comments

Comments
 (0)