From c3cc486269215d2fb70f06052e9735549dbe566c Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:45:25 +0200 Subject: [PATCH 1/8] Update account.rs --- ol/types/src/account.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ol/types/src/account.rs b/ol/types/src/account.rs index e8b2da5bf0..eb5c4af063 100644 --- a/ol/types/src/account.rs +++ b/ol/types/src/account.rs @@ -6,7 +6,7 @@ use diem_crypto::x25519::PublicKey; use diem_global_constants::{DEFAULT_PUB_PORT, DEFAULT_VAL_PORT, DEFAULT_VFN_PORT}; use diem_types::{ account_address::AccountAddress, - network_address::{NetworkAddress}, + network_address::NetworkAddress, transaction::{SignedTransaction, TransactionPayload}, }; @@ -85,12 +85,11 @@ impl ValConfigs { vfn_ip_address: Ipv4Addr, autopay_instructions: Option>, autopay_signed: Option>, - ) -> Self { + ) -> Result { let owner_address = keys.child_0_owner.get_address(); let val_pubkey = - PublicKey::from_ed25519_public_bytes(&keys.child_2_val_network.get_public().to_bytes()) - .unwrap(); + PublicKey::from_ed25519_public_bytes(&keys.child_2_val_network.get_public().to_bytes())?; let val_addr_for_val_net = ValConfigs::make_unencrypted_addr(&val_ip_address, val_pubkey, NetworkId::Validator); @@ -115,12 +114,11 @@ impl ValConfigs { // to connect to its fullnode. let vfn_pubkey = PublicKey::from_ed25519_public_bytes( &keys.child_3_fullnode_network.get_public().to_bytes(), - ) - .unwrap(); + )?; let vfn_addr_obj = ValConfigs::make_unencrypted_addr(&vfn_ip_address, vfn_pubkey, NetworkId::Public); - Self { + let new_conf = Self { /// Proof zero of the onboarded miner block_zero, ow_human_name: owner_address, @@ -133,15 +131,16 @@ impl ValConfigs { op_consensus_pubkey: keys.child_4_consensus.get_public().to_bytes().to_vec(), // 0L todo diem-1.4.1 // op_validator_network_addresses: bcs::to_bytes(&vec![encrypted_addr]).unwrap(), - op_validator_network_addresses: bcs::to_bytes(&vec![&val_addr_for_val_net]).unwrap(), - op_fullnode_network_addresses: bcs::to_bytes(&vec![&vfn_addr_obj]).unwrap(), + op_validator_network_addresses: bcs::to_bytes(&vec![&val_addr_for_val_net])?, + op_fullnode_network_addresses: bcs::to_bytes(&vec![&vfn_addr_obj])?, op_val_net_addr_for_vals: val_addr_for_val_net.to_owned(), op_val_net_addr_for_vfn: val_addr_for_vfn_net.to_owned(), op_vfn_net_addr_for_public: vfn_addr_obj.to_owned(), op_human_name: format!("{}-oper", owner_address), //NOTE: This must match ol/types/src/config.rs format_oper_namespace autopay_instructions, autopay_signed, - } + }; + Ok(new_conf) } /// Creates the json file needed for onchain account creation - validator pub fn create_manifest(&self, mut json_path: PathBuf) -> Result<(), anyhow::Error>{ From e87146db781324ce667612102a267ce837007809 Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:46:52 +0200 Subject: [PATCH 2/8] Update val_config_cmd.rs --- ol/txs/src/commands/val_config_cmd.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ol/txs/src/commands/val_config_cmd.rs b/ol/txs/src/commands/val_config_cmd.rs index dd3e315a28..c1ee72489f 100644 --- a/ol/txs/src/commands/val_config_cmd.rs +++ b/ol/txs/src/commands/val_config_cmd.rs @@ -32,7 +32,7 @@ impl Runnable for ValConfigCmd { // let _entry_args = entrypoint::get_args(); let (_, _, w) = wallet::get_account_from_prompt(); - let val_cfg = ValConfigs::new( + let val_cfg_res = ValConfigs::new( None, KeyScheme::new(&w), self.val_ip.expect("neeed a validator ip address"), @@ -41,6 +41,11 @@ impl Runnable for ValConfigCmd { None, ); + let val_cfg = match val_cfg_res { + Ok(cfg) => cfg, + Err(error) => panic!("Could not create validator config: {:?}", error), + }; + let txt = format!("New consensus pubkey: {} \n New validator network addresses: {}, \n New vfn fullnode network addresses: {}", From 665397fb3cc6e2421b1255facbe77732fe71e270 Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:47:46 +0200 Subject: [PATCH 3/8] Update wizard_val_cmd.rs --- ol/onboard/src/commands/wizard_val_cmd.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ol/onboard/src/commands/wizard_val_cmd.rs b/ol/onboard/src/commands/wizard_val_cmd.rs index c47a01fb84..b9f162eb93 100644 --- a/ol/onboard/src/commands/wizard_val_cmd.rs +++ b/ol/onboard/src/commands/wizard_val_cmd.rs @@ -309,15 +309,22 @@ pub fn write_account_json( let keys = KeyScheme::new(&wallet); let block = VDFProof::parse_block_file(cfg.get_block_dir().join("proof_0.json").to_owned()); - match ValConfigs::new( + let val_cfg_res = ValConfigs::new( Some(block), keys, cfg.profile.ip, cfg.profile.vfn_ip.unwrap_or("0.0.0.0".parse().unwrap()), autopay_batch, autopay_signed, - ) - .create_manifest(json_path) + ); + + let val_cfg = match val_cfg_res { + Ok(cfg) => cfg, + Err(error) => panic!("Could not create validator config: {:?}", error), + }; + + match val_cfg.create_manifest(json_path) + { Ok(_) => { status_ok!( From 6b4d243556df6895ddf511e4bb7a97d4caed4484 Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:49:10 +0200 Subject: [PATCH 4/8] Update wizard_fork_cmd.rs --- ol/onboard/src/commands/wizard_fork_cmd.rs | 23 ++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ol/onboard/src/commands/wizard_fork_cmd.rs b/ol/onboard/src/commands/wizard_fork_cmd.rs index 004b7d2ff4..3a0987dfbb 100644 --- a/ol/onboard/src/commands/wizard_fork_cmd.rs +++ b/ol/onboard/src/commands/wizard_fork_cmd.rs @@ -285,16 +285,31 @@ pub fn write_account_json( let json_path = json_path.clone().unwrap_or(cfg.workspace.node_home.clone()); let keys = KeyScheme::new(&wallet); let block = VDFProof::parse_block_file(cfg.get_block_dir().join("proof_0.json").to_owned()); - - match ValConfigs::new( + let val_cfg_res = ValConfigs::new( Some(block), keys, cfg.profile.ip, cfg.profile.vfn_ip.unwrap_or("0.0.0.0".parse().unwrap()), autopay_batch, autopay_signed, - ) - .create_manifest(json_path) + ); + + let val_cfg = match val_cfg_res { + Ok(cfg) => cfg, + Err(error) => panic!("Could not create validator config: {:?}", error), + }; + + match val_cfg.create_manifest(json_path) + + // match ValConfigs::new( + // Some(block), + // keys, + // cfg.profile.ip, + // cfg.profile.vfn_ip.unwrap_or("0.0.0.0".parse().unwrap()), + // autopay_batch, + // autopay_signed, + // ) + // .create_manifest(json_path) { Ok(_) => { status_ok!( From 89a8236740306aba1f7071af2d36383fc2e4371d Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:49:50 +0200 Subject: [PATCH 5/8] Update manifest.rs --- ol/onboard/src/manifest.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ol/onboard/src/manifest.rs b/ol/onboard/src/manifest.rs index 9f4ca8e448..81b70fed4e 100644 --- a/ol/onboard/src/manifest.rs +++ b/ol/onboard/src/manifest.rs @@ -31,14 +31,18 @@ pub fn write_manifest( let keys = KeyScheme::new(&wallet); let block = VDFProof::parse_block_file(cfg.get_block_dir().join("proof_0.json").to_owned()); - - return ValConfigs::new( + let val_cfg_res = ValConfigs::new( Some(block), keys, cfg.profile.ip, cfg.profile.vfn_ip.unwrap_or("0.0.0.0".parse().unwrap()), autopay_batch, autopay_signed, - ) - .create_manifest(miner_home) + ); + + let val_cfg = match val_cfg_res { + Ok(cfg) => cfg, + Err(error) => panic!("Could not create validator config: {:?}", error), + }; + return val_cfg.create_manifest(miner_home) } From 61c2316e27db4bcd70acfdea26c6dd7ae2d6c68c Mon Sep 17 00:00:00 2001 From: Michael Zelbel <102329247+MichaelZelbel@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:50:51 +0200 Subject: [PATCH 6/8] Update whoami_cmd.rs --- ol/cli/src/commands/whoami_cmd.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ol/cli/src/commands/whoami_cmd.rs b/ol/cli/src/commands/whoami_cmd.rs index 711087e79d..f9c7654bb8 100644 --- a/ol/cli/src/commands/whoami_cmd.rs +++ b/ol/cli/src/commands/whoami_cmd.rs @@ -35,7 +35,7 @@ impl Runnable for WhoamiCmd { let (auth, addr, wallet) = wallet::get_account_from_prompt(); - let val_cfg = ValConfigs::new( + let val_cfg_res = ValConfigs::new( None, KeyScheme::new(&wallet), app_cfg.profile.ip, @@ -43,6 +43,10 @@ impl Runnable for WhoamiCmd { None, None, ); + let val_cfg = match val_cfg_res { + Ok(cfg) => cfg, + Err(error) => panic!("Could not create validator config: {:?}", error), + }; println!("\n0L ACCOUNT\n"); println!("address: {}", addr); From 69150d234e2fb811ec40d203fa098d9dff3f1b24 Mon Sep 17 00:00:00 2001 From: MichaelZelbel Date: Sun, 2 Oct 2022 18:09:14 +0200 Subject: [PATCH 7/8] Tool Scrubber Graduation Commit --- .../current/build/DPNFramework/BuildInfo.yaml | 2 +- .../bytecode_modules/EpochBoundary.mv | Bin 3171 -> 3215 bytes .../build/DPNFramework/docs/DiemAccount.md | 1 + .../DPNFramework/docs/DualAttestation.md | 1 + .../build/DPNFramework/docs/EpochBoundary.md | 9 ++++++++- .../current/build/DPNFramework/docs/Jail.md | 1 - .../DPNFramework/source_maps/DiemAccount.mvsm | Bin 124157 -> 124157 bytes .../source_maps/DualAttestation.mvsm | Bin 16021 -> 16021 bytes .../source_maps/EpochBoundary.mvsm | Bin 23439 -> 24123 bytes .../build/DPNFramework/source_maps/Jail.mvsm | Bin 11390 -> 11390 bytes .../DPNFramework/sources/DiemAccount.move | 1 + .../DPNFramework/sources/DualAttestation.move | 1 + .../DPNFramework/sources/EpochBoundary.move | 9 ++++++++- .../build/DPNFramework/sources/Jail.move | 1 - 14 files changed, 21 insertions(+), 5 deletions(-) diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/BuildInfo.yaml b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/BuildInfo.yaml index 83f1cf23d7..9cafe5a824 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/BuildInfo.yaml +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/BuildInfo.yaml @@ -313,7 +313,7 @@ compiled_package_info: ? address: "00000000000000000000000000000001" name: XUS : DiemFramework - source_digest: C858C8D4197D82103F1F6F229A8539BACFA2CFF36186C713926E1C43A373A2D4 + source_digest: 6FE88762F2E1A750B12C4166250C66AAE205A92570EF975EEBA86738CABDE2A2 build_flags: dev_mode: false test_mode: false diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/EpochBoundary.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/EpochBoundary.mv index 3559442f1c3a05d85a63631ac47acd0bf037f8c1..59509f57ed1bbe72620aa3cddf1f78cdf2cf2781 100644 GIT binary patch delta 779 zcmYjPziSjh6yA5UZ-30ZoxR!J+w9(*m(xow2|-k}m?9WK%k)+v5<`ecB8jmOzBltVyOZBd;{-of-h;bq zzw^95RHd!p%l6F8P;{kdWm7x=E1ZU4`|;HeQjrkPANQ-`S`8tMo&WmDVQp?sfYQNj}g z8i5yZN#@$(HJ+v&;<)S+7o1(`;k6Q16CDz`?voILZQ>`8O`eo)s=TTMjTt@Fp{K}c z&hAu7$wZQjgsMgvX=aF%6v#lkCTfwCau9XNmbP|fZg^gs-2=Q2CACe655Vsc3S_&0 zkAO#`S@E$JIoJoE9O1AhfKSV$7P$ufk`HK-gvf4-_F_n=b2=CfZsq^<-DAMKU1WxW+=z+28IEB#Qp*J6U@iR OMP9t*uOTdMi@kqClU-T> delta 762 zcmYk3KWG#|6vp@6?AzUW^JeyDbGum+6E9x=DiVZ%3yQI@)80x%k|RVUk;Dk5xz0{B zu3#sEf(R)jhmB|<2%?>6Bbv%SonR%-hRdI6X865t=6m0p2S17(ch)}(GMZanx_y0dX|-I(sqQ9*FmlEQ91z%$ z!@%n;_Q^Lv;kAUuneuxuIW$c*%PdGxm@``46en<+JgN~|Qzl^nx_c>{ht4)wEd<7P zkTa7N-u|1TLSd{tP+83$<;Ff|dvJ^?HjT=55HFer#RW82ITuCX{D)YR4n(iVmN@A; zP5HonLLpFe(B4b^aKGxe$2m87 z;THj?dm@kPRCmxdcoo|wEj+T6WGxPGL2{r1aifE`DsD$x9O8=PP=#U*KY+=pUZr7T ztGLhg!@W$#aDm1+@6?^brnnFI2%K!Z$q_yV$&rf06TqiH<{&-w4YR~&t}K-l&jDXn zcZNGm_{u>yGO-Exx`Gqz^+Us{;}sXfucGW* sj)~8JUqN}hwALH)fSuwLzc~yQ&ko6d0R9B`*QrX&9r_5m?5bb?0YNobQUCw| diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemAccount.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemAccount.md index 7d0e38f413..2968101e48 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemAccount.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemAccount.md @@ -6107,6 +6107,7 @@ based on the conditions checked in the prologue, should never fail. let gas_used = txn_max_gas_units - gas_units_remaining; let transaction_fee_amount = txn_gas_price * gas_used; let coin = global<Balance<Token>>(sender).coin; + ensures global<DiemAccount>(sender).sequence_number == old(global<DiemAccount>(sender).sequence_number) + 1; include (transaction_fee_amount > 0) ==> TransactionFee::PayFeeEnsures<Token>{coin: Diem<Token>{value: transaction_fee_amount}}; } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DualAttestation.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DualAttestation.md index 8a27d07ab9..316e863cda 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DualAttestation.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DualAttestation.md @@ -1283,6 +1283,7 @@ Travel rule limit set during genesis let initial_limit = INITIAL_DUAL_ATTESTATION_LIMIT * Diem::spec_scaling_factor<GAS>(); aborts_if initial_limit > MAX_U64 with Errors::LIMIT_EXCEEDED; include Diem::AbortsIfNoCurrency<GAS>; +ensures global<Limit>(@DiemRoot).micro_xdx_limit == initial_limit; diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/EpochBoundary.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/EpochBoundary.md index 68f5b3d9a2..f85fe14d84 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/EpochBoundary.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/EpochBoundary.md @@ -234,6 +234,7 @@ while (i < Vector::length<address>(&previous_set)) { let addr = *Vector::borrow(&previous_set, i); let case = Cases::get_case(vm, addr, height_start, height_now); + if ( // we care about nodes that are performing consensus correctly, case 1 and 2. case < 3 && @@ -243,6 +244,7 @@ // also reset the jail counter for any successful unjails Jail::remove_consecutive_fail(vm, addr); } else { + Jail::jail(vm, addr); }; i = i+ 1; @@ -277,8 +279,12 @@ let addr = *Vector::borrow(&top_accounts, i); let mined_last_epoch = TowerState::node_above_thresh(addr); let case = Cases::get_case(vm, addr, height_start, height_now); + print(&44444444); print(&addr); print(&case); + print(&Jail::is_jailed(addr)); + print(&Audit::val_audit_passing(addr)); + print(&Vouch::unrelated_buddies_above_thresh(addr)); if ( // ignore proven nodes already on list @@ -296,7 +302,8 @@ // has proven themselves in the previous round. If your // vouchers fall out of the set, you may also fall out, // and this chain reaction would cause instability in the network. - Vouch::unrelated_buddies_above_thresh(addr) ) { + Vouch::unrelated_buddies_above_thresh(addr) + ) { print(&99990901); Vector::push_back(&mut proposed_set, addr); }; diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Jail.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Jail.md index 3ffcc120a4..e1a43971d8 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Jail.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Jail.md @@ -151,7 +151,6 @@
public fun jail(vm: &signer, validator: address) acquires Jail{
   CoreAddresses::assert_vm(vm);
-
   if (exists<Jail>(validator)) {
     let j = borrow_global_mut<Jail>(validator);
     j.is_jailed = true;
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DiemAccount.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DiemAccount.mvsm
index f14e773c73a8ddbcab26d66bfbb3d00f16fc582f..ccea86eba5679940dc3c21a9cda7b5a4562be362 100644
GIT binary patch
literal 124157
zcmbWAcX$>>yNCBpLhpp$r1v7dNeM}S07)PTy}ZQa4GE-?0tD$rii!v*iZm%=14P7*
zG*Lkj6~#tX5EN{HihywL30d`=^T%(3m-lsjpSgEt%gi$~&+fZh{KOw6`h2|mi2u;P
zZ}eW@$hY=fVx6})I&Z&!^6!d=R&U(V!Q(i=z`y_NA5XE6BwtEUTwGdqYE~J?DK5%s
zSdMbQ@l)m?tkIyng*Z=uN1A0SJ5GIYJgUqoSj)gqmic;P$9We#1!B_1`BGKEAESP5
zbS3_ZbOrq79$YWUewMP{gJP(qjjs0KG}2iJkbCeAXX+<&Ugb4yUBz)afvP(jX9^UM
z=0>ld^D5}NyN&j9LO|6WjWYxaN;9>vrN};oVDH8xMtK%@O6mSr}gKePbLzSa@7E67$EgER`%*&L5E
z5sFB&YZJ%m4VHU40CkYj)gFvR%7CJB4_?E17xdA8gY_+_y2G0~P81ZA=FYN?^C{@#
z858I@6QH;(Gr1x?1DpW0p9ir%2IbYL4
z0m}Of^t5gV*5{xnVc%i>4tmOT602r2kHuiWuc^m50(!9Bg7q@!L2)ydvGox4ELM5;
zQwQ^Fm<2F(s63BZ5K{*>V-*4&uH5}BE8CJenhFpoP4^m=m!`RrwZNi*ezDx+dn|W*G8IfCVl@NZUETV1cg>-^6`;H8D_C!U
z?yfIjy$QOzZooPYx)UD3`UZ3-+=+DzbSHFc*R#VxD?H9H(A~8gRw(H1+7-*#y1O>Q
z+5ox}&c=EIbSF&0S^?!`Cv<$c@fhh
z`O#yI#~BQkVPy#FNTb_^6)$oEm=GuT`(eb#OzG0R4{Nz8R(I=~8$3=cu#9Z2QQI4x
zo+x)?I^t~5JDiO*2Xtsl!Fn2WXj_T30rWYzA8RA%(B{^zL)#(B`vi0<<0Y(Jpc53^
zu+D-GmoMg-7Ke1Z&?l5|x
zdt;MhQ{#MUP4X)8+hDbbyn=Y$lrCG$Wm6>0OSgklraaRS^$8B%>^Ko%c`hPRW5C}!
z<|8LSsq_rrz1bP5xeGvFrd&Pdu+4lZ7@J~lhNx5iBM
zb?_R4zCKN{I)lDGU9f^d_tTTv}>;Y(|bZGigk!FT-ubItg-x
z0!r>7@$&zQNYB1EIVsLN&X?m&jLl5cMKz+BzEHrEqp0@0KQOW6^0V@Ao*3p`?47?2=50?|PgGP$6%#|8r{8(Z0r}AA!encL}GB?$O&g
zwhuw~=yh0!K=)|(oar7Nx!2=lfbP-Vu`)sT=!sYlf*yIZuqJ@+(M_;^1>K{!W1Rur
zqgP;^1>K|F+I5c}Ks%2Dy{>h8g@d_Y4*hI4Nat3
z0qX!XmF9A+*P)p-r(wMT&86wq-a?w+P~I`PTbd`aPC-j)9>+QXt)%${)|b#)nx^K{
z&_(IA(?L(IHe>AuJ+)emwFmUnYCqO{pr=-QvEBhawOW8xA#0>u%4-D{2mkGSvMpel?zmyp1+=Jw>9O4QmT8FMxMd;m|K9SpSUlBZyAF`w
zzTKB?hQS@&qEBbDS>VafBLOuQGN=LfU1U7iMd7DR1=1`+iKRftgC8lcG^UORov^||
z$AhL=5uoFNd-OUUWKv!Z=y-4+);!ShUa
z-x2iVa0kKcGMg1h=46&M!Ph*lWOrsZv(1~p{aG2Mdf>&GI;8n9)@so4ECp)~=y>)a
z)=ALu>}{-5pyQc)^g5muPhnvUI-XU>Y6?1@{m4Ex!_@I?64pG>@oWLsCblY7@_1#Vm}e23y>
zdI)rYIn&?c`~*6{?8bT*bb#4~Wo#W_p2O-kz$U;{z-j|Jz}%qBwwQXt+){X5i^=03{%2Z(aiFIq?$PUMiF?iTWaB<+Hdj|qHnOp1gPv@BJ)KSsdb05b);Z9Vjhk3SX)Ss+
zQyi-*=*h-!lvxc^Pd40kt)~!8DbMr(J%y-`)dutwVl-AV=qW@h)(p^7h^|;OK~Evv
zeyS%1k5HcJ(RyO=0M-+rCkDn^0Tvg2$s^2Q!15W{wWu46ZWdp%=RcM0arT1c=(7*?
zeaQFdbA*k)g*zF2icjE1Jmh!uX~i}{ke|_KF#f%82cyp5IPI--1q
z8GxxrAGclW(We~cnI51=pORSBK#xAXv0^}vK7+6lL61K5v64WKK5jqNqfZXynI5f2
zpG>Tophq8L%>s*y6g`sL8sPZlBOy1P4HiItBlb$Rc^>lh3+m~kh`VqnLrZVA8xEWZ
z8K!<_$4cPR1;tx~T3~eq9V9DabpjnEM`4Wz9V8#Z+6p>Ix@S%Y$&-|K0d$c33F}YL
znZwtyu7VDymAtI@L5EX6ta_ls>0qol(BZTNRy^o%dLPz2(BX6e*5jbVX)4weU~$L6
z7tO0_fQKnEeW~$2`7VYBk(WSzCJP(!UxX_E>j4a&c{0!0+dV6_kIj!mfeEq6+46?v
zWz4H!rd4vGUSp8sWDVgt6|;A@A9h!rbz+R;%!K0qZlaS1US6Y-1cfIi@t9a#Y`UtY
z(_qKx0XDZNmasRgKnI#RSgSz?8uuu5pn0G2j(`p{&tQE9I?!Ce`U7;Jxr$Ym6RQKw
z3Cuuq31m3#g4G*zpy`7Z2|CbJ$LbF{&`idf3p&swW8Dur(74S{2bwjMw-I!p*@X2H
z=y}^>tnHw0QPie8HUK@tYl77c^bD^dR%6gJJU1BVd0R5&Wq_WyWnoPRedA#!*8QMo
zc#&B1K+o_V#aat`hUXr;zMT+DR2l>Nc0wptBIw%*ZnUc@`{tvRw;F0m^F^#Tp|&&+
zVSNg9qvpHO}B+ubk0=~
zoO*BySWYbVBYyxz;u3kKkuPeSje_9{h$&%z26_#b&d`w~D&{H5^Q{Xkxau{0(wRgg0&R%j3k*}G#&JeWE9p6&^af!cj~#zCdzvW^xWlTtev3eF1xVa
z13h;+fOQ1)+~squ%!__agk1z^KSM+n?^DpD#%EZkK#v+*uug*>H3B&Ar9qDxWwEM(
z9yMxUH3U6sTwos?Vd_z%J61o?qecYQNYJB3YphYAM~#hG+dz*R+p%5)J!;IwdL8tr
zaR%#8(4)pttgE0$4Y$wfQKMKT`ZVZK!w;*Hv1O0zi#6ET((H~k1oWt3tf63W@TW%-
zvPTi(i(9TeN+Op7`?W^{?7P8w?a>Q467sS3NI*}|t;2HdF&%jxlt`PHkB6roV~h1r
zG%ekIg^F58y^g*Q%9>5`_oLUNY<3<3*_8LUkaW(>&h+wf5sM$a-ekKnUY5#iOCC5W
zKKHjaslKdyCGZ+3u*qUK#A^-tojUBi*Kt0CJDILL!**{%?r(cI4VJ&{nL5UC9)NtTR*T2+
zB2)P9YE?c}w=dao4neWocQ$exh-%p#NAqeYaB}oqWfwc6s81#7E2x|!F@wygP
z4(Ks!Jk~_eW7aUNNuXCcZtZ%d<8L|~=#|bN)LaTv=X1+q1%l4!R={cuI-gq(t31?{
zZK*U?8PNIM(;QJcrp{^h$MS*BX?Da)fW~q^-P)T-^9tqt4Nax_G1g6JCQUa`HDzG~H0$N}8J~Z#T4-=6b9>&_Olu-w#MoV9in?zlBM|~*4L0C&46*t=OI;^Ww0thnl#T)b4AQ_X|}-X3ge~O9V-elq*)s)
z8ZxCh73)FBlI9|;rI0Pnkyy)Mf;8X4+6xncV7c*2n4u
z_et|2``8(CiZma=#$KXL}&ca#_4@q+!)()_^mENj4H&h{CcYa5*!5FxcRO)25dkFHIzFo^UTOl8J
ze)ppvhJ3wWF1UuD69L?$lIOWGUK{X8vn*Cy(0NfWRtD(2=m4xt(0Nh!m~>vW$X#4j
z(D!i5W7PtE5BGcau{Nf@hZ~MH6pG06IULIeMWs0gYdjQ_W>c&TC@#$fSdT&pX)ecl
z8gx#03f3mjIpI&Rj)Tq#pTs%?Iw!mh>n!MdxW@V(EN-JtN#`_y<5wU(Hb?*B;xXJO
z!SbUUPous79*_K{z!9|1fa8;w?039trdVlyfps2qr*`YtojPzlH@!i3YGc*}-Bs&g
zH3HpLYhl#}-Btau0zh|FW0nTpRgG!(Q+L&_SlvK(Rb%!B-2wYz4FKH%!?5~*?tm?^
zT7m9>#_SBb0~*upr+$dSSW#f{97FU*-bf6VKcmk^%`rMxRd$nIi2Fcys2y1EfbLM6
zvAzf0p^jml0o|eA#X1Xmlyqy?U9Z~Hyfz4Q*YjYN1l{!^txN*{vfTlr>u%7!%@3<3=-%emu4g(kDer#J
zGo6W8^FYsZ(y(3uy(n3O^)l!=(E_X;pyxzx?Rrj>zL=CH=s8gYmKXG#C=Ba9&~u`x
zSo1(XSlStDKIjKai$B8AfPS#_C(64C`oYrkShXorKcwTuN(TLq&O=zwf__NnO|0FZ
zAJX|0>ub;t>D-NV9`r*x+d1}2nED}|q$S)W0R50oI@VOEDdT4h)-I8axh{hTWdVCmw6$N^HXq8u{MYrmCi7!Hcra2=?f0cFxTWo?dW~-Fg
zNx55QrzT~|~^vmSSxH-7{Xo+7G&CRLA-lEW-2PE3^o(Y;j{ylfk;hO+=mschce>VY>~G
zzZSQhEp|ixTiju`It6#q;(lQ}zu$Scn$@R(f4%8(u0Y}3ww>vVR}DJ;56(MS{@$Y#
zd(s_Bx=)73#o2t%`1Dne^9#6}S$=tX14r@_RLIJRP0fsr%l*bzg3sr*`-<}6KS{s<
zPlm|8I*5ZB3A(QaV~qmcSKX7P`)UcUKn>7+wKi5;(0%nTtXiN)u>x3wK#w^6v0^~4
zNZMl!1id10YqwaDP~HsCE0Wn*kAYs1%*2`ndPU;)6ulxDOq+`by&@Tel>&N2G9D`j
z^ok@MYZmAgNh($v=oQKRSPy|-k<7-L3wlKogtZ6s>ft46
zOoiUkY{OYU4t=B*nnETIIzrZkg>|3zjg5g%?hnOR*OtYW*F?Yu-
zML<91UKy(jcxCMsu`0o6Y2IKTFS6>mSDIf?-f@VN<_@fPAzqs9Qp_jK8pt
zxI|yv?e`z3Jjqlxm}fR3^CnN)D~P*6Cll6TJp($KV9Y&Wu@1RhlNDtxbAYz#+d%9p
z;8!H?O$7QC3%}R)I5(hF-WKj#B-DwFqnZq}a~1S?oR9Y~=<}G3wHWkybnDkinY%f<
zZlIGgC9%4LPRf+PGPX|2T;*tm2Ar&vC4?pc6gsVSNue(c{*x6FoKRu;>Gw=($DBr7?A)$L&`-(GyO2F`yGY
zy|I!(Cwe+yrGP~a
znEGN31|68{V+{cvnCf8}TL-4nSeroyrfFE~KnJEVSnELtCbxDSm@ZJ>AD{!%A*??^
z2c{3PjI9IHt62R^&yiD=s#rmw15*L49-sr0Te}WSiIkTKIxvmG$^xB%9)$H6=nV9O
zSj#{^6EgwpQP9uCxV7u7_94pq5_DF33)U{sS#39B>a6xv%DV+Rt9=Ty9)p+!Mbajw`ZCO8m1>JA*mEHuEnPo<@Hpa1Fd>_YXIoTUkWPQeHZHx=xe$^&(yQuxAROr
z`@M)6!1>g(-?Mq9#TPuz&0uJsNqZ^~lQzyLzb_GhTEyr9vGMWpOIpP+OBvhdRiKR#
zkAh7Ix(BbjDOip{&9Q<&H&?fQJ!Frkyll|TbpX}`(9PAYT{pt_DDMN%jc_H_hoBpw
zTf4=FT<+s{h0Dxu3;l{@_~Me%lYFW2H#(2vuLjHC_dbid6)a-hQM50B#iMKrS51)_
zHZksN%nP6!ja$DSw<=O|CD6^wn6*GRnz~qxLC3h-Sam=*ucBDRKsPUAmIK|qjA`~$
z$2em(0gDG&z8dZ4{05GnWm@YJ@>M9!Pqs3$c!t<(`E;XyEI+yhyP#JevoVk-kWI2X
zUQbi9G@D`d0^KCt`gM~`r@SoCO>!XCaL^Gi2FuvG@%G0md#_ECT!pzFbd&r5>l@Hb
z@@K4@pqu1ItRn2E9(HG9&Ig@zGG$Sz$
zpu8bIJ0&G2zb{2^$d+A9m9z}m*k>TF0o^SMhmjEj-7U^jULdCK79m)pKzEB8SV^F}
zg|Wth#lv*fy7I1Eu$+-KM{R9%%P1I%+ZT%3%*o#G&X2sn=Jo8ZYkSjRDmyU;ivRb%
zq{6OYMgsz61rue3@|>d_EvKDN{~dW_IKKOi&+eA#ZOWPa)VNDfj{4YQ*L?6tOR_aEz68s@`p3kdN@v9;BhIwR8hTHY@-Hg$c=L3B=!wnPqZpLKFn+p1F#tf|4pzmf(!PRs`HF%}H4IK}%^)!+!J87=PGPZt3eOa
zKG09zyYq`K^4OoCybaJ*nonbG0sV~rM69jQU6yIA7a>TR?wJpkrnx@5AViw(?4qYM
z%^c()SOk%4Xr+U#R|jQKD;V8!b#NDMJuveux!d<5CYr*fxeRMN=&9obtR0}Ij-9ZA
zKu;ZaVeJNs$Xl2DFip(87`t3gQ`EbS&i=}i5RaG$`gDb1MS?zE#!Lc>p<)bawN#T@
zvpcjj)J&t>9NHSh^`H;!L98X956zexz~U1#`=0SQ-vT!p;$qX)a_T$G?~Tn)$ct8<
zCwVJ@KC*IH4b5}EdMtjvHNSp@{C%2q4_kZ)`F(-zNw)bJ{K}dS*|AtoipzavmDl2X
zbWPfMoGwuMKc7Rj`pQ__HvEhUm>bA*JRC0p^f~U0H3oF+aqHJ{WKLU;vkY_`c^vC$
z&`Z!qv6h2gf~H|z2EDL6gmoVD!t!OTA3!fG-P-lSau|)k2YO*S25SQ7g=KfFiJ%vj
z|1?9{mQGXNMbHb&16V(SURb``o?i)oexPnC))SzYpwqBQcCh*R^;t}ROubw@j2VEb
zmy2%gdbzlS@}2~}T#UoY0{!sYD6AJiFD$>rIuCkbS+FBN`2xMLyi9o&F>A`U^af^S
z%v#dyhFKT0wlqVqBB72n@56cs^a8kCCoIql;G>k+4zs?j{bkJdn0l$aAM10_OXWFO
z=Rhx&@5MR~da2y8Ge4{ay;LrS6$(w|u`j}U0`x#0kF^5yqIxIR+n^WKBRTVjF!iFk
zg}Iub7u5sq;RlwW7u7wmMuJ{c8*3C;9DE&aOSLz*rf$CvT)t+r18x_{-@7tzU({`{|wmJ*62yd4oVdl`sU$2Ri@W1uFscG|4^pdYZJJ@}2=bO`3|e
z2=p|`ZB=@jw3qVU1wBnN=7*rO>W8t8fu8&v!ukmG!2q;#@q#Z@?%W1pF02k
zJJw&I^Y6yI1$vs~N6#n(dYa^5c|cE-&QtS6(99Agw@&ZAJb@#ODuwI+;
z>VOXGU9o~ehxPhcA)v#0U95Vb!+KS$QAswzdMsud=wLk_D+6?}9*&g>dQIzg7ai7D
zQ{FnzVSQDesl)m#%=w_h`b;ci>##l*s|ROZ2kV2FAA!DEdLYl#Vf{_a!=S^u+v9au
zzfO6#K!^2fd8Q8QKVdqYB^}n?;HX!>^(e0q=+$o%tahMRzs0fIgI@g_s{_=Q@zZS~
zdQID(@&!iomHrtOCn4th;%Y90i7P3y)bi-p}+&$0Xk%SXU|K>ZmC
zS>ELN3-=b>$s1YAJWs9xN}9L%rf1)qoD^r1M{dm~L6E-}xejKFc*y^YTr=5f4&)x9
zZ&G?v#_g1MR#J*weJ*9Yr=f6MBJUdZCduc%b|CKr^DvF<0v%uQINd={Aqrvzfu2JA
zM&%D->M4W|YbNL^L?qTM&{GJvc0Gl7i}Ln?oRsW<9wuxR9uo{4lUTv{@gI)j)!WsoS
zdQD?LlQ1o^y_=dl&Ni@&A1|T43IVpycppIi80@|k^&RGU*OtTdbxaZ-wm&KhM6C<~
zCG&pufrz!6e=)UTnVcl0dQgbiReYFi%KhQIc2&@>;
zeYFPGK+t{lpJpIugG(rHIp~?jW~^w$cr11ux&C#Xlkzew%}
zb!}d)avuFRu>0~}Ksg2>u>0;%HOyMZ{^zBFmOrI@i;X^j;%*SOiK<1)GmV5&M)ul&
z8n9$Vo-qLHPXm5kf#=Ae=qP(S`Cr`_?rbZghaGm54^3Uo;9iRA?y67R(t13D)>8Y>obPPir33!wA2
z4`Mw9I)9suwGMRt)~#LVZ(9(1I)l#NcERcaI)7UeD;RYC){TC(WL!$3yiBMq&6!yD
zLmg=@!&(n@rFoXK?qJrF=6hHNp}sV~#5xW-(;JRev69WxOU9}M7QZ6NCdAJM%fWpP
z>H-L`d3t#n;&QMX)?dMV6D;4n@e%50U_D}fhkOA%CCre?_nvNNXVju+vWJ&61K~?v
z%T;*mK#!UWvDSkgHQoC4sQCfqeFS>cJcxAy^r(3t&(x#lMa;iIkDBHEXq})(%_>+8
zK#!V@uv&l~HCtkJ1wCpO!s-Tk)C|WO2znV4hm`<&8Iy&T19~Lh%vqm}sYhaC%>j$w
zj4l6*_Zom@Tv&^`5enGEg%=UG8#%Wlst))m<`-ZY7k)(j6|CdJE#yMiSh3~*8{5^{
ztOZ!TG;01$$Jqz`3{M6U&vmj9paY46RSt9@xy6neQwNeiG0S7>Kyn%LD@+|8?!oE-
zIy?-<8U{K%48j@@x&(zcJI+zVXPrpO3dV!vPhhas4ek7wm)*#T2WDLRbfu7R0
z!%6@>rO(2e0(wfn5NjpqDgAR;TR>0g&(Mxu!_-sy+J8GvJ2GY1+;vj>(rqQ=sEgfV70G?C`w
zJhQ1Z&DixgG_x|zDAz)oTd`h(yQR4WYcI5v=H@)Jl{8mjn*D4o&6QZjZX->1gzqfP
zIh6MobdlzdSieG7Y5tIBc9Z5M%&X8{nuoE>eg;X?Sl7VfB?J8r@v?ugoLUY+9SQz^
z@$&JOM7*)awfJrARJ<8rIj>xUx)H4IJy-aMF$eVg?GK8qjH%~ub+AG}&)*WT5<$=3
zCSlzNdLg(NYYFI?-c+ompl5oIVm%3Zrnd@fE$ErvSgfZ&&-5a&)`7*#F1nv_oT1?O
zSv-jzhv);lU+bh}WOuM02yt#3mly1J^t+x4=_B<eRs5Coc`Cynd-Bs%dY35L#S>KM7W+v857$wc6Sj)gG
z&E;5+!)R$fiuD-8O7mf?#c;1QP0de0oHWhMVgpzVNaJ~Wbvjt45oe&zHM;E&0+u7M
zhCrLljIT8^*kopY;|6eGd)9!ladEt>J#DPEp@NZ};OUxs;UE91-q
z19=-*eG1?vr?u#RH_A+!EOR|qI05uJ9w@f{Oufi&)1c_=3>f&T0>P^%=zZ|
z=)C5vu4p*=U?@8=DJwBPBbIMAdr1_gP4vlo0xh{r!Qd?9!539e6IyXA&{?cNtk$5j
zSTnE|fX-q?VR=Dku?AqR1f95d`=-u!eL;EOfll1NhIIyX;@%A>I)}!h%JG0s-2W5S
zgNV+IO`{Vp1f3b1nrG_F*bvMIKxf9>FrqVK?%1F+V{52+8`P97
zc{P@?b!Kb@R#653o$uO@`7P*-(-Eu_pfgUV^UBm2r<0hcKxdrHetr!4frcwsH$dm6
zqBuh%KtIs13~M#$EY{LIQ)jW(Vy*|B#Y)H806L3RAL}L1S**%fbwFpae#E)}I*aAb
z=5!XTGZT|uptD$=@=Tq@DvMbMbQY@wRygP^mOF{kS*&@Kw-j`4Div!P=-iY$@6)*{
zvzoXL`mv9jSht|Nj5as0{sx`Ja@R6CH|5XltrY0oR9P&uKGM0V(pY7nr#vEeKXrEK
zM~=JTJvKR?Dbze4bj~LZYXRt-PgktbpmRR%qGfuP74?9g`1
z*Fk58-o)AuIys=Tv_tRZj>+F!bV%OQBKd89?3uB!f`VF%vX1v_b;#g(CC(UD&
zSr#)vnh99xFh-h7u$DujG&^E#fh1|V>4UM-{EqT|fpOCO4eL52OY&HV|9QuX*R`b2I{6|#`3~sX%4`Og8QV|5i1y`NOLyUBA6=8N3d4GG-*DJ
zwHT&LGaGA$L7IE9K7yIj`~>S$m?h1_SRcb|X>P~b1#_h7w&c0e?7&=U9a)Zf(!2+=
z7tEJtAFRHxK$^X=!eF5^-Tiz}nr~9xyYP@Sk7NA+i==rh&wN;#A)L!_SS(GJ5l#ts
zM4Gp#Jr#3_G$&%tz+5WLOw24;CQVb`On6k9?loF2%}*)sI6N-RQ&^|r32C0dIteSJ
z`3}}$cv70C=5Jx8G~H~W#nN=`=N@M(Sl;=15p@UHzH@Uo?z?a&uhRR9?Jhz--?@36
zO^O`N?_2BcVvDAb|F_n4W~+Ws)x7cV|Gab4d;2AP@-D`3wx0mjZ?Bt+{1E*6TCdpL
z+hyvW#0Mul&Q}na57fU4+`({T$&Jz?4C@`JeDEgGZWQV_gA#x5cgBUzVBm1+NVSeYfR)tVN*jw#>$w
z3;J$LGS(i@cSfGY+6DT~$YQMBP)r`XTf4q9QtwN?t^@kcNL8#3P*T<&h&2|#ysZ5I);ZAm`4_RygU-*pwd?%+DEj4O(E0hPSdW9w
z&)-tTk}IEOQdpTF_ZycRzKO_yfxO9(0!YC9HFxv&3%g56B~O
z&%DkjXMM-Jeb10VkYzrExfXPmcmvi;ptHor+zUGQ`xMrC(79jth#r$i^b_Tk;;8o?O|Bq
zpwpOvSP@{cYW<-;RX0HO_*=ZlrwC?ou>NJwYUGWk_)@wR48t2~3YTZXm?@yIZGWs(
z(ATy%)?(1t_I|8Ips#H@*27Rp9+6wSZUygA-a*i{VLz~yHR>GyD9_of1iA+pvmxjn
z@F)A&2vhffZ!srh>K+h|l?J*8w8u(^QnFpUwd)?Rjq+XwedEWN?|{CYvjl5B=-WAN
ztJk-4PE+1_(6@7rVch_IJLe{r=UbcC${fb@!{h-Eb+`46%B+3C@$F>SL?_l8-*8Z
zDzh@jW9qOIgOvd~?DWH020BD6#99J6L}Xzt1sx*X+VvgZZz%5s=wM>ZpFxL+x3CU@
z4iWD4)FC3Ks>c}zIz)tGC4&wT=~x+{?+vG5rGXA6cVq1V-SMBmdIfaHpMmu%RFW;(
zt-Z1|uToygYBu+VKfwGJs>(8r`8())!^SkVSC?fPs}xw=Ec&S#V@-3Sp3O@ZOCy$r
z0GkgVRY$C4N~Yt>JsyQP8g$(0iWLib*_VSg6?B9ehcyi>Zkgr0X8_dUuijj0>%OPC`t_0ZY|t3T)&
zeGRMupl9@M?RvO=fby1r94(M@i43;&`mlD>jBVBdM4Ha
z&`o+A)`??E=h)Ai(B*I6Dwu2akM+xO|GA
zQvsZs`kZA^;v`e5JP{+Y;z0L?p;$dqIV@S`dd#OmxADbTn?Sd5_oV7J{ubqZ0J@F4
z=U#{HE0p&a=&*eq%i${Nu>Ccr2UDkPzQQ!N4%?q&O{Gk|%Ib{O4fHCjGFD^It1P#L
z>Q$DH@)AI=vPNT#1D&!-!5R-bWfOsw0ea=O9qSd)E4Q^+uYz8=J%qIs^vdl)EMx1Z
zdgo(xqHpT;*w>iHL9fUBD9;~i$o^gf>n?*dPf~MJ%$m}C7xNI*lBRp?b*1S>FpG!x
zex6N+bPmHqfta*$KKaJ@lBj{;Z}+@3c~5R#&#@YwECh
zC*1cfgTIZ+1d_zEOf7d9^pQryrZB;xP4gWy6O?mtzA#}-RrMMj_cISqd^uUhaXlU
z&?CorbKIDEa-Q
zRL5Dj_WH8Nxjng|G#{ttRnSP9Yp^yzV`aXG3Z%SppvQ<7SZzR$5f!o8f*vEv
zV^sjX3M!8E1L(C)JXR9uwaqxJWY8m2Kdcnct01@G>#=M#<*fs~3R;zC>alD(=3>xe
zncF|~SoQ|xy$O01WXyL!uWjDLIs|%cvmfhS&?D()tSz9|HpYAv^q6Z*v!8m*{RZn8
z=rQ*s)+x}dpyOC4K#$H}V0{UCbT&1g20c2vJ1)01YU~=2i_XyI0qs3ZONqOQhoB{R|C+8Lvgcvw>POH
z-x8fRoK*qXJYVoT$8iJni1Rtt-=IgFQtWVD&?8PEtRA38ocdTnphq0HOg-WxQ{F_-
zBhDzSNuWm@_k!sWXC38j20h};!rB5l?^cMbUKaG&bcphP1wA%h!>U7>dTa{E8UlK3
z8iwTsJvKGN8V!1ET8Q;1=&@-E)?=W@CbuW)v1u#iy#jh{dJStI=nUOjtam_SFZ*
z9d|lm^#mPv+%k3C@lswK=(sZgD;_L<6nh@+s!?s88}XaSu^Vij8!3et2>t~U_^g3^
z(fkcm&m>4vS+Mxr*UGhyvk5HkyF7!s83KxC
z#o4~F>NWhmP?;|Rv%ZMU^2K}OeX+^rl~?icJfAG@#DC7#KSQyUB=bogt2c9bo?^U*
zqFG5)l*AjhCaKV06}=vK0?emUl>Ij5UZ8KwpuQ1rt0`HUv$0+T9sd6`<*l<>(D-AO
z1U<1RjnxSB#G(mSThK$we)h8)rXEtz#^H);3ib(4;xym-(}+L$Sz8|sKWQ#aIum>+>|
zs5`L^gT==j$EUHR1*f=WHfs&?Mko@O$Y-H^sbl1CQC`E|1BElwlCy0-Apa%uDJUAB
zl#q}Vmz|s?e=zeWx+mS#;fu@8NYWdWMy>=U(k6Nnvr}SIy{WM&@=zMEMH?uZmTo)R
z^+At;vSt&02xPK&-t-J#LXsT8#;{oq1hQ#dS}H#U%FNF6rf1)4kqCU4?bbmJw&e@-
zN%65+X&K&BU)IF5jB)P1`{Y>t8but1>J*cZot&JS7Vpb{DHkcB$ar(I)AMn%?_!Il
zP}JrTjK?OCzyg~`Fy`Yeh0^)GATMW%-2@&EfMV{?)0p|GZ4PoNKZgRj%~9Dq
zvzd9F!OJV9|Zdt5A(97HkSdEP>TSz&q@}QHfrLoEwTb6m6
zBTC2Ax6Art`9Lo;J7Oh(UTC_t>xJe;%KIH^$|HIo>kp_UO*atMmZlr_>PYi0LRKrN
zE6p-kt)ZSY-B4Ixn*Av+4jM?aCssT(lxA0~`=Nz2r(n&2yQP_cH5Xb+)2+RgG?x=+
zpM%!YoQ?H7w2|g?tT!gwe0=N_<`2+bmiZT!hf$}4G|OOBgO1W{iq#f6NpnB7_rUBd
zO?T|NN1B5vZv=FaW+c{h=q}BPSW_WLnxn9$K@VxVwFgVn?Bfgwk!D3&M@(hztuR!Y
zrE>Tf5e$=NHLON3T$&fCxiRJlX*OrY(E&zEvnEzY7$r@2CF7Omc*>grqoo;)H4|c`
z`6|}CaIZAq$NC)Nr1=2WQHYmj)%zT$KKP{B5UUj=Nb_%MZjCucnvY{`f<$TV!uk}F
zq>aI466?$OEZm{V=z;sS#&CMc}SJ!&y-gIGfkRJu-ZYoG;3nD
zhw;*U8EYS8NOM2d7mz88fsYZOeA=4h<3FkPC-SThXL?2I+j
zAkF8ncET)auEcs9W=qq}In9ygG0OWE=1TJn)-Q0sG!J3@3iG5{a0a~t=1cP$<(0);
zAkAi2tzn@w+hX;G2c%gID-0f#=18nWcu1NtSV^!*nwePlgTB
zA7FKRyThNn3lUi7$_v@~G7D1hNV6eUSMZZ&53Ii6FU@XPK@cF#x>(UrP@3U+roO@a
z80JdQ_wCkTtp$DGZWY#Q(8=5-SkHh?(XPugbvpG5=2g(?)E}|_0-a9%0n6Aroq86_
zbH(OK)a!Ys{_R6U%4-VxS)ejl6+u4>R2s|JI+t1ajhZHqj!mTaF#F~5e|(ma6m
z4b+k539L&{SDMGLj)P98?#H?YI!SsZ&ulDf-}yUthoOlyU&PuAO{KXX>jP*e&3#z!
zKyzunfaMTwb&B>^%qyT%wBKR<4mw5qHP$K6DcWTAF&%V@HUeurw3Wx+2P+43iZ(OP
z)aleym}fwzQ}|NtjciXjU4}
zd8VgjCS|EUp)X
zx`D;riRR;Y84oxfi?-Yuv5S#y9$idC91HsLM`Dcwefb~8S_=B|Pr{l8`tnc2GPb__
znOMbmX_daHuVKCch2`Zxj`cg}i~1JUEzpalwOE@#FP7XRviM3~zaL4xgJp>Hp^k-u
zb}t#4f;toIqU58PD@@^bkF#$^-450faxd~hxPu6Jip?&8MQ8U+*pkBjHJO#R^K8Ur>?6PdvPh)Kb-BZ_NZ3Nv@=VQGJI{a?SGj*@J
zhUr|iNkRBy1%U2V9xOl5DTqI)y*Q>$K@>FQflfiBVr7C(K@7$k2|5Ka2+PCghnq1yTJc7VDr>5P?{AK&K$eVi{YfAWC920iA-VmuJ?Jz2hY28K^DIJy>U<
zjx={-{RBF(a4yemD9fDpGx=?3B+bcK4}nfWEXLXZIt8%^>tWC-hzVFPfKDttooDKF
zK{q0324M%^5unorJ+XR$P8T%CngbT;0<1}(pXf@!%7KpZx{t()1D%4n
zfb}cr6vT&E$3dqc+!0ZyAgVAH)&iY^D38?^bPA#XRy*h}&yqVD2T5}T<$0lpm6?XA
z6AM$ZW`RyDtj1agIsio=h3B!hfle%J$Jz~H^4J$+?E#%wIE?iL=)}TVtUo~~
z77F~vd;#>cU)@c4m=W@bCSv7)e)j7=tQnx6{hEa}4+hBE7hpXMQPT8cEe8EW*Q;1>
zfPSLuNvtIdEXj9DIZpK|w9_o%u%9)~p^O33RThqV**8hkC*n@~!Yxe)6uC@oF5cD=6eN2?zIdR^ZZt25|z
zeKV|ipx5!6428CY+C9=4}o-9>BCgK@1_2n(PG<0!1bpa_>j8n0;f*y>IbCz~u>cQCU%6c$9LU|`a55^y0mE#)ef%7V6
zSxh}}p2iHs)B~qmyB;_@QeJn^17{noP|yRX8}0PK`7-6b26{Mr2J3au!{JV>eV~WK
zH?ZCUeS={w)@9H)1CC++2Kr{eeymHNpGS0S*S8Idzs6)9TF6nRELJ7ZPcHt=K32wb
zqGh28Mg5$K;P@Af=gn_+FEg3R1`oiUeCc!*+r0=iG85CXljFTv8A)Tt@GiIvAFswq
zNE(x!k^6ORHJ0z9h~wZ_{NLTyue)wq%+F~DffISRkT27h<@HVAi{6>kF5i_B#dbbm
zaw*ShN4yZw69RXS^n~DH%6lC2gdhJNJA;MT6E4ofL-73ir$4%TYWQ-^r0-#`!Z`?0oJ^0;&H460L*9L1P=)o@sYX#`RZ#34EpjX&#?RxMFd5h0#
zgI-||#YzU97@v$aAM}9w7}j#o1L{Vsr$G;>FJrw2dO-ag>p18EwFK6Aa2f`L_6mwF
z;uH!G8sZ(;u1zJUaA;6)aOA*<7>+k|a8y`KXmn_dH#{gJs8?uIMW-mqxzu+XT;Lj3ozi0FYmdxiyvg+|19dj$0h
ziU-EWJqWM{%Q_3D)(Tivv*`ab~Nt@N;y^ktus1w04IYJ
z
zqnwD)!F83xm8<8}{--7U=TP$+F=r__CN!jiQ~Uq#wA-T0i8iOVhEpfBM<^H48y*%B
z7Ctcic4zYb?;aN5)cvPETAsQ3TrgTzc=*5w&as#F*e^6D(5e5A_TSwK>PL$V8A^-I
z+qLpe{eO4ObeaEN*q(Gr_v}}58i%r%-l)i!+btsapX*Bd`#+@?Lyk6wa(i!X7uqv4
ziYpx!9n_;A?JIg{bWCXY;INR;GES3!_LW0&xBI784UFg)8Qhmma(iq!r{%vp98H{w
h2nmWBYEEFZm!LpnjwXiWhAd8Gba+rqaPQjA{{R_%eNF%X

literal 124157
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
E1F_PAg#Z8m

diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DualAttestation.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DualAttestation.mvsm
index c3e070b32826f02779f9ed705cd92977f74ee081..8388b2606b0c47ad54bddf9cbd8e7325ee7c2a77 100644
GIT binary patch
literal 16021
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
S9z%hRNst
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
V{s~5-;Th3jw4yrVoj=?{^DlN(XC43m

diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/EpochBoundary.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/EpochBoundary.mvsm
index 04130423247ca1caf745fea4c55e22e1a4843891..e23f8ce14402926b5a28c946a2930c6ecc2d72b9 100644
GIT binary patch
literal 24123
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
G&c6W|74$p+

diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Jail.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Jail.mvsm
index 9fc0aa2818fa80f25e32b3aff6dea326c5db5653..83b46e96cc8649587cc0acfcfc0f6a5c4e773c98 100644
GIT binary patch
literal 11390
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
b;KkIR>(sender).coin;
+        ensures global(sender).sequence_number == old(global(sender).sequence_number) + 1;
         include (transaction_fee_amount > 0) ==> TransactionFee::PayFeeEnsures{coin: Diem{value: transaction_fee_amount}};
     }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DualAttestation.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DualAttestation.move
index bd654d9765..6c02a97020 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DualAttestation.move
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DualAttestation.move
@@ -504,6 +504,7 @@ module DiemFramework::DualAttestation {
         let initial_limit = INITIAL_DUAL_ATTESTATION_LIMIT * Diem::spec_scaling_factor();
         aborts_if initial_limit > MAX_U64 with Errors::LIMIT_EXCEEDED;
         include Diem::AbortsIfNoCurrency; // for scaling_factor.
+        ensures global(@DiemRoot).micro_xdx_limit == initial_limit;
     }
 
     /// Return the current dual attestation limit in microdiem
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/EpochBoundary.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/EpochBoundary.move
index c8e23e95a3..0db6d840d4 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/EpochBoundary.move
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/EpochBoundary.move
@@ -154,6 +154,7 @@ module EpochBoundary {
         while (i < Vector::length
(&previous_set)) { let addr = *Vector::borrow(&previous_set, i); let case = Cases::get_case(vm, addr, height_start, height_now); + if ( // we care about nodes that are performing consensus correctly, case 1 and 2. case < 3 && @@ -163,6 +164,7 @@ module EpochBoundary { // also reset the jail counter for any successful unjails Jail::remove_consecutive_fail(vm, addr); } else { + Jail::jail(vm, addr); }; i = i+ 1; @@ -197,8 +199,12 @@ module EpochBoundary { let addr = *Vector::borrow(&top_accounts, i); let mined_last_epoch = TowerState::node_above_thresh(addr); let case = Cases::get_case(vm, addr, height_start, height_now); + print(&44444444); print(&addr); print(&case); + print(&Jail::is_jailed(addr)); + print(&Audit::val_audit_passing(addr)); + print(&Vouch::unrelated_buddies_above_thresh(addr)); if ( // ignore proven nodes already on list @@ -216,7 +222,8 @@ module EpochBoundary { // has proven themselves in the previous round. If your // vouchers fall out of the set, you may also fall out, // and this chain reaction would cause instability in the network. - Vouch::unrelated_buddies_above_thresh(addr) ) { + Vouch::unrelated_buddies_above_thresh(addr) + ) { print(&99990901); Vector::push_back(&mut proposed_set, addr); }; diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Jail.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Jail.move index 110e2f1aa3..b34782c295 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Jail.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Jail.move @@ -61,7 +61,6 @@ address DiemFramework { public fun jail(vm: &signer, validator: address) acquires Jail{ CoreAddresses::assert_vm(vm); - if (exists(validator)) { let j = borrow_global_mut(validator); j.is_jailed = true; From 9f5e0ab321aa74464e274932174d186b3c8454f9 Mon Sep 17 00:00:00 2001 From: MichaelZelbel Date: Sun, 2 Oct 2022 18:10:23 +0200 Subject: [PATCH 8/8] Tool Scrubber Graduation Commit --- ol/cli/src/node/node.rs | 3 +- ol/onboard/src/commands/wizard_fork_cmd.rs | 12 +--- ol/onboard/src/manifest.rs | 8 ++- ol/tower/src/preimage.rs | 2 +- ol/types/src/account.rs | 2 +- ol/types/src/config.rs | 81 ++++++++++++++-------- ol/types/src/fixtures.rs | 3 +- ol/types/src/pay_instruction.rs | 16 ++--- ol/types/src/rpc_playlist.rs | 3 +- 9 files changed, 76 insertions(+), 54 deletions(-) diff --git a/ol/cli/src/node/node.rs b/ol/cli/src/node/node.rs index e126dbecf7..e25598a3f3 100644 --- a/ol/cli/src/node/node.rs +++ b/ol/cli/src/node/node.rs @@ -232,7 +232,8 @@ impl Node { /// database is initialized, Please do NOT invoke this function frequently pub fn db_files_exist(&mut self) -> bool { // check to see no files are present - let db_path = self.app_conf.workspace.db_path.clone().join("diemdb"); + //let db_path = self.app_conf.workspace.db_path.clone().join("diemdb"); + let db_path = self.app_conf.workspace.db_path.join("diemdb"); db_path.exists() } diff --git a/ol/onboard/src/commands/wizard_fork_cmd.rs b/ol/onboard/src/commands/wizard_fork_cmd.rs index 3a0987dfbb..2668747f4f 100644 --- a/ol/onboard/src/commands/wizard_fork_cmd.rs +++ b/ol/onboard/src/commands/wizard_fork_cmd.rs @@ -158,7 +158,7 @@ impl Runnable for ForkCmd { let home_dir = cfg.workspace.node_home.to_owned(); // 0L convention is for the namespace of the operator to be appended by '-oper' - let namespace = cfg.profile.auth_key.clone().to_string() + "-oper"; + let namespace = cfg.profile.auth_key.to_string() + "-oper"; let val_ip_address = cfg.profile.ip; // TODO: use node_config to get the seed peers and then write upstream_node vec in 0L.toml from that. @@ -300,16 +300,6 @@ pub fn write_account_json( }; match val_cfg.create_manifest(json_path) - - // match ValConfigs::new( - // Some(block), - // keys, - // cfg.profile.ip, - // cfg.profile.vfn_ip.unwrap_or("0.0.0.0".parse().unwrap()), - // autopay_batch, - // autopay_signed, - // ) - // .create_manifest(json_path) { Ok(_) => { status_ok!( diff --git a/ol/onboard/src/manifest.rs b/ol/onboard/src/manifest.rs index 81b70fed4e..88484b9cea 100644 --- a/ol/onboard/src/manifest.rs +++ b/ol/onboard/src/manifest.rs @@ -9,7 +9,7 @@ use crate::prelude::app_config; use diem_types::transaction::SignedTransaction; use diem_wallet::WalletLibrary; use ol_types::{account::ValConfigs, pay_instruction::PayInstruction}; -use std::path::PathBuf; +use std::{path::PathBuf, process::exit}; /// Creates an account.json file for the validator pub fn write_manifest( @@ -42,7 +42,11 @@ pub fn write_manifest( let val_cfg = match val_cfg_res { Ok(cfg) => cfg, - Err(error) => panic!("Could not create validator config: {:?}", error), + Err(error) => { + println!("Could not create validator config: {:?}", error); + exit(1); + } + }; return val_cfg.create_manifest(miner_home) } diff --git a/ol/tower/src/preimage.rs b/ol/tower/src/preimage.rs index d90f6441e2..155a3ad4cf 100644 --- a/ol/tower/src/preimage.rs +++ b/ol/tower/src/preimage.rs @@ -18,7 +18,7 @@ pub fn genesis_preimage(cfg: &AppCfg) -> Vec { let mut preimage: Vec = vec![]; // AUTH_KEY_BYTES - let mut padded_key_bytes = match decode(cfg.profile.auth_key.clone().to_string()) { + let mut padded_key_bytes = match decode(cfg.profile.auth_key.to_string()) { Err(x) => panic!("Invalid 0L Auth Key: {}", x), Ok(key_bytes) => padding(key_bytes, AUTH_KEY_BYTES), }; diff --git a/ol/types/src/account.rs b/ol/types/src/account.rs index eb5c4af063..79dad28329 100644 --- a/ol/types/src/account.rs +++ b/ol/types/src/account.rs @@ -230,7 +230,7 @@ impl ValConfigs { let tx = signed.iter().nth(i).unwrap(); let payload = tx.clone().into_raw_transaction().into_payload(); if let TransactionPayload::Script(s) = payload { - match instr.check_instruction_match_tx(s.clone()) { + match instr.check_instruction_match_tx(&s) { // Now passing reference instead of s.clone() (Michael64) Ok(_) => {} Err(e) => { // TODO: should this panic? diff --git a/ol/types/src/config.rs b/ol/types/src/config.rs index 2516dca68c..201676503e 100644 --- a/ol/types/src/config.rs +++ b/ol/types/src/config.rs @@ -1,11 +1,11 @@ //! Configs for all 0L apps. -use anyhow::{bail, Error}; +use anyhow::{bail, anyhow, Error}; use diem_config::config::NodeConfig; use diem_global_constants::{CONFIG_FILE, NODE_HOME}; use diem_types::{ account_address::AccountAddress, chain_id::NamedChain, - transaction::authenticator::AuthenticationKey, waypoint::Waypoint, + transaction::authenticator::AuthenticationKey, waypoint::Waypoint, on_chain_config::DIEM_VERSION_2, }; use dirs; use once_cell::sync::Lazy; @@ -61,10 +61,23 @@ pub struct AppCfg { } /// Get a AppCfg object from toml file -pub fn parse_toml(path: PathBuf) -> Result { +pub fn parse_toml(path: Option) -> Result { // let mut config_toml = path.to_str().unwrap().to_owned()).expect("could not parse app config from file"); + + let cfg_path = match path { + Some(path_value) => path_value, + None => { + match dirs::home_dir() { + Some(dirs_value) => dirs_value.join(".0L").join("0L.toml"), + None => { + anyhow::bail!("Could not construct default path"); + } + } + }, + }; + let mut toml_buf = "".to_string(); - let mut file = File::open(&path)?; + let mut file = File::open(&cfg_path)?; file.read_to_string(&mut toml_buf)?; let cfg: AppCfg = toml::from_str(&toml_buf)?; @@ -73,7 +86,7 @@ pub fn parse_toml(path: PathBuf) -> Result { /// Get a AppCfg object from toml file pub fn fix_missing_fields(path: PathBuf) -> Result<(), Error> { - let cfg: AppCfg = parse_toml(path)?; + let cfg: AppCfg = parse_toml(Some(path))?; cfg.save_file()?; Ok(()) } @@ -123,14 +136,14 @@ impl AppCfg { /// Get where the block/proofs are stored. pub fn get_block_dir(&self) -> PathBuf { - let mut home = self.workspace.node_home.clone(); + let mut home = self.workspace.node_home.to_owned(); home.push(&self.workspace.block_dir); home } /// Get where node key_store.json stored. pub fn get_key_store_path(&self) -> PathBuf { - let mut home = self.workspace.node_home.clone(); + let mut home = self.workspace.node_home.to_owned(); home.push("key_store.json"); home } @@ -161,7 +174,7 @@ impl AppCfg { default_config.profile.ip = match ip { Some(i) => i, - None => what_ip().unwrap(), + None => what_ip()?, }; default_config.profile.vfn_ip = match ip { @@ -170,7 +183,7 @@ impl AppCfg { }; default_config.workspace.node_home = - config_path.clone().unwrap_or_else(|| what_home(None, None)); + config_path.to_owned().unwrap_or_else(|| what_home(None, None)); if let Some(u) = upstream_peer { default_config.profile.upstream_nodes = vec![u.to_owned()] @@ -186,12 +199,15 @@ impl AppCfg { if source_path.is_some() { // let source_path = what_source(); - default_config.workspace.source_path = source_path.clone(); + default_config.workspace.source_path = source_path.to_owned(); + let source_ref = match source_path.as_ref() { + Some(pbuf) => pbuf, + None => { + anyhow::bail!("Could not construct source path"); + }, + }; default_config.workspace.stdlib_bin_path = Some( - source_path - .as_ref() - .unwrap() - .join("language/diem-framework/staged/stdlib.mv"), + source_ref.join("language/diem-framework/staged/stdlib.mv"), ); } @@ -211,7 +227,8 @@ impl AppCfg { return Ok(default_config); } - fs::create_dir_all(&default_config.workspace.node_home).unwrap(); + + fs::create_dir_all(&default_config.workspace.node_home)?; default_config.save_file()?; Ok(default_config) @@ -226,7 +243,7 @@ impl AppCfg { source_path: Option, ) -> Result { // println!("init_swarm_config: {:?}", swarm_path); already logged in commands.rs - let host_config = AppCfg::make_swarm_configs(swarm_path, node_home, source_path); + let host_config = AppCfg::make_swarm_configs(swarm_path, node_home, source_path)?; host_config.save_file()?; Ok(host_config) } @@ -238,7 +255,7 @@ impl AppCfg { swarm_path: PathBuf, node_home: PathBuf, source_path: Option, - ) -> AppCfg { + ) -> Result { let config_path = swarm_path.join(&node_home).join("node.yaml"); let config = NodeConfig::load(&config_path) .unwrap_or_else(|_| panic!("Failed to load NodeConfig from file: {:?}", &config_path)); @@ -251,16 +268,23 @@ impl AppCfg { &upstream_config_path ) }); - let upstream_url = Url::parse( + + let up_res = Url::parse( format!( "http://localhost:{}", upstream_config.json_rpc.address.port() ) .as_str(), - ) - .unwrap(); - // let waypoint = config.base.waypoint.waypoint(); - + ); + + let upstream_url = match up_res { + Ok(up_url) => up_url, + Err(e) => { + anyhow::bail!(e); + } + + }; + let mut cfg = AppCfg { workspace: Workspace::default(), profile: Profile::default(), @@ -274,16 +298,16 @@ impl AppCfg { cfg.workspace.db_path = db_path; cfg.workspace.source_path = source_path; cfg.chain_info.base_waypoint = Some(config.base.waypoint.waypoint()); - cfg.profile.account = "4C613C2F4B1E67CA8D98A542EE3F59F5".parse().unwrap(); // alice + cfg.profile.account = "4C613C2F4B1E67CA8D98A542EE3F59F5".parse()?; // alice cfg.profile.upstream_nodes = vec![upstream_url]; - cfg + Ok(cfg) } /// save the config file to 0L.toml to the workspace home path pub fn save_file(&self) -> Result<(), Error> { let toml = toml::to_string(&self)?; - let home_path = &self.workspace.node_home.clone(); + let home_path = &self.workspace.node_home; // create home path if doesn't exist, usually only in dev/ci environments. fs::create_dir_all(&home_path)?; let toml_path = home_path.join(CONFIG_FILE); @@ -331,14 +355,16 @@ pub struct Workspace { pub stdlib_bin_path: Option, } + fn default_db_path() -> PathBuf { dirs::home_dir().unwrap().join(NODE_HOME).join("db") } + impl Default for Workspace { fn default() -> Self { Self { - node_home: dirs::home_dir().unwrap().join(NODE_HOME), + node_home: dirs::home_dir().unwrap().join(NODE_HOME), //unwrap is benign. because it panics only if the filesystem cannot be read source_path: None, block_dir: "vdf_proofs".to_owned(), db_path: default_db_path(), @@ -394,7 +420,6 @@ pub struct Profile { // /// Node URL and and port to submit transactions. Defaults to localhost:8080 // pub default_node: Option, - /// Other nodes to connect for fallback connections pub upstream_nodes: Vec, @@ -456,7 +481,7 @@ pub struct TxConfigs { impl TxConfigs { /// get the user txs cost preferences for given transaction type pub fn get_cost(&self, tx_type: TxType) -> TxCost { - let ref baseline = self.baseline_cost.clone(); + let ref baseline = self.baseline_cost; let cost = match tx_type { TxType::Critical => self.critical_txs_cost.as_ref().unwrap_or_else(|| baseline), TxType::Mgmt => self diff --git a/ol/types/src/fixtures.rs b/ol/types/src/fixtures.rs index a05644971f..cb923f67c9 100644 --- a/ol/types/src/fixtures.rs +++ b/ol/types/src/fixtures.rs @@ -75,7 +75,8 @@ pub fn get_persona_toml_configs(persona: &str) -> AppCfg { .unwrap() .join("fixtures/configs") .join(format!("{}.toml", persona)); - parse_toml(buf).expect("could not get fixtures for persona") + let parse_buf = Some(buf); + parse_toml(parse_buf).expect("could not get fixtures for persona") } /// get block 0 diff --git a/ol/types/src/pay_instruction.rs b/ol/types/src/pay_instruction.rs index 967d7af316..5a9f508e2a 100644 --- a/ol/types/src/pay_instruction.rs +++ b/ol/types/src/pay_instruction.rs @@ -149,7 +149,7 @@ impl PayInstruction { } /// checks ths instruction against the raw script for correctness. - pub fn check_instruction_match_tx(&self, script: Script) -> Result<(), Error> { + pub fn check_instruction_match_tx(&self, script: &Script) -> Result<(), Error> { let PayInstruction { uid, type_move, @@ -197,8 +197,8 @@ impl PayInstruction { uid = &self.uid.unwrap(), percent_balance = *&self.value_move.unwrap() as f64 /100f64, times = times, - note = &self.note.clone().unwrap(), - epoch_ending = &self.end_epoch.unwrap(), + note = if let Some(n) = &self.note { n } else {""}, // the note is optional for the message + epoch_ending = if let Some(e) = &self.end_epoch { e.to_string() } else {"(not set)".to_string()}, // a missing epoch in the message is no reason to panic destination = &self.destination, ) }, @@ -208,8 +208,8 @@ impl PayInstruction { uid = &self.uid.unwrap(), percent_balance = *&self.value_move.unwrap() as f64 /100f64, times = times, - note = &self.note.clone().unwrap(), - epoch_ending = &self.end_epoch.unwrap(), + note = if let Some(n) = &self.note { n } else {""}, // the note is optional for the message + epoch_ending = if let Some(e) = &self.end_epoch { e.to_string() } else {"(not set)".to_string()}, // a missing epoch in the message is no reason to panic destination = &self.destination, ) }, @@ -219,8 +219,8 @@ impl PayInstruction { uid = &self.uid.unwrap(), total_val = *&self.value_move.unwrap() / 1_000_000, // scaling factor times = times, - note = &self.note.clone().unwrap(), - epoch_ending = &self.end_epoch.unwrap(), + note = if let Some(n) = &self.note { n } else {""}, // the note is optional for the message + epoch_ending = if let Some(e) = &self.end_epoch { e.to_string() } else {"(not set)".to_string()}, // a missing epoch in the message is no reason to panic destination = &self.destination, ) }, @@ -228,7 +228,7 @@ impl PayInstruction { format!( "Instruction {uid}: {note}\nSend {total_val} once to address: {destination}?", uid = &self.uid.unwrap(), - note = &self.note.clone().unwrap(), + note = if let Some(n) = &self.note { n } else {""}, // the note is optional for the message total_val = *&self.value_move.unwrap() / 1_000_000, // scaling factor destination = &self.destination, ) diff --git a/ol/types/src/rpc_playlist.rs b/ol/types/src/rpc_playlist.rs index 64fa60712d..9e4c146153 100644 --- a/ol/types/src/rpc_playlist.rs +++ b/ol/types/src/rpc_playlist.rs @@ -53,7 +53,8 @@ impl FullnodePlaylist { /// update the app configs 0L.toml file pub fn update_config_file(&self, path: Option) -> Result<(), Error> { - let mut new_cfg = config::parse_toml(path.unwrap())?; + + let mut new_cfg = config::parse_toml(path)?; let mut peers = self.get_urls(); let mut rng = thread_rng(); peers.shuffle(&mut rng);