cw4/
hook.rs

1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{to_json_binary, Binary, CosmosMsg, StdResult, WasmMsg};
3
4/// MemberDiff shows the old and new states for a given cw4 member
5/// They cannot both be None.
6/// old = None, new = Some -> Insert
7/// old = Some, new = Some -> Update
8/// old = Some, new = None -> Delete
9#[cw_serde]
10pub struct MemberDiff {
11    pub key: String,
12    pub old: Option<u64>,
13    pub new: Option<u64>,
14}
15
16impl MemberDiff {
17    pub fn new<T: Into<String>>(addr: T, old_weight: Option<u64>, new_weight: Option<u64>) -> Self {
18        MemberDiff {
19            key: addr.into(),
20            old: old_weight,
21            new: new_weight,
22        }
23    }
24}
25
26/// MemberChangedHookMsg should be de/serialized under `MemberChangedHook()` variant in a ExecuteMsg.
27/// This contains a list of all diffs on the given transaction.
28#[cw_serde]
29pub struct MemberChangedHookMsg {
30    pub diffs: Vec<MemberDiff>,
31}
32
33impl MemberChangedHookMsg {
34    pub fn one(diff: MemberDiff) -> Self {
35        MemberChangedHookMsg { diffs: vec![diff] }
36    }
37
38    pub fn new(diffs: Vec<MemberDiff>) -> Self {
39        MemberChangedHookMsg { diffs }
40    }
41
42    /// serializes the message
43    pub fn into_json_binary(self) -> StdResult<Binary> {
44        let msg = MemberChangedExecuteMsg::MemberChangedHook(self);
45        to_json_binary(&msg)
46    }
47
48    /// creates a cosmos_msg sending this struct to the named contract
49    pub fn into_cosmos_msg<T: Into<String>>(self, contract_addr: T) -> StdResult<CosmosMsg> {
50        let msg = self.into_json_binary()?;
51        let execute = WasmMsg::Execute {
52            contract_addr: contract_addr.into(),
53            msg,
54            funds: vec![],
55        };
56        Ok(execute.into())
57    }
58}
59
60// This is just a helper to properly serialize the above message
61#[cw_serde]
62
63enum MemberChangedExecuteMsg {
64    MemberChangedHook(MemberChangedHookMsg),
65}