pallet_xcm_transactor/
encode.rs1use frame_support::pallet_prelude::*;
25use sp_runtime::traits::{AccountIdLookup, StaticLookup};
26use sp_std::prelude::*;
27use xcm_primitives::{
28 AvailableStakeCalls, HrmpAvailableCalls, HrmpEncodeCall, StakeEncodeCall,
29 UtilityAvailableCalls, UtilityEncodeCall, XcmTransact,
30};
31
32pub use crate::pallet::*;
33
34pub use crate::weights::WeightInfo;
35
36impl<T: Config> UtilityEncodeCall for Pallet<T> {
37 fn encode_call<Transactor: XcmTransact>(
38 transactor: Transactor,
39 call: UtilityAvailableCalls,
40 ) -> Vec<u8> {
41 let mut encoded_call: Vec<u8> = Vec::new();
42 encoded_call.push(transactor.utility_pallet_index());
44
45 match call {
46 UtilityAvailableCalls::AsDerivative(a, b) => {
47 encoded_call.push(RelayIndices::<T>::get().as_derivative);
49 encoded_call.append(&mut a.encode());
51 encoded_call.append(&mut b.clone());
52 }
53 }
54
55 encoded_call
56 }
57}
58
59impl<T: Config> HrmpEncodeCall for Pallet<T> {
60 fn hrmp_encode_call(call: HrmpAvailableCalls) -> Result<Vec<u8>, xcm::latest::Error> {
61 let mut encoded_call: Vec<u8> = Vec::new();
62 encoded_call.push(RelayIndices::<T>::get().hrmp);
64
65 match call {
66 HrmpAvailableCalls::InitOpenChannel(a, b, c) => {
67 encoded_call.push(RelayIndices::<T>::get().init_open_channel);
69 encoded_call.append(&mut a.encode());
71 encoded_call.append(&mut b.encode());
72 encoded_call.append(&mut c.encode());
73 }
74 HrmpAvailableCalls::AcceptOpenChannel(a) => {
75 encoded_call.push(RelayIndices::<T>::get().accept_open_channel);
77 encoded_call.append(&mut a.encode());
79 }
80 HrmpAvailableCalls::CloseChannel(a) => {
81 encoded_call.push(RelayIndices::<T>::get().close_channel);
83 encoded_call.append(&mut a.encode());
85 }
86 HrmpAvailableCalls::CancelOpenRequest(a, b) => {
87 encoded_call.push(RelayIndices::<T>::get().cancel_open_request);
89 encoded_call.append(&mut a.encode());
91 encoded_call.append(&mut b.encode());
92 }
93 }
94
95 Ok(encoded_call)
96 }
97}
98
99fn encode_compact_arg<T: parity_scale_codec::HasCompact>(input: T) -> Vec<u8> {
100 #[derive(Encode)]
101 struct CompactWrapper<T: parity_scale_codec::HasCompact> {
102 #[codec(compact)]
103 input: T,
104 }
105 CompactWrapper { input }.encode()
106}
107
108impl<T: Config> StakeEncodeCall for Pallet<T> {
109 fn encode_call<Transactor: XcmTransact>(
110 transactor: Transactor,
111 call: AvailableStakeCalls,
112 ) -> Vec<u8> {
113 let mut encoded_call: Vec<u8> = Vec::new();
114 encoded_call.push(transactor.staking_pallet_index());
116
117 match call {
118 AvailableStakeCalls::Bond(b, c) => {
119 encoded_call.push(RelayIndices::<T>::get().bond);
121 encoded_call.append(&mut encode_compact_arg(b));
123 encoded_call.append(&mut c.encode());
124 }
125 AvailableStakeCalls::BondExtra(a) => {
126 encoded_call.push(RelayIndices::<T>::get().bond_extra);
128 encoded_call.append(&mut encode_compact_arg(a));
130 }
131 AvailableStakeCalls::Unbond(a) => {
132 encoded_call.push(RelayIndices::<T>::get().unbond);
134 encoded_call.append(&mut encode_compact_arg(a));
136 }
137 AvailableStakeCalls::WithdrawUnbonded(a) => {
138 encoded_call.push(RelayIndices::<T>::get().withdraw_unbonded);
140 encoded_call.append(&mut a.encode());
142 }
143 AvailableStakeCalls::Validate(a) => {
144 encoded_call.push(RelayIndices::<T>::get().validate);
146 encoded_call.append(&mut a.encode());
148 }
149 AvailableStakeCalls::Chill => {
150 encoded_call.push(RelayIndices::<T>::get().chill);
152 }
153 AvailableStakeCalls::SetPayee(a) => {
154 encoded_call.push(RelayIndices::<T>::get().set_payee);
156 encoded_call.append(&mut a.encode());
158 }
159 AvailableStakeCalls::SetController => {
160 encoded_call.push(RelayIndices::<T>::get().set_controller);
162 }
163 AvailableStakeCalls::Rebond(a) => {
164 encoded_call.push(RelayIndices::<T>::get().rebond);
166 encoded_call.append(&mut encode_compact_arg(a));
168 }
169 AvailableStakeCalls::Nominate(a) => {
170 encoded_call.push(RelayIndices::<T>::get().nominate);
172 let nominated: Vec<
173 <AccountIdLookup<sp_runtime::AccountId32, ()> as StaticLookup>::Source,
174 > = a.iter().map(|add| (*add).clone().into()).collect();
175 encoded_call.append(&mut nominated.encode());
176 }
177 }
178
179 encoded_call
180 }
181}