@@ -18,64 +18,68 @@ pub fn transfer(
1818 key : & Option < String > ,
1919 shielded : & Option < Transaction > ,
2020) -> TxResult {
21- let src_key = match & sub_prefix {
22- Some ( sub_prefix) => {
23- let prefix = token:: multitoken_balance_prefix ( token, sub_prefix) ;
24- token:: multitoken_balance_key ( & prefix, src)
25- }
26- None => token:: balance_key ( token, src) ,
27- } ;
28- let dest_key = match & sub_prefix {
29- Some ( sub_prefix) => {
30- let prefix = token:: multitoken_balance_prefix ( token, sub_prefix) ;
31- token:: multitoken_balance_key ( & prefix, dest)
32- }
33- None => token:: balance_key ( token, dest) ,
34- } ;
35- let src_bal: Option < Amount > = match src {
36- Address :: Internal ( InternalAddress :: IbcMint ) => Some ( Amount :: max ( ) ) ,
37- Address :: Internal ( InternalAddress :: IbcBurn ) => {
38- log_string ( "invalid transfer from the burn address" ) ;
39- unreachable ! ( )
40- }
41- _ => ctx. read ( & src_key) ?,
42- } ;
43- let mut src_bal = src_bal. unwrap_or_else ( || {
44- log_string ( format ! ( "src {} has no balance" , src_key) ) ;
45- unreachable ! ( )
46- } ) ;
47- src_bal. spend ( & amount) ;
48- let mut dest_bal: Amount = match dest {
49- Address :: Internal ( InternalAddress :: IbcMint ) => {
50- log_string ( "invalid transfer to the mint address" ) ;
51- unreachable ! ( )
52- }
53- _ => ctx. read ( & dest_key) ?. unwrap_or_default ( ) ,
54- } ;
55- dest_bal. receive ( & amount) ;
56- if src != dest {
57- match src {
58- Address :: Internal ( InternalAddress :: IbcMint ) => {
59- ctx. write_temp ( & src_key, src_bal) ?;
21+ if amount != Amount :: default ( ) {
22+ let src_key = match & sub_prefix {
23+ Some ( sub_prefix) => {
24+ let prefix =
25+ token:: multitoken_balance_prefix ( token, sub_prefix) ;
26+ token:: multitoken_balance_key ( & prefix, src)
27+ }
28+ None => token:: balance_key ( token, src) ,
29+ } ;
30+ let dest_key = match & sub_prefix {
31+ Some ( sub_prefix) => {
32+ let prefix =
33+ token:: multitoken_balance_prefix ( token, sub_prefix) ;
34+ token:: multitoken_balance_key ( & prefix, dest)
6035 }
36+ None => token:: balance_key ( token, dest) ,
37+ } ;
38+ let src_bal: Option < Amount > = match src {
39+ Address :: Internal ( InternalAddress :: IbcMint ) => Some ( Amount :: max ( ) ) ,
6140 Address :: Internal ( InternalAddress :: IbcBurn ) => {
6241 log_string ( "invalid transfer from the burn address" ) ;
6342 unreachable ! ( )
6443 }
65- _ => {
66- ctx. write ( & src_key, src_bal) ?;
67- }
68- }
69- match dest {
44+ _ => ctx. read ( & src_key) ?,
45+ } ;
46+ let mut src_bal = src_bal. unwrap_or_else ( || {
47+ log_string ( format ! ( "src {} has no balance" , src_key) ) ;
48+ unreachable ! ( )
49+ } ) ;
50+ src_bal. spend ( & amount) ;
51+ let mut dest_bal: Amount = match dest {
7052 Address :: Internal ( InternalAddress :: IbcMint ) => {
7153 log_string ( "invalid transfer to the mint address" ) ;
7254 unreachable ! ( )
7355 }
74- Address :: Internal ( InternalAddress :: IbcBurn ) => {
75- ctx. write_temp ( & dest_key, dest_bal) ?;
56+ _ => ctx. read ( & dest_key) ?. unwrap_or_default ( ) ,
57+ } ;
58+ dest_bal. receive ( & amount) ;
59+ if src != dest {
60+ match src {
61+ Address :: Internal ( InternalAddress :: IbcMint ) => {
62+ ctx. write_temp ( & src_key, src_bal) ?;
63+ }
64+ Address :: Internal ( InternalAddress :: IbcBurn ) => {
65+ log_string ( "invalid transfer from the burn address" ) ;
66+ unreachable ! ( )
67+ }
68+ _ => {
69+ ctx. write ( & src_key, src_bal) ?;
70+ }
7671 }
77- _ => {
78- ctx. write ( & dest_key, dest_bal) ?;
72+ match dest {
73+ Address :: Internal ( InternalAddress :: IbcMint ) => {
74+ log_string ( "invalid transfer to the mint address" ) ;
75+ unreachable ! ( )
76+ }
77+ Address :: Internal ( InternalAddress :: IbcBurn ) => {
78+ ctx. write_temp ( & dest_key, dest_bal) ?;
79+ }
80+ _ => {
81+ ctx. write ( & dest_key, dest_bal) ?;
82+ }
7983 }
8084 }
8185 }
0 commit comments