Skip to content

Commit 9a7bed2

Browse files
authored
Merge pull request #797 from anoma/cwgoes/fix-shielded-to-shielded
Avoid any reads when balance change is 0
2 parents 48a6172 + 7c03468 commit 9a7bed2

File tree

2 files changed

+57
-53
lines changed

2 files changed

+57
-53
lines changed

tx_prelude/src/token.rs

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

wasm/checksums.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
2-
"tx_bond.wasm": "tx_bond.2adfcfc7d9c204cd3baba31ba7cd9077378068ef7ab4d9e0adf4884230631a39.wasm",
3-
"tx_ibc.wasm": "tx_ibc.f55f05afa9620b1e67b4cac25145376905f94ea066bc404402967d91205480d7.wasm",
2+
"tx_bond.wasm": "tx_bond.27d0de1ed672ea7b460fb0b0084615b77d821388a4e7c89a7518aebd5ee2349e.wasm",
3+
"tx_ibc.wasm": "tx_ibc.92eb16ca8ea7371c7bd43bb0337db1e9800604919ade679e7a33b705dbd788d8.wasm",
44
"tx_init_account.wasm": "tx_init_account.7e73c0a0368ec6dda8751456ec55ce2c8770c9b9f5391895d5e140a33edfa850.wasm",
5-
"tx_init_proposal.wasm": "tx_init_proposal.f78e71d4f423ee163ed41a136d535f29beed73d7937e2e8b2e468ec90e755a58.wasm",
5+
"tx_init_proposal.wasm": "tx_init_proposal.d5b88266ce1d1b4d0b800587cf82e93c0b4c7ee58009b980c64771e20670332a.wasm",
66
"tx_init_validator.wasm": "tx_init_validator.e4f906d19483774f989bdf7ac1a8259745a8f130db3f2c13159c092eaa540a1c.wasm",
7-
"tx_transfer.wasm": "tx_transfer.0058ca2742f1beef62e9067f7245f896730408a6dda072f2c376efc0b99cc1f8.wasm",
7+
"tx_transfer.wasm": "tx_transfer.fd8cb4a45f4712ad2507540be3f67d8f6b54dfcff9828ae55f745c7435e1c539.wasm",
88
"tx_unbond.wasm": "tx_unbond.1f03df3ff9ce1e5397ddd9862f85652f1d3b34ece7c44755252985fdf759816f.wasm",
99
"tx_update_vp.wasm": "tx_update_vp.f45e7812c2285cfc4631b68e3dea876faa031f495ec761f3f49b8d1089a5f912.wasm",
1010
"tx_vote_proposal.wasm": "tx_vote_proposal.db2478624772da21445f9e5d5bfce4009b66041a49d3470ffdae4899632ef279.wasm",
11-
"tx_withdraw.wasm": "tx_withdraw.e5d9a390abf858f2c32dd65d401a4341f1205114b4cc541efcb2708cacd6d7db.wasm",
11+
"tx_withdraw.wasm": "tx_withdraw.9a6970db8994157a24a7e9b119e9c829518b17a6ff86b20d5fccad2662f72528.wasm",
1212
"vp_masp.wasm": "vp_masp.626dacdbc61f73d6d860488fba2dfb49cc428629383173f97fbed69417bbd370.wasm",
1313
"vp_testnet_faucet.wasm": "vp_testnet_faucet.12def040a549619eeefbd24321f6275dd343e2b57a6643e0948e098c818cb4f7.wasm",
1414
"vp_token.wasm": "vp_token.91e218a96a9d6f26fc2f3cb8d1e4ff514761bb7ccb07ab7944e616834cdaec77.wasm",

0 commit comments

Comments
 (0)