From 79af00ed2f23d5d0300d776b5f56b05152a5df9f Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Fri, 13 Oct 2023 09:37:17 +0200 Subject: [PATCH 1/6] Implemented compounding inflation for native tokens. --- core/src/ledger/storage/masp_conversions.rs | 126 ++++++++++++++---- ...3AC0E46C83B093EAF35D1A0537CE81D282FB9.bin} | Bin 16958 -> 16958 bytes ...9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin | Bin 7448 -> 7448 bytes ...D76149D3088F539CF8372D404609B89B095EF7.bin | Bin 7448 -> 7448 bytes ...062D269F657017C578484081762FB65D9D52E.bin} | Bin 9184 -> 9184 bytes ...BD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin} | Bin 9184 -> 9184 bytes ...7C98D1E5AAAA9988F26B1A47090ACCE693572F.bin | Bin 7448 -> 7448 bytes ...69989A13906D683BC96E27EF50FC037156E25.bin} | Bin 9589 -> 9589 bytes ...E9FF2DA066496E6664F56EB28F67D75C21911.bin} | Bin 9589 -> 9589 bytes ...55E2583731052033322E25250C780EE322BF4.bin} | Bin 18732 -> 18732 bytes ...CE2E0F12C98370D2CDFD6A75236522A4235F5.bin} | Bin 24899 -> 24899 bytes ...905E9DAFDAC88A291E7F1756931C8A85441E6.bin} | Bin 19839 -> 19839 bytes ...8DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin | Bin 7448 -> 7448 bytes ...344FFFAA6CA273027CD480AEA68DDED57D88CA.bin | Bin 7448 -> 7448 bytes 14 files changed, 100 insertions(+), 26 deletions(-) rename test_fixtures/masp_proofs/{72CAB503E1E0568CC0CAFA892125DB879A97D990F8395D0D8C34BC7EDD203DA9.bin => 1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin} (64%) rename test_fixtures/masp_proofs/{574D00A0B71BE528A2923F6B68934EAA4FA91FFF4AFDF3B08047E7DC6BFCED36.bin => 47AAF805508239C602AD831876B062D269F657017C578484081762FB65D9D52E.bin} (70%) rename test_fixtures/masp_proofs/{DDD66A8E673E8E8A1401967F6FCDD5724C594E275B353F45FF749CB76D3CFF52.bin => 85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin} (66%) rename test_fixtures/masp_proofs/{B94B8EDBFA5038FFB9D439D316EBD09A62AAF19015EF8149D6502B6C0FA871C4.bin => 8D37EB2E5C3BD60B88B1257DFF869989A13906D683BC96E27EF50FC037156E25.bin} (64%) rename test_fixtures/masp_proofs/{434F17129C496E5DE034C4F2553E767C0E74D457A68F8606AFBF41E6F2F56D6E.bin => 992543B7B7B6B9DCB328590D37CE9FF2DA066496E6664F56EB28F67D75C21911.bin} (65%) rename test_fixtures/masp_proofs/{B9D0EC03A64BC8F9536A05F587B35316EE670A242606A81AF0139B3F21CDEDD8.bin => DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin} (67%) rename test_fixtures/masp_proofs/{0B436B9FB574776E45EDA537DCF334701D250179C310C7076DAEE5367CB3D74A.bin => DFDFB1EDE901241995311122C25CE2E0F12C98370D2CDFD6A75236522A4235F5.bin} (67%) rename test_fixtures/masp_proofs/{C82CD3AD0DACE8091365CB0D91AE73F7B5BC1D64F787FA8A7985D301776103DD.bin => ED30921582F7DCEA42D960F73DE905E9DAFDAC88A291E7F1756931C8A85441E6.bin} (61%) diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index 624fe2aa1f..f5d7553516 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -15,8 +15,8 @@ use crate::types::token::MaspDenom; /// A representation of the conversion state #[derive(Debug, Default, BorshSerialize, BorshDeserialize)] pub struct ConversionState { - /// The merkle root from the previous epoch - pub prev_root: Node, + /// The last amount of the native token distributed + pub normed_inflation: Option, /// The tree currently containing all the conversions pub tree: FrozenCommitmentTree, /// Map assets to their latest conversion and position in Merkle tree @@ -37,6 +37,8 @@ where D: 'static + super::DB + for<'iter> super::DBIter<'iter>, H: 'static + super::StorageHasher, { + use std::cmp::Ordering; + use masp_primitives::ff::PrimeField; use masp_primitives::transaction::components::I32Sum as MaspAmount; use rayon::iter::{ @@ -53,29 +55,41 @@ where let key_prefix: storage::Key = masp_addr.to_db_key().into(); let masp_rewards = address::masp_rewards(); + let mut masp_reward_keys: Vec<_> = masp_rewards.keys().collect(); + // Put the native rewards first because other inflation computations depend + // on it + masp_reward_keys.sort_unstable_by(|x, y| { + if (**x == address::nam()) == (**y == address::nam()) { + Ordering::Equal + } else if **x == address::nam() { + Ordering::Less + } else { + Ordering::Greater + } + }); // The total transparent value of the rewards being distributed let mut total_reward = token::Amount::native_whole(0); - // Construct MASP asset type for rewards. Always timestamp reward tokens - // with the zeroth epoch to minimize the number of convert notes clients - // have to use. This trick works under the assumption that reward tokens - // from different epochs are exactly equivalent. - let reward_asset = - encode_asset_type(address::nam(), MaspDenom::Zero, Epoch(0)); + // Construct MASP asset type for rewards. Always deflate and timestamp + // reward tokens with the zeroth epoch to minimize the number of convert + // notes clients have to use. This trick works under the assumption that + // reward tokens will then be reinflated back to the current epoch. + let reward_assets = [ + encode_asset_type(address::nam(), MaspDenom::Zero, Epoch(0)), + encode_asset_type(address::nam(), MaspDenom::One, Epoch(0)), + encode_asset_type(address::nam(), MaspDenom::Two, Epoch(0)), + encode_asset_type(address::nam(), MaspDenom::Three, Epoch(0)), + ]; // Conversions from the previous to current asset for each address let mut current_convs = BTreeMap::<(Address, MaspDenom), AllowedConversion>::new(); // Reward all tokens according to above reward rates - for (addr, reward) in &masp_rewards { + for addr in masp_reward_keys { + let reward = masp_rewards[addr]; // Dispense a transparent reward in parallel to the shielded rewards let addr_bal: token::Amount = wl_storage .read(&token::balance_key(addr, &masp_addr))? .unwrap_or_default(); - // The reward for each reward.1 units of the current asset is - // reward.0 units of the reward token - // Since floor(a) + floor(b) <= floor(a+b), there will always be - // enough rewards to reimburse users - total_reward += (addr_bal * *reward).0; for denom in token::MaspDenom::iter() { // Provide an allowed conversion from previous timestamp. The // negative sign allows each instance of the old asset to be @@ -90,15 +104,80 @@ where denom, wl_storage.storage.block.epoch, ); - current_convs.insert( - (addr.clone(), denom), - (MaspAmount::from_pair(old_asset, -(reward.1 as i32)).unwrap() - + MaspAmount::from_pair(new_asset, reward.1 as i32) + // Native token inflation values are always with respect to this + let ref_inflation = masp_rewards[&address::nam()].1; + // Get the last rewarded amount of the native token + let normed_inflation = wl_storage + .storage + .conversion_state + .normed_inflation + .get_or_insert(ref_inflation); + if *addr == address::nam() { + // The amount that will be given of the new native token for + // every amount of the native token given in the + // previous epoch + let new_normed_inflation = *normed_inflation + + (*normed_inflation * reward.0) / reward.1; + // The conversion is computed such that if consecutive + // conversions are added together, the + // intermediate native tokens cancel/ + // telescope out + current_convs.insert( + (addr.clone(), denom), + (MaspAmount::from_pair( + old_asset, + -(*normed_inflation as i32), + ) + .unwrap() + + MaspAmount::from_pair( + new_asset, + new_normed_inflation as i32, + ) + .unwrap()) + .into(), + ); + // Operations that happen exactly once for each token + if denom == MaspDenom::Three { + // The reward for each reward.1 units of the current asset + // is reward.0 units of the reward token + total_reward += (addr_bal + * (new_normed_inflation, *normed_inflation)) + .0 + - addr_bal; + // Save the new normed inflation + *normed_inflation = new_normed_inflation; + } + } else { + // Express the inflation reward in real terms, that is, with + // respect to the native asset in the zeroth + // epoch + let real_reward = + (reward.0 * ref_inflation) / *normed_inflation; + // The conversion is computed such that if consecutive + // conversions are added together, the + // intermediate tokens cancel/ telescope out + current_convs.insert( + (addr.clone(), denom), + (MaspAmount::from_pair(old_asset, -(reward.1 as i32)) .unwrap() - + MaspAmount::from_pair(reward_asset, reward.0 as i32) + + MaspAmount::from_pair(new_asset, reward.1 as i32) + .unwrap() + + MaspAmount::from_pair( + reward_assets[denom as usize], + real_reward as i32, + ) .unwrap()) - .into(), - ); + .into(), + ); + // Operations that happen exactly once for each token + if denom == MaspDenom::Three { + // The reward for each reward.1 units of the current asset + // is reward.0 units of the reward token + total_reward += ((addr_bal * (real_reward, reward.1)).0 + * (*normed_inflation, ref_inflation)) + .0; + } + } // Add a conversion from the previous asset type wl_storage.storage.conversion_state.assets.insert( old_asset, @@ -163,11 +242,6 @@ where .map(FrozenCommitmentTree::new) .collect(); - // Keep the merkle root from the old tree for transactions constructed - // close to the epoch boundary - wl_storage.storage.conversion_state.prev_root = - wl_storage.storage.conversion_state.tree.root(); - // Convert conversion vector into tree so that Merkle paths can be // obtained wl_storage.storage.conversion_state.tree = diff --git a/test_fixtures/masp_proofs/72CAB503E1E0568CC0CAFA892125DB879A97D990F8395D0D8C34BC7EDD203DA9.bin b/test_fixtures/masp_proofs/1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin similarity index 64% rename from test_fixtures/masp_proofs/72CAB503E1E0568CC0CAFA892125DB879A97D990F8395D0D8C34BC7EDD203DA9.bin rename to test_fixtures/masp_proofs/1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin index fda6b2648ea391bc3c537ce65b68f32984192478..1764192dbaa796b80a90fc4d76da3a085cc69cb1 100644 GIT binary patch delta 3690 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 delta 3690 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 M-~KmgyBfy-0XgjwGXMYp diff --git a/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin b/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin index 13110a81e528e81658716fe465b67a0ad1f36729..44c77d25216a2aab849662c19ab147b5abd3e01d 100644 GIT binary patch delta 1002 zcmVDesq;T?(}6;GJ0A&$?ljj6iL3u1;1rj(E|Vaq^z0{Yb<2 zRZ!sAVzYl1B?EteB%bahyAOV=K1~c8E1~ECI!?J)a8J%u;9THG77q3h|4jmv>^N2j%Tq{f-vl2<6U)wr)%%$C6n(i|cDRpzu-qM0 zR3y?U(RSHvjnB!CZ%=<&fIBH3bsIJPYuDpXGn9F^^KWwFj`$N2uyJ8Hqp*Eo zPqE?SlW%{kni&~??X?R?Z-vATv{D!V79xIHf5kRFuRXbY3pdJdB?MukdLyRJ;yRvc z@SaXYTfLWC=OfDJm@qJ^*2=KgNuzpdpLcbkp@;K!>KzuC;ERJVLen38-!9EFSW>oF zcHl!D$8EyqzFH8zu{N6Y6Lf4@Wy;AX4>C;Qlr(>v(XP4SduzysR)O1wbU>SZHrtR% zSs~B4#Qy)6GfvDU+)|2r5Dcu)^oK65j^#n@Chn%L;b+IOCaZlK1uv3if(18xD2nb~ zn2}q?o8@$xaOeKPY$Im_WRx=GsGjQ-^0WyY#P`ri7T($Z<>ih8-R4n7mDwylJu0$e zefoduiW)R5L6MW3<&}?a$Q+2nOu=r8RM05VZ8uxi`JeD_T3=*ag?~{TU$81v$yC`3 z_&`GoX`d_=Nbne7Qeet$jj%wypfP)Bm5$`dTrla5Pj#&dauc8u6ZNo_4&Yo0yi6HhnVs{%c(n1h+DRk+HvcP}S~ YSVrNE4_G+MjtEdT%j delta 1002 zcmVI*#W~HT2;nz@ zxi~LAKH@~LzYW7&?%Nl-yO@i!YZLSWAmJtQBn$7S9#~0XdePPH1X>(4vR|n`8}a_0n(9a43?gcZDTG7jB$|(QP5Jv>-b=}M2@)fIZ5Y7K$5xO_!ds(G1s}e; z***mlYCZ74Jzn#!`s*2)zhRxDh3YWI2@JejZ=@VFp%Q<>%`dFF9NE#uu~s;*kgF}A zjr{`(on`#d4gAxmsz!+_w!QE+8$@F}$flYVq-HtJ96*NKR$0Ca9QfI}sn~}7hp=|D z%Az(}D_tri(B4Anq2x|Y?Kt)ZF}*I7CHdgIH3>57fui8%?T9!q2%*W&fM9V>Z(YFK zaPCwHIh}vnh5jeqV=Yk=ynZ}5`x;A}+)F7HS!4u;Fy-A=dI;0qvjn%BBW?H+#CTd0 zIu{MjnaL?iSL@%{9L2VrIwp@7vcdO${(fTNVW+#mQsyk-gpC60S?_--3<2GfrMWMn zk>I4!CZ_a`5~~5X|DVX|xm49%YhN*eiwicVRH%RP5{H84w-nKlK!EB#3ZUYdY8fBO< zJkmr7Zb!hp5c;2NyfCfGHp0sBaKMltdu;(={klj^%5GmADz3FR3hq^2Zf^~$l}=;Y z=wg5K9oiAgZhA%6MB*8a#MC^W7Q?lu?j7+FV;sKqK>)j>6Dm?&>(8slzvS%<6itI83D0Ud%{Nyt(B2IE1{CwBEo8x46YUft05k2=2z^F@ zjdY#V32bIav31Y_+`>+n5KW)xwK-md95M7MSpq#;ZkQe8=bLB3loEBW@`eBKQaHA_ YMJrM1aWjl1>Z3|e-ldnP2b1I+G|z_R+yDRo diff --git a/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin b/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin index 0e74c8f67b52270617893dbd0db61ab11e91e60a..c702a4e9b7d40dc5649b26874ffb844890a78506 100644 GIT binary patch delta 1002 zcmVC6}N zEapxwnp>)jr-~G`oxDz)P23KuyUb>@7<^x+wFlZgI=DKb5ZoBe-?^*KPINBxHY#X7 zp;w_2IJQ(Ft{4m%|MHQ?DXS;7IPNC*y^x^#r;0FU%M*WIJ`X+{Z8Ozx&q)yJU_18{Wl=msyXXpnXJLB3Z30&a9r{+2B ztHyP7Ny%L}Q_J*pVnNb$pE4Z0P_Y3$Ozr8%Fl&a6!3e{W#jO-z5aiDjsiF9y+r^GL z6*9{Vvj%^=wcEdc(@e6`iZe4r&Cu1hb4vhH7-oi=n-=(pX~>np3k)z#f$&wqN5pP5 z0y>}|BIXhj0ZSl;_bUoNnw-YbEiE06}ct9mmI+uHW8Qwll`g#oAqhmWBGGgPt4qxG_ug z#UlJBzkh(*xYNIxLz{p&hhC}IdJ&xI5Ju-}qU=OJUJL=Cy2@8`M&ZpC;-H@$_C&K3N-6R+R_;TlVKQPv3Q zV~HrDDpb+!#wQGUh#0>`d}o%EDxs7^{(#NOEK@&>AELtPs%KBfH$AmjcXGm}!`?at zN{}O?aZ1h@UEN%yVTqrn-*;71H6keT)z5!VCV7sI8+y{U;b5u!oGYL4%P-#Gx_t7* z4?N(b;2$b0PPmW50-tH}ET3r`i{JiOGv8Em7QrIpgV6JehH;>Md2OYK9RnjiXxiV^ zqG1nCR?yxruNd?aGiPb$HqZ@=0&_FjDqCc^=17l$0KgbHz2#E0S7n{{oGt9;S-rB9X?z5e?{VCIH Y`ypZ$XOpoSr`$q+Y7L>Lk;u- zAg{eP94h^yOrHp?p+RD5Q#Cr@+%Jma4-Q=WxXq;cVY62d^a3E@LY-NWzD%|^v=K`> z(`V>i*wgh`)jz`w11t@QhL%FJYZLSWAlsv+;c~hIJuG@2Uq9SpiJy^<;m-ot1|@8y zzMxRw6SIF7B?EtlEsV2Z8Qrb9b$S$8IHN^`RMNy2Wp65;;z{BU!Rdm5^KwY7z`5TQ zp%WRMYiJ9Y%+a14uubHSY4&RuX}h{Zg~zNaRsyuVDcY)2%2oY4RDPz4O$j#cT0$M; z6Br2!TYRF56B@7(6!slsQ)#=q{RcSzgHbOQaX9@?Eck!EMUr`HdyKIbf3n;LS0Oe> zkXsE_Xm_^ABgbqw`tm;*jkY_~MPS(BG(NdJnQQd^d(cP&FhoG}Lvq5kM8)AOxvaPl zU}Po?9@;7E$%`@bveO1Yqmzx~Sl03M5Tso$|9=OB68za^!QWZ_I88?kk<)vB1KR41 zdmLG4S@wU`-g0(T*y-PJt60D@bBR=33-&ksNim1Y?!^Kn96_BhkPQTDqyRZAj+iv^ zz)gzkgez(~JgVMTA9MI;hV5uau;pp%03~k@M+0m#uvv4%zLrehQ~jDMIx?|v5D9FB zd_TM|)*m&)q=zK|Fk7aZGW^P5p<+$T4>!0*{`-H;DP@XW1m0}N&GzDCF&1PPtDhY{ zqA(8HX7$g^Q&OsKfvvH=ZL+A8;w`p*){tv@Mn1H9yexLJwnO};7j2O8>>5axj!$i^ z{#mHoF7$(XIp;99$E3OY?igpf3^Y^4Hx_nq5sBNual=wGu1*iy8i>YYL z*!6$&N~LclzmY7~3rR-C@8srsw6njX%oj*Pr#Tp{_?2#SD~qBs<|IFr;#nOoYCC9) z5}x$|rFS6{+Pb63!Edj9*<=-%{~&1~jrF+hl!R$Hi~g<&$y$@x&DOh31z528?c@Gk zlpmt95MR+5jq)`DE~<;B0AMZQD(r602H<~z`erK=1o+U<21#yy=nc)q%WbNznbwmf zcjj*=0pZg~+5(R|5eWZe;t&~!WZ0a(TseQFvn{Z^txzS z{s3g>x$yQww*;dU0o!q47!e`q1JJh5SThA>Sf32)IpawZKY%-Z+t}534?X#{f~$~buEcgl(OtRG8<}9iJo9mtGZ+YQkXd>ljYIUCVrhP&&*L9)5Yr?6 YOZ$)3UyW6T8hhMoonG*543p#>G%kARwEzGB diff --git a/test_fixtures/masp_proofs/574D00A0B71BE528A2923F6B68934EAA4FA91FFF4AFDF3B08047E7DC6BFCED36.bin b/test_fixtures/masp_proofs/47AAF805508239C602AD831876B062D269F657017C578484081762FB65D9D52E.bin similarity index 70% rename from test_fixtures/masp_proofs/574D00A0B71BE528A2923F6B68934EAA4FA91FFF4AFDF3B08047E7DC6BFCED36.bin rename to test_fixtures/masp_proofs/47AAF805508239C602AD831876B062D269F657017C578484081762FB65D9D52E.bin index 83e5789827553d51ba6d808265e8cb68071ce88a..7e5410e8031e27696320808e5d8f9c26424e05ae 100644 GIT binary patch delta 2022 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 EG}E`!4*&oF diff --git a/test_fixtures/masp_proofs/DDD66A8E673E8E8A1401967F6FCDD5724C594E275B353F45FF749CB76D3CFF52.bin b/test_fixtures/masp_proofs/85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin similarity index 66% rename from test_fixtures/masp_proofs/DDD66A8E673E8E8A1401967F6FCDD5724C594E275B353F45FF749CB76D3CFF52.bin rename to test_fixtures/masp_proofs/85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin index 0a8cd508185b176b40d43c6dbba4cf66abad91bc..d4245c57e2ed3b88764874479d31af8ab8ba2edd 100644 GIT binary patch delta 1936 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 Wi0IuWUVLYe)9Gnu4hRa9tRpmtj;`wf diff --git a/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin b/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin index 76b40e6552fe560c8972619d316a447d37974631..54421f95dcd807e270f4e698bf324bc902ecc86b 100644 GIT binary patch delta 1002 zcmVC0yIvoU>OD^a3D^5mp-@o@M=3gFP?J zv2v>Jd6x+9PA^=hk`)a$IMD2~YZLSWAXB1ya8Mw;&S1ZJK(&l?Ky|llD8kPZ(F&tP zm7K$4MzenwB?Eu9DPMG1%47MIn!-Pz(4fyShms(70ikAF*zRH3(4&J^>BiC#C;`WK zBTm4&oSKTV_5ZR42(GbEv-kHus7`d4^P-ezz_a_xLfW#`ej!FExu0L`+Ic zHJdII)Ff!g6o|nhjE#i9lvYR@Zl5o#0$7jsHY29?#36s|bLj&V8##sfCmf(&#K#*3 zhCO&9yt@w}?TPmu*Q7B>Qfa$05KbF6jSZIJ!@EuJ!o9-{PXQ`Y3+jFOFtG~$v*@fb zwQQ*pL`0bcN$i+q<_ye+`ia6G?7el2^VPFeg&un?go@|JNRKs)$#+nzkCqMCEk?v9 z58mx!Xv}}0{idjBZ)_D$d`%hVB{noU?&TcAI18+b<7JZS+2X>|umYM+cA05e;_wdw z@8wL>G=d**)o?M9rUJz;Ozt#)E}!*=uExs)AG|uWBL_SYN4A844u-`HeOl(my+HC> zs0}RJjkpn!ES2{V&U|aU13eEx#&t*G)oycQDPVs@_z;s0)?7-%21v?2b3T=d43!19 zz#b;>J2v%9CGLg{g>Sw?lY{f3$+tCKj!EmZIC7RBOd9`{G1y5)Q*-s?w9v8FmJW{r zX;%JYR)StWq%?$QJoWpGtpUIETkazYd7TEH1QWtarcCV4LYEtTiinZ2!IbC6^1VAV ztMGqQx7|nBehX8VS@Ra}+dfj5>L&-NpRy3a>y7=IGS(KClgG86CVAt;v-#@&rei1D zI@&O@x1z7-;`tY!wX3wYbUF;CwO>;{)k)$Td&EteLqKr)TQN^AbAHzRbW^eO`#@;wHfK2;L%3k6;|W8h3qBm z&WMD`)?D#7rL7W=*%I`aO+f6=`l5qz!s9}B8QIzCVuF&YHsq2w^iH%!PR4cmbBji? zM(=c~c#u=5oRO#q(GafuVDSVKg{hy;Qt@N+qr=>%=W$xQk67GGrbh)y{rZuUuz>&& YdTThf7=`82h!}GyroTO$29x9*Gy2x|UhyqtYTi=dw+BQxB?VQ7$x z9ZUYhn*Cp^XUR$*@Y4vGuEP;Ov$N~AhfBmVRbcO{ddj3I*tn$Q{wC=>zIa4jtE`GF zoFdB%M50@RRh{@IV}R+F5xJ_LaA9os@AihQfkpU+;@E$$Uf=gfdbybxNhD;AOgkMs znc^aCyI+Q!Lhoe&G$L%T!abg|?dANS;qm99h0d1pdg~KYH?ztmydcGhye|7jfTcOY z@GK9+@pg8Qr09lZmC`dED88|xI7aUz#RS#1T>5%<)RfbRnLH=KdohIlsd0(jH>On2 z_K3OG`W=6>z7K@#q4p<4p!LLCf`H)}q0lj+TxrgbR9~95D0V#P+X&Gu{W!?)8)AIsFug zB~!x!+dAC3pmOFIzovEi`KX@(j7_}Z1WOsGb2+n=*3_2nN(54=2a*L^lc{#oV5RQE zhD@B(j$66zhC+o+OgEhr<$Rpyh^|Oa%$yL9NX#AHxj$*R1go7cS80?qNo=e(c?EH$ zu-SiWWo$GLy5eLN4nu?NTjL>80{BaWw_SX|w4Gtwmp~k%0(M zPTp#v>ZMlP__E{3q|x?WvvWhX>H8C2_gT+|hxVWa9)X5WG)T&4+F0`h;Sz^+?V!C2 z9t}9?hoswbj?P1GF?>*#f9O;@A}jG z^Vqj;;cW4lp8h$A)A6-Cu=Y)zYXL>yJ_J5*n5wld5HZ)Lcdi z?*O-OT{)$fOO7qo$oN~ZpaBSWii9$Ig@t7_7yfC8#=pJAU~D=Qw8&}ilveVO>K6sE Y7?8IeV9LpuF(4U1Hi*_v)&IrNT$QiT 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 z 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 zIV=^fe}~%a;uCvEZc-0000000000000010000000002lTIZkpX6=5 delta 2313 zcmV+k3HJ8&O7%*RrXjJO!gY2Vet0Z8Bv?G6xO{J0c*!%qmHe1R^%B&jF-ZcGO$N8K zegWqVf4-Bk&IOjQ2UkRF(~vC{(mD1qyssGZcTOK?h zxl;#U`GxW?_;Kz|@xBZaLz7*|(8^D|_7hese`$IDIUvSYEcL|;tlHo_8fn=dGaROx z)d@`-?2tnb!%BDatu`QQAT+Sr{BLNePi8ff^&ms-jkvJABhQmCmD(8trk@!geGMhY z);G^ea068CB{o`eFc!4fA*C0BImHp=6caciAjH9Kjl0tpyZ_Ti&(RaZ9E`ksCch65 z3D02uPRJjzcLK9)5Vr$=m3WLCqr>&H5>*VGVRlfZmf=0Jv{Timvm}=G#?}ZLARHyW zu2?n4XXc$uY%mNA?9WKG%S0L~hweYy(5pHMULeKHeG9;Wq`dF?^1L%|)Rv&e^DV0k z+fD<}vHa%sVqhR7$qsN4ANfm34Vrqg1J7;{=UCd=H2-~qnS#52d<&ONAWcl^8zL(S z9LaG112IA5K53OSnL1!@yH2ZE09~*d6d-XuG!`&EF0;`__<*qaJkr#B6@Y^+H%fl0 zQ$ONm+94p)zs7z4PS#7uZ|@W#-pf6UTw5i8X0|h0!Y!Y)oHYd?tw2;pSQ{piU5yb5 zF?#1m{C=RoL8KeS#x?Djj z|IG>yBE@wR*L0crC+k6ojK1^GI|=9_jpU2_{9JJe)}vB-_;8ezWfY=TdD%+9=@l!v zC$1YK<_|pTn?W$N9xNxNCeK9icfX2G@}Xg6j7MlfVB^$Jkjn@s5uGvRKS4^ifsOtd z;p|EB_9o&PopO{LBU5$`9Pp*HqZ~E^f3cpzb#@zmcq}?3SUjS*d~aKL$uqu{{Fp`c z64a$JNu%J>X&b$*6|9@>(})!nda;kJ{8w62oGPmL#9uW*OW_rdzBW1=#REUwu2}-{ zy{nj26nw4t(-Si?G^KR!oNZu@E&iNtQ!>oU(WKRBq+b3YwTAt&_VS0vfh&W(e`XZS z^+FFG<3xt2w9Ef;IZI~k0I9s-QN+V{R7sIcW8G8p_kq| zAtewT6r1D${4u^*GABk1X}Rj)v@2X4C)WnEFTPF&2-vLwLe^ViK|ree&t)_VJsGh? z0BiVOb3(hC{dqW3NqpiulR*%V~_)f7Ju3V>r?+ z4gKYGBQ4DoPL$&N1jN+pT#b^fHZ1_x>}l-@wt=&KS*)LqZwJttenpPoD|ry*sZUunkb|I3 zl%?vU8yS76mbz&MwS#%*Xf-<8wN?BM;}SAEh|MJ|u5Mc4kR)^ie;tSopjiWV^dO<9 zub9^k)?FY5o$SXIKDoX2?)6L)Nc1maLPg#q)kLoAp>jyuxREW!dZ&npp1A=qh`$J( z2U$RKrlXPix<-b=VxHuXiGf&=7J}?{B;`xNvfZDv1sH{E7Coe@I3@@l+$NPzD2*)} z_brifqibE>0J!_9f3(df%OXY)*fmX~#siimuOui21KEAED(C0jJc^0J_3>pF2*%;jFTP-8@%DdB+W&f2rcfyk8cE1>vg5DxGN zK9+mUZCE$$e{C7y>+4X~zZO!%9Q$!e^AL83Tl8V|Ho(kv|JM~M^J1RNZl#ILB=~Or zw-2Zf#Z8;hHuaZab%#Yyy!zw?H|O*^8ogHy0#t3SE^|51+YI1#9chciDBEpl&Q+oc za%CK&2Oq2b3yE5X+b$S@vP7ffRdPwp3woyfUcrFy~IBR$q5M5XF>1OV|8wzEE@v jsM^Mm#-|1X0000000000000010000000002lTIZk0cBOE diff --git a/test_fixtures/masp_proofs/B9D0EC03A64BC8F9536A05F587B35316EE670A242606A81AF0139B3F21CDEDD8.bin b/test_fixtures/masp_proofs/DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin similarity index 67% rename from test_fixtures/masp_proofs/B9D0EC03A64BC8F9536A05F587B35316EE670A242606A81AF0139B3F21CDEDD8.bin rename to test_fixtures/masp_proofs/DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin index 6519f4fbc39ff576434e536792ebe0b52d446415..a8a8691cd4e3d5a3d412e6ac82e1b884fdb149c4 100644 GIT binary patch delta 3970 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 delta 3970 zcmV-|4}I{gk^!ue0gyT&<8hkG%YN$K2#mQTc6e=E8`wE@V5^otbWauYN9m^xQ>S=`?-MPo?0H;PE@CC%86Tmqbe4-iS z0f42tbXS~(_CmkA!0-s-NU)?yAWARB#1shbTy#jv+Tzk~EC1d8E&8+fWOz6L^-=i+ zNg&Z%swzBz-DGux>K@3SkHc(lP;ON z>G^}2B8_Ci6zA~KXlNZ-AYS!chGYhjybM&)vo+Y;zAZt&c}f!qXM;U0#tr}_A|PJ} z!ofPDjlS7ZHJ(w~g*5S+oB$^KydmyjXcEG^i$WlT;&k64__QkTKKtjU#jN@+?50bm z7t6DK6~F@^)b^j%MQGXu@Py%|`jkg15mq3EMKa*}VZ5q>u#+E6lU*4ie-fuN`oD4_ zZ#!^z;#-06s3i}5YDSYr+?tfs15oWoaUffy@tJ~P|Pg!3%U;$5PG!=G7W$^r7DSUqGdd2c0000000006lc6Oflkg%d zvz!{q5Fj`QQ@A6Zs3M;&t<%|6J1?T}a~9sNkH;cjnuTSQbmfzUD?lI_Rc4GZh`|xx zw4hSA+bXU=?r+I4tWfC=7jZl0w(;S~Yqu!E{5AMvuYEw0+ov<~2N7 zW(5$qqFHOOjl5+)fl;3AbeVB6fKHFsI|kU4IF)VD=H6pA0>D{|Y8X}vu6E^3(YLeq zMCvb_`fIc2ETjT|*NH)6ppXrr7W;ZQG$q8)c`cwMLdo*9^zHo)BfTz15REV&^|;yZ zbR+vgNZxz3Xs=X@dF-^GX!#gBk`j$pQ#9E~bFvXsv>{`Zf!COWfW!BDZz!o|j}*OGdpy=mb}^3NGuqijd2bJd9l zv9NL83fo4%L3rKA9JuA@iKQJF;UcJd2^A*!+IihufNb+=$B`@-tAYS2R|RfzkzDeB zeLUh_l-mTn*b2_mvmP^*0)P3s6H^g6dPzzmcs)V#PZFL~uMxmnQ}noEmr~J+0o8=T z0K%V)?=8GaZ;4Ydt6@s_)U>VPrv^xUbgVNvH}8)PPU5aI-Qtl>&d~zr9oU zp)s2B0h`(60JBTCaV1V3Ld!pSS-&R&8DaKkH7YJ1R1 zEw(Y^prT=GN$7PUvCZP$r&O~>Ih6u`4LW&4O$sDHk~Q#8dCJLJIRi=MP$|T*sqg9rW{ytOWg2sIQi1l$cTk* z(51PHCTSM6y`*MjIhIGaa=g8ny;%B=fN;{01_MBK+BM)vC0mr;{z2v+1=J^F1g_LGIayI!uZ zN)2%mSd-|Bc00swTfV$63fQ*9xg>UYZCo4J zIdx#GmQjl*>IJ#qXF{vkNW`%W80k5E*>MGsr7&@musiD+Qv!4(21s%@fhY%02~FMJ za_U(=mWZ`=2zQUZo}<9NtgvVMYHe9l1Vp6*SJi1DV2^JmF>)0p+7D^tmdFba3)w_s zML`5HM1T1KCRt1t>I}-$7s~8pcnG8Wor9f-eQ`>=0jp@lgn;}`#|Rer2T=|p5^>&d zsG5wkW?xCqfNbhl;fSxxUUmZ6Ts${ozG43FrcOX)ak78kD zKxT-HvfljNCBTY7IynD26ePk;=utnqF-;$2e1Gi|wk|7%PW;nhTpCkm``1`GsZu3r zz}Y6K{RK=!d1B8DxKlE$Nfo(3Bwcxa5knQosr|R93bUZ>u(o|Z4QJ6=43+U3^ge|y zJ|KY4rxBQs;7f7FMEml&>D%uLwow2#`_AA=xj>D|pdmno115y4u}kg++(~7U9{O!$ zynjP$^L(BO9Eas#?Molmjd84N(mh7oQ;pO1KRDv`bgK3BAhPDA%76+o9RNf4Qccex z9ch_(kN)X1&e@~$LYegcRNW^)7+Bnj#5}JEZ;=hOu81bkAH)vnsRp?|9zI=G+oaw> zEnf5%f}QvBFwmsbX2sfUgK|xFjg71eZ+{Vi*7^iK=-O9^20Yi-V|v*J7z(7y+M++q zGcTwA%i&t)(WESCTrF;@I+c%|ARKS+!UvU2WqXDS{CRx;s1c01h*{H+pTeVtRA{3V zizks4(9s*q89hcZ9v^BA&AP0-`pxcbXu*oKD4-O*LoDyH`1{{9S`F?6Zlv;vhJTZ+ z_UX+=wl7ZqiuKzcHY#83vu(yC8%@g3awyil8ULX97_SQc##y&hF;`rYF7w$;C$m;v znnD)fQ5)q9=GJY&$lw|X!YcsE4xP@1c@aGO&&;JOK26q3(;-ICZf6{xg%A$(DcOh= z-g8}!E!rl)F8j(c!55pQ(D%ze9Df1?%bPQT#_7M~e!O%f=G}Ge?&7#(GzDw9dilnk zyhK2bc$#DhtgCii%?53<@qf;Sm@V6U zrVG*EtDE^Cqx5L>crU=$uDu_~cJ=$atlV5#gb?4?V62E5CGC0x%n>9v5ptoUIJl!- zD5SJf?~6ak88_5Lt|*c56KhfR;;hT`;L;OlH2vVuzHKhb24P%SwDgf`j-*8y+tl94 zEO|18YO#dCGdOr_M$uN@26PZ9e}yHlJy3`CkaXH)zE84Sof z*4mV5Ke+~wVhZy`nSTw((v)n7IdMpG3DbZhgI_`jFbUCNEc^%K&wrT=?wO0)UW2pg zkW1iRkFhAcSa2*%zLqZY#fP8?h`WF|hj*uzY_ak+2_gk{FrJ?AhI(&0DHR9l!?FFS zS$0KfYV$7Zp24N`+}tIXrTkY(KCI`(12ek8@os}{b9b%JEq@W^#Y6uW51PC#`v>Ph zE=R(4jsOlz7x!x?agd1T=@n`({!Hlz$aWHWeGKnQvkrEW%%TaeYmp$4#`H3F1m`5X zc1R@P7hu-=0};_R1c{bG8gl#?3y-33e^{$5H1UFEj~QiIjWs!* z9Nm(^mxMG!cz?uJ#uv=~Eu+oK4UrZbRn}3hnZp`31Sa4XKErfn%j_i7T`$BfT5~xX zuDh$5Q?FzWqk+*Ut=RD2TWbnjSJQ??)>{UNebLElG3>w0L0P}sqF+7SF{`$qj?sk) z{^3B!Vm?T(+my6sH@j1Z&r2}1M4Q%^Mf!>F==pP;w0{wxXSvtLh@Sn%KIjexXU@A+ zD#J-uw-zI_DPQ-F+$C1o7Y~o=&KSLjp zwY@~Xd=fFWL`&D^I>}zDC5@y%RZK5X*I^WoFk+X$3pp#GY5}4@@yy{T(~#;G_=o$d zL90LKe`gkbicXrfcs*wrsbkjYd-Mhzk)Wn#v`C zo+owplLsF@M&u3KfqKFW@|5q@DZ3j(9jBGzlkh-Ek_|nbYl(2>B?F5y^%LgxCA>S1 z1Yd$sM{~? z0JeWMxWr*t8MSQMo9U+L+s;jH#RCS=nnnMO1|_&EFaqs*#ZAmQxqM`-(6~qLS~n9r z_gYNDi|*Y@AuhA2Tz)g$&HlV>d&Jg;D}Pnj4t{Clf#WBTbIuTNS{TqqydVd1X2)2Q z!)K-KnEJ++^NQ1d5wg7d+=B=YBGpetm^|RO;K!qKrK!9uD=96Ut}3{SyIaArqP_Hi z6r>ptxN0p8i)(*=g*NWt)Ql7P7E|r*c@l;0sid;K)zNBJLR|hisjb;biLdE~^?!W5 zwPOdNp{7g|a^WaTZ6_(S$Q;}!-8n*XfPm7?=&m2#JsRomE(ZdFNQX4iGDKvAA|Z9& z&-n+=-MRl>JvYzrC(!UGP+ApJCuXX7IPB}avXpA&ZdkPcR-e~=Cl((!bz04N=udqp zKEi{&0RcQAY!3yw3juG9wN^LxITJf`ssO)xQkWK~_+~}@&rO(w@V4(a00d$2V<2f_ z5-hl$Hn^?2U^v%*rt_nY)+D#VwSXq*4vP%ZpzCv#aa0i&Gapm zZ#I~kIpIr&kQr79;vle=g5h-%rs`_ZU$dU*JB-B!T(V0z1ehBLHiV!+iUH*8%7<=oKer)B7zdGgU~w)1=oNtPK`&n`K+NDta9IVQ7q}BqZj6s95V; zVig#oHG2P;Oyg3r-YT(snRsG2-M(8$cCwVy;|yO0J`&PERPG7*_lDo+yje0@_f#dT ze=$W}Q40Nl@1<$6y;6|EY0&;xq#OKy=SWG*f)6Pt>KNiCP6m_w%94`^rUtyNjh%h9 zEfz{4ERY@%jTes=jJ@m>oiw{-YO`&m9+@NcGg+x4oxwwAB#w~KH6m}V!T4k+Q*0hX zDT)g}l}yTeedl#SyZBR}s;STo^1LmEc=e64Cxg&yvvCicBSkWUx-UPE;p7YrQUKiNwinz z=y73s`xAU(3|J}bsDT(_xpH%?8#`A`+2T`dxg1lLH=#e#Pw&SqmE?6jdK>vj0LlC7 zR6&2HLF-Bp+W*IAO0w3^3PuqrqI-Da$hK|NXgY+T7UgKamxTYnL_1#Vs5nk{e`jJ} z_s%Q`n;lJm2g{Y7*u@4CM1kJm0#-=4KxH!4-(F8>FL6}awM8_Q8wIyfz_u8yQ<37- zKExbCm+5bqsXn(7WZ9>@vrF8lP^V}8;lgU8v3=F;-DvwD{gW!i4vXftv}~99?0=&n<=|k*@u0r#J9)?NK8vZ) zDX}28+NTZt5m^{)Exz}-rt}TQ2svyUVCipmr+WW{^AXmx0!z{fIfI$EO!}#KE~k>c zjia?=@gy&`n@60f1Rh;CFV(%Z|BFhv$bI*0FX`RuD6FJRd!__ar zgBVY@Jed9P7V8gXfuEIE`1dXZwQyrst>Aw`8R&p)aN2d0g}{($WKdX8i zBnhn48ONF7n&RAql~6#tHc8+`!0BQz^W@%at=4 zPsJJkri@_^f>m7(LdA7h55-XAYt7}zz3;tFWvJ!$WyJSq?>ayv=e2*pMnwIG4i;ml zxOpV97j$)Z43No!`ys8bwXA@=`6oKTD#BRAvcWk7eT&__GfQNwV_ zBbo?lY@D`2iSnOs5K0DdUT)n*XZ_}CuYp)~b=)AF% zk!hqaD_k@rqmSrs^pMiD7%<-w0fs4}V?!3uranTgvA+zb)Dxx*@ zeu|*jfx)>9!S)!<3QRyWP@$V5qrBaxllTd0FMdfA+^O=|j8BbV$E1%;dLGfemcwtOFM-=%>H10KU#hl&uB@I| zL~X9LsMXg5uV|u`D|kd)&MBF_DDg@;7&G3s^k0UKrt0+XkLNoEpW1}MVm-DU`}iZC zX*fOI;4olKCp-@9(E>^kD|zE=RY70liaoVjlfg8trFYPQ+czGF6Ixt$pYtM1aUZ2T zwEA4>2_9yoKPw&ZOT*2`|8ft8zt}OUTl+2`SX1u)m?_|SWc-{}*5}PgyLaQF5Tk|A z;Lw0-PjM_BozUjmu2p@qyDm&b|Eu?@Wgm1z3LOF6sl|XNMGH59aecXrQuw3x661-E ziC#D6^e2A{LC*yzX+fX{Xc*l_SJmN=-tL1I-V6U|#;l~j6YV-s-*QE}mt1EJ6pyZi zza06w<+RY7o7J(Yw8Uvz$+d+lD{i1tPDEHqM4$zR4@#P zs5=2WrWYQ|J<^|z3=>)(P=Us35outd(VctpH-P}g#YO%=-ypHy5Vhrm5goH)PIz-Jn#QdY zu(^Bvi#0W>n0Ls}c{Qc0!OAHy7%7^btAwvT7@3FC{chx#kXiRlP-o0082^TPZaGy? z+`W4BN|aBTXfOG_W(GoUY>Jwlh?25Qb1c+mGD>NHqxq?4eGB0C zr^)WY$S%dTkt>c;l&7YQxi@yJJ``5LZozv7CPAq0YVm3?Y3GaP0ecKJ%xhw8W@=dV z34~Mrm}uYI+KW`LxdQq@X-2YzuLt9d=oEh1t$>Eecs$cf@T-8kaUr7c%oHyLr|Q&z zq2J0L=IOoObPi4k@8OykVc$N(`T=Bk9MQjy1A_P#fuR(N!kun~WFlrPq){chf>gf` zonsoda74YC+DG1b8-9M9UI)wJ_8#*m`{y~MT;%Hwud1COZW#o{zt#{QX^;i-c%3Es z1iEfHazE9Og}wJM^!M@4RhwtbbN3&S^c)I$S*g7`zT$QHfFB4|^8HRa4p60_*(aEo zH}WwF6WZOlilMU(ag3jmO9WKPuMPzE(^={YL3Qwc>wOJlu(kVu@;N z4C5}69XRa1c!SLquCP;8f@-L7+h9P{qc(in6p0_07Pro{47^u?T;wRIU=)#8r3 zmHfNw5U+XA{jg2}bkoC`#);?@j=1R$H<6Txq2%&>;|7Iv^2tM7Vw}dp{iE4Z-w1ID zg>XKN`vR!(rVZA`tRl)I)IBFEFB4-X{oxHh$){VWgTYby?~@XMYP241>G=T}klxm% z@uCE%l}Zd|OgkOkkNM7xxnZh~USr+hfNJDC^o4)RBPUgOiF{S|7!%%dJFnd-l!z#- z!vzo8JN~}jUDHgpbm*P=F(zB{{aYJK4aU71(f-&7VSTlXh?h`{be5z273)D&Os9=Z zOxAmUSvPt#0ptVD%e2Pwp_B-gN_gBXZPDE8&0PwA*1R1xT(4_&mk z4OWSG6#nAu*_Kuj(>nCjC`@vb7Bu^OeT!!RaZhs9Xp0}*{xxQw zx{S{KLq0_EV-j|wat68&8^3VQqB%}NpZG9OZx;ZZI5ufAsb^JoELJ^Ce1Dr9lq~rM zWRMnmTK~M;RTpgUBFFcxUI=H^#go4&cPYXXQ*a9UqEX$&KvOh)y*=9t1+QegPS9G`hTachtx{O;E zQwC3}MBczulz&j9+QVOad6___u%{8@DRIejjF-5ghWnD~F%lCDxZZ5PgmLv(etlfS zO?4A!6ow}npX!II*q=8oT}>AB#1ZF_8@e&3aYKr+9H>+nC&8b{9}8C(8p>V91q+#g zkDn(MM4SXRURrsDP`lW03f(F}TV$#~+ zSz4Aly`pfcURc}v1ay9@n2K$)+=nk+bGVN9W!U`XvjHh4A1ydE2B$L04g2}6bf%ym z0h4x*KV#HGmLHQ+e#rPlIPlHzlNnqBGwmCFaLrX%q#ZILLqU>Z=`Za=7F5L}%f73R zbA{N9*n&1Y&B2}4&bHcI{b}-EezE4BP;aC}$x(b~hG^*Ta`Z9IW6I3R!HxG#YIdJq z`pSq2mENX+Zz|GhDpS(C^ws$9iBws=dgPt1^R2zYz@_^Wkz^{O8B-&DcQYb@D}Io= zG1F%Bb_Xv@$$G#3{X0I|_!$q-ybIM=G%?ird)$IE{vA20fP7MCjw<&Mjm)^Ojuz!r zFAllk2rhD-PT=Rx<+mmyf?)mmNj}V?m?3k)V{hj~vd9;R@LaS?w|{U~s(P>Rvsxgx zt$<)CWSrzuLi4%x(e>^0iJ&#mvo;u7&gXH}J!K;tozYA+a%gGt&)~@#e|biKt}lNQ z@nz*SZ&twALC1S7sG)Jusxe1eW^)0d*159%SgD@c;SGvhO)>i9is`4!9#RQ%M>qam zt>vM#63cHkF=jMyi6KQr(^oF69dN~#vFtc9l?QTZ`EZf9%`2tX73p<;{TA9+wxcT$gLKApSU~DQnmven+i@6fsR^&o&tdu$IW6F6S zX1=1C8*Gq!Lnm?gZ|Oy&KjSMAkH)^5RBjr*Q5jisYKGf|PdQfvYnv(|x!@3@QC6fb z#LJC;fu*oRXzH#5yaRBYv^o+oV6QY2p6+Z~E)@u`(gijJ1g};MBPl5k<&~QTb}m-} z@h*Y`n$2wNFZ;!mS+frf&MTXfE~&uP;%)Z==Ebnq;5Vk84xyWiP8J&Sg&zY%=S_%^ zA7?Iw+UozP6gpC#4k>3?!SPZh-P^(6G4}S9{GM?}!XJF1%>gU~liXX}>T`L{f!L|* z#J;D{W3Gad!%9B4=yvkX_8D*Za*Xo}qaH9z1 zIQXA{Q;t0eG_!}XU>&b8V-ILYhc4D)?0-?I zYeBop;f;GVcZ?Kuej&}5Vfc{!2ER>9s&{S2c%-4(UASD{E{b3w}DoHzwD0x9_Fo<9itKg2Yf5< zSSEueo=`h@%WV3t7;4hL1x0DFlX$0Gn}&(^4D;>D`l(%%AJ_ O6XIiFU?7Gq!u|(}l}vsB delta 5374 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 delta 4648 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 diff --git a/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin b/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin index c0a788ee9945314e71b99678948354b00730e1e8..9fa6ccfe2b5ff834dec8619ce7ce41edf11e8329 100644 GIT binary patch delta 1001 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 Y!D$ZpN{}RqgSPwJpSjIC3zOs=H1Xx?t^fc4 delta 1002 zcmVhVLk;u- zAZkuxi6FId5BZIw`f|d^x(Cj$2?|%|E4Lg!aVR?Hyt7vj^a3Ew$bR6BsErdKnxuV8 z^Zi>(E31mkE?#c{2CPgJ@#0FeYZLSWAn(tlo+b_6m^1tsB_~FHRmN%0L;i@-TxrxZZC6{VAK?uxbbQvx9p@rEri1~Y#?_%G^+{7J#wu?4O*114JPOoPYlxNFSm*? zZuRCO&Mc$}J><+y&K`}yiPe>pe5-=d6S#>!`>w}GWvzh2XFz}XB~t*l4y(xHn~%sQ zknWw|W2Ohg4rIdqHy-<@TV5%0p0-cHrJR2_XEC)}AOx1RCkW-})l>k{%L&{nhb9<_ z5s~19g^C;DDzo^$5&5*$D$?>b=i#5X3crEy;?~F^|JulQbX_hxC~fdAV<6cwHzE5t6c zl*k;5ua=2!!+@Dl)X1aUl$eBpYJ5-``X(ZJjrK{9 Date: Mon, 16 Oct 2023 08:05:15 +0200 Subject: [PATCH 2/6] Integrated PD controller support. --- apps/src/lib/config/genesis.rs | 14 + .../lib/node/ledger/shell/finalize_block.rs | 5 +- apps/src/lib/node/ledger/shell/init_chain.rs | 24 ++ apps/src/lib/node/ledger/shell/mod.rs | 2 + apps/src/lib/node/ledger/storage/mod.rs | 2 + {shared => core}/src/ledger/inflation.rs | 23 +- core/src/ledger/mod.rs | 1 + core/src/ledger/storage/masp_conversions.rs | 196 ++++++++++- core/src/ledger/storage/mod.rs | 4 +- core/src/types/token.rs | 184 +++++++++- genesis/e2e-tests-single-node.toml | 35 ++ scripts/generator.sh | 318 +++++++----------- shared/src/ledger/mod.rs | 1 - ...33AC0E46C83B093EAF35D1A0537CE81D282FB9.bin | Bin 16958 -> 0 bytes ...9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin | Bin 7448 -> 7448 bytes ...D76149D3088F539CF8372D404609B89B095EF7.bin | Bin 7448 -> 7448 bytes ...B062D269F657017C578484081762FB65D9D52E.bin | Bin 9184 -> 0 bytes ...FBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin | Bin 9184 -> 0 bytes ...7C98D1E5AAAA9988F26B1A47090ACCE693572F.bin | Bin 7448 -> 7448 bytes ...869989A13906D683BC96E27EF50FC037156E25.bin | Bin 9589 -> 0 bytes ...9181FA326C06FCA9A49B5A5C394C75942820E.bin} | Bin 18732 -> 15573 bytes ...CE9FF2DA066496E6664F56EB28F67D75C21911.bin | Bin 9589 -> 0 bytes ...A700BB49387329F8FD049D5F66C95B11B55ADE.bin | Bin 0 -> 22648 bytes ...4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin | Bin 0 -> 10312 bytes ...5CE2E0F12C98370D2CDFD6A75236522A4235F5.bin | Bin 24899 -> 0 bytes ...E905E9DAFDAC88A291E7F1756931C8A85441E6.bin | Bin 19839 -> 0 bytes ...8DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin | Bin 7448 -> 0 bytes ...344FFFAA6CA273027CD480AEA68DDED57D88CA.bin | Bin 7448 -> 7448 bytes ...C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin | Bin 0 -> 13799 bytes 29 files changed, 588 insertions(+), 221 deletions(-) rename {shared => core}/src/ledger/inflation.rs (92%) delete mode 100644 test_fixtures/masp_proofs/1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin delete mode 100644 test_fixtures/masp_proofs/47AAF805508239C602AD831876B062D269F657017C578484081762FB65D9D52E.bin delete mode 100644 test_fixtures/masp_proofs/85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin delete mode 100644 test_fixtures/masp_proofs/8D37EB2E5C3BD60B88B1257DFF869989A13906D683BC96E27EF50FC037156E25.bin rename test_fixtures/masp_proofs/{DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin => 917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin} (50%) delete mode 100644 test_fixtures/masp_proofs/992543B7B7B6B9DCB328590D37CE9FF2DA066496E6664F56EB28F67D75C21911.bin create mode 100644 test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin create mode 100644 test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin delete mode 100644 test_fixtures/masp_proofs/DFDFB1EDE901241995311122C25CE2E0F12C98370D2CDFD6A75236522A4235F5.bin delete mode 100644 test_fixtures/masp_proofs/ED30921582F7DCEA42D960F73DE905E9DAFDAC88A291E7F1756931C8A85441E6.bin delete mode 100644 test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin create mode 100644 test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index b7281fd4ce..eac5f5bdca 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -213,6 +213,8 @@ pub mod genesis_config { pub vp: Option, // Initial balances held by accounts defined elsewhere. pub balances: Option>, + // Token parameters + pub parameters: Option, } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -404,6 +406,9 @@ pub mod genesis_config { implicit_accounts: &HashMap, ) -> TokenAccount { TokenAccount { + last_locked_ratio: Dec::zero(), + last_inflation: token::Amount::zero(), + parameters: config.parameters.as_ref().unwrap().to_owned(), address: Address::decode(config.address.as_ref().unwrap()).unwrap(), denom: config.denom, balances: config @@ -818,6 +823,12 @@ pub struct TokenAccount { /// Accounts' balances of this token #[derivative(PartialOrd = "ignore", Ord = "ignore")] pub balances: HashMap, + /// Token parameters + pub parameters: token::Parameters, + /// Token inflation from the last epoch (read + write for every epoch) + pub last_inflation: token::Amount, + /// Token shielded ratio from the last epoch (read + write for every epoch) + pub last_locked_ratio: Dec, } #[derive( @@ -1100,6 +1111,9 @@ pub fn genesis(num_validators: u64) -> Genesis { .into_iter() .map(|(k, v)| (k, token::Amount::from_uint(v, denom).unwrap())) .collect(), + parameters: token::Parameters::default(), + last_inflation: token::Amount::zero(), + last_locked_ratio: Dec::zero(), }) .collect(); Genesis { diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 53252065f1..346a3f916b 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use data_encoding::HEXUPPER; +use namada::core::ledger::inflation; use namada::core::ledger::pgf::ADDRESS as pgf_address; use namada::ledger::events::EventType; use namada::ledger::gas::{GasMetering, TxGasMeter}; @@ -11,7 +12,7 @@ use namada::ledger::pos::{namada_proof_of_stake, staking_token_address}; use namada::ledger::storage::EPOCH_SWITCH_BLOCKS_DELAY; use namada::ledger::storage_api::token::credit_tokens; use namada::ledger::storage_api::{pgf, StorageRead, StorageWrite}; -use namada::ledger::{inflation, protocol, replay_protection}; +use namada::ledger::{protocol, replay_protection}; use namada::proof_of_stake::{ delegator_rewards_products_handle, find_validator_by_raw_hash, read_last_block_proposer_address, read_pos_params, read_total_stake, @@ -665,6 +666,7 @@ where let pos_controller = inflation::RewardsController { locked_tokens: pos_locked_supply, total_tokens, + total_native_tokens: total_tokens, locked_ratio_target: pos_locked_ratio_target, locked_ratio_last: pos_last_staked_ratio, max_reward_rate: pos_max_inflation_rate, @@ -676,6 +678,7 @@ where let _masp_controller = inflation::RewardsController { locked_tokens: masp_locked_supply, total_tokens, + total_native_tokens: total_tokens, locked_ratio_target: masp_locked_ratio_target, locked_ratio_last: masp_locked_ratio_last, max_reward_rate: masp_max_inflation_rate, diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index d6b2efe4dd..46d4222983 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -330,14 +330,38 @@ where address, denom, balances, + parameters, + last_inflation, + last_locked_ratio, } in accounts { + // Init token parameters and last inflation and caching rates + parameters.init_storage(&address, &mut self.wl_storage); + self.wl_storage + .write(&token::masp_last_inflation(&address), last_inflation) + .unwrap(); + self.wl_storage + .write( + &token::masp_last_locked_ratio(&address), + last_locked_ratio, + ) + .unwrap(); // associate a token with its denomination. write_denom(&mut self.wl_storage, &address, denom).unwrap(); + + let mut total_balance_for_token = token::Amount::default(); for (owner, amount) in balances { + total_balance_for_token += amount; credit_tokens(&mut self.wl_storage, &address, &owner, amount) .unwrap(); } + // Write the total amount of tokens for the ratio + self.wl_storage + .write( + &token::minted_balance_key(&address), + total_balance_for_token, + ) + .unwrap(); } } diff --git a/apps/src/lib/node/ledger/shell/mod.rs b/apps/src/lib/node/ledger/shell/mod.rs index a1c17fe450..8230ce2a76 100644 --- a/apps/src/lib/node/ledger/shell/mod.rs +++ b/apps/src/lib/node/ledger/shell/mod.rs @@ -1980,6 +1980,7 @@ mod test_utils { /// We test that on shell shutdown, the tx queue gets persisted in a DB, and /// on startup it is read successfully + #[cfg(feature = "testing")] #[test] fn test_tx_queue_persistence() { let base_dir = tempdir().unwrap().as_ref().canonicalize().unwrap(); @@ -2017,6 +2018,7 @@ mod test_utils { .storage .begin_block(BlockHash::default(), BlockHeight(1)) .expect("begin_block failed"); + token::testing::init_token_storage(&mut shell.wl_storage, 60); let keypair = gen_keypair(); // enqueue a wrapper tx let mut wrapper = diff --git a/apps/src/lib/node/ledger/storage/mod.rs b/apps/src/lib/node/ledger/storage/mod.rs index 659f561cce..43617879c8 100644 --- a/apps/src/lib/node/ledger/storage/mod.rs +++ b/apps/src/lib/node/ledger/storage/mod.rs @@ -118,6 +118,7 @@ mod tests { assert_eq!(result, None); } + #[cfg(feature = "testing")] #[test] fn test_commit_block() { let db_path = @@ -144,6 +145,7 @@ mod tests { storage.block.pred_epochs.new_epoch(BlockHeight(100)); // make wl_storage to update conversion for a new epoch let mut wl_storage = WlStorage::new(WriteLog::default(), storage); + namada::types::token::testing::init_token_storage(&mut wl_storage, 60); update_allowed_conversions(&mut wl_storage) .expect("update conversions failed"); wl_storage.commit_block().expect("commit failed"); diff --git a/shared/src/ledger/inflation.rs b/core/src/ledger/inflation.rs similarity index 92% rename from shared/src/ledger/inflation.rs rename to core/src/ledger/inflation.rs index da2d5ed1e1..46e2c7ba8f 100644 --- a/shared/src/ledger/inflation.rs +++ b/core/src/ledger/inflation.rs @@ -2,8 +2,7 @@ //! proof-of-stake, providing liquity to shielded asset pools, and public goods //! funding. -use namada_core::types::dec::Dec; - +use crate::types::dec::Dec; use crate::types::token; /// The domains of inflation @@ -30,6 +29,8 @@ pub struct RewardsController { pub locked_tokens: token::Amount, /// Total token supply pub total_tokens: token::Amount, + /// Total native token supply + pub total_native_tokens: token::Amount, /// PD target locked ratio pub locked_ratio_target: Dec, /// PD last locked ratio @@ -52,6 +53,7 @@ impl RewardsController { let Self { locked_tokens, total_tokens, + total_native_tokens, locked_ratio_target, locked_ratio_last, max_reward_rate, @@ -67,10 +69,12 @@ impl RewardsController { .expect("Should not fail to convert token Amount to Dec"); let total = Dec::try_from(total_tokens.raw_amount()) .expect("Should not fail to convert token Amount to Dec"); + let total_native = Dec::try_from(total_native_tokens.raw_amount()) + .expect("Should not fail to convert token Amount to Dec"); let epochs_py: Dec = epochs_per_year.into(); let locked_ratio = locked / total; - let max_inflation = total * max_reward_rate / epochs_py; + let max_inflation = total_native * max_reward_rate / epochs_py; let p_gain = p_gain_nom * max_inflation; let d_gain = d_gain_nom * max_inflation; @@ -114,9 +118,8 @@ impl RewardsController { mod test { use std::str::FromStr; - use namada_core::types::token::NATIVE_MAX_DECIMAL_PLACES; - use super::*; + use crate::types::token::NATIVE_MAX_DECIMAL_PLACES; #[test] fn test_inflation_calc_up() { @@ -131,6 +134,11 @@ mod test { NATIVE_MAX_DECIMAL_PLACES, ) .unwrap(), + total_native_tokens: token::Amount::from_uint( + 4_000, + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(), locked_ratio_target: Dec::from_str("0.66666666").unwrap(), locked_ratio_last: Dec::from_str("0.5").unwrap(), max_reward_rate: Dec::from_str("0.1").unwrap(), @@ -202,6 +210,11 @@ mod test { NATIVE_MAX_DECIMAL_PLACES, ) .unwrap(), + total_native_tokens: token::Amount::from_uint( + 1_000, + NATIVE_MAX_DECIMAL_PLACES, + ) + .unwrap(), locked_ratio_target: Dec::from_str("0.66666666").unwrap(), locked_ratio_last: Dec::from_str("0.9").unwrap(), max_reward_rate: Dec::from_str("0.1").unwrap(), diff --git a/core/src/ledger/mod.rs b/core/src/ledger/mod.rs index 890d58044d..301cf78e08 100644 --- a/core/src/ledger/mod.rs +++ b/core/src/ledger/mod.rs @@ -5,6 +5,7 @@ pub mod gas; pub mod governance; #[cfg(any(feature = "abciplus", feature = "abcipp"))] pub mod ibc; +pub mod inflation; pub mod parameters; pub mod pgf; pub mod replay_protection; diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index f5d7553516..5b195dd29d 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -8,9 +8,21 @@ use masp_primitives::convert::AllowedConversion; use masp_primitives::merkle_tree::FrozenCommitmentTree; use masp_primitives::sapling::Node; +use crate::ledger::inflation::{RewardsController, ValsToUpdate}; +use crate::ledger::parameters; +use crate::ledger::storage_api::{StorageRead, StorageWrite}; use crate::types::address::Address; +use crate::types::dec::Dec; use crate::types::storage::Epoch; use crate::types::token::MaspDenom; +use crate::types::{address, token}; + +/// Inflation is implicitly denominated by this value. The lower this figure, +/// the less precise inflation computations are. The higher this figure, the +/// larger the fixed-width types that are required to carry out inflation +/// computations. This value should be fixed constant for each asset type - here +/// we have simplified it and made it constant across asset types. +const PRECISION: u64 = 100; /// A representation of the conversion state #[derive(Debug, Default, BorshSerialize, BorshDeserialize)] @@ -27,6 +39,150 @@ pub struct ConversionState { >, } +/// Compute the MASP rewards by applying the PD-controller to the genesis +/// parameters and the last inflation and last locked rewards ratio values. +pub fn calculate_masp_rewards( + wl_storage: &mut super::WlStorage, + addr: &Address, +) -> crate::ledger::storage_api::Result<(u32, u32)> +where + D: 'static + super::DB + for<'iter> super::DBIter<'iter>, + H: 'static + super::StorageHasher, +{ + let masp_addr = address::masp(); + // Query the storage for information + + //// information about the amount of tokens on the chain + let total_tokens: token::Amount = wl_storage + .read(&token::minted_balance_key(addr))? + .expect("the total supply key should be here"); + + //// information about the amount of native tokens on the chain + let total_native_tokens: token::Amount = wl_storage + .read(&token::minted_balance_key(&wl_storage.storage.native_token))? + .expect("the total supply key should be here"); + + // total staked amount in the Shielded pool + let total_token_in_masp: token::Amount = wl_storage + .read(&token::balance_key(addr, &masp_addr))? + .unwrap_or_default(); + + let epochs_per_year: u64 = wl_storage + .read(¶meters::storage::get_epochs_per_year_key())? + .expect(""); + + //// Values from the last epoch + let last_inflation: token::Amount = wl_storage + .read(&token::masp_last_inflation(addr)) + .expect("failure to read last inflation") + .expect(""); + + let last_locked_ratio: Dec = wl_storage + .read(&token::masp_last_locked_ratio(addr)) + .expect("failure to read last inflation") + .expect(""); + + //// Parameters for each token + let max_reward_rate: Dec = wl_storage + .read(&token::masp_max_reward_rate(addr)) + .expect("max reward should properly decode") + .expect(""); + + let kp_gain_nom: Dec = wl_storage + .read(&token::masp_kp_gain(addr)) + .expect("kp_gain_nom reward should properly decode") + .expect(""); + + let kd_gain_nom: Dec = wl_storage + .read(&token::masp_kd_gain(addr)) + .expect("kd_gain_nom reward should properly decode") + .expect(""); + + let locked_target_ratio: Dec = wl_storage + .read(&token::masp_locked_ratio_target(addr))? + .expect(""); + + // Creating the PD controller for handing out tokens + let controller = RewardsController { + locked_tokens: total_token_in_masp, + total_tokens, + total_native_tokens, + locked_ratio_target: locked_target_ratio, + locked_ratio_last: last_locked_ratio, + max_reward_rate, + last_inflation_amount: last_inflation, + p_gain_nom: kp_gain_nom, + d_gain_nom: kd_gain_nom, + epochs_per_year, + }; + + let ValsToUpdate { + locked_ratio, + inflation, + } = RewardsController::run(controller); + + // inflation-per-token = inflation / locked tokens = n/PRECISION + // ∴ n = (inflation * PRECISION) / locked tokens + // Since we must put the notes in a compatible format with the + // note format, we must make the inflation amount discrete. + let noterized_inflation = if total_token_in_masp.is_zero() { + 0u32 + } else { + crate::types::uint::Uint::try_into( + (inflation.raw_amount() * PRECISION) + / total_token_in_masp.raw_amount(), + ) + .unwrap() + }; + + tracing::debug!( + "Controller, call: total_in_masp {:?}, total_tokens {:?}, \ + total_native_tokens {:?}, locked_target_ratio {:?}, \ + last_locked_ratio {:?}, max_reward_rate {:?}, last_inflation {:?}, \ + kp_gain_nom {:?}, kd_gain_nom {:?}, epochs_per_year {:?}", + total_token_in_masp, + total_tokens, + total_native_tokens, + locked_target_ratio, + last_locked_ratio, + max_reward_rate, + last_inflation, + kp_gain_nom, + kd_gain_nom, + epochs_per_year, + ); + tracing::debug!("Please give me: {:?}", addr); + tracing::debug!("Ratio {:?}", locked_ratio); + tracing::debug!("inflation from the pd controller {:?}", inflation); + tracing::debug!("total in the masp {:?}", total_token_in_masp); + tracing::debug!("Please give me inflation: {:?}", noterized_inflation); + + // Is it fine to write the inflation rate, this is accurate, + // but we should make sure the return value's ratio matches + // this new inflation rate in 'update_allowed_conversions', + // otherwise we will have an inaccurate view of inflation + wl_storage + .write( + &token::masp_last_inflation(addr), + (total_token_in_masp / PRECISION) * u64::from(noterized_inflation), + ) + .expect("unable to encode new inflation rate (Decimal)"); + + wl_storage + .write(&token::masp_last_locked_ratio(addr), locked_ratio) + .expect("unable to encode new locked ratio (Decimal)"); + + // to make it conform with the expected output, we need to + // move it to a ratio of x/100 to match the masp_rewards + // function This may be unneeded, as we could describe it as a + // ratio of x/1 + + Ok(( + noterized_inflation, + PRECISION.try_into().expect("inflation precision too large"), + )) +} + // This is only enabled when "wasm-runtime" is on, because we're using rayon #[cfg(feature = "wasm-runtime")] /// Update the MASP's allowed conversions @@ -46,22 +202,22 @@ where }; use rayon::prelude::ParallelSlice; - use crate::ledger::storage_api::{ResultExt, StorageRead, StorageWrite}; + use crate::ledger::storage_api::ResultExt; use crate::types::storage::{self, KeySeg}; - use crate::types::{address, token}; // The derived conversions will be placed in MASP address space let masp_addr = address::masp(); let key_prefix: storage::Key = masp_addr.to_db_key().into(); - let masp_rewards = address::masp_rewards(); - let mut masp_reward_keys: Vec<_> = masp_rewards.keys().collect(); + let tokens = address::tokens(); + let mut masp_reward_keys: Vec<_> = tokens.into_keys().collect(); // Put the native rewards first because other inflation computations depend // on it + let native_token = wl_storage.storage.native_token.clone(); masp_reward_keys.sort_unstable_by(|x, y| { - if (**x == address::nam()) == (**y == address::nam()) { + if (*x == native_token) == (*y == native_token) { Ordering::Equal - } else if **x == address::nam() { + } else if *x == native_token { Ordering::Less } else { Ordering::Greater @@ -75,17 +231,25 @@ where // notes clients have to use. This trick works under the assumption that // reward tokens will then be reinflated back to the current epoch. let reward_assets = [ - encode_asset_type(address::nam(), MaspDenom::Zero, Epoch(0)), - encode_asset_type(address::nam(), MaspDenom::One, Epoch(0)), - encode_asset_type(address::nam(), MaspDenom::Two, Epoch(0)), - encode_asset_type(address::nam(), MaspDenom::Three, Epoch(0)), + encode_asset_type(native_token.clone(), MaspDenom::Zero, Epoch(0)), + encode_asset_type(native_token.clone(), MaspDenom::One, Epoch(0)), + encode_asset_type(native_token.clone(), MaspDenom::Two, Epoch(0)), + encode_asset_type(native_token.clone(), MaspDenom::Three, Epoch(0)), ]; // Conversions from the previous to current asset for each address let mut current_convs = BTreeMap::<(Address, MaspDenom), AllowedConversion>::new(); + // Native token inflation values are always with respect to this + let mut ref_inflation = 0; // Reward all tokens according to above reward rates - for addr in masp_reward_keys { - let reward = masp_rewards[addr]; + for addr in &masp_reward_keys { + let reward = calculate_masp_rewards(wl_storage, addr) + .expect("Calculating the masp rewards should not fail"); + if *addr == native_token { + // The reference inflation is the denominator of the native token + // inflation, which is always a constant + ref_inflation = reward.1; + } // Dispense a transparent reward in parallel to the shielded rewards let addr_bal: token::Amount = wl_storage .read(&token::balance_key(addr, &masp_addr))? @@ -104,15 +268,13 @@ where denom, wl_storage.storage.block.epoch, ); - // Native token inflation values are always with respect to this - let ref_inflation = masp_rewards[&address::nam()].1; // Get the last rewarded amount of the native token let normed_inflation = wl_storage .storage .conversion_state .normed_inflation .get_or_insert(ref_inflation); - if *addr == address::nam() { + if *addr == native_token { // The amount that will be given of the new native token for // every amount of the native token given in the // previous epoch @@ -224,7 +386,7 @@ where // Update the MASP's transparent reward token balance to ensure that it // is sufficiently backed to redeem rewards - let reward_key = token::balance_key(&address::nam(), &masp_addr); + let reward_key = token::balance_key(&native_token, &masp_addr); let addr_bal: token::Amount = wl_storage.read(&reward_key)?.unwrap_or_default(); let new_bal = addr_bal + total_reward; @@ -249,7 +411,7 @@ where // Add purely decoding entries to the assets map. These will be // overwritten before the creation of the next commitment tree - for addr in masp_rewards.keys() { + for addr in masp_reward_keys { for denom in token::MaspDenom::iter() { // Add the decoding entry for the new asset type. An uncommited // node position is used since this is not a conversion. diff --git a/core/src/ledger/storage/mod.rs b/core/src/ledger/storage/mod.rs index 81be7e48a6..868e49fbdd 100644 --- a/core/src/ledger/storage/mod.rs +++ b/core/src/ledger/storage/mod.rs @@ -26,7 +26,9 @@ pub use wl_storage::{ #[cfg(feature = "wasm-runtime")] pub use self::masp_conversions::update_allowed_conversions; -pub use self::masp_conversions::{encode_asset_type, ConversionState}; +pub use self::masp_conversions::{ + calculate_masp_rewards, encode_asset_type, ConversionState, +}; use super::replay_protection::is_replay_protection_key; use crate::ledger::eth_bridge::storage::bridge_pool::is_pending_transfer_key; use crate::ledger::gas::{ diff --git a/core/src/types/token.rs b/core/src/types/token.rs index 0ee60b4326..c6fefea9c6 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -13,8 +13,9 @@ use thiserror::Error; use super::dec::POS_DECIMAL_PRECISION; use crate::ibc::applications::transfer::Amount as IbcAmount; +use crate::ledger::storage as ledger_storage; use crate::ledger::storage_api::token::read_denom; -use crate::ledger::storage_api::{self, StorageRead}; +use crate::ledger::storage_api::{self, StorageRead, StorageWrite}; use crate::types::address::{ masp, Address, DecodeError as AddressError, InternalAddress, }; @@ -814,6 +815,31 @@ pub const TX_KEY_PREFIX: &str = "tx-"; pub const CONVERSION_KEY_PREFIX: &str = "conv"; /// Key segment prefix for pinned shielded transactions pub const PIN_KEY_PREFIX: &str = "pin-"; +/// Last calculated inflation value handed out +pub const MASP_LAST_INFLATION: &str = "last_inflation"; +/// The last locked ratio +pub const MASP_LAST_LOCKED_RATIO: &str = "last_locked_ratio"; +/// The key for the nominal proportional gain of a shielded pool for a given +/// asset +pub const MASP_KP_GAIN_KEY: &str = "proptional_gain"; +/// The key for the nominal derivative gain of a shielded pool for a given asset +pub const MASP_KD_GAIN_KEY: &str = "derivative_gain"; +/// The key for the locked ratio target for a given asset +pub const MASP_LOCKED_RATIO_TARGET_KEY: &str = "locked_ratio_target"; +/// The key for the max reward rate for a given asset +pub const MASP_MAX_REWARD_RATE: &str = "max_reward_rate"; + +/// Gets the key for the given token address, error with the given +/// message to expect if the key is not in the address +pub fn key_of_token( + token_addr: &Address, + specific_key: &str, + expect_message: &str, +) -> Key { + Key::from(token_addr.to_db_key()) + .push(&specific_key.to_owned()) + .expect(expect_message) +} /// Obtain a storage key for user's balance. pub fn balance_key(token_addr: &Address, owner: &Address) -> Key { @@ -847,6 +873,98 @@ pub fn minted_balance_key(token_addr: &Address) -> Key { .expect("Cannot obtain a storage key") } +/// Obtain the nominal proportional key for the given token +pub fn masp_kp_gain(token_addr: &Address) -> Key { + key_of_token(token_addr, MASP_KP_GAIN_KEY, "nominal proproitonal gains") +} + +/// Obtain the nominal derivative key for the given token +pub fn masp_kd_gain(token_addr: &Address) -> Key { + key_of_token(token_addr, MASP_KD_GAIN_KEY, "nominal proproitonal gains") +} + +/// The max reward rate key for the given token +pub fn masp_max_reward_rate(token_addr: &Address) -> Key { + key_of_token(token_addr, MASP_MAX_REWARD_RATE, "max reward rate") +} + +/// Obtain the locked target ratio key for the given token +pub fn masp_locked_ratio_target(token_addr: &Address) -> Key { + key_of_token( + token_addr, + MASP_LOCKED_RATIO_TARGET_KEY, + "nominal proproitonal gains", + ) +} + +/// Token parameters for each kind of asset held on chain +#[derive( + Clone, + Debug, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + BorshSerialize, + BorshDeserialize, + BorshSchema, + Deserialize, + Serialize, +)] +pub struct Parameters { + /// Maximum reward rate + pub max_reward_rate: Dec, + /// Shielded Pool nominal derivative gain + pub kd_gain_nom: Dec, + /// Shielded Pool nominal proportional gain for the given token + pub kp_gain_nom: Dec, + /// Locked ratio for the given token + pub locked_ratio_target_key: Dec, +} + +impl Parameters { + /// Initialize parameters for the token in storage during the genesis block. + pub fn init_storage( + &self, + address: &Address, + wl_storage: &mut ledger_storage::WlStorage, + ) where + DB: ledger_storage::DB + for<'iter> ledger_storage::DBIter<'iter>, + H: ledger_storage::StorageHasher, + { + let Self { + max_reward_rate: max_rate, + kd_gain_nom, + kp_gain_nom, + locked_ratio_target_key: locked_target, + } = self; + wl_storage + .write(&masp_max_reward_rate(address), max_rate) + .expect("max reward rate for the given asset must be initialized"); + wl_storage + .write(&masp_locked_ratio_target(address), locked_target) + .expect("locked ratio must be initialized"); + wl_storage + .write(&masp_kp_gain(address), kp_gain_nom) + .expect("The nominal proportional gain must be initialized"); + wl_storage + .write(&masp_kd_gain(address), kd_gain_nom) + .expect("The nominal derivative gain must be initialized"); + } +} + +impl Default for Parameters { + fn default() -> Self { + Self { + max_reward_rate: Dec::from_str("0.1").unwrap(), + kp_gain_nom: Dec::from_str("0.1").unwrap(), + kd_gain_nom: Dec::from_str("0.1").unwrap(), + locked_ratio_target_key: Dec::from_str("0.1").unwrap(), + } + } +} + /// Check if the given storage key is balance key for the given token. If it is, /// returns the owner. For minted balances, use [`is_any_minted_balance_key()`]. pub fn is_balance_key<'a>( @@ -914,6 +1032,24 @@ pub fn is_masp_key(key: &Key) -> bool { || key.starts_with(PIN_KEY_PREFIX))) } +/// The last locked ratio of a token +pub fn masp_last_locked_ratio(token_address: &Address) -> Key { + key_of_token( + token_address, + MASP_LAST_LOCKED_RATIO, + "cannot obtain storage key for the last locked ratio", + ) +} + +/// The last inflation of a token +pub fn masp_last_inflation(token_address: &Address) -> Key { + key_of_token( + token_address, + MASP_LAST_INFLATION, + "cannot obtain storage key for the last inflation rate", + ) +} + /// Check if the given storage key is for a minter of a unspecified token. /// If it is, returns the token. pub fn is_any_minter_key(key: &Key) -> Option<&Address> { @@ -1185,4 +1321,50 @@ pub mod testing { ) -> impl Strategy { (1..=max).prop_map(|val| Amount::from_uint(val, 0).unwrap()) } + + /// init_token_storage is useful when the initialization of the network is + /// not properly made. This properly sets up the storage such that + /// inflation calculations can be ran on the token addresses. We assume + /// a total supply that may not be real + pub fn init_token_storage( + wl_storage: &mut ledger_storage::WlStorage, + epochs_per_year: u64, + ) where + D: 'static + + ledger_storage::DB + + for<'iter> ledger_storage::DBIter<'iter>, + H: 'static + ledger_storage::StorageHasher, + { + use crate::ledger::parameters::storage::get_epochs_per_year_key; + use crate::types::address::masp_rewards; + + let masp_rewards = masp_rewards(); + let masp_reward_keys: Vec<_> = masp_rewards.keys().collect(); + + wl_storage + .write(&get_epochs_per_year_key(), epochs_per_year) + .unwrap(); + let params = Parameters { + max_reward_rate: Dec::from_str("0.1").unwrap(), + kd_gain_nom: Dec::from_str("0.1").unwrap(), + kp_gain_nom: Dec::from_str("0.1").unwrap(), + locked_ratio_target_key: Dec::zero(), + }; + + for address in masp_reward_keys { + params.init_storage(address, wl_storage); + wl_storage + .write( + &minted_balance_key(address), + Amount::native_whole(5), // arbitrary amount + ) + .unwrap(); + wl_storage + .write(&masp_last_inflation(address), Amount::zero()) + .expect("inflation ought to be written"); + wl_storage + .write(&masp_last_locked_ratio(address), Dec::zero()) + .expect("last locked set default"); + } + } } diff --git a/genesis/e2e-tests-single-node.toml b/genesis/e2e-tests-single-node.toml index 4a3c02b805..0020dd995a 100644 --- a/genesis/e2e-tests-single-node.toml +++ b/genesis/e2e-tests-single-node.toml @@ -36,6 +36,11 @@ Christel = "1000000" Daewon = "1000000" Ester = "1000000" "validator-0.public_key" = "100" +[token.NAM.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.BTC] address = "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp" @@ -46,6 +51,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.BTC.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.ETH] address = "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p" @@ -56,6 +66,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.ETH.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.DOT] address = "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn" @@ -66,6 +81,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.DOT.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.Schnitzel] address = "atest1v4ehgw36xue5xvf5xvuyzvpjx5un2v3k8qeyvd3cxdqns32p89rrxd6xx9zngvpegccnzs699rdnnt" @@ -76,6 +96,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.Schnitzel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.Apfel] address = "atest1v4ehgw36gfryydj9g3p5zv3kg9znyd358ycnzsfcggc5gvecgc6ygs2rxv6ry3zpg4zrwdfeumqcz9" @@ -86,6 +111,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.Apfel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [token.Kartoffel] address = "atest1v4ehgw36gep5ysecxq6nyv3jg3zygv3e89qn2vp48pryxsf4xpznvve5gvmy23fs89pryvf5a6ht90" @@ -97,6 +127,11 @@ Bertha = "1000000" Christel = "1000000" Daewon = "1000000" Ester = "1000000" +[token.Kartoffel.parameters] +max_reward_rate = "0.1" +kd_gain_nom = "0.1" +kp_gain_nom = "0.1" +locked_ratio_target_key = "0.6667" [established.Albert] vp = "vp_user" diff --git a/scripts/generator.sh b/scripts/generator.sh index 3fe1792a49..c9635d498d 100755 --- a/scripts/generator.sh +++ b/scripts/generator.sh @@ -9,8 +9,10 @@ # vectors. NAMADA_DIR="$(pwd)" +NAMADA_BASE_DIR_FILE="$(pwd)/namada_base_dir" export NAMADA_LEDGER_LOG_PATH="$(pwd)/vectors.json" export NAMADA_TX_LOG_PATH="$(pwd)/debugs.txt" +export NAMADA_DEV=false if [ "$#" -ne 1 ]; then echo "Illegal number of parameters" @@ -19,11 +21,14 @@ elif [ "$1" = "server" ]; then sed -i 's/^epochs_per_year = 31_536_000$/epochs_per_year = 262_800/' genesis/test-vectors-single-node.toml - NAMADA_GENESIS_FILE=$(cargo run --bin namadac -- utils init-network --genesis-path genesis/test-vectors-single-node.toml --wasm-checksums-path wasm/checksums.json --chain-prefix e2e-test --unsafe-dont-encrypt --localhost --allow-duplicate-ip | grep 'Genesis file generated at ' | sed 's/^Genesis file generated at //') + NAMADA_GENESIS_FILE=$(cargo run --bin namadac --package namada_apps --manifest-path Cargo.toml -- utils init-network --genesis-path genesis/test-vectors-single-node.toml --wasm-checksums-path wasm/checksums.json --chain-prefix e2e-test --unsafe-dont-encrypt --localhost --dont-archive --allow-duplicate-ip | grep 'Genesis file generated at ' | sed 's/^Genesis file generated at //') rm genesis/test-vectors-single-node.toml NAMADA_BASE_DIR=${NAMADA_GENESIS_FILE%.toml} + echo $NAMADA_BASE_DIR > $NAMADA_BASE_DIR_FILE + + sed -i 's/^mode = "RemoteEndpoint"$/mode = "Off"/' $NAMADA_BASE_DIR/config.toml cp wasm/*.wasm $NAMADA_BASE_DIR/wasm/ @@ -31,8 +36,14 @@ elif [ "$1" = "server" ]; then cp $NAMADA_BASE_DIR/setup/other/wallet.toml $NAMADA_BASE_DIR/wallet.toml - cargo run --bin namadan -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada/ ledger + sed -i 's/^mode = "RemoteEndpoint"$/mode = "Off"/' $NAMADA_BASE_DIR/setup/validator-0/.namada/$(basename $NAMADA_BASE_DIR)/config.toml + + cargo run --bin namadan --package namada_apps --manifest-path Cargo.toml -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada/ ledger elif [ "$1" = "client" ]; then + if test -f "$NAMADA_BASE_DIR_FILE"; then + NAMADA_BASE_DIR="$(cat $NAMADA_BASE_DIR_FILE)" + fi + echo > $NAMADA_TX_LOG_PATH echo $'[' > $NAMADA_LEDGER_LOG_PATH @@ -40,120 +51,49 @@ elif [ "$1" = "client" ]; then ALBERT_ADDRESS=$(cargo run --bin namadaw -- address find --alias albert | sed 's/^Found address Established: //') echo '{ - "author":"'$ALBERT_ADDRESS'", - "content":{ - "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", - "authors":"test@test.com", - "created":"2022-03-10T08:54:37Z", - "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", - "discussions-to":"www.github.com/anoma/aip/1", - "license":"MIT", - "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", - "requires":"2", - "title":"TheTitle" - }, - "grace_epoch":30, - "type":{ - "Default":"'$NAMADA_DIR'/wasm_for_tests/tx_proposal_code.wasm" - }, - "voting_end_epoch":24, - "voting_start_epoch":12 -} -' > proposal_submission_valid_proposal.json - + "proposal": { + "author":"'$ALBERT_ADDRESS'", + "content":{ + "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", + "authors":"test@test.com", + "created":"2022-03-10T08:54:37Z", + "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", + "discussions-to":"www.github.com/anoma/aip/1", + "license":"MIT", + "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", + "requires":"2", + "title":"TheTitle" + }, + "grace_epoch":30, + "voting_end_epoch":24, + "voting_start_epoch":12 + } + }' > proposal_default.json + echo '{ - "content": { - "abstract": "Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", - "authors": "test@test.com", - "created": "2022-03-10T08:54:37Z", - "details": "Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", - "discussions-to": "www.github.com/anoma/aip/1", - "license": "MIT", - "motivation": "Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", - "requires": "2", - "title": "TheTitle" - }, - "author": "'$ALBERT_ADDRESS'", - "tally_epoch": 18, - "signature": { - "Ed25519": { - "R_bytes": [ - 113, - 196, - 231, - 134, - 101, - 191, - 75, - 17, - 245, - 19, - 50, - 231, - 183, - 80, - 162, - 38, - 108, - 72, - 72, - 2, - 116, - 112, - 121, - 33, - 197, - 67, - 64, - 116, - 21, - 250, - 196, - 121 - ], - "s_bytes": [ - 87, - 163, - 134, - 87, - 42, - 156, - 121, - 211, - 189, - 19, - 255, - 5, - 23, - 178, - 143, - 39, - 118, - 249, - 37, - 53, - 121, - 136, - 59, - 103, - 190, - 91, - 121, - 95, - 46, - 54, - 168, - 9 - ] + "data":['$(od -An -tu1 -v wasm_for_tests/tx_proposal_code.wasm | tr '\n' ' ' | sed 's/\b\s\+\b/,/g')'], + "proposal": { + "author":"'$ALBERT_ADDRESS'", + "content":{ + "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", + "authors":"test@test.com", + "created":"2022-03-10T08:54:37Z", + "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", + "discussions-to":"www.github.com/anoma/aip/1", + "license":"MIT", + "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", + "requires":"2", + "title":"TheTitle" + }, + "grace_epoch":30, + "voting_end_epoch":24, + "voting_start_epoch":12 } - }, - "address": "'$ALBERT_ADDRESS'" -} -' > proposal_offline_proposal + }' > proposal_default_with_data.json echo '{ - "author":"'$ALBERT_ADDRESS'", - "content":{ + "author":"'$ALBERT_ADDRESS'", + "content":{ "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", "authors":"test@test.com", "created":"2022-03-10T08:54:37Z", @@ -164,59 +104,41 @@ elif [ "$1" = "client" ]; then "requires":"2", "title":"TheTitle" }, - "grace_epoch":18, - "type":{ - "Default":null - }, - "voting_end_epoch":9, - "voting_start_epoch":3 -}' > proposal_offline_valid_proposal.json + "tally_epoch":1 + }' > proposal_offline.json echo '{ - "author":"'$ALBERT_ADDRESS'", - "content":{ - "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", - "authors":"test@test.com", - "created":"2022-03-10T08:54:37Z", - "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", - "discussions-to":"www.github.com/anoma/aip/1", - "license":"MIT", - "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", - "requires":"2", - "title":"TheTitle" + "proposal": { + "author":"'$ALBERT_ADDRESS'", + "content":{ + "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", + "authors":"test@test.com", + "created":"2022-03-10T08:54:37Z", + "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", + "discussions-to":"www.github.com/anoma/aip/1", + "license":"MIT", + "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", + "requires":"2", + "title":"TheTitle" + }, + "grace_epoch":30, + "voting_end_epoch":24, + "voting_start_epoch":12 }, - "grace_epoch":30, - "type":"ETHBridge", - "voting_end_epoch":24, - "voting_start_epoch":12 -}' > eth_governance_proposal_valid_proposal.json + "data": {"add":"'$ALBERT_ADDRESS'","remove":[]} + }' > proposal_pgf_steward_add.json - echo '{ - "author":"'$ALBERT_ADDRESS'", - "content":{ - "abstract":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros. Nullam sed ex justo. Ut at placerat ipsum, sit amet rhoncus libero. Sed blandit non purus non suscipit. Phasellus sed quam nec augue bibendum bibendum ut vitae urna. Sed odio diam, ornare nec sapien eget, congue viverra enim.", - "authors":"test@test.com", - "created":"2022-03-10T08:54:37Z", - "details":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices. Quisque viverra varius cursus. Praesent sed mauris gravida, pharetra turpis non, gravida eros.", - "discussions-to":"www.github.com/anoma/aip/1", - "license":"MIT", - "motivation":"Ut convallis eleifend orci vel venenatis. Duis vulputate metus in lacus sollicitudin vestibulum. Suspendisse vel velit ac est consectetur feugiat nec ac urna. Ut faucibus ex nec dictum fermentum. Morbi aliquet purus at sollicitudin ultrices.", - "requires":"2", - "title":"TheTitle" - }, - "grace_epoch":30, - "type":"PGFCouncil", - "voting_end_epoch":24, - "voting_start_epoch":12 -}' > pgf_governance_proposal_valid_proposal.json + # proposal_default - # proposal_submission + cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-token NAM --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- unjail-validator --validator Bertha --gas-token NAM --force --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.02 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.02 --gas-token NAM --force --node 127.0.0.1:27657 - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_submission_valid_proposal.json --node 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_default.json --node 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + + cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_default_with_data.json --node 127.0.0.1:27657 cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --address validator-0 --node 127.0.0.1:27657 @@ -226,41 +148,29 @@ elif [ "$1" = "client" ]; then # proposal_offline - cargo run --bin namadac --features std -- bond --validator validator-0 --source Albert --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --node 127.0.0.1:27657 - - cargo run --bin namadac --features std -- change-commission-rate --validator Albert --commission-rate 0.05 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - - cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_offline_valid_proposal.json --offline --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Albert --amount 900 --gas-token NAM --node 127.0.0.1:27657 - cargo run --bin namadac --features std -- vote-proposal --data-path proposal_offline_proposal --vote yay --address Albert --offline --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Albert --commission-rate 0.05 --gas-token NAM --force --node 127.0.0.1:27657 - # eth_governance_proposal + PROPOSAL_OFFLINE_SIGNED=$(cargo run --bin namadac --features std -- init-proposal --force --data-path proposal_offline.json --signing-keys albert-key --offline --node 127.0.0.1:27657 | grep -o -P '(?<=Proposal serialized to:\s).*') - cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 - - cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.07 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 - - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path eth_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - - cargo run --bin namadac --features std -- vote-proposal --force --proposal-id 0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --address Bertha --ledger-address 127.0.0.1:27657 - - cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --eth '011586062748ba53bc53155e817ec1ea708de75878dcb9a5713bf6986d87fe14e7 fd34672ab5' --address validator-0 --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --data-path $PROPOSAL_OFFLINE_SIGNED --vote yay --address Albert --offline --node 127.0.0.1:27657 # pgf_governance_proposal - cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-amount 0 --gas-limit 0 --gas-token NAM --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- bond --validator validator-0 --source Bertha --amount 900 --gas-token NAM --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.09 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.09 --gas-token NAM --force --node 127.0.0.1:27657 - PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_0=$(cargo run --bin namadac --features std -- init-proposal --pgf-stewards --force --data-path proposal_pgf_steward_add.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - PROPOSAL_ID_1=$(cargo run --bin namadac --features std -- init-proposal --force --data-path pgf_governance_proposal_valid_proposal.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') + PROPOSAL_ID_1=$(cargo run --bin namadac --features std -- init-proposal --pgf-stewards --force --data-path proposal_pgf_steward_add.json --ledger-address 127.0.0.1:27657 | grep -o -P '(?<=/proposal/).*(?=/author)') - cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 1000" --address validator-0 --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- --base-dir $NAMADA_BASE_DIR/setup/validator-0/.namada vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --address validator-0 --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --pgf "$ALBERT_ADDRESS 900" --address Bertha --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_0 --vote yay --address Bertha --signing-keys bertha-key --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_1 --vote yay --pgf "$ALBERT_ADDRESS 900" --address Bertha --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- vote-proposal --force --proposal-id $PROPOSAL_ID_1 --vote yay --address Bertha --signing-keys bertha-key --ledger-address 127.0.0.1:27657 # non-proposal tests @@ -268,24 +178,38 @@ elif [ "$1" = "client" ]; then cargo run --bin namadac --features std -- bond --validator bertha --amount 25 --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.11 --gas-amount 0 --gas-limit 0 --gas-token NAM --force --node 127.0.0.1:27657 + cargo run --bin namadac --features std -- change-commission-rate --validator Bertha --commission-rate 0.11 --gas-token NAM --force --node 127.0.0.1:27657 cargo run --bin namadac --features std -- reveal-pk --public-key albert-key --gas-payer albert-key --force --ledger-address 127.0.0.1:27657 cargo run --bin namadac --features std -- update-account --code-path vp_user.wasm --address bertha --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- init-validator --alias bertha-validator --account-keys bertha --commission-rate 0.05 --max-commission-rate-change 0.01 --signing-keys bertha-key --unsafe-dont-encrypt --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- update-account --code-path vp_user.wasm --address bertha --public-keys albert-key,bertha-key --force --ledger-address 127.0.0.1:27657 + + cargo run --bin namadac --features std -- update-account --code-path vp_user.wasm --address bertha --public-keys albert-key,bertha-key,christel-key --threshold 2 --force --ledger-address 127.0.0.1:27657 + + cargo run --bin namadac --features std -- init-validator --alias bertha-validator --account-keys bertha-key --commission-rate 0.05 --max-commission-rate-change 0.01 --signing-keys bertha-key --unsafe-dont-encrypt --force --ledger-address 127.0.0.1:27657 + + cargo run --bin namadac --features std -- init-validator --alias validator-mult --account-keys albert-key,bertha-key --commission-rate 0.05 --max-commission-rate-change 0.01 --signing-keys albert-key,bertha-key --threshold 2 --unsafe-dont-encrypt --force --ledger-address 127.0.0.1:27657 + # TODO works but panics cargo run --bin namadac --features std -- unbond --validator christel --amount 5 --signing-keys christel-key --force --ledger-address 127.0.0.1:27657 cargo run --bin namadac --features std -- withdraw --validator albert --signing-keys albert-key --force --ledger-address 127.0.0.1:27657 cargo run --bin namadac --features std -- init-account --alias albert-account --public-keys albert-key --signing-keys albert-key --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- tx --code-path $NAMADA_DIR/wasm_for_tests/tx_no_op.wasm --data-path README.md --signing-keys albert-key --owner albert --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- init-account --alias account-mul --public-keys albert-key,bertha-key,christel-key --signing-keys albert-key,bertha-key,christel-key --threshold 2 --force --ledger-address 127.0.0.1:27657 + + # TODO panics, no vector produced + # cargo run --bin namadac --features std -- tx --code-path $NAMADA_DIR/wasm_for_tests/tx_no_op.wasm --data-path README.md --signing-keys albert-key --owner albert --force --ledger-address 127.0.0.1:27657 cargo run --bin namadac --features std -- ibc-transfer --source bertha --receiver christel --token btc --amount 24 --channel-id channel-141 --signing-keys bertha-key --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadac --features std -- ibc-transfer --source albert --receiver bertha --token nam --amount 100000 --channel-id channel-0 --port-id transfer --signing-keys albert-key --force --ledger-address 127.0.0.1:27657 + + cargo run --bin namadac --features std -- ibc-transfer --source albert --receiver bertha --token nam --amount 100000 --channel-id channel-0 --port-id transfer --signing-keys albert-key --timeout-sec-offset 5 --force --ledger-address 127.0.0.1:27657 + cargo run --bin namadaw -- masp add --alias a_spending_key --value xsktest1qqqqqqqqqqqqqq9v0sls5r5de7njx8ehu49pqgmqr9ygelg87l5x8y4s9r0pjlvu69au6gn3su5ewneas486hdccyayx32hxvt64p3d0hfuprpgcgv2q9gdx3jvxrn02f0nnp3jtdd6f5vwscfuyum083cvfv4jun75ak5sdgrm2pthzj3sflxc0jx0edrakx3vdcngrfjmru8ywkguru8mxss2uuqxdlglaz6undx5h8w7g70t2es850g48xzdkqay5qs0yw06rtxcvedhsv --unsafe-dont-encrypt cargo run --bin namadaw -- masp add --alias b_spending_key --value xsktest1qqqqqqqqqqqqqqpagte43rsza46v55dlz8cffahv0fnr6eqacvnrkyuf9lmndgal7c2k4r7f7zu2yr5rjwr374unjjeuzrh6mquzy6grfdcnnu5clzaq2llqhr70a8yyx0p62aajqvrqjxrht3myuyypsvm725uyt5vm0fqzrzuuedtf6fala4r4nnazm9y9hq5yu6pq24arjskmpv4mdgfn3spffxxv8ugvym36kmnj45jcvvmm227vqjm5fq8882yhjsq97p7xrwqqd82s0 --unsafe-dont-encrypt @@ -296,27 +220,31 @@ elif [ "$1" = "client" ]; then cargo run --bin namadaw -- masp add --alias bb_payment_address --value patest1vqe0vyxh6wmhahwa52gthgd6edgqxfmgyv8e94jtwn55mdvpvylcyqnp59595272qrz3zxn0ysg + # TODO vector produced only when epoch boundaries not straddled cargo run --bin namadac --features std -- transfer --source albert --target aa_payment_address --token btc --amount 20 --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- transfer --source a_spending_key --target ab_payment_address --token btc --amount 7 --force --ledger-address 127.0.0.1:27657 + # TODO vector produced only when epoch boundaries not straddled + cargo run --bin namadac --features std -- transfer --gas-payer albert-key --source a_spending_key --target ab_payment_address --token btc --amount 7 --force --ledger-address 127.0.0.1:27657 - until cargo run --bin namadac -- epoch --ledger-address 127.0.0.1:27657 | grep -m1 "Last committed epoch: 2" ; do sleep 10 ; done; + # TODO fragile + until cargo run --bin namadac -- epoch --ledger-address 127.0.0.1:27657 | grep -m1 "Last committed epoch: 2" ; do sleep 10 ; done; - cargo run --bin namadac --features std -- transfer --source a_spending_key --target bb_payment_address --token btc --amount 7 --force --ledger-address 127.0.0.1:27657 + # TODO vector produced only when epoch boundaries not straddled + cargo run --bin namadac --features std -- transfer --gas-payer albert-key --source a_spending_key --target bb_payment_address --token btc --amount 7 --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- transfer --source a_spending_key --target bb_payment_address --token btc --amount 6 --force --ledger-address 127.0.0.1:27657 + # TODO vector produced only when epoch boundaries not straddled + cargo run --bin namadac --features std -- transfer --gas-payer albert-key --source a_spending_key --target bb_payment_address --token btc --amount 6 --force --ledger-address 127.0.0.1:27657 - cargo run --bin namadac --features std -- transfer --source b_spending_key --target bb_payment_address --token btc --amount 6 --force --ledger-address 127.0.0.1:27657 + # TODO vector produced only when epoch boundaries not straddled + cargo run --bin namadac --features std -- transfer --gas-payer albert-key --source b_spending_key --target bb_payment_address --token btc --amount 6 --force --ledger-address 127.0.0.1:27657 - rm proposal_submission_valid_proposal.json - - rm proposal_offline_proposal - - rm proposal_offline_valid_proposal.json + rm -f proposal_default.json + + rm -f proposal_default_with_data.json - rm eth_governance_proposal_valid_proposal.json + rm -f proposal_offline.json - rm pgf_governance_proposal_valid_proposal.json + rm -f proposal_pgf_steward_add.json perl -0777 -i.original -pe 's/,\s*$//igs' $NAMADA_LEDGER_LOG_PATH diff --git a/shared/src/ledger/mod.rs b/shared/src/ledger/mod.rs index 04b5809bc2..a1a6e93c40 100644 --- a/shared/src/ledger/mod.rs +++ b/shared/src/ledger/mod.rs @@ -4,7 +4,6 @@ pub mod eth_bridge; pub mod events; pub mod governance; pub mod ibc; -pub mod inflation; pub mod native_vp; pub mod pgf; pub mod pos; diff --git a/test_fixtures/masp_proofs/1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin b/test_fixtures/masp_proofs/1226362759E8F5050B9954234033AC0E46C83B093EAF35D1A0537CE81D282FB9.bin deleted file mode 100644 index 1764192dbaa796b80a90fc4d76da3a085cc69cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 Ya}+Rcru$9usD;;K>Tn9_0h8n$G(5oe8~^|S delta 1002 zcmVDesq;T?(}6;GJ0A&$?ljj6iL3u1;1rj(E|Vaq^z0{Yb<2 zRZ!sAVzYl1B?EteB%bahyAOV=K1~c8E1~ECI!?J)a8J%u;9THG77q3h|4jmv>^N2j%Tq{f-vl2<6U)wr)%%$C6n(i|cDRpzu-qM0 zR3y?U(RSHvjnB!CZ%=<&fIBH3bsIJPYuDpXGn9F^^KWwFj`$N2uyJ8Hqp*Eo zPqE?SlW%{kni&~??X?R?Z-vATv{D!V79xIHf5kRFuRXbY3pdJdB?MukdLyRJ;yRvc z@SaXYTfLWC=OfDJm@qJ^*2=KgNuzpdpLcbkp@;K!>KzuC;ERJVLen38-!9EFSW>oF zcHl!D$8EyqzFH8zu{N6Y6Lf4@Wy;AX4>C;Qlr(>v(XP4SduzysR)O1wbU>SZHrtR% zSs~B4#Qy)6GfvDU+)|2r5Dcu)^oK65j^#n@Chn%L;b+IOCaZlK1uv3if(18xD2nb~ zn2}q?o8@$xaOeKPY$Im_WRx=GsGjQ-^0WyY#P`ri7T($Z<>ih8-R4n7mDwylJu0$e zefoduiW)R5L6MW3<&}?a$Q+2nOu=r8RM05VZ8uxi`JeD_T3=*ag?~{TU$81v$yC`3 z_&`GoX`d_=Nbne7Qeet$jj%wypfP)Bm5$`dTrla5Pj#&dauc8u6ZNo_4&Yo0yi6HhnVs{%c(n1h+DRk+HvcP}S~ YSVrNE4_G+MjtEdT%j diff --git a/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin b/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin index c702a4e9b7d40dc5649b26874ffb844890a78506..1fbae64602829c00c5f1da4fa116e6a3dc28caa9 100644 GIT binary patch delta 1002 zcmVe6>1H+jGSqT`PNLuuCrGV^a3DLVLmyV&#ydNPhCsu zM2L~U&v{E|(5ctv@ZIaruv#;-YZLSWARl*%nEx%fG9+jZOQ2|RQBwB1w6)HeI?t;v zi!}V6E3-~B&4&sKlc=-Npnv%n*-s#fNnN@SBwzXwTAbL@YsCZpj>}s zmMD4_iHoL7Mcp^PB2n~iKxrCIR7G&rsxv^O=upSz%T<4y!GEG5tS}vI)@n`s75lT@ zp&JxP75=|#uG63X04BaXv{mi?1;PP8KK+U0lLR>b=BMk2NY?LUSN)8bMY;Owi>|UJ z8}_M>b7b`U5b=7q=sLOYsQbV36V|>mXqe8L5J`Fd{(Fm)WHqA~m`yt$gOcP@-F6~* z@DWtVao2ys$941zZ7A0@5_=@>=%xs$(@N+NmL>KNLuP5#r2RsUXX z%jE3-*wdFoiZ0R`TXOkj%_!<3k#;^Q@tye^^e0mW@rB+UmV&V1I2&j zg4u9pG$u(HmsxRui^s3DqlE>ieCZ(bQ21X819yLtK*zbY2}HsAUE?=XBWALdePvmZ z;0OsMmb3?Ht!E-r33Iya-{6K8^$>owT3iss!|0~Zxyyu6f@Jnw21t^=ftP<6jTJ&jhU{2+t#bE=2NVa@6i3n65c(VD zfI)W2o>X~<1Kter1^D7~_hxv{Zj1nk4VgJPpyk6JZKPUH7E5v(JxOB)V=rYI@NQ?- z5K5>zTt^&&x$^B+HWZC8VOPbN~PV delta 1002 zcmVC6}N zEapxwnp>)jr-~G`oxDz)P23KuyUb>@7<^x+wFlZgI=DKb5ZoBe-?^*KPINBxHY#X7 zp;w_2IJQ(Ft{4m%|MHQ?DXS;7IPNC*y^x^#r;0FU%M*WIJ`X+{Z8Ozx&q)yJU_18{Wl=msyXXpnXJLB3Z30&a9r{+2B ztHyP7Ny%L}Q_J*pVnNb$pE4Z0P_Y3$Ozr8%Fl&a6!3e{W#jO-z5aiDjsiF9y+r^GL z6*9{Vvj%^=wcEdc(@e6`iZe4r&Cu1hb4vhH7-oi=n-=(pX~>np3k)z#f$&wqN5pP5 z0y>}|BIXhj0ZSl;_bUoNnw-YbEiE06}ct9mmI+uHW8Qwll`g#oAqhmWBGGgPt4qxG_ug z#UlJBzkh(*xYNIxLz{p&hhC}IdJ&xI5Ju-}qU=OJUJL=Cy2@8`M&ZpC;-H@$_C&K3N-6R+R_;TlVKQPv3Q zV~HrDDpb+!#wQGUh#0>`d}o%EDxs7^{(#NOEK@&>AELtPs%KBfH$AmjcXGm}!`?at zN{}O?aZ1h@UEN%yVTqrn-*;71H6keT)z5!VCV7sI8+y{U;b5u!oGYL4%P-#Gx_t7* z4?N(b;2$b0PPmW50-tH}ET3r`i{JiOGv8Em7QrIpgV6JehH;>Md2OYK9RnjiXxiV^ zqG1nCR?yxruNd?aGiPb$HqZ@=0&_FjDqCc^=17l$0KgbHz2#E0S7n{{oGt9;S-rB9X?z5e?{VCIH Y`ypZ$xg1bux4+M9IV8Pwp0|W_f!MPCJ=H|Vd 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 diff --git a/test_fixtures/masp_proofs/85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin b/test_fixtures/masp_proofs/85BDAF3AC6C282F8C767109FBDFBD6BDE6A1BF0BAE7D72FDACCC888A32094C72.bin deleted file mode 100644 index d4245c57e2ed3b88764874479d31af8ab8ba2edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9184 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 N{~tXhB)~r#{{{l65zznu diff --git a/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin b/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin index 54421f95dcd807e270f4e698bf324bc902ecc86b..fc528241a153f61d1e8fa210caa13bc95cd1c670 100644 GIT binary patch delta 1002 zcmVX`P$Z74p=MaZ7Dvz4$JtiYUa?TP5 zHV|Z0vW0r36Af3MU{~BXL~+TpYZLSWAko2KdLrr~RiCgbbe_xnoT5dVY$d}z%#ehK zr4vq3JhOimB?Eu35Tx*YDvx@r#_Z|xY=sp_jaiNw7v4;ciB>ceyJagBqYH6j*$Y>7 z6Fk%gOVpu)1Na(R!ud4v7wMXetet!c6&EXwwOmR(kO~Xw#dU?1v{Bw)lbrFCBKh7} z%*|yAEV;n>CsHM+abb6bsbnwu;@bs^96uQ5>M07dg6)6U=dLIpb+19`K!UqW1+*rhiA; zx{Gt&!le&kUWY+u-@-#7pch0#xC?uVKFhq zlXt=%+LcXZz(Fsl4#gU$@c9xosQ=-+iG;_#P(^>-|8262A%s)jYfCBHw5YhI=)Waf zXxG@p8TRQRR+Q?(c*$rBt*)NCvJ;wMzSyS1wZVd@>%H=K5HY_&g&g(Wn)Wu`3M@Pq6`>y}y z^_zd^ZbE<9`eL2Y+Y=K9!5?i%5uo3!Fs!{D6Y2x9AL`99^v%}yr?Uok&+^7NmvTD; zz1-@zV+!&T$OcphO!t_*&4mM~95i3?J=Uh?q0mmLCzr(-_ktdOwT4xfPf z6-B1Nv3(UA-X=$*38k(Oh1j`STkl0_n%7yL=PD+Df80&$2c7idFk=SGx|*HtZ9l6B zO~C@}rl7tpj$w!bwBd}PVid6GVXJexKsCLac^*1BDY|CL+CgpO<^=Ek@f>hcks3y$ zGi-QV`-o37XUs$*4%}2OhxMTlf6k{K4H+sG_*C?)eK|(Tra+T!jYRW1p;{R-jY_#7 Y3Pcn$N)EMb8cUh_iZU5#2$SR-G*c?_y8r+H delta 1002 zcmVC0yIvoU>OD^a3D^5mp-@o@M=3gFP?J zv2v>Jd6x+9PA^=hk`)a$IMD2~YZLSWAXB1ya8Mw;&S1ZJK(&l?Ky|llD8kPZ(F&tP zm7K$4MzenwB?Eu9DPMG1%47MIn!-Pz(4fyShms(70ikAF*zRH3(4&J^>BiC#C;`WK zBTm4&oSKTV_5ZR42(GbEv-kHus7`d4^P-ezz_a_xLfW#`ej!FExu0L`+Ic zHJdII)Ff!g6o|nhjE#i9lvYR@Zl5o#0$7jsHY29?#36s|bLj&V8##sfCmf(&#K#*3 zhCO&9yt@w}?TPmu*Q7B>Qfa$05KbF6jSZIJ!@EuJ!o9-{PXQ`Y3+jFOFtG~$v*@fb zwQQ*pL`0bcN$i+q<_ye+`ia6G?7el2^VPFeg&un?go@|JNRKs)$#+nzkCqMCEk?v9 z58mx!Xv}}0{idjBZ)_D$d`%hVB{noU?&TcAI18+b<7JZS+2X>|umYM+cA05e;_wdw z@8wL>G=d**)o?M9rUJz;Ozt#)E}!*=uExs)AG|uWBL_SYN4A844u-`HeOl(my+HC> zs0}RJjkpn!ES2{V&U|aU13eEx#&t*G)oycQDPVs@_z;s0)?7-%21v?2b3T=d43!19 zz#b;>J2v%9CGLg{g>Sw?lY{f3$+tCKj!EmZIC7RBOd9`{G1y5)Q*-s?w9v8FmJW{r zX;%JYR)StWq%?$QJoWpGtpUIETkazYd7TEH1QWtarcCV4LYEtTiinZ2!IbC6^1VAV ztMGqQx7|nBehX8VS@Ra}+dfj5>L&-NpRy3a>y7=IGS(KClgG86CVAt;v-#@&rei1D zI@&O@x1z7-;`tY!wX3wYbUF;CwO>;{)k)$Td&EteLqKr)TQN^AbAHzRbW^eO`#@;wHfK2;L%3k6;|W8h3qBm z&WMD`)?D#7rL7W=*%I`aO+f6=`l5qz!s9}B8QIzCVuF&YHsq2w^iH%!PR4cmbBji? zM(=c~c#u=5oRO#q(GafuVDSVKg{hy;Qt@N+qr=>%=W$xQk67GGrbh)y{rZuUuz>&& YdTThf7=`82h!}GyroTO$29x9*G3x-4D}-|eWgbBPihB-ZgqtNhwFv4R39j+ z&FAND_-_V0pY;|#FS4^R#KAHJ7z%!-o|+ZT9#C+wyGNkpqY%DAE@`FHO5N{qp(8xV z>LvDu5UGV+3-p`b4N{G94dXng^QldNs;>F(NgLYm9>ntd>?KRQKNFJ*5^{V9MFoH* zsf%IPJwx!|<2%aN1;d_}H7k91qlm-B&ZET~jXOM`ob;jr&0m`P2b6qr#Dh{LSg2}o zZWapg0Vw9O<`xeD_>F~d`}d!;mm{jsh-*YX-=2Fr}tTD(v8g6 z$CmugCNLnZaYe|ZKnRtw3iI7|rs-irymNLOxX-LS-$rmhVIYs*w=y-2BM_ zsJoARh|DgLPF;OT*z)7N?E*XewY`hvTZ;M?p)xDt>&~?T6uM>)PPRMpbHIKZKDDcz4|muP%~*&6 znDp?~iYs+sfa8qyr!=d1KPUfYbqbfcc~cn^riK#&q%p64nZ#a<39yKV5y4eX=7s*g zw1S&@g&2o51%iufIdH_f$78V{A`HME=^K`sVqR2lUb-WY6Cu0a-ZaJ@1bpG6W_C*C zDD*&+p!Z;-oP)iPMyyD1mQP>BF8H)Hk=j~(-h(91uUHRwY}aciq3~_6?KS0EsZ*gB zbl#~`#gwv#ESrkDv!fmtkpJLclB$fQV!Nl6i0VGMENhpfx?M4Yk%(j48voAG6v)^Q zTfbE0vQfJU%mw`&HFRrWKEA@(+_y-65=K)b5k4!DdenXb|Iv3rjXzO$OXVKk=5c_h|w z+i36a0H{Xme^C~bw%wk36MP*av=AD3%&R7;OGGt&j$1$I%mFA{jTP4gNgaH8Xf{6o z7?KxxHD+@_&nDtoR)u6YXfgu~bxE{DP)cH0tpMc1_mooChLDyNq}~e64(hwCfX&q{(12z`zsP9Do@sb=TCyEm@1$vW)3 z^_;i_L$@p4qe&|N36RsrcwsPR3QDuKb!g$skxZU)!Yk71iasf_#mr7;q5`yS3`5^a zaKZ4yHN5o6^+o%OI_5X4kTD&K$7mr>-Fbmc@`&OWrXGmrlWbCWa^FF91Ga%LNem?j zX{;VjEL54G{*9`?`~O1}?(EUsk>R}@Wx)F|jc#M+;n}8~@J2&wqQ}@!RT89Z^LNbq zUsE{1iG8$MjJ4&JEpv37FSw5koBK0LXFB?q(~VMEkBE5x&Yf>ZoW8cL-O8^+7lN#5 zi(twDLCLUcfo|`^C??P!3jd+-9}53Jrto3RX0=hM&-bctA=whmbkrG#gmf`Md&j#h}!hhCGdp9Lq6C|Co1cg_3B&OZn-F?Nn zarowZ_OtOlj9~>9O_8!N)W4?SHBq$tr5YjVHfQmV7onTG&!=;`LT<%PWg($;6k2%o z6*v^U8K~-D3C0J`NDzoB_L2|p51syK#6KGG-)h8n9q9^@AD~5!2A?s=;71mxH2cvc z+5lN$Dav+L5-K-9DZw8$tvYqr`^6}}^2>G=oe~b3iQYs_aVErNs?rVvFv>*m#}+?E z85X_mCoG(vM#KAjfgg5e?V<4`GtS4@7~nh9v=*i)F=1)*IeDVO2I%(M;Z{zS6bun> z9h603r~%PMKF>(&%$I|uCl+^%FYA;%D>3y8kt98yd+KaiPEvp$s^uQ_fo@7XQl7@t z=k#_-ww1KXZrAcOvKdzwE0P_kuwoZ{XntXEbQ_k+>H$;SrkP!^>%ftFBjGhMhkmIK zAlUF{C(jevo>I#*(`B7p#|+o27W%Np=7(ix3saat82+LY)=l7MdD2^``uh{E$fS$G5lNQZB!6xp(i($7 zsdK3O(;G`0h6hJ$SNV0g6GWGd2M4GiDu68V%{PBJr4%22GY(W)&S# zD!CDCdW|M9QN1FX%|4d^3E(d7lXbMmJX>V4JG_k3;zUe}B zdDj@c%k3n+^VTfUq$<0d8HALG9Lv@1A$mPkfc#)lEQ}k)e?-T*0v7?bqb7p z9MipCsxG`R-_b7oz$P(8@H;;!DLlvm^T==REV+kVB0gz*&8kzkhuU zo&L4JKi&V&9r$%Wa~hzH!!7c;md>>X)>CZFJ=HUO^^(5l z=UkBsE(N%Sc{g_vT-M1uQduUL62}&ls@Evv#m$vTb-gbJcBYm1x&x4C2c=QrvXJ@V z4NCn-gC@8EG%d={=PN}Y^c6f8Pb)h8CV2(vAH_^;c}nEx;=t4xA9p1wa^#B2j2iB# ztjulP@-VgyVu_QISo-zUiK;C(w*!L0zg2sGu4R-y_;r$Zr1cw9UtwXAd&x^iJWWYt zAq&UL@9J~D*<;gKnKV|FH-4`his`f3bA0K0y~-s$5fS!^6ou7dpnq1BC{pC@3GOa2 zS;iF2tNf{b#Ym&ATr8G8UjghNvhp1&vGgMrv>D2iVy8|`nCYQB4m#^@#f}2!RAkWw z9+9R$SF7#UT-^pMrC47&rerg5<(Pl)Jvncc;pAbZRq7Y)X1TuGC!2~cWK4o?>loxQ zxY}`MU@goHh`d+)$lB{tY0wwKOU@Ha&6BFV$)6al3v$DQe}RC(%AV2VxA8g8Ek@eG zDLMS5(pA7pWn#ELTYt+INU;PU5~0%RW#- z6Qt8!R=_zfD})g5kK^Do!4`;e?YSQfydvjcWgBUpz{Lg(O#=4VmsrhLJo(ZBe-Ka@ zbiQqcqeb1XrA=w7ZN%E^g`q&!yI&UTA~8jhnNL820fs^fOUm}1X&w%G#I6NbdsnP4 zb`}Zgk<6v^pfFh~2}}upGiQ#-py;xo z1_!k76HiBp341Gc78K`6U;Aq}*|lBc6)PEPVHSTF?c?XAg3|OSGbvM&ajd+vMTr?( z!6Ox7rx1F!?rfJnZkGEs@zz6~h-K6+?TgZ3e3$@6@4?yz?CUwBIk#b+px%xV8x%8b zvobO!{FtIk< zu?K{c{zk#%9nNfeVo=dOUS`0GtkYu`Uiy1suicI=G|JYru^;sK8xF4>x3k(9Tm`(P z$f#*n-|K|Z0gW7#Fsq#9D(+l%GuF{D@rB*bRf({Yx~+IWNJ%Ti+!6NCGaa-+n|@ABqB75tXt>_uLQyKI+}yzzf*OBP$5#6vR4PMn zrhVfJ|iK0kpE1UqA;xCi5CZNX_A1nX(sv()_dd^_x?&oAciQmLBg+d%o*#u@`W=&T0 z(A(js)#gSUirKnBqiks}a@ZKbJ8dTen3q(IJF(${n5lXD}rRwU1KE-qWnH|lD&)O!Q zJEjKFKh2bHyHyCj;1>+=AxBnE(KM-H2Ct0UPAax>)~8PNnH<~0!cB%ck2%BjsACg0 zA|qeCRR~1%EvSxr7%@XjTF*lSd%3d(p$VN43#KYN9yqxn>|sLTIxN$7!Tq&g^I(G; zJZI!ZR!LNj)K5{QU#Vro@*_*ZgHZk^wcW6Q?=`5`GmL$B zDl88um+_9J2_btdw33I=94WUs;ya#4gAh{v$uybp- zzf>5{4Z|8hc4qG&1?UhK{25y!%<@(6Mymh~1s2Be>)MPAbzxQpc7EQODAB!H@z=-r zi4|0mdJ!~^ayCzrc!ljFM0N2>0_<6ZG=1n zGjjK1o)CvM)w{t~8h(UBU>_(rw$n68A*HC&Z?gvXb&LJES~|~M4tL^=#+%$GiZEL| z15?_9fmte6zXr&$`<0q+g6A?HCYye0&zE8KP!EdtYN?71&>pFpf`TD`ViVEJ%!$nghPx1;;@GYb1|Q9r4Xqx3V)Ow={-N9F`G zZvwMIO?AM@u4sx5d$mDlXWIGzcWJ~LV?b4%=qt*oB5>s5=ZYd5B#_c{t^ z8vucEglda?rX@ZuY!C%x^nJe{cuR~FTZL@oIr=(_$Oq*rZEpo<1PsEe=Qk+u_XU`O zOrGk}q&PDG?&}|kmUyt*vmCZ`n(KfC^B%UK#J!d!y^VyUAsFP$J?Z5e-h?fofag<Z@eX z$Oe`$Z>yUl+EjpS$5*|6kK^s(5pNo?o3CWWba=XR*iynWP2wFT%^N4?giLMRU+;?3 z+0M(!ugM1vAtH7tY}0 z%pSrWc7aC#oN&DXqDh$R1z4Iu{L?OR6LwIZQ=fC+jwl2 zuYGYrT2HSuIoG_LYnf8)K+PilzHQkvCKaoOshrK3?=RU@`Pa*_-Ojt4Zfw62@rRN6gmb z-FxVQDoZbK^LnGQD-{sK&_O|(BljiyzJukccX`H4%LR*&d75?f{ZZ9oVHQ_K|ApIV z)|^dz;w6;tedMu>EwclA$PdzTxCJ^-XCQvz@$F1)X%Oozf2>^W^>{&be=fo*1(7G2 zh$ppJ)U|Ky!`|##jnNE{2^VHOF^ELwo);Nw1@-bm34RB&Rhs)U%EMqn_ kYl+xzjmfN`5kvm-FGs&p0>A9n*x&d69QZHK=zk6V2Ux4QX#fBK diff --git a/test_fixtures/masp_proofs/DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin b/test_fixtures/masp_proofs/917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin similarity index 50% rename from test_fixtures/masp_proofs/DA50E59A47A7BE9BC8BFF03D9E755E2583731052033322E25250C780EE322BF4.bin rename to test_fixtures/masp_proofs/917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin index a8a8691cd4e3d5a3d412e6ac82e1b884fdb149c4..4dde0ccf5f17bae502d207612170f73df7e81ba2 100644 GIT binary patch delta 3619 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 E02i6kBme*a delta 5328 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 diff --git a/test_fixtures/masp_proofs/992543B7B7B6B9DCB328590D37CE9FF2DA066496E6664F56EB28F67D75C21911.bin b/test_fixtures/masp_proofs/992543B7B7B6B9DCB328590D37CE9FF2DA066496E6664F56EB28F67D75C21911.bin deleted file mode 100644 index 96669ba726b230e46b99331417957a5dcae14d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9589 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 L&wroe|9bIXxH#^@ diff --git a/test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin b/test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d88ddcc5d402717893ed197c13f45baa08a53c1 GIT binary patch literal 22648 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 O`(GFTIDr5A$$tPvo&`t% literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin b/test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin new file mode 100644 index 0000000000000000000000000000000000000000..d67642b43e9810f3f2e1acccdbbee81da239a5ed GIT binary patch literal 10312 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/DFDFB1EDE901241995311122C25CE2E0F12C98370D2CDFD6A75236522A4235F5.bin b/test_fixtures/masp_proofs/DFDFB1EDE901241995311122C25CE2E0F12C98370D2CDFD6A75236522A4235F5.bin deleted file mode 100644 index 321b39faef07e63b03f2431b84b66ff9a9bfd082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24899 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 D;Sm$_ diff --git a/test_fixtures/masp_proofs/ED30921582F7DCEA42D960F73DE905E9DAFDAC88A291E7F1756931C8A85441E6.bin b/test_fixtures/masp_proofs/ED30921582F7DCEA42D960F73DE905E9DAFDAC88A291E7F1756931C8A85441E6.bin deleted file mode 100644 index 259d8ed81127715adf2313a84924aaf5cf90c130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19839 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 BMP~p2 diff --git a/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin b/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin deleted file mode 100644 index 9fa6ccfe2b5ff834dec8619ce7ce41edf11e8329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7448 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 Y6BuD6dz(Z?U#j6PLnD=60F&e#G!Mh-$p8QV delta 1002 zcmVNCGPtQKJShxO6wDY0hWRe}jO?rU zVrw~$xv}JlpjU=@-QH7f=(ldJ+^o?zZyUq77fq5=8IlSb@M;Xj8-f7t ziyx!U1M@3PR4kf?##ywGgaH&Lm%D9Gn5D<1(QWw}Tpcsc@0GLFP|DzK0yIp-gc9xHW#oS(CxvrFtVZh$vgR5;!gjin-AG+J*pv zmG9wb*VTXROxWgz1H+)wIt3--p@h2SR;)*8H%m!5w+E#z)cet?q;{#buquA?w9y)1~Xcs4u@gJa1L%Pw&c z7!h}Y)ehID_XHfkOU*dh5T_&ViZ%4}MQ z)$)Bzbmg83cd{WGw1kW|A?PHke+cU+T0@^<5*9U?V_6~B3r>nXQ3b|CA+TH-Fl#|a z=l~gtt3b47_VQ|XbFV^+^nG3{N2D+JdT)Pa_?|>ZRTIeu=D3>!sLoH9$|i)=29XB` z!|8XO09M*VAJQu+Rfz(u~4FJvHZXJB@imAoQ+*PcOPLt~Z&rHq(*@G{TW)I6>fuap?U;93One0Yt62Lc1Q13v zo)6L|X$vJlp{E``>O6(kbiHBP*%sv~H`Y#PBfeo$Hh8Y^TK=5VDEiC@Lh*W)k-a~z Y!D$ZpN{}RqgSPwJpSjIC3zOs=H1Xx?t^fc4 diff --git a/test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin b/test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin new file mode 100644 index 0000000000000000000000000000000000000000..b10162bc6b0288fcfa3d1721fd716ec3c2a776b3 GIT binary patch literal 13799 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 L{&$QI|9bu}n12XU literal 0 HcmV?d00001 From ce20a157e6d4c4a629a9ae31d0d1c4e58c8ec8f7 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Tue, 17 Oct 2023 13:29:24 +0200 Subject: [PATCH 3/6] Increased the precision of MASP rewards. --- Cargo.lock | 6 +- Cargo.toml | 4 +- apps/src/lib/client/rpc.rs | 4 +- apps/src/lib/config/genesis.rs | 4 +- .../lib/node/ledger/shell/finalize_block.rs | 28 +--- apps/src/lib/node/ledger/shell/init_chain.rs | 7 +- core/src/ledger/storage/masp_conversions.rs | 90 ++++++------ core/src/types/address.rs | 17 --- core/src/types/token.rs | 70 +++++---- genesis/e2e-tests-single-node.toml | 14 +- shared/src/ledger/queries/shell.rs | 4 +- shared/src/sdk/masp.rs | 6 +- shared/src/sdk/rpc.rs | 2 +- shared/src/sdk/tx.rs | 4 +- ...9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin | Bin 7448 -> 7448 bytes ...FF8BF07596031CD460FEBFAEA4F75AF65D5402.bin | Bin 0 -> 9208 bytes ...D76149D3088F539CF8372D404609B89B095EF7.bin | Bin 7448 -> 7448 bytes ...EB66F886B3A3B6C71D33F456B859D01DA47ADD.bin | Bin 0 -> 9208 bytes ...7C98D1E5AAAA9988F26B1A47090ACCE693572F.bin | Bin 7448 -> 7448 bytes ...59181FA326C06FCA9A49B5A5C394C75942820E.bin | Bin 15573 -> 0 bytes ...FC3DA2C57E4FD8FF0811D9CB129887F0F9F706.bin | Bin 0 -> 25031 bytes ...8B6780B6F18A312AE3909BEA19D16FCFE837DC.bin | Bin 0 -> 18792 bytes ...A700BB49387329F8FD049D5F66C95B11B55ADE.bin | Bin 22648 -> 0 bytes ...4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin | Bin 10312 -> 0 bytes ...E72A01F0B169F946835583DC2C71B550315603.bin | Bin 0 -> 19947 bytes ...CFE8EEC08E2D8512695A667D294AE1A4A8D4E6.bin | Bin 0 -> 9649 bytes ...8DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin | Bin 0 -> 7448 bytes ...FA3F379DB351AB4AE081207ABFDFC429C9FA48.bin | Bin 0 -> 17018 bytes ...344FFFAA6CA273027CD480AEA68DDED57D88CA.bin | Bin 7448 -> 7448 bytes ...B827EEEDA858AB983D16024AAA415579A68953.bin | Bin 0 -> 9649 bytes ...C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin | Bin 13799 -> 0 bytes tests/src/integration/masp.rs | 137 ++++-------------- wasm/Cargo.lock | 6 +- wasm/wasm_source/Cargo.toml | 2 +- wasm_for_tests/wasm_source/Cargo.lock | 6 +- 35 files changed, 149 insertions(+), 262 deletions(-) create mode 100644 test_fixtures/masp_proofs/29AC8DE3B07495BEABEAF50FE8FF8BF07596031CD460FEBFAEA4F75AF65D5402.bin create mode 100644 test_fixtures/masp_proofs/52984E26D4A044A259B441C1DAEB66F886B3A3B6C71D33F456B859D01DA47ADD.bin delete mode 100644 test_fixtures/masp_proofs/917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin create mode 100644 test_fixtures/masp_proofs/9883C2EF7971504BB1CF651BAFFC3DA2C57E4FD8FF0811D9CB129887F0F9F706.bin create mode 100644 test_fixtures/masp_proofs/99393E3AC8046F86ABA05519568B6780B6F18A312AE3909BEA19D16FCFE837DC.bin delete mode 100644 test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin delete mode 100644 test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin create mode 100644 test_fixtures/masp_proofs/BA4FED83467B6FEE522748C6F7E72A01F0B169F946835583DC2C71B550315603.bin create mode 100644 test_fixtures/masp_proofs/C7ECE8C02C2E764EFD5B6A0756CFE8EEC08E2D8512695A667D294AE1A4A8D4E6.bin create mode 100644 test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin create mode 100644 test_fixtures/masp_proofs/EEB91EB873807EC77BBCA95D4CFA3F379DB351AB4AE081207ABFDFC429C9FA48.bin create mode 100644 test_fixtures/masp_proofs/F36A8353F15FD6D8158DBC67DDB827EEEDA858AB983D16024AAA415579A68953.bin delete mode 100644 test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin diff --git a/Cargo.lock b/Cargo.lock index 84cbd6f48e..1c0d1cb6d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3748,7 +3748,7 @@ dependencies = [ [[package]] name = "masp_note_encryption" version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "borsh 0.9.4", "chacha20 0.9.1", @@ -3761,7 +3761,7 @@ dependencies = [ [[package]] name = "masp_primitives" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "aes 0.7.5", "bip0039", @@ -3792,7 +3792,7 @@ dependencies = [ [[package]] name = "masp_proofs" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "bellman", "blake2b_simd", diff --git a/Cargo.toml b/Cargo.toml index 9c731f0fdf..db71e92989 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,8 +90,8 @@ libc = "0.2.97" libloading = "0.7.2" libsecp256k1 = {git = "https://github.com/heliaxdev/libsecp256k1", rev = "bbb3bd44a49db361f21d9db80f9a087c194c0ae9", default-features = false, features = ["std", "static-context"]} # branch = "murisi/namada-integration" -masp_primitives = { git = "https://github.com/anoma/masp", rev = "50acc5028fbcd52a05970fe7991c7850ab04358e" } -masp_proofs = { git = "https://github.com/anoma/masp", rev = "50acc5028fbcd52a05970fe7991c7850ab04358e", default-features = false, features = ["local-prover"] } +masp_primitives = { git = "https://github.com/anoma/masp", rev = "1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" } +masp_proofs = { git = "https://github.com/anoma/masp", rev = "1345b463e8fa3b3a6fa13e4a43fb1c410690ad62", default-features = false, features = ["local-prover"] } num256 = "0.3.5" num_cpus = "1.13.0" num-derive = "0.3.3" diff --git a/apps/src/lib/client/rpc.rs b/apps/src/lib/client/rpc.rs index d750ccc759..1645009011 100644 --- a/apps/src/lib/client/rpc.rs +++ b/apps/src/lib/client/rpc.rs @@ -2126,7 +2126,7 @@ pub async fn query_conversions< // Track whether any non-sentinel conversions are found let mut conversions_found = false; for ((addr, _), epoch, conv, _) in conv_state.assets.values() { - let amt: masp_primitives::transaction::components::I32Sum = + let amt: masp_primitives::transaction::components::I128Sum = conv.clone().into(); // If the user has specified any targets, then meet them // If we have a sentinel conversion, then skip printing @@ -2181,7 +2181,7 @@ pub async fn query_conversion( Address, MaspDenom, Epoch, - masp_primitives::transaction::components::I32Sum, + masp_primitives::transaction::components::I128Sum, MerklePath, )> { namada::sdk::rpc::query_conversion(client, asset_type).await diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index eac5f5bdca..3331a30c03 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -1012,8 +1012,8 @@ pub fn genesis(num_validators: u64) -> Genesis { implicit_vp_code_path: vp_implicit_path.into(), implicit_vp_sha256: Default::default(), max_signatures_per_transaction: 15, - epochs_per_year: 525_600, /* seconds in yr (60*60*24*365) div seconds - * per epoch (60 = min_duration) */ + epochs_per_year: 365, /* seconds in yr (60*60*24*365) div seconds + * per epoch (60 = min_duration) */ pos_gain_p: Dec::new(1, 1).expect("This can't fail"), pos_gain_d: Dec::new(1, 1).expect("This can't fail"), staked_ratio: Dec::zero(), diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 346a3f916b..525ed86ec4 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -618,10 +618,8 @@ where /// with respect to the previous epoch. fn apply_inflation(&mut self, current_epoch: Epoch) -> Result<()> { let last_epoch = current_epoch.prev(); - // Get input values needed for the PD controller for PoS and MASP. + // Get input values needed for the PD controller for PoS. // Run the PD controllers to calculate new rates. - // - // MASP is included below just for some completeness. let params = read_pos_params(&self.wl_storage)?; @@ -653,15 +651,6 @@ where let pos_locked_ratio_target = params.target_staked_ratio; let pos_max_inflation_rate = params.max_inflation_rate; - // TODO: properly fetch these values (arbitrary for now) - let masp_locked_supply: Amount = Amount::default(); - let masp_locked_ratio_target = Dec::new(5, 1).expect("Cannot fail"); - let masp_locked_ratio_last = Dec::new(5, 1).expect("Cannot fail"); - let masp_max_inflation_rate = Dec::new(2, 1).expect("Cannot fail"); - let masp_last_inflation_rate = Dec::new(12, 2).expect("Cannot fail"); - let masp_p_gain = Dec::new(1, 1).expect("Cannot fail"); - let masp_d_gain = Dec::new(1, 1).expect("Cannot fail"); - // Run rewards PD controller let pos_controller = inflation::RewardsController { locked_tokens: pos_locked_supply, @@ -675,27 +664,12 @@ where d_gain_nom: pos_d_gain_nom, epochs_per_year, }; - let _masp_controller = inflation::RewardsController { - locked_tokens: masp_locked_supply, - total_tokens, - total_native_tokens: total_tokens, - locked_ratio_target: masp_locked_ratio_target, - locked_ratio_last: masp_locked_ratio_last, - max_reward_rate: masp_max_inflation_rate, - last_inflation_amount: token::Amount::from( - masp_last_inflation_rate, - ), - p_gain_nom: masp_p_gain, - d_gain_nom: masp_d_gain, - epochs_per_year, - }; // Run the rewards controllers let inflation::ValsToUpdate { locked_ratio, inflation, } = pos_controller.run(); - // let new_masp_vals = _masp_controller.run(); // Get the number of blocks in the last epoch let first_block_of_last_epoch = self diff --git a/apps/src/lib/node/ledger/shell/init_chain.rs b/apps/src/lib/node/ledger/shell/init_chain.rs index 46d4222983..abe231e9af 100644 --- a/apps/src/lib/node/ledger/shell/init_chain.rs +++ b/apps/src/lib/node/ledger/shell/init_chain.rs @@ -338,11 +338,14 @@ where // Init token parameters and last inflation and caching rates parameters.init_storage(&address, &mut self.wl_storage); self.wl_storage - .write(&token::masp_last_inflation(&address), last_inflation) + .write( + &token::masp_last_inflation_key(&address), + last_inflation, + ) .unwrap(); self.wl_storage .write( - &token::masp_last_locked_ratio(&address), + &token::masp_last_locked_ratio_key(&address), last_locked_ratio, ) .unwrap(); diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index 5b195dd29d..d9b13526fe 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -10,6 +10,7 @@ use masp_primitives::sapling::Node; use crate::ledger::inflation::{RewardsController, ValsToUpdate}; use crate::ledger::parameters; +use crate::ledger::storage_api::token::read_denom; use crate::ledger::storage_api::{StorageRead, StorageWrite}; use crate::types::address::Address; use crate::types::dec::Dec; @@ -17,18 +18,11 @@ use crate::types::storage::Epoch; use crate::types::token::MaspDenom; use crate::types::{address, token}; -/// Inflation is implicitly denominated by this value. The lower this figure, -/// the less precise inflation computations are. The higher this figure, the -/// larger the fixed-width types that are required to carry out inflation -/// computations. This value should be fixed constant for each asset type - here -/// we have simplified it and made it constant across asset types. -const PRECISION: u64 = 100; - /// A representation of the conversion state #[derive(Debug, Default, BorshSerialize, BorshDeserialize)] pub struct ConversionState { /// The last amount of the native token distributed - pub normed_inflation: Option, + pub normed_inflation: Option, /// The tree currently containing all the conversions pub tree: FrozenCommitmentTree, /// Map assets to their latest conversion and position in Merkle tree @@ -44,11 +38,20 @@ pub struct ConversionState { pub fn calculate_masp_rewards( wl_storage: &mut super::WlStorage, addr: &Address, -) -> crate::ledger::storage_api::Result<(u32, u32)> +) -> crate::ledger::storage_api::Result<(u128, u128)> where D: 'static + super::DB + for<'iter> super::DBIter<'iter>, H: 'static + super::StorageHasher, { + let denomination = read_denom(wl_storage, addr).unwrap().unwrap(); + // Inflation is implicitly denominated by this value. The lower this + // figure, the less precise inflation computations are. This is especially + // problematic when inflation is coming from a token with much higher + // denomination than the native token. The higher this figure, the higher + // the threshold of holdings required in order to receive non-zero rewards. + // This value should be fixed constant for each asset type. + let precision = 10u128.pow(std::cmp::max(u32::from(denomination.0), 3) - 3); + let masp_addr = address::masp(); // Query the storage for information @@ -69,38 +72,33 @@ where let epochs_per_year: u64 = wl_storage .read(¶meters::storage::get_epochs_per_year_key())? - .expect(""); + .expect("epochs per year should properly decode"); //// Values from the last epoch let last_inflation: token::Amount = wl_storage - .read(&token::masp_last_inflation(addr)) - .expect("failure to read last inflation") - .expect(""); + .read(&token::masp_last_inflation_key(addr))? + .expect("failure to read last inflation"); let last_locked_ratio: Dec = wl_storage - .read(&token::masp_last_locked_ratio(addr)) - .expect("failure to read last inflation") - .expect(""); + .read(&token::masp_last_locked_ratio_key(addr))? + .expect("failure to read last inflation"); //// Parameters for each token let max_reward_rate: Dec = wl_storage - .read(&token::masp_max_reward_rate(addr)) - .expect("max reward should properly decode") - .expect(""); + .read(&token::masp_max_reward_rate_key(addr))? + .expect("max reward should properly decode"); let kp_gain_nom: Dec = wl_storage - .read(&token::masp_kp_gain(addr)) - .expect("kp_gain_nom reward should properly decode") - .expect(""); + .read(&token::masp_kp_gain_key(addr))? + .expect("kp_gain_nom reward should properly decode"); let kd_gain_nom: Dec = wl_storage - .read(&token::masp_kd_gain(addr)) - .expect("kd_gain_nom reward should properly decode") - .expect(""); + .read(&token::masp_kd_gain_key(addr))? + .expect("kd_gain_nom reward should properly decode"); let locked_target_ratio: Dec = wl_storage - .read(&token::masp_locked_ratio_target(addr))? - .expect(""); + .read(&token::masp_locked_ratio_target_key(addr))? + .expect("locked ratio target should properly decode"); // Creating the PD controller for handing out tokens let controller = RewardsController { @@ -126,10 +124,11 @@ where // Since we must put the notes in a compatible format with the // note format, we must make the inflation amount discrete. let noterized_inflation = if total_token_in_masp.is_zero() { - 0u32 + 0u128 } else { crate::types::uint::Uint::try_into( - (inflation.raw_amount() * PRECISION) + (inflation.raw_amount() + * crate::types::uint::Uint::from(precision)) / total_token_in_masp.raw_amount(), ) .unwrap() @@ -163,24 +162,21 @@ where // otherwise we will have an inaccurate view of inflation wl_storage .write( - &token::masp_last_inflation(addr), - (total_token_in_masp / PRECISION) * u64::from(noterized_inflation), + &token::masp_last_inflation_key(addr), + token::Amount::from_uint( + (total_token_in_masp.raw_amount() / precision) + * crate::types::uint::Uint::from(noterized_inflation), + 0, + ) + .unwrap(), ) .expect("unable to encode new inflation rate (Decimal)"); wl_storage - .write(&token::masp_last_locked_ratio(addr), locked_ratio) + .write(&token::masp_last_locked_ratio_key(addr), locked_ratio) .expect("unable to encode new locked ratio (Decimal)"); - // to make it conform with the expected output, we need to - // move it to a ratio of x/100 to match the masp_rewards - // function This may be unneeded, as we could describe it as a - // ratio of x/1 - - Ok(( - noterized_inflation, - PRECISION.try_into().expect("inflation precision too large"), - )) + Ok((noterized_inflation, precision)) } // This is only enabled when "wasm-runtime" is on, because we're using rayon @@ -196,7 +192,7 @@ where use std::cmp::Ordering; use masp_primitives::ff::PrimeField; - use masp_primitives::transaction::components::I32Sum as MaspAmount; + use masp_primitives::transaction::components::I128Sum as MaspAmount; use rayon::iter::{ IndexedParallelIterator, IntoParallelIterator, ParallelIterator, }; @@ -288,12 +284,12 @@ where (addr.clone(), denom), (MaspAmount::from_pair( old_asset, - -(*normed_inflation as i32), + -(*normed_inflation as i128), ) .unwrap() + MaspAmount::from_pair( new_asset, - new_normed_inflation as i32, + new_normed_inflation as i128, ) .unwrap()) .into(), @@ -320,13 +316,13 @@ where // intermediate tokens cancel/ telescope out current_convs.insert( (addr.clone(), denom), - (MaspAmount::from_pair(old_asset, -(reward.1 as i32)) + (MaspAmount::from_pair(old_asset, -(reward.1 as i128)) .unwrap() - + MaspAmount::from_pair(new_asset, reward.1 as i32) + + MaspAmount::from_pair(new_asset, reward.1 as i128) .unwrap() + MaspAmount::from_pair( reward_assets[denom as usize], - real_reward as i32, + real_reward as i128, ) .unwrap()) .into(), diff --git a/core/src/types/address.rs b/core/src/types/address.rs index 416b3f059e..b0b709d69f 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -681,23 +681,6 @@ pub fn tokens() -> HashMap { .collect() } -/// Temporary helper for testing, a hash map of tokens addresses with their -/// MASP XAN incentive schedules. If the reward is (a, b) then a rewarded tokens -/// are dispensed for every b possessed tokens. -pub fn masp_rewards() -> HashMap { - vec![ - (nam(), (0, 100)), - (btc(), (1, 100)), - (eth(), (2, 100)), - (dot(), (3, 100)), - (schnitzel(), (4, 100)), - (apfel(), (5, 100)), - (kartoffel(), (6, 100)), - ] - .into_iter() - .collect() -} - #[cfg(test)] pub mod tests { use proptest::prelude::*; diff --git a/core/src/types/token.rs b/core/src/types/token.rs index c6fefea9c6..ffc21f817d 100644 --- a/core/src/types/token.rs +++ b/core/src/types/token.rs @@ -596,6 +596,20 @@ impl Mul for Amount { } } +/// A combination of Euclidean division and fractions: +/// x*(a,b) = (a*(x//b), x%b). +impl Mul<(u128, u128)> for Amount { + type Output = (Amount, Amount); + + fn mul(mut self, rhs: (u128, u128)) -> Self::Output { + let amt = Amount { + raw: (self.raw / rhs.1) * Uint::from(rhs.0), + }; + self.raw %= rhs.1; + (amt, self) + } +} + /// A combination of Euclidean division and fractions: /// x*(a,b) = (a*(x//b), x%b). impl Mul<(u64, u64)> for Amount { @@ -816,18 +830,18 @@ pub const CONVERSION_KEY_PREFIX: &str = "conv"; /// Key segment prefix for pinned shielded transactions pub const PIN_KEY_PREFIX: &str = "pin-"; /// Last calculated inflation value handed out -pub const MASP_LAST_INFLATION: &str = "last_inflation"; +pub const MASP_LAST_INFLATION_KEY: &str = "last_inflation"; /// The last locked ratio -pub const MASP_LAST_LOCKED_RATIO: &str = "last_locked_ratio"; +pub const MASP_LAST_LOCKED_RATIO_KEY: &str = "last_locked_ratio"; /// The key for the nominal proportional gain of a shielded pool for a given /// asset -pub const MASP_KP_GAIN_KEY: &str = "proptional_gain"; +pub const MASP_KP_GAIN_KEY: &str = "proportional_gain"; /// The key for the nominal derivative gain of a shielded pool for a given asset pub const MASP_KD_GAIN_KEY: &str = "derivative_gain"; /// The key for the locked ratio target for a given asset pub const MASP_LOCKED_RATIO_TARGET_KEY: &str = "locked_ratio_target"; /// The key for the max reward rate for a given asset -pub const MASP_MAX_REWARD_RATE: &str = "max_reward_rate"; +pub const MASP_MAX_REWARD_RATE_KEY: &str = "max_reward_rate"; /// Gets the key for the given token address, error with the given /// message to expect if the key is not in the address @@ -874,22 +888,22 @@ pub fn minted_balance_key(token_addr: &Address) -> Key { } /// Obtain the nominal proportional key for the given token -pub fn masp_kp_gain(token_addr: &Address) -> Key { +pub fn masp_kp_gain_key(token_addr: &Address) -> Key { key_of_token(token_addr, MASP_KP_GAIN_KEY, "nominal proproitonal gains") } /// Obtain the nominal derivative key for the given token -pub fn masp_kd_gain(token_addr: &Address) -> Key { +pub fn masp_kd_gain_key(token_addr: &Address) -> Key { key_of_token(token_addr, MASP_KD_GAIN_KEY, "nominal proproitonal gains") } /// The max reward rate key for the given token -pub fn masp_max_reward_rate(token_addr: &Address) -> Key { - key_of_token(token_addr, MASP_MAX_REWARD_RATE, "max reward rate") +pub fn masp_max_reward_rate_key(token_addr: &Address) -> Key { + key_of_token(token_addr, MASP_MAX_REWARD_RATE_KEY, "max reward rate") } /// Obtain the locked target ratio key for the given token -pub fn masp_locked_ratio_target(token_addr: &Address) -> Key { +pub fn masp_locked_ratio_target_key(token_addr: &Address) -> Key { key_of_token( token_addr, MASP_LOCKED_RATIO_TARGET_KEY, @@ -920,7 +934,7 @@ pub struct Parameters { /// Shielded Pool nominal proportional gain for the given token pub kp_gain_nom: Dec, /// Locked ratio for the given token - pub locked_ratio_target_key: Dec, + pub locked_ratio_target: Dec, } impl Parameters { @@ -937,19 +951,19 @@ impl Parameters { max_reward_rate: max_rate, kd_gain_nom, kp_gain_nom, - locked_ratio_target_key: locked_target, + locked_ratio_target: locked_target, } = self; wl_storage - .write(&masp_max_reward_rate(address), max_rate) + .write(&masp_max_reward_rate_key(address), max_rate) .expect("max reward rate for the given asset must be initialized"); wl_storage - .write(&masp_locked_ratio_target(address), locked_target) + .write(&masp_locked_ratio_target_key(address), locked_target) .expect("locked ratio must be initialized"); wl_storage - .write(&masp_kp_gain(address), kp_gain_nom) + .write(&masp_kp_gain_key(address), kp_gain_nom) .expect("The nominal proportional gain must be initialized"); wl_storage - .write(&masp_kd_gain(address), kd_gain_nom) + .write(&masp_kd_gain_key(address), kd_gain_nom) .expect("The nominal derivative gain must be initialized"); } } @@ -960,7 +974,7 @@ impl Default for Parameters { max_reward_rate: Dec::from_str("0.1").unwrap(), kp_gain_nom: Dec::from_str("0.1").unwrap(), kd_gain_nom: Dec::from_str("0.1").unwrap(), - locked_ratio_target_key: Dec::from_str("0.1").unwrap(), + locked_ratio_target: Dec::from_str("0.1").unwrap(), } } } @@ -1032,20 +1046,20 @@ pub fn is_masp_key(key: &Key) -> bool { || key.starts_with(PIN_KEY_PREFIX))) } -/// The last locked ratio of a token -pub fn masp_last_locked_ratio(token_address: &Address) -> Key { +/// Obtain the storage key for the last locked ratio of a token +pub fn masp_last_locked_ratio_key(token_address: &Address) -> Key { key_of_token( token_address, - MASP_LAST_LOCKED_RATIO, + MASP_LAST_LOCKED_RATIO_KEY, "cannot obtain storage key for the last locked ratio", ) } -/// The last inflation of a token -pub fn masp_last_inflation(token_address: &Address) -> Key { +/// Obtain the storage key for the last inflation of a token +pub fn masp_last_inflation_key(token_address: &Address) -> Key { key_of_token( token_address, - MASP_LAST_INFLATION, + MASP_LAST_INFLATION_KEY, "cannot obtain storage key for the last inflation rate", ) } @@ -1336,10 +1350,10 @@ pub mod testing { H: 'static + ledger_storage::StorageHasher, { use crate::ledger::parameters::storage::get_epochs_per_year_key; - use crate::types::address::masp_rewards; + use crate::types::address::tokens; - let masp_rewards = masp_rewards(); - let masp_reward_keys: Vec<_> = masp_rewards.keys().collect(); + let tokens = tokens(); + let masp_reward_keys: Vec<_> = tokens.keys().collect(); wl_storage .write(&get_epochs_per_year_key(), epochs_per_year) @@ -1348,7 +1362,7 @@ pub mod testing { max_reward_rate: Dec::from_str("0.1").unwrap(), kd_gain_nom: Dec::from_str("0.1").unwrap(), kp_gain_nom: Dec::from_str("0.1").unwrap(), - locked_ratio_target_key: Dec::zero(), + locked_ratio_target: Dec::zero(), }; for address in masp_reward_keys { @@ -1360,10 +1374,10 @@ pub mod testing { ) .unwrap(); wl_storage - .write(&masp_last_inflation(address), Amount::zero()) + .write(&masp_last_inflation_key(address), Amount::zero()) .expect("inflation ought to be written"); wl_storage - .write(&masp_last_locked_ratio(address), Dec::zero()) + .write(&masp_last_locked_ratio_key(address), Dec::zero()) .expect("last locked set default"); } } diff --git a/genesis/e2e-tests-single-node.toml b/genesis/e2e-tests-single-node.toml index 0020dd995a..1096be0d28 100644 --- a/genesis/e2e-tests-single-node.toml +++ b/genesis/e2e-tests-single-node.toml @@ -40,7 +40,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.BTC] address = "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp" @@ -55,7 +55,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.ETH] address = "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p" @@ -70,7 +70,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.DOT] address = "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn" @@ -85,7 +85,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.Schnitzel] address = "atest1v4ehgw36xue5xvf5xvuyzvpjx5un2v3k8qeyvd3cxdqns32p89rrxd6xx9zngvpegccnzs699rdnnt" @@ -100,7 +100,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.Apfel] address = "atest1v4ehgw36gfryydj9g3p5zv3kg9znyd358ycnzsfcggc5gvecgc6ygs2rxv6ry3zpg4zrwdfeumqcz9" @@ -115,7 +115,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [token.Kartoffel] address = "atest1v4ehgw36gep5ysecxq6nyv3jg3zygv3e89qn2vp48pryxsf4xpznvve5gvmy23fs89pryvf5a6ht90" @@ -131,7 +131,7 @@ Ester = "1000000" max_reward_rate = "0.1" kd_gain_nom = "0.1" kp_gain_nom = "0.1" -locked_ratio_target_key = "0.6667" +locked_ratio_target = "0.6667" [established.Albert] vp = "vp_user" diff --git a/shared/src/ledger/queries/shell.rs b/shared/src/ledger/queries/shell.rs index a766846916..520c702608 100644 --- a/shared/src/ledger/queries/shell.rs +++ b/shared/src/ledger/queries/shell.rs @@ -30,7 +30,7 @@ type Conversion = ( Address, MaspDenom, Epoch, - masp_primitives::transaction::components::I32Sum, + masp_primitives::transaction::components::I128Sum, MerklePath, ); @@ -254,7 +254,7 @@ where addr.clone(), *denom, *epoch, - Into::::into( + Into::::into( conv.clone(), ), ctx.wl_storage.storage.conversion_state.tree.path(*pos), diff --git a/shared/src/sdk/masp.rs b/shared/src/sdk/masp.rs index 739f941b9a..f9459f6cab 100644 --- a/shared/src/sdk/masp.rs +++ b/shared/src/sdk/masp.rs @@ -34,8 +34,8 @@ use masp_primitives::transaction::builder::{self, *}; use masp_primitives::transaction::components::sapling::builder::SaplingMetadata; use masp_primitives::transaction::components::transparent::builder::TransparentBuilder; use masp_primitives::transaction::components::{ - ConvertDescription, I128Sum, I32Sum, OutputDescription, SpendDescription, - TxOut, U64Sum, + ConvertDescription, I128Sum, OutputDescription, SpendDescription, TxOut, + U64Sum, }; use masp_primitives::transaction::fees::fixed::FeeRule; use masp_primitives::transaction::sighash::{signature_hash, SignableInput}; @@ -989,7 +989,7 @@ impl ShieldedContext { Address, MaspDenom, _, - I32Sum, + I128Sum, MerklePath, ) = rpc::query_conversion(client, asset_type).await?; self.asset_types diff --git a/shared/src/sdk/rpc.rs b/shared/src/sdk/rpc.rs index 58609bed42..cb881e88a2 100644 --- a/shared/src/sdk/rpc.rs +++ b/shared/src/sdk/rpc.rs @@ -228,7 +228,7 @@ pub async fn query_conversion( Address, MaspDenom, Epoch, - masp_primitives::transaction::components::I32Sum, + masp_primitives::transaction::components::I128Sum, MerklePath, )> { Some(unwrap_client_response::( diff --git a/shared/src/sdk/tx.rs b/shared/src/sdk/tx.rs index 9d7fe0cfe4..0381e6f6aa 100644 --- a/shared/src/sdk/tx.rs +++ b/shared/src/sdk/tx.rs @@ -15,7 +15,7 @@ use masp_primitives::transaction::components::sapling::fees::{ use masp_primitives::transaction::components::transparent::fees::{ InputView as TransparentInputView, OutputView as TransparentOutputView, }; -use masp_primitives::transaction::components::I32Sum; +use masp_primitives::transaction::components::I128Sum; use namada_core::ledger::governance::cli::onchain::{ DefaultProposal, OnChainProposal, PgfFundingProposal, PgfStewardProposal, ProposalVote, @@ -1643,7 +1643,7 @@ async fn used_asset_types< // Collect all the asset types used in the Sapling converts for output in builder.sapling_converts() { for (asset_type, _) in - I32Sum::from(output.conversion().clone()).components() + I128Sum::from(output.conversion().clone()).components() { add_asset_type(&mut asset_types, shielded, client, *asset_type) .await; diff --git a/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin b/test_fixtures/masp_proofs/1362F1CF9B836CF8B05D8189EA9CB1712CCA85B0E96A3330A63BE7CD9E5ECD22.bin index 20634c1de5ed13fa856cedaf2127d8ef6c39a987..741f4d5106a2c0107b1dbbcb346b1da4d04cc5fa 100644 GIT binary patch delta 1002 zcmV9f)2Sk z3xbx1LbHDsB?Et|ZB$N(t^fDH(Z!P~CeI;tdVVf&h2S1wq=85^i?EsNm#(Mm6$^Cf zpC8<1GlLI;)q|le%A6-?Q+2d;stU=K%z5>nI7}RsG&a?-rCM1L+COsVHOB?q*YDh@ zIsBgz=9~rh!NBTxxVa6NwkgW28uW+QHJxwwyYH+rn$>^H!`?!wi!mAd2v=B$@b&SQ zg!K%D(SRWq9pE_EHcF&+@c+)14>h2TW&>{i`eh|6O4bVCl!?Vf$K6E7f=d{p2=-yk6!A@ zl0#=b&JRjJD>X*s>9I_ zP1x~#w{k9|sC`T|Bb`m-#UfCqdIC7_m-HCXMUsagO)?& z_{RUTXEh01|Me_i_Fc<0!Z5O+mo%Gj;Ug9UtsHmMrrZ7)NCL^Zed;swsSt_SSP;mi z>mlbu;x^W&^DW)*RMl6i&1#O@gill1ZfSp00xyKj{9G-UU|I4}AG{7`wq!%W4~qOg ze}^yEajuZ6*eme06*RkTiFTF(tMxVzX5u%WpdGv9nJAs9F9_`k>wy&*t;|(*DrB)S zRTx5sj$A2>$x z${IOmv3m~<(z;w;1&4oJan(%`2ib_cn{lnvFKU!eaE1cwq{t{&5xdEzj8c?fkOhk delta 1002 zcmVpk*o95o+sy!j3?)2rzLiDn_ld*Lk;u- zAo>W*4+W*yW8ST5ntdnZX%9pYUkB&FaY^gtM?x5Sma|t7^a3E^HG97fO%V;Q3GW=8 z7Q-V7YOwL(c2Xh6Jv}Z>+AB4)YZLSWAiZ4^lX^sH^9rQ&gXP(NuV|+^k zbjJWR=d*tnB?Eu1Sg7AKIHb>%y>pD=gV38zfmhBe^c}z4=K(Ob=%{M{GsRD$3}sZ< z`13s)&J$p$1=4PqDhg)QZNeU(xii-KDhxNL6T5xkfZ&S2@@+#p5nc1D>+w{YLX>>! z&(-(_=Uz8#)G0G3uXFL2P6s|XkLbR8wo}Gyo%@r%Hd=q(I=pa6vcnOgR&z_bEBNqu zrEU7CxQ2`KTrvb^`>S8#c{R3!F-PAjJ(>y-n$8UaSCF`*SYvzvFG=R}eVh&=w&UC* z2OqS8afQq3o2A^)AHcBKI0{XAQo);6Abp0KC3t+&_G*<%7>tZW5tFZNZV!N%e>k!_DUBk>tMM;|yBYaCd)5W;LY=eH1w9dVaAr9_cIbU*CL4 zTofue!39yve(U!}l`*Mh&KFjp57vqJd9MNH!5^T^@Nz^P*J+{qUg%%B(7?TX9gWDl z-T`_a2xKz$#1sDxiW$g95=pNmb!S~*pq(l-ri>;=)e>AUV-)|RwpH`XqN!aOXsj6EXANhRAs!h94?&m`>x|&9` zg73G;Mu5c<<7(^@(ZS6rK2ivl2=1-#Y$9a<8KL{`4OVh4?lJn{9oE32)hTjhl?czs Ya}+Rcru$9usD;;K>Tn9_0h8n$G(5oe8~^|S diff --git a/test_fixtures/masp_proofs/29AC8DE3B07495BEABEAF50FE8FF8BF07596031CD460FEBFAEA4F75AF65D5402.bin b/test_fixtures/masp_proofs/29AC8DE3B07495BEABEAF50FE8FF8BF07596031CD460FEBFAEA4F75AF65D5402.bin new file mode 100644 index 0000000000000000000000000000000000000000..b748454de8fd4dcd1fb8fc32f944bc6abc828039 GIT binary patch literal 9208 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin b/test_fixtures/masp_proofs/37332141CB34FC30FF51F4BEE8D76149D3088F539CF8372D404609B89B095EF7.bin index 1fbae64602829c00c5f1da4fa116e6a3dc28caa9..18f83d0543674902e112707b9a890c8baf916c7d 100644 GIT binary patch delta 1002 zcmVvYhohcmRZRsWyRVE!v#6`hu zk(qIeQddQ$q}|-O06{Kq!C&2!mkmP*8(k-`36 zA?XXmR0V%_E1S@M7R-2&ymF~G#ClQiPR1qVyGQB>+3-q|7QhoAG7358k$!IX?!n*R zJR9%dF}LkDLJe+ny9RU`Q$S@q#_W~>MIcM_tw99FAb?De;iQo4Eiv=XpE*Pm;nxMP z5vGD!i8Q!rRiQaXyb24kK`=&z%p5ZsB1s68;Cp{_tD}#j77w96T{ssDLXxU_4B~U* zZ9MpSwU}u*`QcSk%B&v0JTaeAwf|@}gThnR)l`*6Q?UjGNWokP z?l6@LKM*Zv!J`e|Si3kNq80I{&Y;Fi$+GBnuv|&J+JmSK5#%nGaG=BPFuZQ-HZCv5 zCx0i|R(ih$S6745pYZmQ`^z7Yz2d@6W(|Mr*1iIyAwaMi3aidjT>rP{QRuJc78I|W zXK1&i5+1?S?CqCL06QWUOH@w_VbdV_FBi!S!>jukac-;KrW{>=z|UJ<+X~xuL&>W~ zn}-|e4kGFLKmr;7b`LBB-5LFoq3fWsVD;2Tn$A zARF%H-*q4qcsBAYxPVlin2eOvOMoo!?qTg37=%L8sD|1#nCT+f;8z@QNgY>fO%TYi YE$!*C*K|(TI4fpp@^KR`0F&e#H2>)7?EnA( delta 1002 zcmVe6>1H+jGSqT`PNLuuCrGV^a3DLVLmyV&#ydNPhCsu zM2L~U&v{E|(5ctv@ZIaruv#;-YZLSWARl*%nEx%fG9+jZOQ2|RQBwB1w6)HeI?t;v zi!}V6E3-~B&4&sKlc=-Npnv%n*-s#fNnN@SBwzXwTAbL@YsCZpj>}s zmMD4_iHoL7Mcp^PB2n~iKxrCIR7G&rsxv^O=upSz%T<4y!GEG5tS}vI)@n`s75lT@ zp&JxP75=|#uG63X04BaXv{mi?1;PP8KK+U0lLR>b=BMk2NY?LUSN)8bMY;Owi>|UJ z8}_M>b7b`U5b=7q=sLOYsQbV36V|>mXqe8L5J`Fd{(Fm)WHqA~m`yt$gOcP@-F6~* z@DWtVao2ys$941zZ7A0@5_=@>=%xs$(@N+NmL>KNLuP5#r2RsUXX z%jE3-*wdFoiZ0R`TXOkj%_!<3k#;^Q@tye^^e0mW@rB+UmV&V1I2&j zg4u9pG$u(HmsxRui^s3DqlE>ieCZ(bQ21X819yLtK*zbY2}HsAUE?=XBWALdePvmZ z;0OsMmb3?Ht!E-r33Iya-{6K8^$>owT3iss!|0~Zxyyu6f@Jnw21t^=ftP<6jTJ&jhU{2+t#bE=2NVa@6i3n65c(VD zfI)W2o>X~<1Kter1^D7~_hxv{Zj1nk4VgJPpyk6JZKPUH7E5v(JxOB)V=rYI@NQ?- z5K5>zTt^&&x$^B+HWZC8VOPbN~PV diff --git a/test_fixtures/masp_proofs/52984E26D4A044A259B441C1DAEB66F886B3A3B6C71D33F456B859D01DA47ADD.bin b/test_fixtures/masp_proofs/52984E26D4A044A259B441C1DAEB66F886B3A3B6C71D33F456B859D01DA47ADD.bin new file mode 100644 index 0000000000000000000000000000000000000000..c51b5ed0d978ab920e1c513daaffdee73adc4aed GIT binary patch literal 9208 zcmeI2Wl$aMlE<+?$iad;gS!WZ;2Jmy2Zsa>?h@SHEf75Df#B}$79_a)K|*j6f3OD}ny&ux>*?-6L_k0w_+$MN;vb7LZ~c@LN;j!dE&-Lx zug`SO!I*-`qSL4;yhxfDM` z&FIEhorRWtIW(73)+rA{R0?F|mfVOJzM}tf@IP_#%h4|(uI&|N^0fOksmc1jYXiu2 zYQn8CBme!}->+g)XWFqyN6y2lolj2_FAhD;#7ro98AR|RI4}A0 zIxpnHvnwQ?eJcs+drFlqM9oa9`YamJXGqNoF*o29<8^W^7=XBl5xYH7}CT9wg5Cdg`}22tPL>UXr#o{QE{9e zJK=_1mMLvxfqK?altvlPiUgoXnQ4S5@)E_HKDA-4ldjF>Vmd zfB(ttO@E<5k(G%a2D%|YS8$$wVN|$qLd?$Q5`~nH)Y>=$@@m>9*Fa6aKXHG!IK^vy zX5^KRkvk`17d(DrgJD4BS@!`1-ts+^(X-$^N#OT9Op}be6qgPZvf}`u0Kl5`^@!u4 z9^#Pj14%%^h?{Bc#sJpmnbXzoZ>zbG2P~kR;JWdVuMGDO5YhCgD~U>wQ1$BK0tny( zkc{PwO*nvvdlQk)MEUq$&K`OpYaQ;;fCgS5_5#e-iacAX!y{9p zR@%F#Qrk@MC>idAoQMgonRO=x^5rPNQPU6y9+Zv-M&DPtJ-%)pm!+xqvSU@P`Q6Qk zfC%LFDUae)kgQp_k4LeksK}Qj$NXlHB^nZ{UCIf;Yv2W1i^7PKhbZFuf$@71J(Gm9 zu_H+RSmC;(2Mt!TuRI_re?F5mC$rZhhc2?5PntNRvXx%PcP0sfBquqvbl3v*G;j_$ ztVAY#)A?!ZkE{0UCy@cxZ)Ltm#NTka%BYh83sG&;G7fSlgvwj|?agyj+0y1yS0z3| zCg8B4?!)0n0K41cx(|_!vOVWi#-WM>A2otm?7=8cDpXQK)Qtt`bbttFS_@X&cba#* zde?o0m)Lykg@Se(U~f%QqawcEJTpMCXW`^*uPZ+n(PziAZnK+XpY7C$3D=K78~bH( zr6w(4H*emNVYcLB@7tnE{C084P!`J2c!mSl=hZ2bJbVuYR{L=L9XwL!x#D4$m#_V5;f2) z=rPnJZ)+_CNe~Un@f@f)K)h&6Av2d)a>f7XQ>+aLTlHH>Dt;Ym4T@H`M7MPz3CEx}jnppYe?W z2Y9y1yukB9TIZh@V5`{rnN(C>>KIt^aBcG4>beDY5>M*cwg%u4`;0Kj?CFh}7A4LO zD2nY#rN#VD?%1bsP+1Ij8gdIn8h%dUY|JknRw&RCTm|? z0353`p)4+Axi=debQdDD92)(d_ob8;F6rDAX2XyJJD_YfR$Lz_ebT{UG`S><{4x4= z%;JQaRn)Dl8qTKMYy{|O;j4=xmAq#$1K=ESB+_?!$gLmX+BOL6#z_u5=4gQMM^cND z{(3mQp$$3sRtaGv`s39XeKVLmrnmec3qCf0?jidkVh~-rZ9Q<7XP187733;EM8{7y z1)#UDj`d?GH%nviG z;^R!Gx?oe-mI}s|uV3n-Pa)O=0`V&aFSZI=-|qdd-#EQ3+j^A)LYD*0DT-*7{Q}cy zYXo{dPGcAl{-W?-6#k3C|H2do@T@<$z~!e>>Mq!NHQA9&slRmIXn$%jW+fY0-jscd z_8V2d?LRw(jqD5~GS01y%Hhxz^n2T{4wvUmakO+Bw6Vk=mWKzo6y2wa4kl`51f3S? zjtxi(^r7ci)5Z_FYrZ0k^%( zewa}Tv>H~9wA zfu8`K$flGT9?e{UOYK^Rqsp_|S%UIL7U93Y`!8z!MXi5HYN0eSbBV`(QxAo>(!Y|! zI;}g=Q%AD$=~^7-Boiv?u>3!$;FGh$(xroP?|VS`j0V0U-u~<){RbVzxNW%x zH3XBmu}%@04fG3F{}9q2_6cJlLxIb~-mgc0>kuRU8Or{v-Y_zASF;p96B#AD68jY9 zu3Log6Dop5-YNEpu*S>ik>~o!)#if^WsuW-_7IVo&jP~*hT2K)?-=zI&iD$#E<*K= z^K);B1lRnW!aZ7gaBk`q>_|yu>u@V<;aa=8sWb@1^YcG9wof04MGhLF@ z${AwG(6LXwqA(cv>7G^x5uDGm5~Y@G&eM5nV6vAXx9Pi=;S+#KHodhfCHl<~g%Ksv zO<9>+zm+4Q9oZD)LrUq&g*|C|US1b+N?9w@do8~m^_BSr<{^J0Z}1kb~~cB$7_2d`FM+k9gV-GmBZpnMD6Du6;|)Vo5>jVg9gss?>A4RAH( zxfVWuF~`RKiVziblwSQ78_~}$)HR|pI!=n=Ddo3HWmj%&6O^<$0*{!+Z25FrvNlzYB@f$?Vz(2;eT z9TSWJFSb}b07GW4Kk&ocnD(+XC06?^THUZ}?E3DVR8D+N&>$=mwh?48$f<@~=2j9L zp}o3XlujVOcrt-g>q}tQX8nUyWjJ`w+j^xava73C3Q=;_nPE+q&z>b%)|N26Pe(M8 zc1x!zb$N#je8GuxkhV$O-x2cWdq_5e584fq5{acqa)dO0nUpyW^%IG)@+z;!G={rH z-T8;}X}=PmsdZw-M2xbj$A#IoIW@y!Bd=X68?}^}1oFmSX&L8qMY>$2rPmYK&oF7(%#Kra zPfAjO&>HJX%o=4jcSgjD?VI!9j@#x|GkQ5$iDaXgu{I|xxV#`B+{@v@Y4{59)}d`( z@i}=O?H~b)m_I@vqynYl_-O6FL(Y(VprLvTXb3VTk+WvN_tflSw74+Vr(L;Ew$VOE z%uGdv;;Bzm-`eO98|cjMt3{1#K;8BYbz{$slz;ZB;7ni_eBy(TZeBc6Bcs*z(r-Vj z*u&VKJ=0;Z>kN;C4tIa&jMOGeNZyH#wh2@8pBY#NPrANl1eLU1g$VX@!vsOe-BHVi zD*LV&c_D1!LXnzGa}Pm-bt@lfhjw@_iHgipN$tp9A<1~XgwZP0$jQI@m@o#BnOV9u zoIzC>T?-ll@i)Ib2=_a#MY)@&AHY&!VkTL~`Y!!+aU#+WkE^cXNzU6?9kg}MR%6D2 zW!YH~?l{K~a>W!%L>5K-d!jBYr%vk|#mT&I^iS|^*gjlcU7irh}#;(4k<8v4&XIUcvoLq(X+PP<&% z0A3qgAk32YbNDk)otLH&kwd1^rm}{9`-;+^Iv>pg7nOBZ!Yy4>d=W~ej_m_4*I(G8 zZu8j;8N?b4MwHVfx(OK~AFuB7d=H8Y%}AY#`NGfYHSiHYQ%^6&$_!`jI_Z9ZMhaHp zzhfxV`kWjSam-6){b)@kK8{F*bW5AZXdI1jbt#8hL&Ev0;dpn6X}jLaepi{|%s*D% zB3(8aEeNKCg`RqD8dlpYmnK**h;HW+7qa57*-p|u_g0X8L!p|-pe{W^98dke+&?h3 z{vMSu_kB7IUE$8~crPn{@$=Dn=Sl6|+)#V&i6PHFrX~2b-cd&C2yxqQDmb6R-Z(Uc zL)$7%+GVH!jzl5MC+oKO_J}#2#iz2cftV;-@JP$rTS}qscmgU}_5k;pFk~jiNLCw@ zvk)SRbGD+(0(Db=cJu%=!nvN{s)199+JF}ljG{Z*dx}$6+w_k{Q%kw5?2m zAG>LoGxz#blPq4)Ed@aOxa|5~<)R@HXunq2^Xf)fKzm&!8-@EaVhc$Q>ObE(5`5tD zl8_PB-RXV##+GqCGOb!#z(;%AI@--#B3_mKnEHDJW@e>PTpQp;OpDkh;@I(B2_&Gt zGl(l*=6DjSFOBKcO|oqLhQw=Pyx4;t^rP*9pHO?Iq+K^Kf<}TNWb`hLqOh_$B1@a= z)lui-%X$~%J}m^r`zfN;kz{zviE z5i-+xMImy-fk zGrWLG$Zmpmv)rNJT90gBAMbxVPyZv?BmCLe_RprTsoC2PH!bAW2s`XH6fxFa{ZFxt zMbIsDNBqIn2i_N%HH1c9>S;4Q6|cKkk(&z7E7o?~e-srq>yG3K6o|jVmYw7BiL13@ zBo%48={n_LwM+}ko=ocW)i0OBJrf{+A-C)@^TdgEeX1(0s!=uJyP;Mi(G>T?DRM## z?C;|t;h~!~M}>5_&s3bk=W`~P31&(A%(os^IDgNZ zTw>&X6%uhD`X#H5y0Pm}2+C|D<)*WLNDA`&M)G+@yViw_@`w z?#j;ljx-1xJNCuF^VPzc!ZM`L{uN&hiNJ_0Svn+&2yIGTt}W z2KxyiJaItg(I&0VE%AJYu@d38Pjv>Ilx4bNb2cG`Y`1g0lep}j#^H1LYQ$AUwIqJp zch=tgqdUo;RzVC!RB>z`PX@Z_7OC*wQR6g}MD{du2S-Whyp5Aj7;cImlPtn0I+a3h zPPWuKmt4?{9(t@HqWLq9Z;6=;=lZNB-Y0*EK_()4>Pwnf0QmM>FJ(sH^}vteN1xtz zEFi3$-AWvg!3kmf;X}8#L!s3p?8CH_Caphh4LC+*WII$*`23WFu$d#p$Un5q9-&64 zR+z?oxC*7w94WZYi4A@?4w97(awYm6w)bo_Ss=FDW3hGWSO!YaAxBDQle|6$A;* zsFX02Hx^aeqPRDkkU2@$HR*hcL3HGr!+UHyK}O8^aGQARoMt-KO^+W75YZ6PHK4U%o%~y;RWupPy2>qTd&4X%G{6`xA_1P zui@*QZt-tXiig?oh6^Pxr?H9+$&iwhDF>ytmUBVxF2f4@$5l_f$yjl(9~TKpslkh-Vyq=ho7OoBQt<6J zUh-N7k{12=L4Ik#ThGWXe+XiPfHPIZ%q(a6(2qtRM_0Y&*hIDdO0(nUI z6D=r##?`CUqeQ|d7OwHw@sWl5QkZQ{)(o`2g_9C@d1uz}@_B7xNU8qxe%eor{h|F8 zN{IM?_gPl=IBELzX<&TEMMhdBLcONEp9A|3x=MUpvA(2N)u3^55|_)0Qn|~QTLF{E zIdm7W=m9#7CjrbRs)M3rU_vtJ=Iaxs`JvoUcLlSwjOu0BG%FMjTaSkvDsO!+S28jt zDp@OXengp&ScV&1E61J$SYX0SEwPU@M2p&$|<@ux2UbgEc~oM{f~dY{4U~tRdB!b Od;j+x0s`nCH~$7@I|zCJ literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin b/test_fixtures/masp_proofs/8B29BC2E1A96DF331C7C3A2B227C98D1E5AAAA9988F26B1A47090ACCE693572F.bin index fc528241a153f61d1e8fa210caa13bc95cd1c670..afcad7c65449afcb2942ccb2e2db2169ed4ffc23 100644 GIT binary patch delta 1002 zcmVjs{Lk;u- zAft2SEe1x3k?ZIxnig@KV4LceiY%E2A}|`F#FwW3C0|O24V0wR-o}80J!|EP{BR`kSd&qp_E!W z);Ig9!|ds@w=9ZZLq)AYOysu|Qmlj@p`2^Nth#k_AWBUMT z%}*;6o^D7rY6W9@LYR2vyIs83Rk6EQNLis@vBX{$I!S+20DLZ$Vy(oYNVcfJS=XUG zu7jf&@5U2aQ)*oy5u4M4kqUD%<%{l!F#VG5vP<6hShmlNy@@WEg zIEy{C!k&KyqT`1-R>4i4_-DFFqbS^e83T~T)7zTr9cI?`|77>bg&BiJs-HBE5hVmF z+4CpKI)Vi;;^cytA~|Q3|Cv78&VLGsCHx|W`53^;7mjLr@uH@Ngm~H^V+M=u-yeRRDLdv z>MnoN!@p;7?&N*iS1A5HZ$WI0nuRx|g%1G=U%&!fxc_%q*!Mum@EB$&QYql+`R-$e_6I5>2$B3i(bqJ!3s13fdFc1X|mIZ(G-`HJFNw~>KqEHbTh+cVa#QefkszZEI z_qDJEDMrb$X!XMZ88XwU4N8qagDj|Sf;9K%iFEyL@fG|qGm|;vcn4W1qsup@;!`rR zzhsL^J?9T0f@s~TV$lbJgeN|YJWWK4k-L-TVe0w_@_p@0F$j?h{~|qGMW2CIr+Y@t z>V)PF0vx!0lPy#YKO@38bb}SI6;oaH*vb+Fd~LX7Z&Jl;aWez&Ty~MW6suvKtiz|n YJe73yQ(X`P$Z74p=MaZ7Dvz4$JtiYUa?TP5 zHV|Z0vW0r36Af3MU{~BXL~+TpYZLSWAko2KdLrr~RiCgbbe_xnoT5dVY$d}z%#ehK zr4vq3JhOimB?Eu35Tx*YDvx@r#_Z|xY=sp_jaiNw7v4;ciB>ceyJagBqYH6j*$Y>7 z6Fk%gOVpu)1Na(R!ud4v7wMXetet!c6&EXwwOmR(kO~Xw#dU?1v{Bw)lbrFCBKh7} z%*|yAEV;n>CsHM+abb6bsbnwu;@bs^96uQ5>M07dg6)6U=dLIpb+19`K!UqW1+*rhiA; zx{Gt&!le&kUWY+u-@-#7pch0#xC?uVKFhq zlXt=%+LcXZz(Fsl4#gU$@c9xosQ=-+iG;_#P(^>-|8262A%s)jYfCBHw5YhI=)Waf zXxG@p8TRQRR+Q?(c*$rBt*)NCvJ;wMzSyS1wZVd@>%H=K5HY_&g&g(Wn)Wu`3M@Pq6`>y}y z^_zd^ZbE<9`eL2Y+Y=K9!5?i%5uo3!Fs!{D6Y2x9AL`99^v%}yr?Uok&+^7NmvTD; zz1-@zV+!&T$OcphO!t_*&4mM~95i3?J=Uh?q0mmLCzr(-_ktdOwT4xfPf z6-B1Nv3(UA-X=$*38k(Oh1j`STkl0_n%7yL=PD+Df80&$2c7idFk=SGx|*HtZ9l6B zO~C@}rl7tpj$w!bwBd}PVid6GVXJexKsCLac^*1BDY|CL+CgpO<^=Ek@f>hcks3y$ zGi-QV`-o37XUs$*4%}2OhxMTlf6k{K4H+sG_*C?)eK|(Tra+T!jYRW1p;{R-jY_#7 Y3Pcn$N)EMb8cUh_iZU5#2$SR-G*c?_y8r+H diff --git a/test_fixtures/masp_proofs/917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin b/test_fixtures/masp_proofs/917B7AD5FD4F2F0CB33924511A59181FA326C06FCA9A49B5A5C394C75942820E.bin deleted file mode 100644 index 4dde0ccf5f17bae502d207612170f73df7e81ba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15573 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 diff --git a/test_fixtures/masp_proofs/9883C2EF7971504BB1CF651BAFFC3DA2C57E4FD8FF0811D9CB129887F0F9F706.bin b/test_fixtures/masp_proofs/9883C2EF7971504BB1CF651BAFFC3DA2C57E4FD8FF0811D9CB129887F0F9F706.bin new file mode 100644 index 0000000000000000000000000000000000000000..094103100a780895ed109ac82128ed1b142bfc78 GIT binary patch literal 25031 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 Yx6j}GyTc!+KWFv+m;Lqmb9t421Kf{AI{*Lx literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/99393E3AC8046F86ABA05519568B6780B6F18A312AE3909BEA19D16FCFE837DC.bin b/test_fixtures/masp_proofs/99393E3AC8046F86ABA05519568B6780B6F18A312AE3909BEA19D16FCFE837DC.bin new file mode 100644 index 0000000000000000000000000000000000000000..f456d94d7d508b81413aada12461d083d9b29c0c GIT binary patch literal 18792 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin b/test_fixtures/masp_proofs/A08264B610C5903A47D48E90ABA700BB49387329F8FD049D5F66C95B11B55ADE.bin deleted file mode 100644 index 4d88ddcc5d402717893ed197c13f45baa08a53c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22648 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 O`(GFTIDr5A$$tPvo&`t% diff --git a/test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin b/test_fixtures/masp_proofs/A9D6D90370C747C254D4DD4A2D4B1C762CEA0436B0ECA42C52A830A0FD66BC00.bin deleted file mode 100644 index d67642b43e9810f3f2e1acccdbbee81da239a5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10312 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 diff --git a/test_fixtures/masp_proofs/BA4FED83467B6FEE522748C6F7E72A01F0B169F946835583DC2C71B550315603.bin b/test_fixtures/masp_proofs/BA4FED83467B6FEE522748C6F7E72A01F0B169F946835583DC2C71B550315603.bin new file mode 100644 index 0000000000000000000000000000000000000000..565d189c0ce9f5b3fc605e1d63a57a4b3ff949e5 GIT binary patch literal 19947 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 NzCZiK~)dy{2)v!?Iv~r|L{bjoXQNN0??% zC)8Vfc>Y$J&x{-d+Kqsv=!>+iXWZ12965yPK5KsQ!Sn5Ox!ZdvZIec2Ga4kYC^i$2 zk&B`9p4}LlZ=fEqnnS*-T*6Y%f}cwcvMC| z@%BTx&l6L4c#XrgR+HY3({7o!Oi3XPv`UtMh8LgM5}2Vbha(y~DQ#F7t;?RjZijwS z+k~fy>ly|$vBMJ!JK*@+bW_>Ue;PZ$j4kb9m! zqo)CaQPv?815&S=46xFM-=Tz_CC70hx7T61=({Un@gP2XW-u%Otcc$XIUnjl4e&qV z2Nn)_m{ou6MID(wS?)Yt&Q*Ov1uC#_>f!t(*uH~tr-t3}72onzEicT20WJXAM9RdJ z8Hji=6=?r31b?+%w zH)6x3thvA>JyU|rydeMzq==QGrc@o-VcY6x{9fjE`FVI=m8CsMj(%z`=xl@n1XS

