hermit_toolkit_hmip21/
handle.rs

1use serde::Serialize;
2
3use cosmwasm_std::{to_binary, Binary, Coin, CosmosMsg, HumanAddr, StdResult, Uint128, WasmMsg};
4
5use crate::batch::{
6    BurnFromAction, MintAction, SendAction, SendFromAction, TransferAction, TransferFromAction,
7};
8use hermit_toolkit_utils::space_pad;
9
10/// SNIP20 token handle messages
11#[derive(Serialize, Clone, Debug, PartialEq)]
12#[serde(rename_all = "snake_case")]
13pub enum HandleMsg {
14    // Native coin interactions
15    Redeem {
16        amount: Uint128,
17        // TODO: remove skip_serializing once denom is added to sSCRT stored on mainnet
18        #[serde(skip_serializing_if = "Option::is_none")]
19        denom: Option<String>,
20        padding: Option<String>,
21    },
22    Deposit {
23        padding: Option<String>,
24    },
25
26    // Basic SNIP20 functions
27    Transfer {
28        recipient: HumanAddr,
29        amount: Uint128,
30        memo: Option<String>,
31        padding: Option<String>,
32    },
33    Send {
34        recipient: HumanAddr,
35        recipient_code_hash: Option<String>,
36        amount: Uint128,
37        msg: Option<Binary>,
38        memo: Option<String>,
39        padding: Option<String>,
40    },
41    BatchTransfer {
42        actions: Vec<TransferAction>,
43        padding: Option<String>,
44    },
45    BatchSend {
46        actions: Vec<SendAction>,
47        padding: Option<String>,
48    },
49    Burn {
50        amount: Uint128,
51        memo: Option<String>,
52        padding: Option<String>,
53    },
54    RegisterReceive {
55        code_hash: String,
56        padding: Option<String>,
57    },
58    CreateViewingKey {
59        entropy: String,
60        padding: Option<String>,
61    },
62    SetViewingKey {
63        key: String,
64        padding: Option<String>,
65    },
66
67    // Allowance functions
68    IncreaseAllowance {
69        spender: HumanAddr,
70        amount: Uint128,
71        expiration: Option<u64>,
72        padding: Option<String>,
73    },
74    DecreaseAllowance {
75        spender: HumanAddr,
76        amount: Uint128,
77        expiration: Option<u64>,
78        padding: Option<String>,
79    },
80    TransferFrom {
81        owner: HumanAddr,
82        recipient: HumanAddr,
83        amount: Uint128,
84        memo: Option<String>,
85        padding: Option<String>,
86    },
87    SendFrom {
88        owner: HumanAddr,
89        recipient: HumanAddr,
90        recipient_code_hash: Option<String>,
91        amount: Uint128,
92        msg: Option<Binary>,
93        memo: Option<String>,
94        padding: Option<String>,
95    },
96    BatchTransferFrom {
97        actions: Vec<TransferFromAction>,
98        padding: Option<String>,
99    },
100    BatchSendFrom {
101        actions: Vec<SendFromAction>,
102        padding: Option<String>,
103    },
104    BurnFrom {
105        owner: HumanAddr,
106        amount: Uint128,
107        memo: Option<String>,
108        padding: Option<String>,
109    },
110    BatchBurnFrom {
111        actions: Vec<BurnFromAction>,
112        padding: Option<String>,
113    },
114
115    // Mint
116    Mint {
117        recipient: HumanAddr,
118        amount: Uint128,
119        memo: Option<String>,
120        padding: Option<String>,
121    },
122    BatchMint {
123        actions: Vec<MintAction>,
124        padding: Option<String>,
125    },
126    AddMinters {
127        minters: Vec<HumanAddr>,
128        padding: Option<String>,
129    },
130    RemoveMinters {
131        minters: Vec<HumanAddr>,
132        padding: Option<String>,
133    },
134    SetMinters {
135        minters: Vec<HumanAddr>,
136        padding: Option<String>,
137    },
138}
139
140impl HandleMsg {
141    /// Returns a StdResult<CosmosMsg> used to execute a SNIP20 contract function
142    ///
143    /// # Arguments
144    ///
145    /// * `block_size` - pad the message to blocks of this size
146    /// * `callback_code_hash` - String holding the code hash of the contract being called
147    /// * `contract_addr` - address of the contract being called
148    /// * `send_amount` - Optional Uint128 amount of native coin to send with the callback message
149    ///                 NOTE: Only a Deposit message should have an amount sent with it
150    pub fn to_cosmos_msg(
151        &self,
152        mut block_size: usize,
153        callback_code_hash: String,
154        contract_addr: HumanAddr,
155        send_amount: Option<Uint128>,
156    ) -> StdResult<CosmosMsg> {
157        // can not have block size of 0
158        if block_size == 0 {
159            block_size = 1;
160        }
161        let mut msg = to_binary(self)?;
162        space_pad(&mut msg.0, block_size);
163        let mut send = Vec::new();
164        if let Some(amount) = send_amount {
165            send.push(Coin {
166                amount,
167                denom: String::from("uscrt"),
168            });
169        }
170        let execute = WasmMsg::Execute {
171            msg,
172            contract_addr,
173            callback_code_hash,
174            send,
175        };
176        Ok(execute.into())
177    }
178}
179
180/// Returns a StdResult<CosmosMsg> used to execute Redeem
181///
182/// # Arguments
183///
184/// * `amount` - Uint128 amount of token to redeem for SCRT
185/// * `denom` - Optional String to hold the denomination of tokens to redeem
186/// * `padding` - Optional String used as padding if you don't want to use block padding
187/// * `block_size` - pad the message to blocks of this size
188/// * `callback_code_hash` - String holding the code hash of the contract being called
189/// * `contract_addr` - address of the contract being called
190pub fn redeem_msg(
191    amount: Uint128,
192    denom: Option<String>,
193    padding: Option<String>,
194    block_size: usize,
195    callback_code_hash: String,
196    contract_addr: HumanAddr,
197) -> StdResult<CosmosMsg> {
198    HandleMsg::Redeem {
199        amount,
200        denom,
201        padding,
202    }
203        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
204}
205
206/// Returns a StdResult<CosmosMsg> used to execute Deposit
207///
208/// # Arguments
209///
210/// * `amount` - Uint128 amount of uSCRT to convert to the SNIP20 token
211/// * `padding` - Optional String used as padding if you don't want to use block padding
212/// * `block_size` - pad the message to blocks of this size
213/// * `callback_code_hash` - String holding the code hash of the contract being called
214/// * `contract_addr` - address of the contract being called
215pub fn deposit_msg(
216    amount: Uint128,
217    padding: Option<String>,
218    block_size: usize,
219    callback_code_hash: String,
220    contract_addr: HumanAddr,
221) -> StdResult<CosmosMsg> {
222    HandleMsg::Deposit { padding }.to_cosmos_msg(
223        block_size,
224        callback_code_hash,
225        contract_addr,
226        Some(amount),
227    )
228}
229
230/// Returns a StdResult<CosmosMsg> used to execute Transfer
231///
232/// # Arguments
233///
234/// * `recipient` - the address the tokens are to be sent to
235/// * `amount` - Uint128 amount of tokens to send
236/// * `memo` - A message to include in transaction
237/// * `padding` - Optional String used as padding if you don't want to use block padding
238/// * `block_size` - pad the message to blocks of this size
239/// * `callback_code_hash` - String holding the code hash of the contract being called
240/// * `contract_addr` - address of the contract being called
241pub fn transfer_msg(
242    recipient: HumanAddr,
243    amount: Uint128,
244    memo: Option<String>,
245    padding: Option<String>,
246    block_size: usize,
247    callback_code_hash: String,
248    contract_addr: HumanAddr,
249) -> StdResult<CosmosMsg> {
250    HandleMsg::Transfer {
251        recipient,
252        amount,
253        memo,
254        padding,
255    }
256        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
257}
258
259/// Returns a StdResult<CosmosMsg> used to execute Send
260///
261/// # Arguments
262///
263/// * `recipient` - the address tokens are to be sent to
264/// * `amount` - Uint128 amount of tokens to send
265/// * `msg` - Optional base64 encoded string to pass to the recipient contract's
266///           Receive function
267/// * `memo` - A message to include in transaction
268/// * `padding` - Optional String used as padding if you don't want to use block padding
269/// * `block_size` - pad the message to blocks of this size
270/// * `callback_code_hash` - String holding the code hash of the contract being called
271/// * `contract_addr` - address of the contract being called
272#[allow(clippy::too_many_arguments)]
273pub fn send_msg(
274    recipient: HumanAddr,
275    amount: Uint128,
276    msg: Option<Binary>,
277    memo: Option<String>,
278    padding: Option<String>,
279    block_size: usize,
280    callback_code_hash: String,
281    contract_addr: HumanAddr,
282) -> StdResult<CosmosMsg> {
283    HandleMsg::Send {
284        recipient,
285        recipient_code_hash: None,
286        amount,
287        msg,
288        memo,
289        padding,
290    }
291        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
292}
293
294/// Returns a StdResult<CosmosMsg> used to execute Send
295///
296/// # Arguments
297///
298/// * `recipient` - the address tokens are to be sent to
299/// * `recipient_code_hash` - override the `recipient_code_hash` registered with the `RegisterReceiver` interface
300/// * `amount` - Uint128 amount of tokens to send
301/// * `msg` - Optional base64 encoded string to pass to the recipient contract's
302///           Receive function
303/// * `memo` - A message to include in transaction
304/// * `padding` - Optional String used as padding if you don't want to use block padding
305/// * `block_size` - pad the message to blocks of this size
306/// * `callback_code_hash` - String holding the code hash of the contract being called
307/// * `contract_addr` - address of the contract being called
308#[allow(clippy::too_many_arguments)]
309pub fn send_msg_with_code_hash(
310    recipient: HumanAddr,
311    recipient_code_hash: Option<String>,
312    amount: Uint128,
313    msg: Option<Binary>,
314    memo: Option<String>,
315    padding: Option<String>,
316    block_size: usize,
317    callback_code_hash: String,
318    contract_addr: HumanAddr,
319) -> StdResult<CosmosMsg> {
320    HandleMsg::Send {
321        recipient,
322        recipient_code_hash,
323        amount,
324        msg,
325        memo,
326        padding,
327    }
328        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
329}
330
331/// Returns a StdResult<CosmosMsg> used to execute BatchTransfer
332///
333/// # Arguments
334/// * `actions` - Batch of actions
335/// * `padding` - Optional String used as padding if you don't want to use block padding
336/// * `block_size` - pad the message to blocks of this size
337/// * `callback_code_hash` - String holding the code hash of the contract being called
338/// * `contract_addr` - address of the contract being called
339pub fn batch_transfer_msg(
340    actions: Vec<TransferAction>,
341    padding: Option<String>,
342    block_size: usize,
343    callback_code_hash: String,
344    contract_addr: HumanAddr,
345) -> StdResult<CosmosMsg> {
346    HandleMsg::BatchTransfer { actions, padding }.to_cosmos_msg(
347        block_size,
348        callback_code_hash,
349        contract_addr,
350        None,
351    )
352}
353
354/// Returns a StdResult<CosmosMsg> used to execute BatchSend
355///
356/// # Arguments
357/// * `actions` - Batch of actions
358/// * `padding` - Optional String used as padding if you don't want to use block padding
359/// * `block_size` - pad the message to blocks of this size
360/// * `callback_code_hash` - String holding the code hash of the contract being called
361/// * `contract_addr` - address of the contract being called
362pub fn batch_send_msg(
363    actions: Vec<SendAction>,
364    padding: Option<String>,
365    block_size: usize,
366    callback_code_hash: String,
367    contract_addr: HumanAddr,
368) -> StdResult<CosmosMsg> {
369    HandleMsg::BatchSend { actions, padding }.to_cosmos_msg(
370        block_size,
371        callback_code_hash,
372        contract_addr,
373        None,
374    )
375}
376
377/// Returns a StdResult<CosmosMsg> used to execute Burn
378///
379/// # Arguments
380///
381/// * `amount` - Uint128 amount of tokens to burn
382/// * `memo` - A message to include in transaction
383/// * `padding` - Optional String used as padding if you don't want to use block padding
384/// * `block_size` - pad the message to blocks of this size
385/// * `callback_code_hash` - String holding the code hash of the contract being called
386/// * `contract_addr` - address of the contract being called
387pub fn burn_msg(
388    amount: Uint128,
389    memo: Option<String>,
390    padding: Option<String>,
391    block_size: usize,
392    callback_code_hash: String,
393    contract_addr: HumanAddr,
394) -> StdResult<CosmosMsg> {
395    HandleMsg::Burn {
396        amount,
397        memo,
398        padding,
399    }
400        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
401}
402
403/// Returns a StdResult<CosmosMsg> used to execute CreateViewingKey
404///
405/// # Arguments
406/// * `entropy` - Random bytes used to generate the viewing key
407/// * `padding` - Optional String used as padding if you don't want to use block padding
408/// * `block_size` - pad the message to blocks of this size
409/// * `callback_code_hash` - String holding the code hash of the contract being called
410/// * `contract_addr` - address of the contract being called
411pub fn create_viewing_key_msg(
412    entropy: String,
413    padding: Option<String>,
414    block_size: usize,
415    callback_code_hash: String,
416    contract_addr: HumanAddr,
417) -> StdResult<CosmosMsg> {
418    HandleMsg::CreateViewingKey { entropy, padding }.to_cosmos_msg(
419        block_size,
420        callback_code_hash,
421        contract_addr,
422        None,
423    )
424}
425
426/// Returns a StdResult<CosmosMsg> used to execute RegisterReceive
427///
428/// # Arguments
429///
430/// * `your_contracts_code_hash` - String holding the code hash of your contract
431/// * `padding` - Optional String used as padding if you don't want to use block padding
432/// * `block_size` - pad the message to blocks of this size
433/// * `callback_code_hash` - String holding the code hash of the contract being called
434/// * `contract_addr` - address of the contract being called
435pub fn register_receive_msg(
436    your_contracts_code_hash: String,
437    padding: Option<String>,
438    block_size: usize,
439    callback_code_hash: String,
440    contract_addr: HumanAddr,
441) -> StdResult<CosmosMsg> {
442    HandleMsg::RegisterReceive {
443        code_hash: your_contracts_code_hash,
444        padding,
445    }
446        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
447}
448
449/// Returns a StdResult<CosmosMsg> used to execute SetViewingKey
450///
451/// # Arguments
452///
453/// * `key` - String holding the authentication key used for later queries
454/// * `padding` - Optional String used as padding if you don't want to use block padding
455/// * `block_size` - pad the message to blocks of this size
456/// * `callback_code_hash` - String holding the code hash of the contract being called
457/// * `contract_addr` - address of the contract being called
458pub fn set_viewing_key_msg(
459    key: String,
460    padding: Option<String>,
461    block_size: usize,
462    callback_code_hash: String,
463    contract_addr: HumanAddr,
464) -> StdResult<CosmosMsg> {
465    HandleMsg::SetViewingKey { key, padding }.to_cosmos_msg(
466        block_size,
467        callback_code_hash,
468        contract_addr,
469        None,
470    )
471}
472
473/// Returns a StdResult<CosmosMsg> used to execute IncreaseAllowance
474///
475/// # Arguments
476///
477/// * `spender` - the address of the allowed spender
478/// * `amount` - Uint128 additional amount the spender is allowed to send/burn
479/// * `expiration` - Optional u64 denoting the epoch time in seconds that the allowance will expire
480/// * `padding` - Optional String used as padding if you don't want to use block padding
481/// * `block_size` - pad the message to blocks of this size
482/// * `callback_code_hash` - String holding the code hash of the contract being called
483/// * `contract_addr` - address of the contract being called
484pub fn increase_allowance_msg(
485    spender: HumanAddr,
486    amount: Uint128,
487    expiration: Option<u64>,
488    padding: Option<String>,
489    block_size: usize,
490    callback_code_hash: String,
491    contract_addr: HumanAddr,
492) -> StdResult<CosmosMsg> {
493    HandleMsg::IncreaseAllowance {
494        spender,
495        amount,
496        expiration,
497        padding,
498    }
499        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
500}
501
502/// Returns a StdResult<CosmosMsg> used to execute DecreaseAllowance
503///
504/// # Arguments
505///
506/// * `spender` - the address of the allowed spender
507/// * `amount` - Uint128 amount the spender is no longer allowed to send/burn
508/// * `expiration` - Optional u64 denoting the epoch time in seconds that the allowance will expire
509/// * `padding` - Optional String used as padding if you don't want to use block padding
510/// * `block_size` - pad the message to blocks of this size
511/// * `callback_code_hash` - String holding the code hash of the contract being called
512/// * `contract_addr` - address of the contract being called
513pub fn decrease_allowance_msg(
514    spender: HumanAddr,
515    amount: Uint128,
516    expiration: Option<u64>,
517    padding: Option<String>,
518    block_size: usize,
519    callback_code_hash: String,
520    contract_addr: HumanAddr,
521) -> StdResult<CosmosMsg> {
522    HandleMsg::DecreaseAllowance {
523        spender,
524        amount,
525        expiration,
526        padding,
527    }
528        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
529}
530
531/// Returns a StdResult<CosmosMsg> used to execute TransferFrom
532///
533/// # Arguments
534///
535/// * `owner` - the address of the owner of the tokens to be sent
536/// * `recipient` - the address the tokens are to be sent to
537/// * `amount` - Uint128 amount of tokens to send
538/// * `memo` - A message to include in transaction
539/// * `padding` - Optional String used as padding if you don't want to use block padding
540/// * `block_size` - pad the message to blocks of this size
541/// * `callback_code_hash` - String holding the code hash of the contract being called
542/// * `contract_addr` - address of the contract being called
543#[allow(clippy::too_many_arguments)]
544pub fn transfer_from_msg(
545    owner: HumanAddr,
546    recipient: HumanAddr,
547    amount: Uint128,
548    memo: Option<String>,
549    padding: Option<String>,
550    block_size: usize,
551    callback_code_hash: String,
552    contract_addr: HumanAddr,
553) -> StdResult<CosmosMsg> {
554    HandleMsg::TransferFrom {
555        owner,
556        recipient,
557        amount,
558        memo,
559        padding,
560    }
561        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
562}
563
564/// Returns a StdResult<CosmosMsg> used to execute SendFrom
565///
566/// # Arguments
567///
568/// * `owner` - the address of the owner of the tokens to be sent
569/// * `recipient` - the address the tokens are to be sent to
570/// * `amount` - Uint128 amount of tokens to send
571/// * `msg` - Optional base64 encoded string to pass to the recipient contract's
572///           Receive function
573/// * `memo` - A message to include in transaction
574/// * `padding` - Optional String used as padding if you don't want to use block padding
575/// * `block_size` - pad the message to blocks of this size
576/// * `callback_code_hash` - String holding the code hash of the contract being called
577/// * `contract_addr` - address of the contract being called
578#[allow(clippy::too_many_arguments)]
579pub fn send_from_msg(
580    owner: HumanAddr,
581    recipient: HumanAddr,
582    amount: Uint128,
583    msg: Option<Binary>,
584    memo: Option<String>,
585    padding: Option<String>,
586    block_size: usize,
587    callback_code_hash: String,
588    contract_addr: HumanAddr,
589) -> StdResult<CosmosMsg> {
590    HandleMsg::SendFrom {
591        owner,
592        recipient,
593        recipient_code_hash: None,
594        amount,
595        msg,
596        memo,
597        padding,
598    }
599        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
600}
601
602/// Returns a StdResult<CosmosMsg> used to execute SendFrom
603///
604/// # Arguments
605///
606/// * `owner` - the address of the owner of the tokens to be sent
607/// * `recipient` - the address the tokens are to be sent to
608/// * `recipient_code_hash` - override the `recipient_code_hash` registered with the `RegisterReceiver` interface
609/// * `amount` - Uint128 amount of tokens to send
610/// * `msg` - Optional base64 encoded string to pass to the recipient contract's
611///           Receive function
612/// * `memo` - A message to include in transaction
613/// * `padding` - Optional String used as padding if you don't want to use block padding
614/// * `block_size` - pad the message to blocks of this size
615/// * `callback_code_hash` - String holding the code hash of the contract being called
616/// * `contract_addr` - address of the contract being called
617#[allow(clippy::too_many_arguments)]
618pub fn send_from_msg_with_code_hash(
619    owner: HumanAddr,
620    recipient: HumanAddr,
621    recipient_code_hash: Option<String>,
622    amount: Uint128,
623    msg: Option<Binary>,
624    memo: Option<String>,
625    padding: Option<String>,
626    block_size: usize,
627    callback_code_hash: String,
628    contract_addr: HumanAddr,
629) -> StdResult<CosmosMsg> {
630    HandleMsg::SendFrom {
631        owner,
632        recipient,
633        recipient_code_hash,
634        amount,
635        msg,
636        memo,
637        padding,
638    }
639        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
640}
641
642/// Returns a StdResult<CosmosMsg> used to execute BatchTransferFrom
643///
644/// # Arguments
645/// * `actions` - Batch of actions
646/// * `padding` - Optional String used as padding if you don't want to use block padding
647/// * `block_size` - pad the message to blocks of this size
648/// * `callback_code_hash` - String holding the code hash of the contract being called
649/// * `contract_addr` - address of the contract being called
650pub fn batch_transfer_from_msg(
651    actions: Vec<TransferFromAction>,
652    padding: Option<String>,
653    block_size: usize,
654    callback_code_hash: String,
655    contract_addr: HumanAddr,
656) -> StdResult<CosmosMsg> {
657    HandleMsg::BatchTransferFrom { actions, padding }.to_cosmos_msg(
658        block_size,
659        callback_code_hash,
660        contract_addr,
661        None,
662    )
663}
664
665/// Returns a StdResult<CosmosMsg> used to execute BatchSendFrom
666///
667/// # Arguments
668/// * `actions` - Batch of actions
669/// * `padding` - Optional String used as padding if you don't want to use block padding
670/// * `block_size` - pad the message to blocks of this size
671/// * `callback_code_hash` - String holding the code hash of the contract being called
672/// * `contract_addr` - address of the contract being called
673pub fn batch_send_from_msg(
674    actions: Vec<SendFromAction>,
675    padding: Option<String>,
676    block_size: usize,
677    callback_code_hash: String,
678    contract_addr: HumanAddr,
679) -> StdResult<CosmosMsg> {
680    HandleMsg::BatchSendFrom { actions, padding }.to_cosmos_msg(
681        block_size,
682        callback_code_hash,
683        contract_addr,
684        None,
685    )
686}
687
688/// Returns a StdResult<CosmosMsg> used to execute BurnFrom
689///
690/// # Arguments
691///
692/// * `owner` - the address of the owner of the tokens to be burnt
693/// * `amount` - Uint128 amount of tokens to burn
694/// * `memo` - A message to include in transaction
695/// * `padding` - Optional String used as padding if you don't want to use block padding
696/// * `block_size` - pad the message to blocks of this size
697/// * `callback_code_hash` - String holding the code hash of the contract being called
698/// * `contract_addr` - address of the contract being called
699pub fn burn_from_msg(
700    owner: HumanAddr,
701    amount: Uint128,
702    memo: Option<String>,
703    padding: Option<String>,
704    block_size: usize,
705    callback_code_hash: String,
706    contract_addr: HumanAddr,
707) -> StdResult<CosmosMsg> {
708    HandleMsg::BurnFrom {
709        owner,
710        amount,
711        memo,
712        padding,
713    }
714        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
715}
716
717/// Returns a StdResult<CosmosMsg> used to execute BatchBurnFrom
718///
719/// # Arguments
720/// * `actions` - Batch of actions
721/// * `padding` - Optional String used as padding if you don't want to use block padding
722/// * `block_size` - pad the message to blocks of this size
723/// * `callback_code_hash` - String holding the code hash of the contract being called
724/// * `contract_addr` - address of the contract being called
725pub fn batch_burn_from_msg(
726    actions: Vec<BurnFromAction>,
727    padding: Option<String>,
728    block_size: usize,
729    callback_code_hash: String,
730    contract_addr: HumanAddr,
731) -> StdResult<CosmosMsg> {
732    HandleMsg::BatchBurnFrom { actions, padding }.to_cosmos_msg(
733        block_size,
734        callback_code_hash,
735        contract_addr,
736        None,
737    )
738}
739
740/// Returns a StdResult<CosmosMsg> used to execute Mint
741///
742/// # Arguments
743///
744/// * `recipient` - the address that will receive the newly minted tokens
745/// * `amount` - Uint128 amount of tokens to mint
746/// * `memo` - A message to include in transaction
747/// * `padding` - Optional String used as padding if you don't want to use block padding
748/// * `block_size` - pad the message to blocks of this size
749/// * `callback_code_hash` - String holding the code hash of the contract being called
750/// * `contract_addr` - address of the contract being called
751pub fn mint_msg(
752    recipient: HumanAddr,
753    amount: Uint128,
754    memo: Option<String>,
755    padding: Option<String>,
756    block_size: usize,
757    callback_code_hash: String,
758    contract_addr: HumanAddr,
759) -> StdResult<CosmosMsg> {
760    HandleMsg::Mint {
761        recipient,
762        amount,
763        memo,
764        padding,
765    }
766        .to_cosmos_msg(block_size, callback_code_hash, contract_addr, None)
767}
768
769/// Returns a StdResult<CosmosMsg> used to execute BatchMint
770///
771/// # Arguments
772/// * `actions` - Batch of actions
773/// * `padding` - Optional String used as padding if you don't want to use block padding
774/// * `block_size` - pad the message to blocks of this size
775/// * `callback_code_hash` - String holding the code hash of the contract being called
776/// * `contract_addr` - address of the contract being called
777pub fn batch_mint_msg(
778    actions: Vec<MintAction>,
779    padding: Option<String>,
780    block_size: usize,
781    callback_code_hash: String,
782    contract_addr: HumanAddr,
783) -> StdResult<CosmosMsg> {
784    HandleMsg::BatchMint { actions, padding }.to_cosmos_msg(
785        block_size,
786        callback_code_hash,
787        contract_addr,
788        None,
789    )
790}
791
792/// Returns a StdResult<CosmosMsg> used to execute AddMinters
793///
794/// # Arguments
795///
796/// * `minters` - list of new addresses that will be allowed to mint
797/// * `padding` - Optional String used as padding if you don't want to use block padding
798/// * `block_size` - pad the message to blocks of this size
799/// * `callback_code_hash` - String holding the code hash of the contract being called
800/// * `contract_addr` - address of the contract being called
801pub fn add_minters_msg(
802    minters: Vec<HumanAddr>,
803    padding: Option<String>,
804    block_size: usize,
805    callback_code_hash: String,
806    contract_addr: HumanAddr,
807) -> StdResult<CosmosMsg> {
808    HandleMsg::AddMinters { minters, padding }.to_cosmos_msg(
809        block_size,
810        callback_code_hash,
811        contract_addr,
812        None,
813    )
814}
815
816/// Returns a StdResult<CosmosMsg> used to execute RemoveMinters
817///
818/// # Arguments
819///
820/// * `minters` - list of addresses that are no longer allowed to mint
821/// * `padding` - Optional String used as padding if you don't want to use block padding
822/// * `block_size` - pad the message to blocks of this size
823/// * `callback_code_hash` - String holding the code hash of the contract being called
824/// * `contract_addr` - address of the contract being called
825pub fn remove_minters_msg(
826    minters: Vec<HumanAddr>,
827    padding: Option<String>,
828    block_size: usize,
829    callback_code_hash: String,
830    contract_addr: HumanAddr,
831) -> StdResult<CosmosMsg> {
832    HandleMsg::RemoveMinters { minters, padding }.to_cosmos_msg(
833        block_size,
834        callback_code_hash,
835        contract_addr,
836        None,
837    )
838}
839
840/// Returns a StdResult<CosmosMsg> used to execute SetMinters
841///
842/// # Arguments
843///
844/// * `minters` - list of the only addresses that are allowed to mint
845/// * `padding` - Optional String used as padding if you don't want to use block padding
846/// * `block_size` - pad the message to blocks of this size
847/// * `callback_code_hash` - String holding the code hash of the contract being called
848/// * `contract_addr` - address of the contract being called
849pub fn set_minters_msg(
850    minters: Vec<HumanAddr>,
851    padding: Option<String>,
852    block_size: usize,
853    callback_code_hash: String,
854    contract_addr: HumanAddr,
855) -> StdResult<CosmosMsg> {
856    HandleMsg::SetMinters { minters, padding }.to_cosmos_msg(
857        block_size,
858        callback_code_hash,
859        contract_addr,
860        None,
861    )
862}