Skip to content

Commit c0d4c01

Browse files
committed
Use the reply id to indicate Instantiate vs. Execute messages (echo contract)
1 parent c20f112 commit c0d4c01

File tree

2 files changed

+86
-26
lines changed

2 files changed

+86
-26
lines changed

packages/multi-test/src/app.rs

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,8 @@ mod test {
18241824
mod reply_data_overwrite {
18251825
use super::*;
18261826

1827+
use echo::EXECUTE_REPLY_BASE_ID;
1828+
18271829
fn make_echo_submsg(
18281830
contract: Addr,
18291831
data: impl Into<Option<&'static str>>,
@@ -1907,7 +1909,12 @@ mod test {
19071909
contract.clone(),
19081910
&echo::Message {
19091911
data: Some("First".to_owned()),
1910-
sub_msg: vec![make_echo_submsg(contract, "Second", vec![], 1)],
1912+
sub_msg: vec![make_echo_submsg(
1913+
contract,
1914+
"Second",
1915+
vec![],
1916+
EXECUTE_REPLY_BASE_ID,
1917+
)],
19111918
..echo::Message::default()
19121919
},
19131920
&[],
@@ -1987,7 +1994,12 @@ mod test {
19871994
owner,
19881995
contract.clone(),
19891996
&echo::Message {
1990-
sub_msg: vec![make_echo_submsg(contract, "Second", vec![], 1)],
1997+
sub_msg: vec![make_echo_submsg(
1998+
contract,
1999+
"Second",
2000+
vec![],
2001+
EXECUTE_REPLY_BASE_ID,
2002+
)],
19912003
..echo::Message::default()
19922004
},
19932005
&[],
@@ -2076,10 +2088,25 @@ mod test {
20762088
&echo::Message {
20772089
data: Some("Orig".to_owned()),
20782090
sub_msg: vec![
2079-
make_echo_submsg(contract.clone(), None, vec![], 1),
2080-
make_echo_submsg(contract.clone(), "First", vec![], 2),
2081-
make_echo_submsg(contract.clone(), "Second", vec![], 3),
2082-
make_echo_submsg(contract, None, vec![], 4),
2091+
make_echo_submsg(
2092+
contract.clone(),
2093+
None,
2094+
vec![],
2095+
EXECUTE_REPLY_BASE_ID + 1,
2096+
),
2097+
make_echo_submsg(
2098+
contract.clone(),
2099+
"First",
2100+
vec![],
2101+
EXECUTE_REPLY_BASE_ID + 2,
2102+
),
2103+
make_echo_submsg(
2104+
contract.clone(),
2105+
"Second",
2106+
vec![],
2107+
EXECUTE_REPLY_BASE_ID + 3,
2108+
),
2109+
make_echo_submsg(contract, None, vec![], EXECUTE_REPLY_BASE_ID + 4),
20832110
],
20842111
..echo::Message::default()
20852112
},
@@ -2139,10 +2166,25 @@ mod test {
21392166
contract.clone(),
21402167
&echo::Message {
21412168
sub_msg: vec![
2142-
make_echo_submsg(contract.clone(), None, vec![], 1),
2169+
make_echo_submsg(
2170+
contract.clone(),
2171+
None,
2172+
vec![],
2173+
EXECUTE_REPLY_BASE_ID + 1,
2174+
),
21432175
make_echo_submsg_no_reply(contract.clone(), "Hidden", vec![]),
2144-
make_echo_submsg(contract.clone(), "Shown", vec![], 2),
2145-
make_echo_submsg(contract.clone(), None, vec![], 3),
2176+
make_echo_submsg(
2177+
contract.clone(),
2178+
"Shown",
2179+
vec![],
2180+
EXECUTE_REPLY_BASE_ID + 2,
2181+
),
2182+
make_echo_submsg(
2183+
contract.clone(),
2184+
None,
2185+
vec![],
2186+
EXECUTE_REPLY_BASE_ID + 3,
2187+
),
21462188
make_echo_submsg_no_reply(contract, "Lost", vec![]),
21472189
],
21482190
..echo::Message::default()
@@ -2180,12 +2222,17 @@ mod test {
21802222
vec![make_echo_submsg(
21812223
contract.clone(),
21822224
"Second",
2183-
vec![make_echo_submsg(contract, None, vec![], 4)],
2184-
3,
2225+
vec![make_echo_submsg(
2226+
contract,
2227+
None,
2228+
vec![],
2229+
EXECUTE_REPLY_BASE_ID + 4,
2230+
)],
2231+
EXECUTE_REPLY_BASE_ID + 3,
21852232
)],
2186-
2,
2233+
EXECUTE_REPLY_BASE_ID + 2,
21872234
)],
2188-
1,
2235+
EXECUTE_REPLY_BASE_ID + 1,
21892236
)],
21902237
..echo::Message::default()
21912238
},
@@ -2393,6 +2440,7 @@ mod test {
23932440

23942441
mod protobuf_wrapped_data {
23952442
use super::*;
2443+
use crate::test_helpers::contracts::echo::EXECUTE_REPLY_BASE_ID;
23962444
use cw0::parse_instantiate_response_data;
23972445

23982446
#[test]
@@ -2486,7 +2534,7 @@ mod test {
24862534
msg: to_binary(&msg).unwrap(),
24872535
funds: vec![],
24882536
},
2489-
1234,
2537+
EXECUTE_REPLY_BASE_ID,
24902538
);
24912539
let init_msg = echo::InitMessage::<Empty> {
24922540
data: Some("Overwrite me".into()),

packages/multi-test/src/test_helpers/contracts/echo.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ use crate::{test_helpers::EmptyMsg, Contract, ContractWrapper};
1313
use schemars::JsonSchema;
1414
use std::fmt::Debug;
1515

16-
use cw0::parse_execute_response_data;
16+
use cw0::{parse_execute_response_data, parse_instantiate_response_data};
1717
use derivative::Derivative;
1818

19+
// Choosing a reply id less than ECHO_EXECUTE_BASE_ID indicates an Instantiate message reply by convention.
20+
// An Execute message reply otherwise.
21+
pub(crate) const EXECUTE_REPLY_BASE_ID: u64 = i64::MAX as u64;
22+
1923
#[derive(Debug, Clone, Serialize, Deserialize, Derivative)]
2024
#[derivative(Default(bound = "", new = "true"))]
2125
pub struct Message<ExecC>
@@ -90,27 +94,35 @@ fn reply<ExecC>(_deps: DepsMut, _env: Env, msg: Reply) -> Result<Response<ExecC>
9094
where
9195
ExecC: Debug + PartialEq + Clone + JsonSchema + 'static,
9296
{
97+
let res = Response::new();
9398
if let Reply {
99+
id,
94100
result:
95101
ContractResult::Ok(SubMsgExecutionResponse {
96102
data: Some(data), ..
97103
}),
98-
..
99104
} = msg
100105
{
101-
// we parse out the WasmMsg::Execute wrapper...
102-
// TODO: this is not fully correct... we need to handle execute, instantiate, and bankmsg differently
103-
// that will require using the Reply id somehow to signal what type
104-
let parsed = parse_execute_response_data(data.as_slice())
105-
.map_err(|e| StdError::generic_err(e.to_string()))?
106-
.data;
107-
if let Some(d) = parsed {
108-
Ok(Response::new().set_data(d))
106+
// We parse out the WasmMsg::Execute wrapper...
107+
// TODO: Handle all of Execute, Instantiate, and BankMsg replies differently.
108+
let parsed_data;
109+
if id < EXECUTE_REPLY_BASE_ID {
110+
parsed_data = parse_instantiate_response_data(data.as_slice())
111+
.map_err(|e| StdError::generic_err(e.to_string()))?
112+
.data;
113+
} else {
114+
parsed_data = parse_execute_response_data(data.as_slice())
115+
.map_err(|e| StdError::generic_err(e.to_string()))?
116+
.data;
117+
}
118+
119+
if let Some(data) = parsed_data {
120+
Ok(res.set_data(data))
109121
} else {
110-
Ok(Response::new())
122+
Ok(res)
111123
}
112124
} else {
113-
Ok(Response::new())
125+
Ok(res)
114126
}
115127
}
116128

0 commit comments

Comments
 (0)