uE-H%Yk6E~GN6&ybD%-m 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 literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin b/test_fixtures/masp_proofs/EE7C912B7E21F07494D58AA6668DC6BBB31619C7E93A1A5A2E64B694DBE1BD6E.bin new file mode 100644 index 0000000000000000000000000000000000000000..fee4361a2b54e7e9b59cdc715893a58d59f9ada9 GIT binary patch literal 7448 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 Y6BuD6dz(Z?U#j6PLnD=60F&e#G!Mh-$p8QV diff --git a/test_fixtures/masp_proofs/F36A8353F15FD6D8158DBC67DDB827EEEDA858AB983D16024AAA415579A68953.bin b/test_fixtures/masp_proofs/F36A8353F15FD6D8158DBC67DDB827EEEDA858AB983D16024AAA415579A68953.bin new file mode 100644 index 0000000000000000000000000000000000000000..755c32011e4d8f737561ac85b8cb3357c052506c GIT binary patch literal 9649 zcmeI2Wl)?=w#Nq#3{G$o1_pi+QSf1T4v004maZ{?>U{jKaZs?EIE3hA^Br@fw< zIvlO-q7$Zro9b3SCEe6lVk`#4@won+YhA~-t}8XNi_&%6B$DA4Fje{{6^Y(Q6sljt zKD)((_ZCWZ_{J48pf9KmD`3UUh@h>4UHPYj|A~{Ij(!@F<3yua(x-3hd2$#Xp3RAx za~yJ4T=0eVxCn6%R3Ik<@?Z1*s!KgZv2Y_s3&7NT8}j&I19I8$JB*9(#xWI4U&y^a zj<;wM69PXd0;vS6u{&}QagG*_oi#(*Iu;OI?6v}0!uUK1j_r%RDO}l(k~%MC+ba;+ z_&ER=+`~Z0*Q4aEA$Fem>1&)pMk-!(M#6_$ZmlIn6opz5s>mvS5o%Z6bXXX|5&61Rkqj)YBeG(snyg6C7mr5V@fc zDh1v0^%>p|P#~TSVZWw!uTB9%*SvQjy5?L5vApiP$>LELqLTgsw(LMu5a^5K)sW+^ zF4BPDJ-J{0kgF+tr5AT(>hN>N(dTT{dt6W%@l_p~H-zI9NIE&}LarDfQ2BX&4hZ4_ zAsb5@o3MjI?o5Q*_Rp%{t$$6YN}gq7j+2S*dfG`ZV5QCR&aajW6nPG1YeJbW*XD#& zsg-nXDZ(3w(GpgjP~vc)Rnu=NKzY)Spkb4$_ME7#wT#}%*`405ZWkpOtOt65(I`74@Ae#NdB-@0T-PM_ z1hJ=DgD6;bbfd*h@Rk9I%bZQc&p@_1r7?vT^C;q`6xUL#c}~QEstNJ-jjcAI8roI% z)vRJj>Q`rirqj!oE38mID+kDNNc8nH7l=9~XfCXI5@IiXK%%h5+tM&Iks)a|aarso zU;=$V(6Kv+272Q9pgJYAPO9^a+W4JZZ>~lliyagd>yu(qkh(D+oi-@M8EnpK^Wo*~ zH{Gl5f(tyJSb)K1XN?62V}bUe%e7gZ%(8%6I*b3nCn%f1roIEu@sm4KG5PvzE)ya@D{jW z*P&=g-c6E4LD|t>ivyC4_AX9Uz*Mx@RZm2HGr25nnFQVXG>eglZP6V6!PXFzz8AcH z)nqoMarLRCwgh@v1FH}PKS1p}^M8mcG_~#kVw+giu~ns1x^(VipdKm&y85fyfvqmM zc@Ur-A{zxRkVpa8`G+~wGO}hW37v~3A}e7Ko^bnl*_=zp(t&&}D|6aIq@X04di#jSf(QF7hJp0@WZB%JbwBE@ zylp_xNbNBNQHaIXbYQ@3kig=*@MA6|2~9$ZnM<770sAK)1sI~J#$WQFmECB3K@cT3 z{03ouK*RdnwX|}TO{c*Kq^tQ*{W)@R3=0gj${s~7d8>=kl(MR24R~T4Z_jCl0TRrm zFfZ<@S*16$rh?wc16IOwFE{mJSu!}DGJPx$@j$Pj0xxfUU1_uqMXva015KuZHGryv z{@B-4D@e&h?ZhCl&_J<4F%-31_T#Vn+&MRwehDwyg)?m;lITcW+E5KZe#53`ulBkh zwlKAbDjCEBC(q_d0;d@5DI(log}R<=gA6wJzv)ip@nNz0OF-izwb;n-K#MJo{JozU zn6(_deS22?`poKwev`6%n*6Uj?|)5U zA3L^@Dp8gu4-3Y~I8UTr5-g5U7-vGa|RM=oLU-W}WDkDhv3Gt6+o0KAPW&ay|4{1>wf<1+KT)fX1mW{00lE0a?W#jostc~CvRvT$ z_JcLAorGtDG@IHWr`I%&r*%rh!eA1yn0w2lPCn`ZKEQg`7~5dRX`VySzPmL%;9`awq+dztl>M@)jP&7Z$d;O zUhTXT0Rcc``Z5$AR2>(~HICeut4b?+w;@fI$=-{<0(ts70K^|4qlUp`B=htn5C1JY|N3-=z0Hv6qMf)i-GQ+@cDb^cfpFx zcfWx6*MGkgdIoMk{*8!2Nk@%DfH$IODQ5>jVov1Z4>+yv0RgJ$aC!E;vtT9=^sjaQ z5bh7*{t)gz5w88}Jy(>)j2fHaX2VUB)-e{R6`-VI^uPe4TxE&ROc0d+&0pGT5~`}z zl$~Zxwl^iz$j=*Sv;To6U=9VG7H9zK6vizp#8!2;)=<`iIm5W)y^^2x^M3oWnD;%& z^az9s8Yy%%Tl!o-(6UU2m_Cga0bH2TZ{F~v`mT57ZLcT30BN^Prox1b;saz{uDYOj zipeDQP5ffB>qe@~ms%@t$Ux7X)7@-xVoMNgqp!MAj5{-U_jzPcp|aSP0(ujc3{)V( zN)d^LN3Gzza7OESr)!OtoY0u}+YR_4avHsENi|v^K((-1jcyZ|DVt6HZSWE!CJ^Et zfjQLmImF$pf8HK*`ybr;djRxz@xv9Li9K*JsVPyTjILg#PEPGKmb1vo1pri{Z=auN z&BvWW6V1%dcrqAm@H@$7p1Q2|({=IUcay>C)Pyp>Q8g|(8!V}S=-WEYUDFSN{422XpOOj4Q*+iI@r&ZUiIRXwJE251(U_L0_2J^h2!85bCbK^wHe(3nr;}uOIvdID4;08dToOPK@ zm=HyQ;!;E8WqC;2Ndh&-V6zR)WteV8dhF?9e(GH+PZ!#pK|S0aFo6jTD9G}5(t(mp z`CugH%q}izkeM2e^2%eiUudl%BhQdiK3TVPrP9|JzTzb5c4gjX)zgTg+>r`x45P!V zyx~exNKq*qYfvTd@KIVLR9)Mh*L*xSM}Viz!N%Ur8s$0^SkD}2x=1iw8DPbtkD|11 zimhZ2i{)OW^a7T<2Y2$XwGQLGqkQS8r;QQXH#e7By#YpAE3nzbMOUCBkm`YEiB?sxTr%qVmv^n4aDXYi74GEo(#^O(RXRHad*5 zg4gi9SGFCg;u;rZZEMZ~`;wdFJCD<3G^_Fs^c@)X0NO=}M(MZenrUCD1mKMb{7R=n zy+X}a86FdvCuUIxIvQw~CsfB@Amc*Y(iT!MC#-KIj$9 z_X3JR`LW8#oYlwa_s^#Z%%4|k=_a(>qx-#lS z6q*PTtHZ3Q6ttl>y4&(7tSC7a$L;QMAuS_v5XISG>>xkqlXN83ilKIqKrs5&SKoob z$_r z^)nKiN zo=v`=NH%t>edww1;qeta?sX4CdZG>g5W8m9et})(veL(%h-d>}!R0s72Q~eIu&}mM zUpNP;|4Wj3-|DLO9-wz&Js(+J8O(k0$+DrWucREu$i%@ES+3Md!sBPl z-ya$ZRwjYzSm^DEbM`crQ_>k_q9R|nN^(0K1LbKaHfbu zRl6-vp1oG@oPW;nl|0QcjuNcqf=hLnm)+2(*e-T9isatLM{cFmz^-nGH2r{~C1EYr zdf9v%dtRb+LF_1;{*hL%tj|c}EOp{`%($R`J;B=DqeUh|(e$z;3wX>mby{@mQHjw@ zv;p(Jr)q?yuEmidTAvpSQ;B8f561A}-o&=eR;Lt-gMl-iR!fDU?d@F>NaEAZ3}2*p z>{tS&Y)DeOwV#KA*R<=C7B?uN=TGr>lE0Gmv%%Qm!)A+mO%F^dDjUXr0YU zkF?!#(*NL^qJBG;6h_Rra)Y9?5zcX6sMtnE^{s%Vma_FGY#}Zl=!v(~IQrBD`QkH} zUYBqCqe znGTWK7|Tzaj2U|urKW{Aq8x*$|gE3+Fs?Oo-*N0 z|Mr|wwlbt1=A$adL?3!vot~~D#6ri$%QYJzygMi6cZ`?#i9$jvjLKHVTqH?08S_Vu zG^gv=UAZi;jTY(TUZQ3;|11lxkzj6jZ6(u?&;e6PQz=8AZ8^#Q|MormOPl;IPyf4g zdqsaa{={ia@i-H~IpT3?+Q+c1QIpLWQTNj#=YTvP)Q zq%Ohd_+7siF1bWsDl;URryD+9fllLR9QLT24EbYJ%uO?Pe;J>5%_Xz&>$0(hCq4a$ z8)@fu-~5dlm;S3;wWDk^4(fWPAsyfo_1I;6>Qo)}kr^)Gwlx(~mF2M#peo+10{p(^ zRMZ*$a%7>b`_Pl^m5to8$~%^g!yS1Dg%H_r-u^o#sv(FnW`p{6>CAX~SwPtN<=xrn z%xn5P*>981CF0WZOii(SE~)@I9%WdYPX3bxRU&zM^jS#8;{X9SWBAiZ-4v2j!&s&}i*;Svm zFdn;g#zH@+^m`Opx9X78x#Y_rOOuN}GTKArdGd{Vm$ws28Hwjep;ve;McQ#CShXdd zMiH|$RrrYpX-ZY1-<tVcN|dQ+g^{A>1zil? z2{ZL?JyB%=#w4txwc3vWWjKaRy~nNgPSK0$xfhwUUx+X{Ad_5yb-ca1H2?WvO{d)JlBux)G6&Fiow3!o-E~#B5t=r!NoV^*e)3M%#sUH}kY(he7rdMBLd$LJIsYOU!M5Ht>|%MHuOQ#~kVx<;pE#4}>N zA)E_@;F>ag%GOHGkj&y=J&Gh*k_(J$nd~~nB%_d1X7L9kFYIDOkINJW-7*;Pp$PG9 ziR6ut>WE0z(Y|wiPVjIsR_yo+e`^o>%Ms&jWHxL?F^RD8S@O#+1Vk{_J~vgKt?7Jm zK|(IGh@Buql7RCvDOpaCLTQZx>?$-f7idC;Jt7vJcX*?T_o^^y4cWf-waqLoJac0U zY+PJ_aZGPK3!1sHx{_BRIW*=sL9>r`(Z+OA)~H~6M3;zBv?=Um!MtA+k#M|&%^BRv zka8kJAKM30oB$F7>e#zPPfc|rEb~aj%lj-~0TQR!Ar((B=k zLm{(enaFs`Ty$gb4*&C(lhoru{qemD?O;y5{Aj;fW5Kdv%XRy0ZW{v3sGPN7k`ywI z9iZ^%-jwLZ{ZVS`d(G3h%!h(VlEZiE26Jn=!`~I=J~tE{hGEv$6_+WP+5aF3rtiZz zEsR}h5%H0u0^oFbpx0oOmJ*G4`$bL{b7B!Q%2TPaVTA@%Un6kH;Ei)51}R!vDUCD* zF4?>1!d4WI+irPOh8ZUdzbV+*t#@zMfEm{~6_LylnC0)c_%eK&>_w#1WYGTgxzeu) S<8^*Kf>!4E`4(MeJ1o literal 0 HcmV?d00001 diff --git a/test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin b/test_fixtures/masp_proofs/F3FE67606FCCCE54C3BCF643F0C7F5019CA3DF4CB89D10CB4E38DA9CDE3A9A0A.bin deleted file mode 100644 index b10162bc6b0288fcfa3d1721fd716ec3c2a776b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13799 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 L{&$QI|9bu}n12XU diff --git a/tests/src/integration/masp.rs b/tests/src/integration/masp.rs index ecd1b34465..592130e574 100644 --- a/tests/src/integration/masp.rs +++ b/tests/src/integration/masp.rs @@ -6,9 +6,6 @@ use namada::types::io::DefaultIo; use namada_apps::client::tx::CLIShieldedUtils; use namada_apps::node::ledger::shell::testing::client::run; use namada_apps::node::ledger::shell::testing::utils::{Bin, CapturedOutput}; -use namada_core::types::address::{btc, eth, masp_rewards}; -use namada_core::types::token; -use namada_core::types::token::{DenominatedAmount, NATIVE_MAX_DECIMAL_PLACES}; use test_log::test; use super::setup; @@ -22,10 +19,6 @@ use crate::e2e::setup::constants::{ /// for leaving their assets in the pool for varying periods of time. #[test] fn masp_incentives() -> Result<()> { - // The number of decimal places used by BTC amounts. - const BTC_DENOMINATION: u8 = 8; - // The number of decimal places used by ETH amounts. - const ETH_DENOMINATION: u8 = 18; // This address doesn't matter for tests. But an argument is required. let validator_one_rpc = "127.0.0.1:26567"; // Download the shielded pool parameters before starting node @@ -35,7 +28,7 @@ fn masp_incentives() -> Result<()> { // not invalidated. let mut node = setup::setup()?; // Wait till epoch boundary - let ep0 = node.next_epoch(); + node.next_epoch(); // Send 20 BTC from Albert to PA run( &node, @@ -94,10 +87,8 @@ fn masp_incentives() -> Result<()> { assert!(captured.result.is_ok()); assert!(captured.contains("No shielded nam balance found")); - let masp_rewards = masp_rewards(); - // Wait till epoch boundary - let ep1 = node.next_epoch(); + node.next_epoch(); // Assert BTC balance at VK(A) is 20 let captured = CapturedOutput::of(|| { @@ -118,9 +109,6 @@ fn masp_incentives() -> Result<()> { assert!(captured.result.is_ok()); assert!(captured.contains("btc: 20")); - let amt20 = token::Amount::from_uint(20, BTC_DENOMINATION).unwrap(); - let amt10 = token::Amount::from_uint(10, ETH_DENOMINATION).unwrap(); - // Assert NAM balance at VK(A) is 20*BTC_reward*(epoch_1-epoch_0) let captured = CapturedOutput::of(|| { run( @@ -138,13 +126,8 @@ fn masp_incentives() -> Result<()> { ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep1.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 22.74")); // Assert NAM balance at MASP pool is 20*BTC_reward*(epoch_1-epoch_0) let captured = CapturedOutput::of(|| { @@ -162,16 +145,11 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep1.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 22.74")); // Wait till epoch boundary - let ep2 = node.next_epoch(); + node.next_epoch(); // Assert BTC balance at VK(A) is 20 let captured = CapturedOutput::of(|| { @@ -208,13 +186,8 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep2.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 90.96")); // Assert NAM balance at MASP pool is 20*BTC_reward*(epoch_2-epoch_0) let captured = CapturedOutput::of(|| { @@ -232,16 +205,11 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep2.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 90.96")); // Wait till epoch boundary - let ep3 = node.next_epoch(); + node.next_epoch(); // Send 10 ETH from Albert to PA(B) run( @@ -302,7 +270,7 @@ fn masp_incentives() -> Result<()> { assert!(captured.contains("No shielded nam balance found")); // Wait till epoch boundary - let ep4 = node.next_epoch(); + node.next_epoch(); // Assert ETH balance at VK(B) is 10 let captured = CapturedOutput::of(|| { @@ -339,13 +307,8 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt10 * masp_rewards[ð()]).0 * (ep4.0 - ep3.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 22.71432")); // Assert NAM balance at MASP pool is // 20*BTC_reward*(epoch_4-epoch_0)+10*ETH_reward*(epoch_4-epoch_3) @@ -364,17 +327,11 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = ((amt20 * masp_rewards[&btc()]).0 * (ep4.0 - ep0.0)) - + ((amt10 * masp_rewards[ð()]).0 * (ep4.0 - ep3.0)); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 386.46336")); // Wait till epoch boundary - let ep5 = node.next_epoch(); + node.next_epoch(); // Send 10 ETH from SK(B) to Christel run( @@ -417,7 +374,7 @@ fn masp_incentives() -> Result<()> { assert!(captured.result.is_ok()); assert!(captured.contains("No shielded eth balance found")); - let _ep = node.next_epoch(); + node.next_epoch(); // Assert NAM balance at VK(B) is 10*ETH_reward*(ep-epoch_3) let captured = CapturedOutput::of(|| { @@ -435,15 +392,10 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 86.60024")); - let ep = node.next_epoch(); + node.next_epoch(); // Assert NAM balance at MASP pool is // 20*BTC_reward*(epoch_5-epoch_0)+10*ETH_reward*(epoch_5-epoch_3) let captured = CapturedOutput::of(|| { @@ -461,17 +413,11 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = ((amt20 * masp_rewards[&btc()]).0 * (ep.0 - ep0.0)) - + ((amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0)); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 1180.41525")); // Wait till epoch boundary - let ep6 = node.next_epoch(); + node.next_epoch(); // Send 20 BTC from SK(A) to Christel run( @@ -530,13 +476,8 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated,))); + assert!(captured.contains("nam: 1407.16324")); // Assert NAM balance at MASP pool is // 20*BTC_reward*(epoch_6-epoch_0)+20*ETH_reward*(epoch_5-epoch_3) @@ -555,17 +496,11 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = ((amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0)) - + ((amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0)); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated,))); + assert!(captured.contains("nam: 1520.37191")); // Wait till epoch boundary - let _ep7 = node.next_epoch(); + node.next_epoch(); // Assert NAM balance at VK(A) is 20*BTC_reward*(epoch_6-epoch_0) let captured = CapturedOutput::of(|| { @@ -583,13 +518,8 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated))); + assert!(captured.contains("nam: 1573.18")); // Assert NAM balance at VK(B) is 10*ETH_reward*(epoch_5-epoch_3) let captured = CapturedOutput::of(|| { @@ -607,13 +537,8 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = (amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated,))); + assert!(captured.contains("nam: 126.565")); // Assert NAM balance at MASP pool is // 20*BTC_reward*(epoch_6-epoch_0)+10*ETH_reward*(epoch_5-epoch_3) @@ -632,18 +557,12 @@ fn masp_incentives() -> Result<()> { ], ) }); - let amt = ((amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0)) - + ((amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0)); - let denominated = DenominatedAmount { - amount: amt, - denom: NATIVE_MAX_DECIMAL_PLACES.into(), - }; assert!(captured.result.is_ok()); - assert!(captured.contains(&format!("nam: {}", denominated,))); + assert!(captured.contains("nam: 1699.745")); // Wait till epoch boundary to prevent conversion expiry during transaction // construction - let _ep8 = node.next_epoch(); + node.next_epoch(); // Send 10*ETH_reward*(epoch_5-epoch_3) NAM from SK(B) to Christel run( @@ -658,8 +577,7 @@ fn masp_incentives() -> Result<()> { "--token", NAM, "--amount", - &((amt10 * masp_rewards[ð()]).0 * (ep5.0 - ep3.0)) - .to_string_native(), + "141.49967", "--signing-keys", BERTHA, "--node", @@ -669,7 +587,7 @@ fn masp_incentives() -> Result<()> { node.assert_success(); // Wait till epoch boundary - let _ep9 = node.next_epoch(); + node.next_epoch(); // Send 20*BTC_reward*(epoch_6-epoch_0) NAM from SK(A) to Bertha run( @@ -684,8 +602,7 @@ fn masp_incentives() -> Result<()> { "--token", NAM, "--amount", - &((amt20 * masp_rewards[&btc()]).0 * (ep6.0 - ep0.0)) - .to_string_native(), + "1980.356", "--signing-keys", ALBERT, "--node", diff --git a/wasm/Cargo.lock b/wasm/Cargo.lock index 5dbe91c1e4..439d62e184 100644 --- a/wasm/Cargo.lock +++ b/wasm/Cargo.lock @@ -3101,7 +3101,7 @@ dependencies = [ [[package]] name = "masp_note_encryption" version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "borsh 0.9.4", "chacha20 0.9.1", @@ -3114,7 +3114,7 @@ dependencies = [ [[package]] name = "masp_primitives" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "aes 0.7.5", "bip0039", @@ -3145,7 +3145,7 @@ dependencies = [ [[package]] name = "masp_proofs" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "bellman", "blake2b_simd", diff --git a/wasm/wasm_source/Cargo.toml b/wasm/wasm_source/Cargo.toml index 81f07ba049..2022e64ca0 100644 --- a/wasm/wasm_source/Cargo.toml +++ b/wasm/wasm_source/Cargo.toml @@ -43,7 +43,7 @@ once_cell = {version = "1.8.0", optional = true} wee_alloc = "0.4.5" getrandom = { version = "0.2", features = ["custom"] } # branch = "murisi/namada-integration" -masp_primitives = { git = "https://github.com/anoma/masp", rev = "50acc5028fbcd52a05970fe7991c7850ab04358e", optional = true } +masp_primitives = { git = "https://github.com/anoma/masp", rev = "1345b463e8fa3b3a6fa13e4a43fb1c410690ad62", optional = true } ripemd = "0.1" [dev-dependencies] diff --git a/wasm_for_tests/wasm_source/Cargo.lock b/wasm_for_tests/wasm_source/Cargo.lock index 8e3bc2bb20..c8cafdda1c 100644 --- a/wasm_for_tests/wasm_source/Cargo.lock +++ b/wasm_for_tests/wasm_source/Cargo.lock @@ -3101,7 +3101,7 @@ dependencies = [ [[package]] name = "masp_note_encryption" version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "borsh 0.9.4", "chacha20 0.9.1", @@ -3114,7 +3114,7 @@ dependencies = [ [[package]] name = "masp_primitives" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "aes 0.7.5", "bip0039", @@ -3145,7 +3145,7 @@ dependencies = [ [[package]] name = "masp_proofs" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=50acc5028fbcd52a05970fe7991c7850ab04358e#50acc5028fbcd52a05970fe7991c7850ab04358e" +source = "git+https://github.com/anoma/masp?rev=1345b463e8fa3b3a6fa13e4a43fb1c410690ad62#1345b463e8fa3b3a6fa13e4a43fb1c410690ad62" dependencies = [ "bellman", "blake2b_simd", From ab2076658eca0cd4d2ec817745c296d202260b9d Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 18 Oct 2023 13:57:49 -0400 Subject: [PATCH 4/6] make token amounts in `RewardsController` of `Uint` type --- .../lib/node/ledger/shell/finalize_block.rs | 13 +- core/src/ledger/inflation.rs | 122 ++++++------------ core/src/ledger/storage/masp_conversions.rs | 11 +- 3 files changed, 54 insertions(+), 92 deletions(-) diff --git a/apps/src/lib/node/ledger/shell/finalize_block.rs b/apps/src/lib/node/ledger/shell/finalize_block.rs index 525ed86ec4..f36cd4b7e7 100644 --- a/apps/src/lib/node/ledger/shell/finalize_block.rs +++ b/apps/src/lib/node/ledger/shell/finalize_block.rs @@ -641,7 +641,7 @@ where .read_storage_key(¶ms_storage::get_pos_inflation_amount_key()) .expect("PoS inflation amount should exist in storage"); // Read from PoS storage - let total_tokens = self + let total_tokens: token::Amount = self .read_storage_key(&token::minted_balance_key( &staking_token_address(&self.wl_storage), )) @@ -653,13 +653,13 @@ where // Run rewards PD controller let pos_controller = inflation::RewardsController { - locked_tokens: pos_locked_supply, - total_tokens, - total_native_tokens: total_tokens, + locked_tokens: pos_locked_supply.raw_amount(), + total_tokens: total_tokens.raw_amount(), + total_native_tokens: total_tokens.raw_amount(), locked_ratio_target: pos_locked_ratio_target, locked_ratio_last: pos_last_staked_ratio, max_reward_rate: pos_max_inflation_rate, - last_inflation_amount: pos_last_inflation_amount, + last_inflation_amount: pos_last_inflation_amount.raw_amount(), p_gain_nom: pos_p_gain_nom, d_gain_nom: pos_d_gain_nom, epochs_per_year, @@ -689,6 +689,9 @@ where // for the previous epoch // // TODO: think about changing the reward to Decimal + let inflation = token::Amount::from_uint(inflation, 0) + .expect("Should not fail Uint -> Amount conversion"); + let mut reward_tokens_remaining = inflation; let mut new_rewards_products: HashMap = HashMap::new(); diff --git a/core/src/ledger/inflation.rs b/core/src/ledger/inflation.rs index 46e2c7ba8f..3e1902a445 100644 --- a/core/src/ledger/inflation.rs +++ b/core/src/ledger/inflation.rs @@ -3,7 +3,7 @@ //! funding. use crate::types::dec::Dec; -use crate::types::token; +use crate::types::uint::Uint; /// The domains of inflation pub enum RewardsType { @@ -19,18 +19,18 @@ pub enum RewardsType { #[allow(missing_docs)] pub struct ValsToUpdate { pub locked_ratio: Dec, - pub inflation: token::Amount, + pub inflation: Uint, } /// PD controller used to dynamically adjust the rewards rates #[derive(Debug, Clone)] pub struct RewardsController { /// Locked token amount in the relevant system - pub locked_tokens: token::Amount, + pub locked_tokens: Uint, /// Total token supply - pub total_tokens: token::Amount, + pub total_tokens: Uint, /// Total native token supply - pub total_native_tokens: token::Amount, + pub total_native_tokens: Uint, /// PD target locked ratio pub locked_ratio_target: Dec, /// PD last locked ratio @@ -38,7 +38,7 @@ pub struct RewardsController { /// Maximum reward rate pub max_reward_rate: Dec, /// Last inflation amount - pub last_inflation_amount: token::Amount, + pub last_inflation_amount: Uint, /// Nominal proportional gain pub p_gain_nom: Dec, /// Nominal derivative gain @@ -65,12 +65,12 @@ impl RewardsController { // Token amounts must be expressed in terms of the raw amount (namnam) // to properly run the PD controller - let locked = Dec::try_from(locked_tokens.raw_amount()) - .expect("Should not fail to convert token Amount to Dec"); - let total = Dec::try_from(total_tokens.raw_amount()) - .expect("Should not fail to convert token Amount to Dec"); - let total_native = Dec::try_from(total_native_tokens.raw_amount()) - .expect("Should not fail to convert token Amount to Dec"); + let locked = Dec::try_from(locked_tokens) + .expect("Should not fail to convert Uint to Dec"); + let total = Dec::try_from(total_tokens) + .expect("Should not fail to convert Uint to Dec"); + let total_native = Dec::try_from(total_native_tokens) + .expect("Should not fail to convert Uint to Dec"); let epochs_py: Dec = epochs_per_year.into(); let locked_ratio = locked / total; @@ -82,29 +82,20 @@ impl RewardsController { let delta_error = locked_ratio_last - locked_ratio; let control_val = p_gain * error - d_gain * delta_error; - let last_inflation_amount = - Dec::try_from(last_inflation_amount.raw_amount()) - .expect("Should not fail to convert token Amount to Dec"); + let last_inflation_amount = Dec::try_from(last_inflation_amount) + .expect("Should not fail to convert Uint to Dec"); let new_inflation_amount_raw = last_inflation_amount + control_val; let new_inflation_amount = if new_inflation_amount_raw.is_negative() { - token::Amount::zero() + Uint::zero() } else { - token::Amount::from_uint( - new_inflation_amount_raw - .to_uint() - .expect("Should not fail to convert Dec to Uint"), - 0, - ) - .expect("Should not fail to convert Uint to Amount") + new_inflation_amount_raw + .to_uint() + .expect("Should not fail to convert Dec to Uint") }; - let max_inflation = token::Amount::from_uint( - max_inflation - .to_uint() - .expect("Should not fail to convert Dec to Uint"), - 0, - ) - .expect("Should not fail to convert Uint to Amount"); + let max_inflation = max_inflation + .to_uint() + .expect("Should not fail to convert Dec to Uint"); let inflation = std::cmp::min(new_inflation_amount, max_inflation); ValsToUpdate { @@ -119,30 +110,17 @@ mod test { use std::str::FromStr; use super::*; - use crate::types::token::NATIVE_MAX_DECIMAL_PLACES; #[test] fn test_inflation_calc_up() { let mut controller = RewardsController { - locked_tokens: token::Amount::from_uint( - 2_000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), - total_tokens: token::Amount::from_uint( - 4_000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), - total_native_tokens: token::Amount::from_uint( - 4_000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), + locked_tokens: Uint::from(2_000_000_000), + total_tokens: Uint::from(4_000_000_000_u64), + total_native_tokens: Uint::from(4_000_000_000_u64), locked_ratio_target: Dec::from_str("0.66666666").unwrap(), locked_ratio_last: Dec::from_str("0.5").unwrap(), max_reward_rate: Dec::from_str("0.1").unwrap(), - last_inflation_amount: token::Amount::zero(), + last_inflation_amount: Uint::zero(), p_gain_nom: Dec::from_str("0.1").unwrap(), d_gain_nom: Dec::from_str("0.1").unwrap(), epochs_per_year: 365, @@ -154,11 +132,10 @@ mod test { inflation: inflation_0, } = controller.clone().run(); println!( - "Round 0: Locked ratio: {locked_ratio_0}, inflation: {}", - inflation_0.to_string_native() + "Round 0: Locked ratio: {locked_ratio_0}, inflation: {inflation_0}" ); assert_eq!(locked_ratio_0, Dec::from_str("0.5").unwrap()); - assert_eq!(inflation_0, token::Amount::from_uint(18_264, 0).unwrap()); + assert_eq!(inflation_0, Uint::from(18_264)); controller.locked_ratio_last = locked_ratio_0; controller.last_inflation_amount = inflation_0; @@ -170,13 +147,12 @@ mod test { inflation: inflation_1, } = controller.clone().run(); println!( - "Round 1: Locked ratio: {locked_ratio_1}, inflation: {}", - inflation_1.to_string_native() + "Round 1: Locked ratio: {locked_ratio_1}, inflation: {inflation_1}" ); assert!(locked_ratio_1 > locked_ratio_0); assert!(locked_ratio_1 > Dec::from_str("0.5").unwrap()); assert!(locked_ratio_1 < Dec::from_str("0.51").unwrap()); - assert_eq!(inflation_1, token::Amount::from_uint(36_528, 0).unwrap()); + assert_eq!(inflation_1, Uint::from(36_528)); controller.locked_ratio_last = locked_ratio_1; controller.last_inflation_amount = inflation_1; @@ -188,37 +164,24 @@ mod test { inflation: inflation_2, } = controller.run(); println!( - "Round 2: Locked ratio: {locked_ratio_2}, inflation: {}", - inflation_2.to_string_native() + "Round 2: Locked ratio: {locked_ratio_2}, inflation: {inflation_2}", ); assert!(locked_ratio_2 > locked_ratio_1); assert!(locked_ratio_2 > Dec::from_str("0.5").unwrap()); assert!(locked_ratio_2 < Dec::from_str("0.51").unwrap()); - assert_eq!(inflation_2, token::Amount::from_uint(54_792, 0).unwrap()); + assert_eq!(inflation_2, Uint::from(54_792)); } #[test] fn test_inflation_calc_down() { let mut controller = RewardsController { - locked_tokens: token::Amount::from_uint( - 900, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), - total_tokens: token::Amount::from_uint( - 1_000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), - total_native_tokens: token::Amount::from_uint( - 1_000, - NATIVE_MAX_DECIMAL_PLACES, - ) - .unwrap(), + locked_tokens: Uint::from(900_000_000), + total_tokens: Uint::from(1_000_000_000), + total_native_tokens: Uint::from(1_000_000_000), locked_ratio_target: Dec::from_str("0.66666666").unwrap(), locked_ratio_last: Dec::from_str("0.9").unwrap(), max_reward_rate: Dec::from_str("0.1").unwrap(), - last_inflation_amount: token::Amount::from_uint(10_000, 0).unwrap(), + last_inflation_amount: Uint::from(10_000), p_gain_nom: Dec::from_str("0.1").unwrap(), d_gain_nom: Dec::from_str("0.1").unwrap(), epochs_per_year: 365, @@ -230,11 +193,10 @@ mod test { inflation: inflation_0, } = controller.clone().run(); println!( - "Round 0: Locked ratio: {locked_ratio_0}, inflation: {}", - inflation_0.to_string_native() + "Round 0: Locked ratio: {locked_ratio_0}, inflation: {inflation_0}", ); assert_eq!(locked_ratio_0, Dec::from_str("0.9").unwrap()); - assert_eq!(inflation_0, token::Amount::from_uint(3_607, 0).unwrap()); + assert_eq!(inflation_0, Uint::from(3_607)); controller.locked_ratio_last = locked_ratio_0; controller.last_inflation_amount = inflation_0; @@ -246,13 +208,12 @@ mod test { inflation: inflation_1, } = controller.clone().run(); println!( - "Round 1: Locked ratio: {locked_ratio_1}, inflation: {}", - inflation_1.to_string_native() + "Round 1: Locked ratio: {locked_ratio_1}, inflation: {inflation_1}", ); assert!(locked_ratio_1 > locked_ratio_0); assert!(locked_ratio_1 > Dec::from_str("0.9").unwrap()); assert!(locked_ratio_1 < Dec::from_str("0.91").unwrap()); - assert_eq!(inflation_1, token::Amount::zero()); + assert_eq!(inflation_1, Uint::zero()); controller.locked_ratio_last = locked_ratio_1; controller.last_inflation_amount = inflation_1; @@ -264,10 +225,9 @@ mod test { inflation: inflation_2, } = controller.run(); println!( - "Round 2: Locked ratio: {locked_ratio_2}, inflation: {}", - inflation_2.to_string_native() + "Round 2: Locked ratio: {locked_ratio_2}, inflation: {inflation_2}", ); assert_eq!(locked_ratio_2, locked_ratio_1); - assert_eq!(inflation_2, token::Amount::zero()); + assert_eq!(inflation_2, Uint::zero()); } } diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index d9b13526fe..7a4b6b7701 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -102,13 +102,13 @@ where // Creating the PD controller for handing out tokens let controller = RewardsController { - locked_tokens: total_token_in_masp, - total_tokens, - total_native_tokens, + locked_tokens: total_token_in_masp.raw_amount(), + total_tokens: total_tokens.raw_amount(), + total_native_tokens: total_native_tokens.raw_amount(), locked_ratio_target: locked_target_ratio, locked_ratio_last: last_locked_ratio, max_reward_rate, - last_inflation_amount: last_inflation, + last_inflation_amount: last_inflation.raw_amount(), p_gain_nom: kp_gain_nom, d_gain_nom: kd_gain_nom, epochs_per_year, @@ -127,8 +127,7 @@ where 0u128 } else { crate::types::uint::Uint::try_into( - (inflation.raw_amount() - * crate::types::uint::Uint::from(precision)) + (inflation * crate::types::uint::Uint::from(precision)) / total_token_in_masp.raw_amount(), ) .unwrap() From 7877a13d6910cc79f693949a3ad10fbddf36782f Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Fri, 20 Oct 2023 08:50:08 +0200 Subject: [PATCH 5/6] Implemented a mul_div operation for Uints and reduced overflow risks in inflation computations. --- core/src/ledger/storage/masp_conversions.rs | 84 ++++-- core/src/types/uint.rs | 319 +++++++++++++++++++- 2 files changed, 372 insertions(+), 31 deletions(-) diff --git a/core/src/ledger/storage/masp_conversions.rs b/core/src/ledger/storage/masp_conversions.rs index 7a4b6b7701..69c1461e71 100644 --- a/core/src/ledger/storage/masp_conversions.rs +++ b/core/src/ledger/storage/masp_conversions.rs @@ -16,6 +16,7 @@ use crate::types::address::Address; use crate::types::dec::Dec; use crate::types::storage::Epoch; use crate::types::token::MaspDenom; +use crate::types::uint::Uint; use crate::types::{address, token}; /// A representation of the conversion state @@ -43,13 +44,15 @@ where D: 'static + super::DB + for<'iter> super::DBIter<'iter>, H: 'static + super::StorageHasher, { - let denomination = read_denom(wl_storage, addr).unwrap().unwrap(); + let denomination = read_denom(wl_storage, addr)? + .expect("failed to read token denomination"); // Inflation is implicitly denominated by this value. The lower this // figure, the less precise inflation computations are. This is especially // problematic when inflation is coming from a token with much higher // denomination than the native token. The higher this figure, the higher // the threshold of holdings required in order to receive non-zero rewards. - // This value should be fixed constant for each asset type. + // This value should be fixed constant for each asset type. Here we choose + // a thousandth of the given asset. let precision = 10u128.pow(std::cmp::max(u32::from(denomination.0), 3) - 3); let masp_addr = address::masp(); @@ -126,11 +129,21 @@ where let noterized_inflation = if total_token_in_masp.is_zero() { 0u128 } else { - crate::types::uint::Uint::try_into( - (inflation * crate::types::uint::Uint::from(precision)) - / total_token_in_masp.raw_amount(), - ) - .unwrap() + inflation + .checked_mul_div( + Uint::from(precision), + total_token_in_masp.raw_amount(), + ) + .and_then(|x| x.0.try_into().ok()) + .unwrap_or_else(|| { + tracing::warn!( + "MASP inflation for {} assumed to be 0 because the \ + computed value is too large. Please check the inflation \ + parameters.", + *addr + ); + 0u128 + }) }; tracing::debug!( @@ -159,21 +172,17 @@ where // but we should make sure the return value's ratio matches // this new inflation rate in 'update_allowed_conversions', // otherwise we will have an inaccurate view of inflation - wl_storage - .write( - &token::masp_last_inflation_key(addr), - token::Amount::from_uint( - (total_token_in_masp.raw_amount() / precision) - * crate::types::uint::Uint::from(noterized_inflation), - 0, - ) - .unwrap(), + wl_storage.write( + &token::masp_last_inflation_key(addr), + token::Amount::from_uint( + (total_token_in_masp.raw_amount() / precision) + * Uint::from(noterized_inflation), + 0, ) - .expect("unable to encode new inflation rate (Decimal)"); + .unwrap(), + )?; - wl_storage - .write(&token::masp_last_locked_ratio_key(addr), locked_ratio) - .expect("unable to encode new locked ratio (Decimal)"); + wl_storage.write(&token::masp_last_locked_ratio_key(addr), locked_ratio)?; Ok((noterized_inflation, precision)) } @@ -238,8 +247,7 @@ where let mut ref_inflation = 0; // Reward all tokens according to above reward rates for addr in &masp_reward_keys { - let reward = calculate_masp_rewards(wl_storage, addr) - .expect("Calculating the masp rewards should not fail"); + let reward = calculate_masp_rewards(wl_storage, addr)?; if *addr == native_token { // The reference inflation is the denominator of the native token // inflation, which is always a constant @@ -273,8 +281,21 @@ where // The amount that will be given of the new native token for // every amount of the native token given in the // previous epoch - let new_normed_inflation = *normed_inflation - + (*normed_inflation * reward.0) / reward.1; + let new_normed_inflation = Uint::from(*normed_inflation) + .checked_add( + (Uint::from(*normed_inflation) * Uint::from(reward.0)) + / reward.1, + ) + .and_then(|x| x.try_into().ok()) + .unwrap_or_else(|| { + tracing::warn!( + "MASP reward for {} assumed to be 0 because the \ + computed value is too large. Please check the \ + inflation parameters.", + *addr + ); + *normed_inflation + }); // The conversion is computed such that if consecutive // conversions are added together, the // intermediate native tokens cancel/ @@ -308,8 +329,19 @@ where // Express the inflation reward in real terms, that is, with // respect to the native asset in the zeroth // epoch - let real_reward = - (reward.0 * ref_inflation) / *normed_inflation; + let real_reward = ((Uint::from(reward.0) + * Uint::from(ref_inflation)) + / *normed_inflation) + .try_into() + .unwrap_or_else(|_| { + tracing::warn!( + "MASP reward for {} assumed to be 0 because the \ + computed value is too large. Please check the \ + inflation parameters.", + *addr + ); + 0u128 + }); // The conversion is computed such that if consecutive // conversions are added together, the // intermediate tokens cancel/ telescope out diff --git a/core/src/types/uint.rs b/core/src/types/uint.rs index ee14e67ad1..fbf1045ca9 100644 --- a/core/src/types/uint.rs +++ b/core/src/types/uint.rs @@ -21,10 +21,276 @@ pub const ZERO: Uint = Uint::from_u64(0); pub const ONE: Uint = Uint::from_u64(1); impl Uint { + const N_WORDS: usize = 4; + /// Convert a [`u64`] to a [`Uint`]. pub const fn from_u64(x: u64) -> Uint { Uint([x.to_le(), 0, 0, 0]) } + + /// Return the least number of bits needed to represent the number + #[inline] + pub fn bits_512(arr: &[u64; 2 * Self::N_WORDS]) -> usize { + for i in 1..arr.len() { + if arr[arr.len() - i] > 0 { + return (0x40 * (arr.len() - i + 1)) + - arr[arr.len() - i].leading_zeros() as usize; + } + } + 0x40 - arr[0].leading_zeros() as usize + } + + fn div_mod_small_512( + mut slf: [u64; 2 * Self::N_WORDS], + other: u64, + ) -> ([u64; 2 * Self::N_WORDS], Self) { + let mut rem = 0u64; + slf.iter_mut().rev().for_each(|d| { + let (q, r) = Self::div_mod_word(rem, *d, other); + *d = q; + rem = r; + }); + (slf, rem.into()) + } + + fn shr_512( + original: [u64; 2 * Self::N_WORDS], + shift: u32, + ) -> [u64; 2 * Self::N_WORDS] { + let shift = shift as usize; + let mut ret = [0u64; 2 * Self::N_WORDS]; + let word_shift = shift / 64; + let bit_shift = shift % 64; + + // shift + for i in word_shift..original.len() { + ret[i - word_shift] = original[i] >> bit_shift; + } + + // Carry + if bit_shift > 0 { + for i in word_shift + 1..original.len() { + ret[i - word_shift - 1] += original[i] << (64 - bit_shift); + } + } + + ret + } + + fn full_shl_512( + slf: [u64; 2 * Self::N_WORDS], + shift: u32, + ) -> [u64; 2 * Self::N_WORDS + 1] { + debug_assert!(shift < Self::WORD_BITS as u32); + let mut u = [0u64; 2 * Self::N_WORDS + 1]; + let u_lo = slf[0] << shift; + let u_hi = Self::shr_512(slf, Self::WORD_BITS as u32 - shift); + u[0] = u_lo; + u[1..].copy_from_slice(&u_hi[..]); + u + } + + fn full_shr_512( + u: [u64; 2 * Self::N_WORDS + 1], + shift: u32, + ) -> [u64; 2 * Self::N_WORDS] { + debug_assert!(shift < Self::WORD_BITS as u32); + let mut res = [0; 2 * Self::N_WORDS]; + for i in 0..res.len() { + res[i] = u[i] >> shift; + } + // carry + if shift > 0 { + for i in 1..=res.len() { + res[i - 1] |= u[i] << (Self::WORD_BITS as u32 - shift); + } + } + res + } + + // See Knuth, TAOCP, Volume 2, section 4.3.1, Algorithm D. + fn div_mod_knuth_512( + slf: [u64; 2 * Self::N_WORDS], + mut v: Self, + n: usize, + m: usize, + ) -> ([u64; 2 * Self::N_WORDS], Self) { + debug_assert!(Self::bits_512(&slf) >= v.bits() && !v.fits_word()); + debug_assert!(n + m <= slf.len()); + // D1. + // Make sure 64th bit in v's highest word is set. + // If we shift both self and v, it won't affect the quotient + // and the remainder will only need to be shifted back. + let shift = v.0[n - 1].leading_zeros(); + v <<= shift; + // u will store the remainder (shifted) + let mut u = Self::full_shl_512(slf, shift); + + // quotient + let mut q = [0; 2 * Self::N_WORDS]; + let v_n_1 = v.0[n - 1]; + let v_n_2 = v.0[n - 2]; + + // D2. D7. + // iterate from m downto 0 + for j in (0..=m).rev() { + let u_jn = u[j + n]; + + // D3. + // q_hat is our guess for the j-th quotient digit + // q_hat = min(b - 1, (u_{j+n} * b + u_{j+n-1}) / v_{n-1}) + // b = 1 << WORD_BITS + // Theorem B: q_hat >= q_j >= q_hat - 2 + let mut q_hat = if u_jn < v_n_1 { + let (mut q_hat, mut r_hat) = + Self::div_mod_word(u_jn, u[j + n - 1], v_n_1); + // this loop takes at most 2 iterations + loop { + // check if q_hat * v_{n-2} > b * r_hat + u_{j+n-2} + let (hi, lo) = + Self::split_u128(u128::from(q_hat) * u128::from(v_n_2)); + if (hi, lo) <= (r_hat, u[j + n - 2]) { + break; + } + // then iterate till it doesn't hold + q_hat -= 1; + let (new_r_hat, overflow) = r_hat.overflowing_add(v_n_1); + r_hat = new_r_hat; + // if r_hat overflowed, we're done + if overflow { + break; + } + } + q_hat + } else { + // here q_hat >= q_j >= q_hat - 1 + u64::max_value() + }; + + // ex. 20: + // since q_hat * v_{n-2} <= b * r_hat + u_{j+n-2}, + // either q_hat == q_j, or q_hat == q_j + 1 + + // D4. + // let's assume optimistically q_hat == q_j + // subtract (q_hat * v) from u[j..] + let q_hat_v = v.full_mul_u64(q_hat); + // u[j..] -= q_hat_v; + let c = Self::sub_slice(&mut u[j..], &q_hat_v[..n + 1]); + + // D6. + // actually, q_hat == q_j + 1 and u[j..] has overflowed + // highly unlikely ~ (1 / 2^63) + if c { + q_hat -= 1; + // add v to u[j..] + let c = Self::add_slice(&mut u[j..], &v.0[..n]); + u[j + n] = u[j + n].wrapping_add(u64::from(c)); + } + + // D5. + q[j] = q_hat; + } + + // D8. + let remainder = Self::full_shr_512(u, shift); + // The remainder should never exceed the capacity of Self + debug_assert!( + Self::bits_512(&remainder) <= Self::N_WORDS * Self::WORD_BITS + ); + (q, Self(remainder[..Self::N_WORDS].try_into().unwrap())) + } + + /// Returns a pair `(self / other, self % other)`. + /// + /// # Panics + /// + /// Panics if `other` is zero. + pub fn div_mod_512( + slf: [u64; 2 * Self::N_WORDS], + other: Self, + ) -> ([u64; 2 * Self::N_WORDS], Self) { + let my_bits = Self::bits_512(&slf); + let your_bits = other.bits(); + + assert!(your_bits != 0, "division by zero"); + + // Early return in case we are dividing by a larger number than us + if my_bits < your_bits { + return ( + [0; 2 * Self::N_WORDS], + Self(slf[..Self::N_WORDS].try_into().unwrap()), + ); + } + + if your_bits <= Self::WORD_BITS { + return Self::div_mod_small_512(slf, other.low_u64()); + } + + let (n, m) = { + let my_words = Self::words(my_bits); + let your_words = Self::words(your_bits); + (your_words, my_words - your_words) + }; + + Self::div_mod_knuth_512(slf, other, n, m) + } + + /// Returns a pair `(Some((self * num) / denom), (self * num) % denom)` if + /// the quotient fits into Self. Otherwise `(None, (self * num) % denom)` is + /// returned. + /// + /// # Panics + /// + /// Panics if `denom` is zero. + pub fn checked_mul_div( + &self, + num: Self, + denom: Self, + ) -> Option<(Self, Self)> { + if denom.is_zero() { + None + } else { + let prod = uint::uint_full_mul_reg!(Uint, 4, self, num); + let (quotient, remainder) = Self::div_mod_512(prod, denom); + // The compiler WILL NOT inline this if you remove this annotation. + #[inline(always)] + fn any_nonzero(arr: &[u64]) -> bool { + use uint::unroll; + unroll! { + for i in 0..4 { + if arr[i] != 0 { + return true; + } + } + } + + false + } + if any_nonzero("ient[Self::N_WORDS..]) { + None + } else { + Some(( + Self(quotient[0..Self::N_WORDS].try_into().unwrap()), + remainder, + )) + } + } + } + + /// Returns a pair `((self * num) / denom, (self * num) % denom)`. + /// + /// # Panics + /// + /// Panics if `denom` is zero. + pub fn mul_div(&self, num: Self, denom: Self) -> (Self, Self) { + let prod = uint::uint_full_mul_reg!(Uint, 4, self, num); + let (quotient, remainder) = Self::div_mod_512(prod, denom); + ( + Self(quotient[0..Self::N_WORDS].try_into().unwrap()), + remainder, + ) + } } construct_uint! { @@ -171,10 +437,10 @@ impl Uint { /// * `self` * 10^(`denom`) overflows 256 bits /// * `other` is zero (`checked_div` will return `None`). pub fn fixed_precision_div(&self, rhs: &Self, denom: u8) -> Option { - let lhs = Uint::from(10) + Uint::from(10) .checked_pow(Uint::from(denom)) - .and_then(|res| res.checked_mul(*self))?; - lhs.checked_div(*rhs) + .and_then(|res| res.checked_mul_div(*self, *rhs)) + .map(|x| x.0) } /// Compute the two's complement of a number. @@ -554,6 +820,8 @@ impl TryFrom for i128 { #[cfg(test)] mod test_uint { + use std::str::FromStr; + use super::*; /// Test that dividing two [`Uint`]s with the specified precision @@ -581,8 +849,14 @@ mod test_uint { two.fixed_precision_div(&three, 3).expect("Satan lives"), Uint::from(666) ); - assert!(two.fixed_precision_div(&three, 77).is_none()); - assert!(Uint::from(20).fixed_precision_div(&three, 76).is_none()); + assert_eq!( + two.fixed_precision_div(&three, 77).expect("Test failed"), + Uint::from_str("9363ff047551e60c314a09cf62a269d471bafcf44a8c6aaaaaaaaaaaaaaaaaaa").unwrap() + ); + assert_eq!( + Uint::from(20).fixed_precision_div(&three, 76).expect("Test failed"), + Uint::from_str("9363ff047551e60c314a09cf62a269d471bafcf44a8c6aaaaaaaaaaaaaaaaaaa").unwrap() + ); } /// Test that adding one to the max signed @@ -710,4 +984,39 @@ mod test_uint { let amount: Result = serde_json::from_str(r#""1000000000.2""#); assert!(amount.is_err()); } + + #[test] + fn test_mul_div() { + use std::str::FromStr; + let a: Uint = Uint::from_str( + "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + ).unwrap(); + let b: Uint = Uint::from_str( + "0x8000000000000000000000000000000000000000000000000000000000000000", + ).unwrap(); + let c: Uint = Uint::from_str( + "0x4000000000000000000000000000000000000000000000000000000000000000", + ).unwrap(); + let d: Uint = Uint::from_str( + "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + ).unwrap(); + let e: Uint = Uint::from_str( + "0x0000000000000000000000000000000000000000000000000000000000000001", + ).unwrap(); + let f: Uint = Uint::from_str( + "0x0000000000000000000000000000000000000000000000000000000000000000", + ).unwrap(); + assert_eq!(a.mul_div(a, a), (a, Uint::zero())); + assert_eq!(b.mul_div(c, b), (c, Uint::zero())); + assert_eq!(a.mul_div(c, b), (d, c)); + assert_eq!(a.mul_div(e, e), (a, Uint::zero())); + assert_eq!(e.mul_div(c, b), (Uint::zero(), c)); + assert_eq!(f.mul_div(a, e), (Uint::zero(), Uint::zero())); + assert_eq!(a.checked_mul_div(a, a), Some((a, Uint::zero()))); + assert_eq!(b.checked_mul_div(c, b), Some((c, Uint::zero()))); + assert_eq!(a.checked_mul_div(c, b), Some((d, c))); + assert_eq!(a.checked_mul_div(e, e), Some((a, Uint::zero()))); + assert_eq!(e.checked_mul_div(c, b), Some((Uint::zero(), c))); + assert_eq!(d.checked_mul_div(a, e), None); + } } From 2e3e64069c56a8ae5d2e65e4fddd8dcc35be5791 Mon Sep 17 00:00:00 2001 From: Murisi Tarusenga Date: Fri, 20 Oct 2023 12:08:58 +0200 Subject: [PATCH 6/6] Added changelog entry. --- .changelog/unreleased/improvements/1985-compounding-rewards.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/improvements/1985-compounding-rewards.md diff --git a/.changelog/unreleased/improvements/1985-compounding-rewards.md b/.changelog/unreleased/improvements/1985-compounding-rewards.md new file mode 100644 index 0000000000..1b41c6ca20 --- /dev/null +++ b/.changelog/unreleased/improvements/1985-compounding-rewards.md @@ -0,0 +1,2 @@ +- MASP rewards are now distributed in the manner dictated by the PD-controller + ([\#1985](https://github.com/anoma/namada/pull/1985)) \ No newline at end of file