From a6c99f12b880c0e6290ffb5e41fc20c4ead91ca8 Mon Sep 17 00:00:00 2001 From: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> Date: Wed, 5 Apr 2023 15:41:05 -0400 Subject: [PATCH] Proof of Fee (#5) * For 0L genesis tools for hard forks, and migrations: create a MoveVm session from fake data to be able to apply migrations from Move system contracts. * wip testing fakeexector for account migrations * Scaffolding tests for v6 genesis fork. first cleanup deprecated modules. * add fixtures for testing recovery genesis * cleanup fixtures implement functional tests for: - exporting db backup to json - creating genesis blob from json - creating genesis blob in one shot from db backup TODO: launch test node from from genesis.blob TODO: e2e tests from a fixture file * integration test using blob from fixture to start a diem-node in test mode * patch github actions tests * full e2e test from db backup to starting a node * Add diem_logger as per @corythian plus comments. * query nodes to check if onchain state is the same as recovery. * - include db reader util to inspect a genesis.blob. - refactor recovery tests * test to check validator count. cleanup test utlis * cleanup tests * stub a "check" feature, to check a json file agains the output genesis.blob * finish balance comparison with error list. * clean * test to create single validator and check output. * skip comparing system zero address. * cargo fix * cargo fmt * create function to start a vm executor, and uses a function pointer to transform legacy data to Move arguments. * experimenting with alternative way of starting a vm genesis session * runs * cleanup * need to explicitly set the validators at genesis * test to confirm genesis validator set, is the same as defined set. * tests for validator set and balance passing * change fixtures, make node start from command line * can start a test node from genesis blob * can genesis tools test can start a node from a genesis and query for an accounts resources * make ol version of swarm config generator in ol/smoke_tests * wip * move legacyRecovery to ol/types. So now we can run the user migrations in the vm_genesis::lib. First draft builds * create GenesisMigration user migration test. Builds. * ol/genesis-tools builds with refactor * refactored with clean build * minor refactors * can migrate the balance of end users with new design * migration successfully migrates balances of users, validators, and operators. * cleanup unused files. clippy, * tests passing * PoF requires all nodes to have equal weight in consensus per the paper. * Update ci.yaml (#1239) * [Genesis] Migration tools for genesis from legacy accounts (#1237) * For 0L genesis tools for hard forks, and migrations: create a MoveVm session from fake data to be able to apply migrations from Move system contracts. * wip testing fakeexector for account migrations * Scaffolding tests for v6 genesis fork. first cleanup deprecated modules. * add fixtures for testing recovery genesis * cleanup fixtures implement functional tests for: - exporting db backup to json - creating genesis blob from json - creating genesis blob in one shot from db backup TODO: launch test node from from genesis.blob TODO: e2e tests from a fixture file * integration test using blob from fixture to start a diem-node in test mode * patch github actions tests * full e2e test from db backup to starting a node * Add diem_logger as per @corythian plus comments. * query nodes to check if onchain state is the same as recovery. * - include db reader util to inspect a genesis.blob. - refactor recovery tests * test to check validator count. cleanup test utlis * cleanup tests * stub a "check" feature, to check a json file agains the output genesis.blob * finish balance comparison with error list. * clean * test to create single validator and check output. * skip comparing system zero address. * cargo fix * cargo fmt * create function to start a vm executor, and uses a function pointer to transform legacy data to Move arguments. * experimenting with alternative way of starting a vm genesis session * runs * cleanup * need to explicitly set the validators at genesis * test to confirm genesis validator set, is the same as defined set. * tests for validator set and balance passing * change fixtures, make node start from command line * can start a test node from genesis blob * can genesis tools test can start a node from a genesis and query for an accounts resources * make ol version of swarm config generator in ol/smoke_tests * wip * move legacyRecovery to ol/types. So now we can run the user migrations in the vm_genesis::lib. First draft builds * create GenesisMigration user migration test. Builds. * ol/genesis-tools builds with refactor * refactored with clean build * minor refactors * can migrate the balance of end users with new design * migration successfully migrates balances of users, validators, and operators. * cleanup unused files. clippy, * tests passing * whitespace to trigger ci * initial scaffold of proof-of-fee auction. Borrows code from NodeWeight. Includes tranaction api. * implement seat filling algo, which considers the 1/3 unproven node limit on epoch changes * patch * patch * builds * implement vm function to pay fee from user account * all validators are charged fee at epoch boundary * cleanup validator set proposal functions * refactor jail function at epoch boundary * make epoch boundry _meta_epoch.move pass * filter for vouches on proof of fee * initialize val account with a PoF struct * epoch reconfiguration meta tests passing. PoF bid initialization unit tests passing. Validator meta sanity tests passing * patch issue with failover * add bid restrictions, and checking upon seating * burn excess fees than needed for validators * reward thermostat initial implementation * genesis init fee baseline * patch bug in thermostat * more tests for fill_seats, and thermostat. patches * test * consolidate validator audits, check for the case that there are fewer bidders than the stated val set. * add test fixtures, modify some APIs "tell don't ask" pattern. Add several tests. * add unit tests for thermostat. Patch a couple bugs * tests for thermostat increase/decrease * deprecate Audit.move, and create tests for qualifications in Proofoffee.move * Jailing mechanism needs update after deprecating Towers. Proposing here that a Voucher is the only one to unjail, since there is no other practical hurdle. * audit tests for vouch, expired bids, no_funds * covered all proof of fee functions, tests for all common scenarios of fill_seats, patch logic issues, all proof of fee tests passing! * patch seating failover * Clean up Cases.move. Patch Vouch tests fixtures * adjust fixtures for reconfiguration tests, deprecate some tests, patch jailing * patch all reconfig test fixtures. remove deprecated burn tests. * continue patching tests and removing deprecated scenarios * All transactional tests passing! * txs transaction apis for setting and retracting bids. * test for set and retract * cleanup prints * add struct in TransactionFee to track origin of fees FeeMaker * refactor Burn to consider the preference of the user FeeMaker * cleanup * init FeeMaker on account creation * patch tests to remove `print` * patch epoch boundary burn ratios * all tests passing --------- Co-authored-by: Zoz <97761083+0xzoz@users.noreply.github.com> --- .../current/build/DPNFramework/BuildInfo.yaml | 8 +- .../abis/ProofOfFee/init_bidding.abi | Bin 0 -> 44 bytes .../abis/ProofOfFee/pof_retract_bid.abi | Bin 0 -> 47 bytes .../abis/ProofOfFee/pof_update_bid.abi | Bin 0 -> 65 bytes .../abis/ol_validator/self_unjail.abi | Bin 49 -> 0 bytes .../DPNFramework/bytecode_modules/Ancestry.mv | Bin 1473 -> 1121 bytes .../DPNFramework/bytecode_modules/Audit.mv | Bin 361 -> 0 bytes .../DPNFramework/bytecode_modules/AutoPay.mv | Bin 3135 -> 3033 bytes .../DPNFramework/bytecode_modules/Burn.mv | Bin 1683 -> 1903 bytes .../DPNFramework/bytecode_modules/Cases.mv | Bin 330 -> 234 bytes .../bytecode_modules/DemoBonding.mv | Bin 787 -> 712 bytes .../bytecode_modules/DiemAccount.mv | Bin 13595 -> 14013 bytes .../bytecode_modules/DiemSystem.mv | Bin 3352 -> 3309 bytes .../bytecode_modules/DonorDirected.mv | Bin 4187 -> 4579 bytes .../DPNFramework/bytecode_modules/Epoch.mv | Bin 627 -> 619 bytes .../bytecode_modules/EpochBoundary.mv | Bin 3310 -> 2120 bytes .../bytecode_modules/FullnodeSubsidy.mv | Bin 537 -> 558 bytes .../DPNFramework/bytecode_modules/Genesis.mv | Bin 2314 -> 2413 bytes .../bytecode_modules/GenesisMigration.mv | Bin 576 -> 579 bytes .../DPNFramework/bytecode_modules/Jail.mv | Bin 1316 -> 1212 bytes .../DPNFramework/bytecode_modules/Mock.mv | Bin 571 -> 1111 bytes .../DPNFramework/bytecode_modules/MultiSig.mv | Bin 5261 -> 4889 bytes .../bytecode_modules/MultiSigPayment.mv | Bin 1914 -> 1687 bytes .../bytecode_modules/ProofOfFee.mv | Bin 0 -> 3817 bytes .../DPNFramework/bytecode_modules/Receipts.mv | Bin 889 -> 975 bytes .../bytecode_modules/StagingNet.mv | Bin 270 -> 273 bytes .../DPNFramework/bytecode_modules/Stats.mv | Bin 2819 -> 3005 bytes .../DPNFramework/bytecode_modules/Subsidy.mv | Bin 1903 -> 1910 bytes .../bytecode_modules/TestFixtures.mv | Bin 7420 -> 7931 bytes .../DPNFramework/bytecode_modules/Testnet.mv | Bin 316 -> 400 bytes .../bytecode_modules/TowerState.mv | Bin 7515 -> 7405 bytes .../bytecode_modules/TransactionFee.mv | Bin 1265 -> 2130 bytes .../bytecode_modules/TransferScripts.mv | Bin 669 -> 615 bytes .../DPNFramework/bytecode_modules/Upgrade.mv | Bin 1224 -> 1222 bytes .../bytecode_modules/ValidatorScripts.mv | Bin 925 -> 803 bytes .../build/DPNFramework/docs/Ancestry.md | 43 +- .../current/build/DPNFramework/docs/Audit.md | 82 - .../build/DPNFramework/docs/AutoPay.md | 30 +- .../current/build/DPNFramework/docs/Burn.md | 165 +- .../current/build/DPNFramework/docs/Cases.md | 51 +- .../build/DPNFramework/docs/DemoBonding.md | 27 +- .../build/DPNFramework/docs/DiemAccount.md | 261 +- .../build/DPNFramework/docs/DiemSystem.md | 12 +- .../build/DPNFramework/docs/DonorDirected.md | 274 +- .../current/build/DPNFramework/docs/Epoch.md | 12 +- .../build/DPNFramework/docs/EpochBoundary.md | 338 +- .../DPNFramework/docs/FullnodeSubsidy.md | 1 + .../build/DPNFramework/docs/Genesis.md | 5 +- .../DPNFramework/docs/GenesisMigration.md | 1 + .../current/build/DPNFramework/docs/Jail.md | 37 +- .../current/build/DPNFramework/docs/Mock.md | 125 +- .../build/DPNFramework/docs/MultiSig.md | 93 +- .../DPNFramework/docs/MultiSigPayment.md | 39 +- .../build/DPNFramework/docs/ProofOfFee.md | 1118 +++ .../build/DPNFramework/docs/Receipts.md | 59 +- .../current/build/DPNFramework/docs/Stats.md | 100 +- .../build/DPNFramework/docs/Subsidy.md | 3 + .../build/DPNFramework/docs/TestFixtures.md | 56 +- .../build/DPNFramework/docs/Testnet.md | 17 +- .../build/DPNFramework/docs/TowerState.md | 13 +- .../build/DPNFramework/docs/TransactionFee.md | 330 +- .../build/DPNFramework/docs/Upgrade.md | 2 +- .../build/DPNFramework/docs/ol_transfer.md | 7 +- .../build/DPNFramework/docs/ol_validator.md | 43 - .../DPNFramework/source_maps/Ancestry.mvsm | Bin 14667 -> 10927 bytes .../build/DPNFramework/source_maps/Audit.mvsm | Bin 1769 -> 0 bytes .../DPNFramework/source_maps/AutoPay.mvsm | Bin 28450 -> 27665 bytes .../build/DPNFramework/source_maps/Burn.mvsm | Bin 14536 -> 15282 bytes .../build/DPNFramework/source_maps/Cases.mvsm | Bin 2493 -> 1353 bytes .../DPNFramework/source_maps/DemoBonding.mvsm | Bin 7470 -> 6546 bytes .../DPNFramework/source_maps/DiemAccount.mvsm | Bin 120553 -> 126407 bytes .../DPNFramework/source_maps/DiemSystem.mvsm | Bin 29238 -> 29028 bytes .../source_maps/DonorDirected.mvsm | Bin 34180 -> 36717 bytes .../build/DPNFramework/source_maps/Epoch.mvsm | Bin 3975 -> 3721 bytes .../source_maps/EpochBoundary.mvsm | Bin 24469 -> 11617 bytes .../source_maps/FullnodeSubsidy.mvsm | Bin 2026 -> 2068 bytes .../DPNFramework/source_maps/Genesis.mvsm | Bin 15256 -> 15466 bytes .../source_maps/GenesisMigration.mvsm | Bin 2375 -> 2417 bytes .../build/DPNFramework/source_maps/Jail.mvsm | Bin 11390 -> 10578 bytes .../build/DPNFramework/source_maps/Mock.mvsm | Bin 4459 -> 8055 bytes .../DPNFramework/source_maps/MultiSig.mvsm | Bin 45646 -> 41676 bytes .../source_maps/MultiSigPayment.mvsm | Bin 11265 -> 8889 bytes .../DPNFramework/source_maps/ProofOfFee.mvsm | Bin 0 -> 39724 bytes .../DPNFramework/source_maps/Receipts.mvsm | Bin 7488 -> 8067 bytes .../DPNFramework/source_maps/StagingNet.mvsm | Bin 929 -> 946 bytes .../build/DPNFramework/source_maps/Stats.mvsm | Bin 30952 -> 33257 bytes .../DPNFramework/source_maps/Subsidy.mvsm | Bin 14552 -> 14678 bytes .../source_maps/TestFixtures.mvsm | Bin 3955 -> 6878 bytes .../DPNFramework/source_maps/Testnet.mvsm | Bin 1526 -> 2237 bytes .../DPNFramework/source_maps/TowerState.mvsm | Bin 66079 -> 65145 bytes .../source_maps/TransactionFee.mvsm | Bin 5961 -> 13317 bytes .../source_maps/TransferScripts.mvsm | Bin 3683 -> 3295 bytes .../DPNFramework/source_maps/Upgrade.mvsm | Bin 8230 -> 8188 bytes .../source_maps/ValidatorScripts.mvsm | Bin 6161 -> 4884 bytes .../build/DPNFramework/source_maps/Vouch.mvsm | Bin 12716 -> 12716 bytes .../build/DPNFramework/sources/Ancestry.move | 44 +- .../build/DPNFramework/sources/AutoPay.move | 24 +- .../build/DPNFramework/sources/Burn.move | 103 +- .../build/DPNFramework/sources/Cases.move | 37 +- .../DPNFramework/sources/DemoBonding.move | 26 +- .../DPNFramework/sources/DiemAccount.move | 195 +- .../DPNFramework/sources/DiemSystem.move | 13 +- .../DPNFramework/sources/DonorDirected.move | 137 +- .../build/DPNFramework/sources/Epoch.move | 8 +- .../DPNFramework/sources/EpochBoundary.move | 290 +- .../DPNFramework/sources/FullnodeSubsidy.move | 1 + .../build/DPNFramework/sources/Genesis.move | 6 +- .../sources/GenesisMigration.move | 3 +- .../build/DPNFramework/sources/Jail.move | 34 +- .../build/DPNFramework/sources/Mock.move | 110 +- .../build/DPNFramework/sources/MultiSig.move | 74 +- .../DPNFramework/sources/MultiSigPayment.move | 40 +- .../DPNFramework/sources/ProofOfFee.move | 682 ++ .../build/DPNFramework/sources/Receipts.move | 17 +- .../build/DPNFramework/sources/Stats.move | 41 +- .../build/DPNFramework/sources/Subsidy.move | 3 + .../DPNFramework/sources/TestFixtures.move | 35 + .../build/DPNFramework/sources/Testnet.move | 18 +- .../DPNFramework/sources/TowerState.move | 14 +- .../DPNFramework/sources/TransactionFee.move | 151 +- .../build/DPNFramework/sources/Upgrade.move | 2 +- .../build/DPNFramework/sources/Vouch.move | 2 +- .../DPNFramework/sources/ol_transfer.move | 2 +- .../DPNFramework/sources/ol_validator.move | 42 +- .../error_description.errmap | Bin 19394 -> 19637 bytes .../current/transaction_script_builder.rs | 123 +- .../DPN/sources/0L/Ancestry.move | 44 +- .../Audit.move => sources/0L/Audit.depr} | 0 .../diem-framework/DPN/sources/0L/Audit.move | 41 - .../diem-framework/DPN/sources/0L/Burn.move | 98 +- .../diem-framework/DPN/sources/0L/Cases.move | 37 +- .../DPN/sources/0L/DemoBonding.move | 26 +- .../DPN/sources/0L/DonorDirected.move | 14 +- .../diem-framework/DPN/sources/0L/Epoch.move | 8 +- .../DPN/sources/0L/EpochBoundary.move | 288 +- .../DPN/sources/0L/FullnodeSubsidy.move | 1 + .../DPN/sources/0L/GenesisMigration.move | 3 +- .../diem-framework/DPN/sources/0L/Jail.move | 34 +- .../DPN/sources/0L/MakeWhole.depr | 7977 ----------------- .../diem-framework/DPN/sources/0L/Mock.move | 110 +- .../DPN/sources/0L/MultiSig.move | 64 +- .../DPN/sources/0L/MultiSigPayment.move | 40 +- .../DPN/sources/0L/ProofOfFee.move | 682 ++ .../diem-framework/DPN/sources/0L/Stats.move | 41 +- .../DPN/sources/0L/Subsidy.move | 3 + .../DPN/sources/0L/TestFixtures.move | 35 + .../DPN/sources/0L/Testnet.move | 18 +- .../DPN/sources/0L/TowerState.move | 14 +- .../DPN/sources/0L/Upgrade.move | 2 +- .../diem-framework/DPN/sources/0L/Vouch.move | 2 +- .../0L_transaction_scripts/ol_validator.move | 42 +- .../DPN/sources/DiemAccount.move | 130 +- .../DPN/sources/DiemSystem.move | 13 +- .../diem-framework/DPN/sources/Genesis.move | 6 +- .../DPN/sources/TransactionFee.move | 151 +- .../0L/ancestry/ancestry_is_fam.move | 10 +- .../audit/audit_check_autopay_disabled.depr | 22 - .../audit/audit_check_operator_balance.depr | 45 - .../0L/audit/audit_passing_happy_day.move | 31 - .../0L/autopay/instructions_balance.move | 4 +- ...instructions_balance_slow_wallet_fail.move | 2 +- ...nstructions_balance_slow_wallet_happy.move | 6 +- .../0L/autopay/instructions_inflow.exp | 6 +- .../0L/autopay/instructions_inflow.move | 1 + .../0L/burn/burn_deposit_index.move | 8 +- .../burn/{burn_epoch.move => burn_epoch.depr} | 1 + .../0L/burn/burn_epoch_recycle.exp | 54 +- .../0L/burn/burn_epoch_recycle.move | 43 +- .../0L/burn/burn_epoch_send_comm.depr | 134 + .../0L/burn/burn_from_balance.move | 10 +- ..._universe.move => burn_from_universe.depr} | 29 +- .../0L/burn/burn_from_universe.exp | 24 +- .../0L/burn/burn_ratios.move | 10 +- .../0L/burn/burn_unit_just_burn.move | 21 +- .../0L/burn/burn_unit_recycle.move | 26 +- .../0L/cases/case_1_reconfig.exp | 94 +- .../0L/cases/case_1_reconfig.move | 117 +- .../{case_1_unit.move => case_1_unit.depr} | 0 ...e_2_reconfig.move => case_2_reconfig.depr} | 0 .../{case_2_unit.move => case_2_unit.depr} | 0 ...e_3_reconfig.move => case_3_reconfig.depr} | 0 .../{case_3_unit.move => case_3_unit.depr} | 0 ...e_4_reconfig.move => case_4_reconfig.depr} | 2 + .../0L/demos/persistence.move | 4 +- .../end_user_transfer_testnet.move | 2 +- .../diem_account/onboarding_rate_limit.move | 4 +- .../0L/diem_account/onboarding_reconfig.exp | 2 +- .../0L/diem_account/onboarding_reconfig.move | 99 +- .../diem_account/onboarding_tx_subsidy.move | 4 +- .../0L/diem_account/vm_payment_receipts.move | 4 +- .../0L/fullnode_subsidy/fullnode_reconfig.exp | 44 +- .../fullnode_subsidy/fullnode_reconfig.move | 87 +- ...=> fullnode_reconfig_mixed_val_cases.depr} | 0 ... => fullnode_reconfig_six_validators.depr} | 0 .../fullnode_reconfig_three_miners.exp | 32 +- .../fullnode_reconfig_three_miners.move | 39 +- .../transactional-tests/0L/gas/gas_mint.move | 1 + ...ck.exp => gas_slow_wal_transfer_check.exp} | 4 +- ....move => gas_slow_wal_transfer_check.move} | 30 +- .../0L/jail/jail_sort.move | 26 +- .../0L/make_whole/make_whole.move | 12 +- .../0L/make_whole/make_whole_none.move | 12 +- .../0L/migrate/_meta_destroy_state.move | 4 +- .../0L/multi_sig/multi_sig_billing.move | 4 +- .../0L/multi_sig/type_propose.move | 4 +- .../0L/node_weight/inactive_validators.move | 4 +- .../audit_expired.exp} | 0 .../0L/proof_of_fee/audit_expired.move | 57 + .../0L/proof_of_fee/audit_happy.exp | 1 + .../0L/proof_of_fee/audit_happy.move | 48 + .../0L/proof_of_fee/audit_jail.exp | 1 + .../0L/proof_of_fee/audit_jail.move | 68 + .../0L/proof_of_fee/audit_no_funds.exp | 1 + .../0L/proof_of_fee/audit_no_funds.move | 56 + .../0L/proof_of_fee/audit_vouch.exp | 1 + .../0L/proof_of_fee/audit_vouch.move | 68 + .../proof_of_fee/fill_seats_few_bidders.exp | 1 + .../proof_of_fee/fill_seats_few_bidders.move | 48 + .../0L/proof_of_fee/fill_seats_happy.exp | 1 + .../0L/proof_of_fee/fill_seats_happy.move | 45 + .../fill_seats_happy_and_thermostat.exp | 0 .../fill_seats_happy_and_thermostat.todo | 48 + .../proof_of_fee/fill_seats_many_bidders.exp | 1 + .../proof_of_fee/fill_seats_many_bidders.move | 62 + .../fill_seats_unproven_happy.exp | 1 + .../fill_seats_unproven_happy.move | 84 + .../proof_of_fee/fill_seats_unproven_sad.exp | 1 + .../proof_of_fee/fill_seats_unproven_sad.move | 92 + .../0L/proof_of_fee/pof_set_retract.exp | 1 + .../0L/proof_of_fee/pof_set_retract.move | 61 + .../proof_of_fee/sorted_vals_expired_bid.exp | 1 + .../proof_of_fee/sorted_vals_expired_bid.move | 55 + .../0L/proof_of_fee/sorted_vals_happy.exp | 1 + .../0L/proof_of_fee/sorted_vals_happy.move | 25 + .../0L/proof_of_fee/sorted_vals_jailed.exp | 1 + .../0L/proof_of_fee/sorted_vals_jailed.move | 29 + .../proof_of_fee/thermostat_decrease_long.exp | 1 + .../thermostat_decrease_long.move | 56 + .../thermostat_decrease_short.exp | 1 + .../thermostat_decrease_short.move | 56 + .../proof_of_fee/thermostat_increase_long.exp | 1 + .../thermostat_increase_long.move | 56 + .../thermostat_increase_short.exp | 1 + .../thermostat_increase_short.move | 56 + .../0L/proof_of_fee/thermostat_mock.exp | 1 + .../0L/proof_of_fee/thermostat_mock.move | 23 + .../0L/proof_of_fee/thermostat_unit_happy.exp | 1 + .../proof_of_fee/thermostat_unit_happy.move | 53 + .../0L/reconfiguration/jailed_set.exp | 2 +- .../0L/reconfiguration/jailed_set.move | 5 +- .../minimum_validators_update.exp | 42 + .../minimum_validators_update.move | 8 +- ...size.move => reconfig_below_set_size.depr} | 2 + ...onfig_case_2.move => reconfig_case_2.depr} | 0 ...se_2.move => reconfig_include_case_2.depr} | 0 ..._case_3.move => reconfig_jail_case_3.depr} | 0 ....move => reconfig_jail_case_3_rejoin.depr} | 0 .../reconfiguration/reconfig_jail_case_4.exp | 140 +- .../reconfiguration/reconfig_jail_case_4.move | 151 +- .../reconfig_success_one_epoch.exp | 102 +- .../reconfig_success_one_epoch.move | 52 +- .../reconfig_success_two_epochs.exp | 331 +- .../reconfig_success_two_epochs.move | 203 +- .../recovery_mode_enable_disable.move | 10 +- .../recovery_mode/recovery_mode_val_pay.exp | 10 +- .../recovery_mode/recovery_mode_val_pay.move | 119 +- .../0L/stats/stats_epoch.exp | 54 + .../0L/subsidy/process_subsidy_one_val.exp | 11 +- .../0L/subsidy/process_subsidy_one_val.move | 84 +- .../0L/tower_state/_meta_mock_mining.move | 30 +- .../tower_state/epoch_random_difficulty.move | 4 +- .../0L/tower_state/init_miner_state.move | 6 +- .../0L/tower_state/lazy_reset_count.move | 22 +- .../0L/tower_state/toy_rng.move | 6 +- .../0L/txn_fee/_meta_deposit_and_track.exp | 1 + .../0L/txn_fee/_meta_deposit_and_track.move | 21 + ..._fee_success.move => txn_fee_success.depr} | 1 + .../{txn_fee_zero.move => txn_fee_zero.depr} | 2 + .../0L/validator_universe/_meta_validator.exp | 1 + .../validator_universe/_meta_validator.move | 15 + ...econd_epoch.move => pow_second_epoch.depr} | 1 + .../create_election_and_vote_happy.move | 4 +- .../create_election_and_vote_retract.move | 2 +- .../0L/vote_lib/vote_curve.move | 14 +- .../lost_voucher_after_reconfig_prod.move | 30 +- .../lost_voucher_doesnt_drop_vouchee.depr | 110 + .../lost_voucher_doesnt_drop_vouchee.move | 103 - ...e => revoke_should_not_drop_good_val.depr} | 0 ..._audit_pass.move => vouch_audit_pass.depr} | 0 .../0L/vouch/vouch_has_unrelated.move | 2 +- ...t.move => vouch_validator_set_reject.depr} | 10 +- .../0L/vouch/vouch_validator_set_reject.exp | 109 - .../community_wallet_process_epoch.move | 10 +- .../community_wallet_process_unit.move | 10 +- .../donor_directed/community_wallet_veto.move | 23 +- .../0L/wallet/slow_wallet_pay_enabled.move | 6 +- .../0L/wallet/slow_wallet_pay_reconfig.move | 8 +- ol/txs/src/commands/valset_cmd.rs | 42 +- 298 files changed, 8038 insertions(+), 11721 deletions(-) create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/init_bidding.abi create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_retract_bid.abi create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_update_bid.abi delete mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ol_validator/self_unjail.abi delete mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Audit.mv create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/ProofOfFee.mv delete mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Audit.md create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ProofOfFee.md delete mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Audit.mvsm create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/ProofOfFee.mvsm create mode 100644 diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ProofOfFee.move rename diem-move/diem-framework/DPN/{releases/artifacts/current/build/DPNFramework/sources/Audit.move => sources/0L/Audit.depr} (100%) delete mode 100644 diem-move/diem-framework/DPN/sources/0L/Audit.move delete mode 100644 diem-move/diem-framework/DPN/sources/0L/MakeWhole.depr create mode 100644 diem-move/diem-framework/DPN/sources/0L/ProofOfFee.move delete mode 100644 diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_autopay_disabled.depr delete mode 100644 diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_operator_balance.depr delete mode 100644 diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.move rename diem-move/diem-framework/core/transactional-tests/0L/burn/{burn_epoch.move => burn_epoch.depr} (97%) create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_send_comm.depr rename diem-move/diem-framework/core/transactional-tests/0L/burn/{burn_from_universe.move => burn_from_universe.depr} (53%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_1_unit.move => case_1_unit.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_2_reconfig.move => case_2_reconfig.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_2_unit.move => case_2_unit.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_3_reconfig.move => case_3_reconfig.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_3_unit.move => case_3_unit.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/cases/{case_4_reconfig.move => case_4_reconfig.depr} (99%) rename diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/{fullnode_reconfig_mixed_val_cases.move => fullnode_reconfig_mixed_val_cases.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/{fullnode_reconfig_six_validators.move => fullnode_reconfig_six_validators.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/gas/{gas_transfer_check.exp => gas_slow_wal_transfer_check.exp} (58%) rename diem-move/diem-framework/core/transactional-tests/0L/gas/{gas_transfer_check.move => gas_slow_wal_transfer_check.move} (55%) rename diem-move/diem-framework/core/transactional-tests/0L/{audit/audit_passing_happy_day.exp => proof_of_fee/audit_expired.exp} (100%) create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.todo create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.move create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.move rename diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/{reconfig_below_set_size.move => reconfig_below_set_size.depr} (98%) rename diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/{reconfig_case_2.move => reconfig_case_2.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/{reconfig_include_case_2.move => reconfig_include_case_2.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/{reconfig_jail_case_3.move => reconfig_jail_case_3.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/{reconfig_jail_case_3_rejoin.move => reconfig_jail_case_3_rejoin.depr} (100%) create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.move rename diem-move/diem-framework/core/transactional-tests/0L/txn_fee/{txn_fee_success.move => txn_fee_success.depr} (99%) rename diem-move/diem-framework/core/transactional-tests/0L/txn_fee/{txn_fee_zero.move => txn_fee_zero.depr} (99%) create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.exp create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.move rename diem-move/diem-framework/core/transactional-tests/0L/validator_universe/{pow_second_epoch.move => pow_second_epoch.depr} (99%) create mode 100644 diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.depr delete mode 100644 diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.move rename diem-move/diem-framework/core/transactional-tests/0L/vouch/{revoke_should_not_drop_good_val.move => revoke_should_not_drop_good_val.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/vouch/{vouch_audit_pass.move => vouch_audit_pass.depr} (100%) rename diem-move/diem-framework/core/transactional-tests/0L/vouch/{vouch_validator_set_reject.move => vouch_validator_set_reject.depr} (94%) delete mode 100644 diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.exp 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 e6ca0417cc..71496995a8 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 @@ -31,9 +31,6 @@ compiled_package_info: ? address: "00000000000000000000000000000001" name: Ancestry : DiemFramework - ? address: "00000000000000000000000000000001" - name: Audit - : DiemFramework ? address: "00000000000000000000000000000001" name: Authenticator : DiemFramework @@ -223,6 +220,9 @@ compiled_package_info: ? address: "00000000000000000000000000000001" name: PersistenceDemo : DiemFramework + ? address: "00000000000000000000000000000001" + name: ProofOfFee + : DiemFramework ? address: "00000000000000000000000000000001" name: Receipts : DiemFramework @@ -346,7 +346,7 @@ compiled_package_info: ? address: "00000000000000000000000000000001" name: XUS : DiemFramework - source_digest: E73442AD7A1B65175ABE2ACCB60D6A59204FBFD1C63E20E767E29AAC56BD3285 + source_digest: 110A62F23F4C530726F3CD908ED8A7393D8E6E9D5B8E6F2543C536D0C02458CB build_flags: dev_mode: false test_mode: false diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/init_bidding.abi b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/init_bidding.abi new file mode 100644 index 0000000000000000000000000000000000000000..cdcc68fa87632e4493a2899cc69ec7ff8ba149aa GIT binary patch literal 44 lcmZSN$;`_viBHN*Ny*GhXFvsvTmeP-`Dy-XZmFq2835KT2*>~c literal 0 HcmV?d00001 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_retract_bid.abi b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_retract_bid.abi new file mode 100644 index 0000000000000000000000000000000000000000..2e93d36189a4be17ddee2ef1352d927b5a74d682 GIT binary patch literal 47 ocmZSNFUU`eFG?*bN=z<^Ps&VTKn09k0Y&-wY5r+$si{C201mAR4gdfE literal 0 HcmV?d00001 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_update_bid.abi b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/abis/ProofOfFee/pof_update_bid.abi new file mode 100644 index 0000000000000000000000000000000000000000..29a2cc5bcd5e1a34abc818634948ffd458783737 GIT binary patch literal 65 zcmZSNE67iaFD*z(EJ=+|%1mKE1&mw)Mfv$@{%LNhsSFHE%s>@PJgEiw$r6u!i!aT~O3ch*Kn08fVTn1JDTyWdMZw8MnFS@qKzRTR+Y2}V diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Ancestry.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Ancestry.mv index 1fe39b05694e1b404496c9f178c9e56d77ed0e39..1848b37d1e018fdab069bd3114a1ace49e18092c 100644 GIT binary patch delta 589 zcmX|6yKWRg5bWp7?DXvH?RxLdXD%=XA(@B3*-D6jPasDKiH{&cCr3Oov=RXckn$H~ z`~o2{KR`&YEipl>ySi(t>WBSKhj05oCIDavnR4dwmAoGGJ$}OYg??fB%d7BChWuGV z`6?fz{hr9r5eOKZn1CpvBkCB0WfytDH2^frCMO@Q5s=mjg4DJ;yOYlQ)e~7EaNiTi za5Oq{wBGo3tiHu{@1)I%IJ~{#HBzF6G8Jm6(u(?zKcC&lP=W?!%$k)#ZXh&(c-1j_ z&&WYZV*;I@CUZMJj4M7ShSwuLOk6HE&Zy_a1=A zV2%;Z0? KiSZ)jA^rhso+*3) literal 1473 zcmY*ZF^n8F6#d`!_jtZN-krVO%LPJ|6Hpw1A`-fa%b&&{(L{b|G)q9d~@S(Zvem}1Ql5C zHs+IE`U=0t>?idny6?=?{$OVOv$5e<^P?@k@Jiqa3N#oX00&xUC_XD*$kM9QLYb2V z;I!hMyoOxR(FX*Y6cIsB%|z_dOoeMUGYDp9M*+=u7vf%An+aq$3Iwn1$j-fI1wq$u z$ebysa>dFAzbI5x6IH62LMDwKk*y`?wm!$-&VolW1YTl;Qv+}53auRiM6-E7sKFCVVXn$z=T(=Jb& zZSRije%W_*ZJM^}^Je>aeeuLvuG@M3tWbKF+0ze@9@5p)z#eN94(+6P(ap``?JsQA9uMp(Y z9l$NkwBymM8N34a%PTq3E!oTTk~G3AZzr&@UypzxYbB{7JoA?HB!t|ajEh6pMG`)B zQ5PwBAqhStwG_4+al=W(LbQ3I%%shmv|o5%RJr|lgblF@A**L$TkxvGsCm2HzT=Y~9iHPhNYo*y+Yr+PnV2 zwJ)|_da{(Srs+&y9`u_jJ3S1xt+RLClzK}3V-h=*lbZt1O{(6}RY{C{w2iE+kwm{J#;t!DKmg^V*Kjja>Nf}9H>V@6OYOfZ2p WUx;ib!kk}<Nm5rbbMH%VLo diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/AutoPay.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/AutoPay.mv index 3fee779876c55911fe529c895dc36f76621d80f4..2cc065715859d490759ffe2dfdb560a92cb37dfb 100644 GIT binary patch delta 1139 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 UGUB5E%QqzV@fxE$PIDmt0VZA(#{d8T literal 1683 zcmY*Z&2Ah;5bo-p>h7)Sot+u)uALviB*7?&tVjVxgCdX|Oc1w7kq{?Fo87iE%I=Ic zJ8NR@@C3X7H?BMaFF-Cl0auQ^0M+BfHht)+{_3Z{s;TNn=-zfXLPW2!9A^od!_mg>p!@rzm2M|&y5eXDp7-7YLL9#+?BM>=a%of6h zZ3t3`1e6e?2!%*BV_8t-287xk07S6EpuGmn!d_2C9Q#HJEZNcjjS zxs#5ztR9Rs<1&1_HDN9X2*$OU;mG6o7Zhpp_7?UZEtL zaBO8PkP3^?%5Z^U6EA1vKCJxe zU_Ng)bvHb0>ZU!cT0ignLVbPk+&!&c`^B@Ss=H4f>gUyQ?OXjVtD80n5udgG$hW?p z`}okGH0!GSrao$-7pzM8JbziPyII?nJ#g&1a&~@uxvbV51)!aERkI!h@pQJ_c*o=} z;ArjZMIO#UDCf;;wW+J_EcyR23Q_IioWL6UkmJ);e`|TvHZ0ASGbTBhapFwpbcKF( z(w*6PQ+KnfUgJs2DcY)D_}67~q?f)v?q2E_P1`m)+4^J7u07ih$a%>5X0<8b5geRs)-RdT{MC5g`dR1CIrg;c*>Z=O zuV$}&c``d&`MN9XhRe08I(k>U=7H?D37ah~9aF9u6=YL|i{}a2RawK_LBy0gl zH71;pnsO5bYwk6UWq8^OHV88baDzlPAh;{Ir=|q=MJmS1VHS&En`!x05SIeS;tqBO z?!vA@GzCZl_aTL`RKO}X3`ZwOFvOc2$0Ai@$#V`c{OZC_2To!2?oN?PArXaiGLgl* zQ{*CtJZ#tTAi*A01v;HXg-&##DGConzow+`sQdUJ=3#sbF=>@5iV8D!hD?^K&+zf3 zGBJfEh)tHU-4!Q(KmevCS0>N493@l?+~C5^nM+X@#O!!JZ>t>l__;7eJa#~kjh!S- za_aODNfwUGB~fQ^SPY%JjAO}$7!UACf@F(i9I8P&o4PoO3p;diT#U$G31RVGD5QFd z-|^#V;2yXrCW=NdiIG2Y61zAWsR@1`iJ-sAyCC!K; z!rLmv{e;UL@-keojI)(lUx?L6OmGsMapFgwy8PEkqM6nS(gVi?PKoRQ&?F5CLi|7r!jz`f;IBsEz5MBs* z@tcm%#V0xdf#AgtbyA0QQ=LXWFVllIr6Dk+I5{U^g~IuyA|xz@`b4DLwmWyayIzX# zbDO*StvQr!FRAFCepkH;;<<_ON>m3C6u^d>B8-epYEEh@W1R*{PG^CWi;nRHZv_w| literal 330 zcmYk0K}rNc3`LVlrK&oW#WV;aG|a#t47d_SL}us8t-5bor*H(dp{v!6NAMEf!CQF= zt8o_oMe@S`kpI>EL<;~OAyC-kX5XJ&g^!v0#Fc*IYq1av5ZJPjErD^sK+Z8(r%Z(8 zkjg5yQ$%FG>~hL{-9MFiGj?N^+x|Tb6Q=Nx#`eAhW?jx{7~9QbdTxilAM2NXliKdC ze@pGS9a7$w-~WXaaCcLfI!~ft{-6-;s5Aw$780{0<|+buGy*k75ELU+8?6Lu(jb+D xIUR80K|NncMRQ(CSg7U0N^P{X;v;X=@wrrsDSOPPo|O5_qjF?*(W#H#z%OoACXxUE diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DemoBonding.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DemoBonding.mv index 5a82c5d5d5b796eb17c1767ab3e3731f6a03fcf4..28267bfe99a6c685237fd1b23c1882099f982ea0 100644 GIT binary patch delta 339 zcmY+AJxT>Z49Am9=3_J2yd7Dv&_?kC@ii*q3B=L^*m(sH@Jc&jS$Np$1+2s?2$q)i zf>?P2XCF4E_|Gqyko?IQUj5=>^E)#DGzd(rt~>J=mvM>DnBJ(94>J9tCu;Bg)P+C^ zz$qXa0M{HmIe@?(AO-}~)Bv_p#U`2MD&0h7qP48xm>C&8F}pC_?G7&o!{_aIgQtsx z4GSY-wNyvPc{;Aozc_-zDoJ1kJ_)WMC!rOndCSEsn;4g%!9s}|O)ZwB$x><5nJc1A zZhFFM8CnrI1g$=?gFa)2JyBh3;}xCL>|}hTy)9w!^<&3vWRKx}c|F|&_W#Q3>c$`1 F{skVe9=-qo delta 369 zcmY+8yGlbr5I|>UclPdMGPxUrT9`&eurwgvMk}o?VlN05HX=dmRDzv^{Q^P!4?7G0 zz{bwP53qG_I=7fTXPDPJ7q@uc`bic5B7!3)W^`oFEYD`mE54!srZ)bP%7gi&!58<1 z2n5ChSOFph;F_te2B5JF;9V^k_yDMpD-KftYWt9-hEY#zJ&k1m9Efo_pIUSQmM?qE zCs&vE%a2FLxAW_pyK;^Pi-6H4i-cnPRn4)V*6-ijhioNk?7&A@2`l%4D@mGqp_PbA z2g;hV6RWmzRGS-d>MFbJrO~F6Xp@6@o%kv~M=@%0k`P0ODU1oRUZVwR9fxI;PN_XC a7qqK&WIZ@?i{l+LDNnRv)pS^1Y5Nb+*d(L? diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DiemAccount.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DiemAccount.mv index 53e1743184605557a0d1fbec2d3beec43decec5f..49bb09019558a11be0ae1822a56d0accca3470f0 100644 GIT binary patch delta 6760 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 z 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DiemSystem.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DiemSystem.mv index f41c0ff1ab62c15adb38fe39f7baf6830acb2fca..151dd923b08ef3c2e758afd2bba6910898d1a279 100644 GIT binary patch delta 638 zcmXAmxo#9e5QhKip6TxC?pbfIubDk(*Iw`1>jMME%Y7IUkRT&RJOR9bA#mb^U=j-= zOC$tDD;@yx0t5sk3OW5t(FZY( zzljr}&!QK`ocX#sN{`9Ds&)PQ+8>*~%RMUy0um8oC}?o zh=C{8)c9adFzO_M!w|(lL$P8$V(9`gmUIFvTL)yUL9SDvS!1*+qju%ck&JGY_2#%x zkb+z%LbSmOHDQI`R6N%fLv6F4+~F2?uE9Na*K6qWTyYl;X@TG_E-L2U(lYOKi89i( z-&BaFyqUS&ZXvl+q=aOz;D+RCHeg;Oro7H};>PNbw7yyS-5O^EeVbEphsV*;K{d`@ zt>NyCCxkq-Lq~UYC-h`ncSF9U+pWCSX|1SLHB@VAEH}cY+?lG%kz-={XUCJf5c4~vIz4Q yyO>ggrgcx+ucMF+2Y$G)UOshiyOWXj6VxMzX+z9aAHVS+G+4N0DQuTR|LY$cenMsd delta 640 zcmX|+yKfUg5XNVA?{@Zf_iSHCoV)Yc@iVdW=9QT6CcH#Jg`l9IfCQ)l5rWbZ5>47G zu#^f3i4F;+rQt8235bS{4pGq|3dXX;YWJtn&i8$q`IQXQ!JF)-^#H&kq#~`$jhDjv zD7yX+F%PaSW@r8Jv1K*HTSvj%7%xDV+Vo&2_E>MfIve41}r!TH8%;MKoA53 zR35w zX#{Vb6o@{?NO&q$pf-5H;B;02bEY05n6)~q%-OifJcmqqo-@UTb_Ypc|&d&BdzAwhV@BMvDn^vJl6rwFUMhhXlS$|G;wb#q< z(^K5eztB2f&qLi$dDrnV6wQ>K7sbxE$_ne{xApSmE%oVetca%Oj5Veq@8(0jn>3s< z>c6=moBomk<3-K972F7#E;OOhQ7eBQ>|x^oO^n#hQ(MLPyl>y)V*cI6{<6VnCI4f8 F{{yNyOVR)U diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DonorDirected.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/DonorDirected.mv index 618c158558c3411331b9fe68904a0d45276b9e92..32e0991238124c8e48cac25fdc42c2a35280e1b0 100644 GIT binary patch literal 4579 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 literal 4187 zcmZ`-OLyDG6`m&s7=R!_QBTvdD9H~=wq?h0OgnaL*|Hs{P4lpmG<~5EIhN2+APa)B zl^@X4({;C9bl*SG-_dr{ZMR)@)o(yjl5K-D5TBAIwseDk z@^2>o#&5`f^1pNS7xgdg{x7OIf2x0>|53ji{CVcTLFJDtO)yZx2q%I_;t)k#;t@@J z5|D~ZNT>*@;$3qHi7+*z2;UOKdk_-G5k!6MP(rj;prj5-q`^2LvqBOw=YV(KMR$RE zge+>Gkfi`i&e?TMw?fGI5MY*@&{pLrRW4@|(^O09xLioC8JA8V zB{(RR+zGgr%n7g_RF+d%Lm?4e4kk2Q$F&VCu%b9c56ql%F%LfNK{XIG zJtD{Il!}#O$|H~{@M9DMzz9@Cw)y_hk`=7NATu$7Mj7pX#;jiX4haP{yF99a)BM<+=UYb!}btw zU81lb^np6?D*S5I!Vpw;gmjgLKCCn!##2`bs~=(ku}}>JqOF+9Za?eiyJ>DZh3Ptv zlU}c1RG##6v(xS7W;irMe>XLUJDpB{loi^xpY*fW>HhpXoX`75CeM+%L_3IxOJ*`d7O2bn5lM~b)cAjy-% z;f&op?poi)-HG$+<=8t+emabk!61iox)Iv%GI$tyo%g>tnMP}(pJmC-@5*olwr!QL zk}HSFcLwUhvBPvfI82WB4A`yr&W$^RnP;E79on7sZ?S{!uq-4js>5Pi>$ecEeR#(_@F-X#Gbszk3 z=S20|liYyy)E1qL(<1J_R)|g+m^6bfV6$K|`XE8fJJyZ$6R5(xcrQ;o-_@pTlYD<< zUF-BrwqG1LdwnFz8$EtmP)c(+D2}}$Alrj>nKu{>58}N9G7@BE4o4ytOL&xEox&_O z+32u#7VvgpjOPig$|Y`z*8TpGS2l{{!5H+NQJzDuxbz!heF*H z3CIaV;;at@9i~Mz(JmPk2mKs*+Kr~@nIg=%pHGraWc|!E#`8!$8~!36*>l04GG*pX zV8b520j}b-J8Rw|cRR@EX~F`tiH*gue`uD*nE-4;#+b)q(MHrOEx@tSU9jG<;-*tm zqg*IZBxyFB-8TSq8TvC|&?S8KkYruEpVj^R@Hp!rD)!XG8H97?ZEW5S(!9(gR4iv7 z%3bpZ6f1bRyLZz1_N3K4X>}$odtXtC>qyqlO0sQSk%Tb5Ot<+B+^vk?l<)Cdn&I+& zUrWx!ZC8H4@3^$h1rv91P2R)rL;UW$%9b+WRZXIE0o62Wa^ELZk?8zoP1}Ueoc1;d zKWBTaoZAq5ZQAombOF4YZKw7vE@ zUy`enX|5fmn2*|0NldFiXu-GSwia3`$vjktF$OuO1?v%vGc z8rQVN@5vo230Jy?9gZza%V#cd3^ zRf260F4Ti!O=+?v>~fz*2s*~tdPTV#426@g+$|QMZmx+2Yol1g4z#98P1c-7`BLMT z+rS#H!B8?&=G72U8OVy%tnGmEwu87Y`a}y~MpfooF(HO7N8t*0B#_V+b#{%(3Y27? z)$2;-tX=_XBh8~LEvCV{xeVSW^m8?7lYmO?1=Od!A|p*UNWkQbXD#A$atQ+>;Iir2 z7{ErraLbwuHXo)m7>f5F*=?i6P^A9INKF8`a!f7d-%~)UF zLadR&H#G(55RqEoEKeL0y~pqgM8)lGBrf+wod&M&wkz#0K)^KhRl6EM`A}o~THwPG z08u*%Jnisv@&VHLXS0m2%MA?7_+F@^1-qy3NB4Zq@PS3eLm*VM=tJb>sW#xM z1);DXc;yq_XLC62hLo29YQ90F654>f}&00>xcbZSwnG@@&3d{f><+dJboEvnwEJ;Z%G9zB*1tz2O* a049i__(Zb*6@UXApCRQL34h@;j{G0@ot`-W diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Epoch.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Epoch.mv index 98dfe13a5d29c1ef1c56027ce411baeb82e13016..4403ca368f87ac713246d036a8342c590dafa2b4 100644 GIT binary patch delta 102 zcmey&@|tCW2Fpf9-fa_g6g8Qd7#O%%m>8J(fD9&nAi*pEBv=H25{yDX79%qwBLgEF p&&IL}Mpbrp25kl&25trc1`#GEpg02?LWog>iJ1{-$Yg1z2mpV^34s6r delta 110 zcmaFO@|k6V2Fp%H-hC5w6g8Qc85p=&m>HP)fD9&nAi*pEBv=H25{yDX79%qwBO@CR u!^W}-MqN&B20;#X25kl&Ms7v{1`#GEMg~R(HdJ9o5hi9vpgEI;nIZtv4hiP~ 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 fd85b2d2ba71a0259b8984be32ce0eaea66aae03..7c84d29709e25ef7f25c5e04be9cb174cebce4d6 100644 GIT binary patch literal 2120 zcmZ8iS#sM(5S_tbKwz+tBT>|9OSUC1@)|3Nl{lNcr7BgfxFT16Q6M>#5P<+|07&6c zQk9>SkB|f80?94%=S$=bNIJG5u{qP|ey{sY6Zm86t#1=TJWBSheVg5TOYPq*!QWWF z)7D??-K+@8^J&R-zJa}i!fpnP8`xAF7b#UJ_$%jBGM)uBFPe2Cf()b79lH$ zCOr#gmBFl809ZG^4Gy#EP$IXeO}tC4OS+eZOG$Uz4=8bVypYH%#$5G4aV>I*vx~^? zUMHl)zb;{Jz;tg4?4w&WB%OUwShs=My+fDbyo>noUI=r)yF%;-Jxbc2pm6pOG425c zaqS5b-&-_9K+mK18|F82$x(tuNuDk4?r`SVdoBwe$^4_$`d{-6kc$5mufj zypFf*t$LOdFaqNU&alK672I|L!Qr6rbHixF;-w zV=$0u{wPv_*?0xVaWU)~Mq$}a3^U{mcZ5qo2s~tm&nLy;^hr_Y!$eP8M|D-aN~ZRc zTIb=@LaU?UP^+?3rT;8d-EP?9KBgodDOK_&qv?F8`t^z7Et}5ELSq=3{n`iu zp&FcJoaDoJCJZF$oR8zN8HIR~Oby5G^ zUnRNYqMJmXQ?o~QC!vM{eD0Xw4O#7&Ab^tT2k~#Lutb$pz z>0z9lDJ^GJV<40s7ihBT_3P{`t|u5*_5bjc>+@k8)H+wxt<9Ro`dV$Sb z@CR(0-^O`uzc>@K8q~5={tcNxd1W@=GtTT`6HkB6h2eDxi;h$fFI9V`Y8H{KZRVs0(jac@@?HGb%$Ow>X$7RF0^; l25ZS(1nkM{uwW5P-o)w_KKuCGHYLkDmJx(9Xm-~k{{h&fxw!xU literal 3310 zcmZ8jON<;x8LsN;s+q2?shOJB?#!;&8}HglY$tx(6O#~ZuWd+T$HIw&K&Um3-r2Ti zrdQoPcJ_|Ml`|(e01`I@;y{cz08%87xa7zYp-3Ra0VIxm)ib@>xOcXu`upGC|5x|? zc>N!~O9&}ba@D!&vg2CWTCEb&%LWy@uYSMn$F0V+Bs8_3ypY}B+<_y)Oc^2N9uhl3KuU9A~{2V;7 z^H^FJAg*7;QockzvT_;T*_A5nu43n1!{YWD9-(i*x4zz_M1KWK?M(>uTbz^bS80oq z%G)s3UxUu-4J_T8ZG`ULT0yMF4p{JSmptO#aXX}Wmvl+x>rgL!1BEr-K~inI$aj&B z^Bxxe9t7q-cHaBzlvE$sos_aF8(xDq` zj9CTBD5nD4ICg;qHBp#x1~)J@EO!89Mj?K7}%1SrpS^S`X;NF}kGk&X| zhH2$ioP;+DmWxcTU^e^Qb`r}yCJ3k3C=RFkBLaK;OSH?s!jS?6sHnivPCa6 zw&|i@ASp9>lJg`%e-~-3SR|Z8<7hAmzo;***T! zx>jY{|M*CH!9IG1&>rfuis5KuK1;$0W^ROZN24fAzto2^f@l3`mU{d1bT1h6hfh{t zh-`z}flAv}kVR93*vsdCK|{sDAV0`iHpBj8IJW_dE=nt(&nEHkNjsgy&w^+D$pp}X z$x#yRmy7v4Ui5Ng4{0!3p3xx55ivE%#~F~%oY>y85l=BXIH^~pJ#hhm!bm?Wkt z!U8Jmat^h`ZUK4P14MT~(aFE22W+YPZLH zM{%F4hIm}S0_-!{=(&fisJg5JKuf;Er?MgIwk0)P>v3&tow6p4>B{<%*3|ijpw@3t z@ucuu(xo1A7!t1ko0=M9ylU1|S9ejyvI?@zd|tJNUB|4e)k9phzSuVKl3umRtnnSa zioB3a6-iVj#S|P`uOt(SjOKQzuGbhx#Uhla*p*n>UQBBzdh|u5Vq3-mEY{_=;v%Q5rCyPGM`DawG%VtijtQn?++5gwcT zBb4mgvJWGkWPhdnZxn|LWPNcg%&V%y{|=bGp#4wE|3xtr9lztaI1sCWJ#+X!t+W_j zQ8odh92{&rks42xGgQ^Yr-g)To-;>OMV!65RA03rH!3!|29-w2+3sHc} z>dggFDxhWE=AtMUP*F8AmxNb<%aYAyAqyxk7HLv*Mfe4n7wg!=L79)A{to#+i&9+R diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/FullnodeSubsidy.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/FullnodeSubsidy.mv index 0d932983328901049aeb88fb19962ffd8de669f2..343a5946ef9258de60379c5120175291f19af860 100644 GIT binary patch delta 103 zcmbQqvW{hfxS#=h;cZ5aGfV<(cbK$z+L-GnY9zC;vGK4@?E7lKD!_mSxR?Y5(n@o3 s^72zs-reKq)0RE+s&r>4pv0Hy8zQ%7`>UNhJhADr;CE z6bZ3m(HCG7v0}puRO%Yu0K_xEF$;hCkA05ih2Q4>3~9rKT28Y=sELb`BxvP~y=Nf*UO(_>n>omgO$NC>=s* zYqS*pbCFVTiAY6xgpA$uE)$h2LV$`^5OlOk*KEqPDb zA-9RFZ8>$5$loG(bw?q+q@OQRv0Fl9E_VgvOtcG~LU;ZekD2FbzPRhuQOSqX$z=Fo zc-xr8$UVWvS~5-!lEEl>Wn%Mu^7v^yG$!63JTudHYW9-Z!Sv;Pn}4a4ZDYJ=#%7kx z;zxs-86{&wJue2+CyQVFj)VL2EzxR+MG4XmOA^8|t%~%z7`Y9;E_A>*sq!NosK9OU zu8(1L{$3O^H3^C-F1@f$NzA{A&PLdz>6U~Zlio8hz^j@(KV7gqfI?^5ie7ucD+M;s(uU zb!F^N-_rm5Y4{dCUW|^B$%N@Sl`r!y;V4bwJjfjwigg+$Cp62 z7dh>g%wA{#?Q^4h5G>TAh)|C!gkr*pQX4_0WdxHvg3T-+GAgHdmc`6!rZ{32QU_r% zm--IVziTb{w1N=QDo?n_13S6f%ZN-nvvNQ4fGHm`G-awsjC;(q@|C403_bP8>z{SH zoU2(6QAv_kk+P$DTu+*}_+63?^Oqvw{9ImR^P0ZQpX(O_Up4RTc;A`Wbr5@e`c5C= zP;Stc4F&CTWrm^fg*>2%!MN7^w)N7w1Ft+e9S59jOb(iMaX6SN2l~y2Oa3o_DFx@j M2=9zEa;gRV2N(%40RR91 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/GenesisMigration.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/GenesisMigration.mv index 0d1668939ee739fbfc550f96522f79fbc46a52c8..7dd3a4554121fe81696b90191e7dcfa558a41f63 100644 GIT binary patch delta 79 zcmX@Wa+qa;xR4!tFXIbFj;~AtY^}_aJoA{VCu-KSu(9#5Zd`4{$f!B_1*5q#7b7<- eI|DnT1rrye1v3u|7Yi4gBC`e?0~Dw;F#rI|s0}3m delta 60 zcmX@ia)4!mxR5P-5913)jxS6CY%R=^Jad^VCu-I+v$FAQTw}w?s4@8^qxobdCJ|nB LHU=nAXJP;V;h_xB diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Jail.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Jail.mv index 8538b73583b3b22a3f87a980ddcf75c316d5e304..db4978276a99df82b3872759cd1eb80b0fb94c75 100644 GIT binary patch delta 285 zcmWkptxg6(44iIzce~yDhmXIU!jMDp3RsW`FkpBBB#MLtLoj3oAz(;INU&HOikH9; z6yY7{nn|bA>9o)K9xk4y-zWf-piYI`Q#td+`Cj!wpU&S%ua6Sz7x|LrDtH?tI55m& zq%elk8mKaO6A;8evk(ib>I_X;0&P}1qi)GOvg{o}widyXdByh8sySt?VM|!g6B}Jm zsL`Ouc>8veCb~?obe9g?PNmfIz+<|0M- delta 391 zcmZ8dyGlbr5S`iCy^r0!&qU)Rv9PhVu<#Q^O9R?yhveI?YgqIVvtviYrk&A)rzHQw z*}#Sk2!4X=gbqbmnrr*|+;i+R_Q!)?83zDGV9dsrzs<$FWA&4Kqsb>eGGF*-hN}c9 zFyJ6Sf`SB6%z&mCvKS05$^ovjoJdH9NlG9Y=?r5*1{lXVAs}{!1jsH;A=xW1D<)$C zY9A};mGLg{t9vMOZ9+gQr4p4YqmndDi8R2a5sWb{G}DYpfg?f)20^68%`h4}Mq~K_p_#ActYnFk~={Kl9bGcw7b-vM04$KB_8zvg&jkzdR3} zTk03B_w(oTr_PC&UD*Zo%7t#_y5ddQ)U&el?dw&2>e}Gs8&~0Ur)(O#@P1}bFAyPH zqK>Ul$KJa%zMrlA+|Jy*JZZYT48gUX?Y8`*h3g`N4cM2nSt}d2T69P9(6_BW6K=Wg z&eQctII@RjbzH1lU%3!A@KcW@NhFApX{c9=#&v#mC34#%*Q{M@TetM5&Tg>#5$l?I zQ6Dy#>i2ysRAqZ^tJamBv!PzBuyF2MyQ~*&+0}j(RNUWTJ)4BapV>1!e56|Y>d4O8 zdX0DKa>M%oz^`j4I4K1Fh>Jx-HO<)+ZnJ?n$eE^7Vu*%}?Dh~j`~xnCrV@EJZDOcU z84!vW4$R#tHEN(VnZ_SZ_l@jwy9^&8;ZL$zJt*XRO0`NU|lh|#1>DqhZ^!fjpUL>e3G%|L*k*y2En5E4)T5{Cp;8mhZ1uR27#3M(r_knC!0INdMY4Ki&2sAJl z$-&NmOe2EM8G#)diG>w_e1?E)kOTLepo%mxWu%Q~5(y%5jEp7+nnCDtP*#Fm#v7>- z=AeHz^)-JR#t`{?xV#lAm(hji;%fLQK_F zxM@RI&6$(&bUYnZcM}eiHvP%l+jv!74(sc(?V38oSjCX4yG9zbkz_OFJW9(=NX=9> zv3g`s0QI$p18^WaaEoF|1N3&yIvglRPHlQ4oA`e`J7d)1(f8W1(|gqCT?ai|%KS^_ zhG+g#h^`Zn(k}5GIx^2s#av=v$;v?;&g~bXP?8vvx1Y1#;O!5s%N6VQ|L)L%d0AS+ EKbnt9ga7~l diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/MultiSig.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/MultiSig.mv index 72dfd734963d72e3bdb0b95214b8000d04d625cf..ec941556b6253cf514674455cb849b026642bbf8 100644 GIT binary patch delta 2336 zcmYjSOK%*<5$@`qnn!of?9Otz%U!;f%YBd(NlW6ZB~qkbmP|{QrO0vY*a<~N^aD^t z!Bmjw5Uc~_l0!~&2z(3>AcrI;9(^_vz%UTxXC#0RJ_HDoL%tq4u@~4vcXf3=zWTc6 z*NdMFM!%i%S-c)%dpgQzNve zjgKqoX}_I)(YLrsLJB1U!6Foqh(%%vS{(~vDni&0JFY~6#{4P_BS_hS`FbXZMqVjW zI1!mt6o_iT6p7rcYf((0s3#h7+#poLq(U@<4EqV=jawC%wW|chWUhpmG7!^V%+$Pc z*1MS-gXq>F=Eos=jV4a|6D=VI?bZnE;p7zL!nA^1oPo*G%q*5?I$kc%K?XbBu81y$ zMyOrt3fk-SDWuE&0fq9)kVJ45=X8x01zle{Lt*?fEt80Etac%9zBC{~uk>5c@1G?S z{Ob9Zpj$oE5sz-KD-z*rvX1`|H;s-+9@e-rV((-+g5t$^M{^^5}=&wv z-u**H{7!SO*>4V7!c{4s`?#cXGA_@k*JorRqawG!4T1n^I1!p zjMx(Oo`jCXeDPa&&MR8# zz_EAi$VOV3$h%jwJTT-!%V}uXMZ92$bl}Nd{u(x5V<{LWEk>jG4u2ERrNOwnTkrrpjlA$WsC7v$Pntq|uR1NE1 z?_wGI@}pRbOTtPcw_xuQnIIKXT5Jmdh-q-qKjg1}J!Jqfa*iU8xkp)PnJK3`s{Qqe z$!WUyGM%88iYS{qG(NhSEo~+Gk(Dl@z~7hKqND1*X;ijQHMs>tv=K=OKy1u9U>*In{Rt0iQjWi@g&HO3QV)o+jle>Q-)tVBR@ zOy)lC%fJLQ#UCD$@_Ht5E#;;rxCv6}>Y!MFOUjKI>BeOZm0aCKnvG&qX^on^@l7GD z83(a%`Z?6ZZo-#RWn6CA&{I+kd0C4J>(I4H^S3Hv_CTX`atslu3WO(>Cm^{goK(Vb zu7IDudOvj2aiBP<76MMNn5tXJCMs#-pM;xE@>#7K7o@~+mV#~+d)4k}#u|-cjd8P9 z`_eO=w~UsJ(&py+|Ik3`M$-q1l*6ogDGwE-keoDlOUi{b38<< z7&j)7CPep4H3nW?8<}VoZ%iXh)PmiDM>sJAGR)hmO|8~i?eM-4S?YuhOyGJpj7_Sm`T62M`P^v2BbaNkrCh9O zpdwB&h&F@q7&M?n;v)r2ZVk$K!b`NRZ!teS0w7+lLsjK@O+bR7k#2zQaTZjQI)u(^ z#&1kM#(m$icIoi;&t5njmG`m|!30yFqmwNkAwlj{ps1~C@FcP=0i1pTV267;?O@~# z5?_*9^K8gGAxuJ%_U|tNtkMmA{cgeLI^RUA^BK2ja-CspxFuWB6}3O&+eW)Hd}1T{8nPwuzH6dm}HCVHsnWepP=wiz0b!ct3+VD0YjE;#3x9=8Q(%%(-l*b ylO<7JpG2J!&qjKR7|;VGox|70#+a^=8fzf;GG)Liv)HZ3sp4+EPAkPxec`_|S<$`# delta 2720 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 HWEuTG(EU63 delta 1006 zcmXw2J#Q3A5UuL&s_yCT>6zJ`UEAxg1!IG43>X_2Bt%3+!Y=>|PCi6(LZ|adm)r&< zq<0$-b04FQ$K|)lo*$SRC^{QUi*Ssh{r^(Be|APU5fG|>{9ew9L znlE^fUaPNYUzxAQ{aw`juGsPa6utPV_-M)x$x8x)0u2TT7%Vs_z(artWd)ENcyAHF zv<8Yr3%tqlMPxv0gMiLifJ!tbP%B{?k%FEffPM}faBsOmaFk&EeHxO>CuV9~MGOwO^Bc6L{kyYIAO3dqZHBY*Z|&q$C=>ET9!oZGc+0R(DS28^GE_ z)3<6H$J$aEpero)a1W^pfJ!a|ap~r1%q~XDGu13?yz#b%&Tr^MhrIvh?SDNvw}=U) zb~~xTn=V9>Ak$iC7G`6Jp4zSq+$=?%bZ#vfl+3aYET$wkd<7!6seL3X0@d7in& zSHDy9R2eCDb@VZ&*fr9Bj}PV{znWx3KI#E23Db{6%SEI>dX4tQ(Z+)R?4L$|Ul2+K kgFNj}G{n<6IolB(1ciC%!8c<*oWC+#RQ|PQf2y4HH-cYGn*aa+ diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/ProofOfFee.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/ProofOfFee.mv new file mode 100644 index 0000000000000000000000000000000000000000..a771031471b456e2853293b8ce3c392f2da06008 GIT binary patch literal 3817 zcmZWs&2JmW6`zlt+1;7pk}It~E$fSvWLdUb+lkGlX=BH6QUn3&HjPo_LafM@vvz;Ey=4Aqz6%@QT@7%65=J<2h#-=<#3MdY zL=)o?(!j!Z2?;<$nv4_Das(lv1a86e30b6ykVs2HmJFt43$3sQA**(|7GPSpxGQ$r zXkxnB!n7G;+FHQ0y@+WiQbZgwO2l=>2t5MCZ(wq7Vq&+XPv}pWPyCHWg@iT6uP`n|*J zlsFIIGySjwaFcDZZMMU9S(|P8yZ*Mn=kKw7w&h>CJpw41-Y_ErKmVm48W$MqS7)EoO+CLk8#SSN1I^ldSGu)U_cgB zP;iLE#OwsQGsu2jVC=3(9D78H0D1_8f7N*_pIaKs*M5ZSQLaJ5D>0UcSsb&=iW{fk zhZX*)kV5iGPpgS~l4se;uTMTq68%A%oImXMv&pDb7JihCPSR87<2W62$rj>@}tuAW zFes8yF)4nVJdg81c&W(4Nxw|9(PBIqq-F1`2}GWx{n+Akf0F0PsO%l5gVmFCIP4Wk zTo%1}H0YfsWpA9P{Uowb|AKululOsAJWmE`JZf67$nr87^q$4T!bwMIY3yX#4${%- zMzuIiMoEztz2mq@hUqAoaf*P7hj|hYUIJ6*aUYDD<5c=069&U;gZ;-NX849j#peA%1adrQTG0eBU?>_jBz z_wLlt?HYRUezV#Yt@&dW%$!}`<{iGLIAwgFAMk6us{VB8b48*s+D5@pnoytF<&v?5 zgG4(#600?Kd7E#F-Fmsg55!TuTHWTi#oP6g8pp73O*tL@o_JKDH5jiO8FESuRa7zg zU$hlF!Ykp1;R@xj&7X?j`^;mg;FPW&DRM};Bd#fOL=6wu3{$*CBE|N3ODuYZinR)X zRx%wshN7lzh&IqP(w3Ojn{O;@JhRP)(6w*S)55DRd?iH_I%`HXr(HD1*&ds9<230h$jf(4(57kD$wP7xNgtUC3X6-ZWEMImD8yUulD z&{MSAWJ|iGe6%nm*LK5oj)=jNqQ%kXTP)IeL_`cP6-syZ6oDHVvfx6-4)@>I~fr<@%86AtzNIdOSdZFPlQ3ZDQ4`IiMKtQ1GN)sT8vX)|e=th8~a2rxNUFXfcKtili zsy3yK8}U%fOT*ziSE)AtmH7HnD-SVO%3Y}it+e^4ViE+1x)&K^fqHM*q8bQ$qr(Sc z40UjPZr6uuuVd8wzVXDz%DtpFu6WdtU2T;_;;?mlE$p2Q54c8zToztCQ1p;)!)q&Z z5vbL#fdzUKcNAxsi%?1);0eh*FqLbUcg?T%okO@g5X+jlygpw8UAaJRlByapJo_m1 z!&z|%Y;kCb$WYW9y00kn>r+S}kXB+1!^;t{2#75{VSsGGdT;B(IBSk4U|%Rj0~#rM z9SMq>bE%DDO|n!o$BHf~u31wov4&0g{eMy%pH&c-NxYb=VKg42Gf-961@*NhyT)9q zYP_29e0I7B)I~jS+iXN2{q}q|KDMl;Sz&L?_p=hy;djJ+CFi0l#RKgBZ&nIyVR`U+ z)ZfU7RWRmJtyPDABK}TMrQHtyjhFyX9hB>SMKvY8FmioGizZ)UpwS(E24c%;N)yc- zQPUvzJN#?$C%m6)qMFfi#Yp^(;);OPpQ-rkJYCJKrqhCoe^AUUu;D$}uEL92@Z<2x zPwbB-j6EK?G(0>|91(X=SRI5}QSBhUh_USr*A6cO>uXAxrlDha6-)Faq=K`gm%TSyMHwXTbn0I2q5w}Iv|-C-@8IY+og;SrtX226zepol<41$P1Nwpldg5(}+a zH(C|BrctFapK8pe8ZTIio3~*25t10yXD+jBsqxypA@;!C?RseRy!uL93KtdB!LKGr z!Y{ih3|~(V;o(-mcJxHF3$|D}=GL{TV^F>2nVG`+xqbo-Q`dwfyA1X!f# j3M%X6o$BCGvEOjI0R{4+O@Rbe!@)BE7>k5F{8IftYs=Ke literal 0 HcmV?d00001 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Receipts.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Receipts.mv index 9fbfadc9ebc52164319f94bd426421646d924cc5..e5b13122f84502edbbc71ae4d06feab4e8796047 100644 GIT binary patch delta 481 zcmYjOJ#Q015S@>m-MhK<-d$pxh6qJU6oobfxk5sUktpcsEihNO2q4=@%5j@I_d3bjci|3uD!y@} zKe&#+_?8DZp{Q>I0RjPo0|8$E1dE{{1}L2Xs5e&y0d6eKwOAs!tvE2hooe&L7OlYp zRB)rM?L!3Iu@0WR1}e1FN=rf?0R@pnIGf1&({TOeS*%Xy-P!Zm?8Eu{)%yFyh52&Y zAK;_5xm?Uw-E`5-y7|Y|^x~{P#aaIq_m0aq%VoF7luh}+nF<$G2FgjfR^H69tI$gS z2cITDRyYD8QwUZ6gsubUoaR-3LWft6A$s)0j6Mq0ZNpC;}e-=-pT|szX6q%ZGgNq2#RA{)xI5z$z^RADrlo(W?ClG JktVOr5un|EEv9nS{ENwgy8@bM2@&tm9AY!c# z;3N0|g1wc_9tch#`MxjnWhTkH|8|py#m|xfKoG zaOff!Ye|D$RN%x4^+Ornziem5oqUK3`4-QL)A9KH^6KRJB7fk@NSpc}T80aC3zb4q zsPEAZ1sclhW`huld}Hofqn$xID53F!BUmPH%baL9!8M3pd=1HTCTe;2cY0*8G;f!5 zlf-q@s=z{Xy7-C`w;eY{3`#HsB??TU9$4D6yS=V9i@iPtrP`*z?km&}=$uqRZ_P$) I_V0}F3-zlcqW}N^ diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/StagingNet.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/StagingNet.mv index c89bf2d449adf746fba4c621885d27d585fd5fee..f7fb5f82199e1fe192e201bb13bb22631bf2a917 100644 GIT binary patch delta 66 zcmeBUn#eRko>PWvCnGD*K1QvH8gsdrIc764fWgG0N(zjM%v{_IjO+}8%<9|>oI(t` S3`~rS3=E9S?2MWWObh^rUkG6U delta 62 zcmbQp)WPcxJtHg67DmH~8gnO}S5jwCWai>#U}TGZ&cpx$g3RjN44gs?x(rN= Pj0_Bn%x92}wv5Na0@~ zTUZNP2{u8n5d;fM!OkLx7B;pb78cHKlD$`K4#WJuJ#)TqW*-;dmgb+0{4fFl3_^;f zEU&&n@d=yqCw@flJ^v=u3zebQDyKiFs{N{-riOkOpUiI^K-B}FCJZ6SmbAdfh=9h^ zgg|FASy$URaP?e1suMv}Cxe2kQ>C)2(-pVI^FSbGYIP778U*Yj7~r$65u1|+ayCZ= zTeKxAQklxOVykx8j!?+Ae z4;ow>Kw4`t7ZyM^ID9UaaXoKQV@zq~`zdOBFohY+@PG;D5pBjmc0hUMKcxtmjFiQz zvC`N6anHp;W%$akhY#s?A#asd$AYCq5Pqh8N4Vz4WUfyhc(;c0R%#iMl(S(F=~AB` zdDqLycs8;*+lQ;F=-|nLFHN|{pWAoGhn(rj7!k7L;xaqf@za*OZL3#u8;UB+(L3rd%gsZyg{4&i3{VwMr+}M+`-vF* E1vYnU=Kufz delta 750 zcmYk4OKTKC6ov1ts=i%aT{BMiboac|Gn2%2OpGtaSBwEM8&|GGaU+qPwv%f2kDFHqo*{28iF_WH1K62pp|2UK&y?&>hTz? z7R^#mB&AN0)auDr+v-}!KI1wNh*S9x#Kwq#orVzj8EX{jh!UOZj8bY*OSg4LcXf|4 z9btkU%9Ea8gJ$hkRrNa+WNayD~mpARwqu{!%b#@MS zWoF^g!U|rT!}s#>1Ls`93l0{FE7sCNiKtHxt1H<%4WcDYAt;P$idOi*%Owk#F3*y! zS7&kMFF7moGnkkUL1FtjI$flYQSww* diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Subsidy.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Subsidy.mv index 08e2246228143284ff873f7862ad1c3ddb16f8ee..cf21ec6118599d08edf8f1e74393c49f7839c8af 100644 GIT binary patch delta 146 zcmaFQ_l<9Yl<-7G_M1$1SU9$_3$Pt!&*j;~F?FM^0wW6>8xQN|0LInKj82pPu(&YV zPj+OLl3-`#V&!IGXJTizVBuo5VB%uqVi!|nwwheXssU6oi`7fiii?qp#ez|UhmDJg ri&ct;nTvs)aq@RoEk=jQN^IU@)<9vfJUbTy7l#EiP#s7?BilOw?v5H` delta 160 zcmeyy_nvQpl<)*b_8UxhSU9$@3$Ptw&*j<3(Z5kwfsvV&jc0Qp<7#F`$H{+LTnz2_ z7`d1%7)5wkxmYcjc-XiY_}E1(n0Z*Z7`RxuS=gD_nJrjAQe13Y>|%<{mXk|ZH5lzC z&t>%zw&Y^uVgc!8<6`1smEvLMVwn7gRg2MnvO1f$h!s!}EXxiwiUVjQ(Co<_Z0`WU CeHzFB diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TestFixtures.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TestFixtures.mv index d5979e47cecd9345eeeeba63ec9fe92867f776f7..da129c513b692a306603b102c1bc03d2b6423e17 100644 GIT binary patch delta 929 zcmZuwy>AmS6!*v3m-9K-T-shg63Ryh7?BWaipqe5Ixql3>3X_coYdl)i)^Q%Q#NL* zj37QFc939aM&dtUVFYz!1tjc#L7~>&?>)cwd%yQ2+do%-++2Cp+z&kfKm`Jh`4i|p zgB9``-u1u3Z@BWA)aX9>c#Xebed<^cAb^1f$lh9W3<2Oa0;&!o2U9i;YR-!t)E!Ja zm~k-cvI(|2b53R+5P%mj0p23;0cp4qNRuIp=R(UTOS}pJJRe!r3pLyOVr(@~63n6b z06;cI5JSo_BMdVPVL*ws4BN#Sf$p<30;x5~w_uI)ZISahfgIa%Y+cMZgf{E)kr^tX z!`o79-^%lH*f;FHD$DM@?z#}Z->mGqs!MN@PZ)TK4)vrQK4c+gD^yWk!~L?Q5&tmYqZwld7JgZP^~qi%nXhAy-njba&XPUh%RWT*2mqjQee$7^j87*q@{W?HYCJ^F z3KK-n3RC2t750(60SAr$(w=NI8+Ob=^WQNU;z#Vs^Z$|@MaRic&E+v&V<4V}@eB`I z_L|$@qqft*;`EQ}AB^k5oG=;%Ex3$l$@Qv7zv4r73o)OOgrh2EsD+|{(H7>Afe_Bb w3%n9l7&;-xi;Qrep%tfgBAswbrb0kpK6WG8r_u<65QiR$-5yc*O58%=H%Wh&?f?J) delta 463 zcmexu`^U0=q0DP;76t|ec18vkW|k<{I1cu-WlS7B%mQq4m`@t>JT?2o1e9iEU;<(W zW)Q&wB3MBL8;D>B5gZ_b6GU)<2yUQq1|ATL7ew%Z2!0SD03rlIvO*veg%yBCGB9#6 zF)}kU@`R)om$+qCl#~{w7PEsmd8s9nlNkSsa1^H|mlkD~RB~k&$Cp4PHnTB5kdzQ) zW?{23SnnkVbfY>u0}~_Acm_5>!O8z*#9~n;nV6WNk|=tZnOLw1voNt@6J}*%gV|6h zD~4u0I}-;?a=xq@n)RGa+}I4{V&cIj%+17$O_+y?4`zdsoH8#16B{TfL4b(?0IrKU Aw*UYD diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Testnet.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/Testnet.mv index 0306b10497ef1113b10b8d44609c4997a5543340..b1ddc41983ffaee81088195fb371cd666d3ecddb 100644 GIT binary patch delta 280 zcmY+8Jx&8r41~w_+xMFdSr8o!3L=U`8k$@KdZg7#NfC)Zu`8~SmTjTp9*84^gV55@ z#Sf(jF08S}{>C5tA~)|R-^l<71k2V)92c|b=4;|gYft{h%0Ae{Cr$b0At8i7c|a!xLji2|JQNsoa%~B+JFdFR z?wt7H&{V^<*Fwi!#Ysf192P1TsU(b5f3EeqKxoiHn5jf;Ad({-6~BbH@sB%fF-3ap E3mSzDmjD0& diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TowerState.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TowerState.mv index dfbd37fecca9706356c145546c57aaa8f2b9b628..343fefb5a96f2994f97682ce79c61c08c3dc6530 100644 GIT binary patch delta 875 zcmYk5$x;+S5QeiVyLzdv9%ch(nr0CO6$Td;VZa4f9C5&5am8J6-}ik8Pu@JV2d_pL z!NG$E3}3-lFv1gO!vk+%CI_)2@{6qcGyklLivBh7XSnt$`t4f);0p+4n8UuWXf0z> zt>Aa*EZWOy_gy||f6PbvTfSlz!iCmgVR(=l1V})zK!FVoxZr^X9}EN%AmIYkQ6wo+ z6lsbKbwE}kK)pq1P=rRi<^bf7ogs25S*LME#TcE!M#ln;N79jyGxMwNEP?VRXiY=hn)dA zJR(IsCTn~`vU!SK0?f0bAU^M*5$+4RZ?}2b+ebUE28RUTYo79EM1Zd4a!@W*U;-wg zQYb?erj`bz7U*gjkKw+h_n7wLMKfQX&~g%wXjw%e-6@>L8JxwVcnpu@36xTt)C#3@ zO3OJsjc4#Ip2PEKNh-R47g0%T603L#FE7mo<3TW;${3YUC1q@F$6vyxqHEJ#S3iRq zwdlZlRbAV&w5#m`Myf|!@k*Gl(K0lywrqOL)vv)=s!`k8?ZjTy|F2Ufly*zDakP`| zLLBuSv8MS>wus3vYosrY7kDLSfIRU(PgF_m$`bttSnBs7HKs+XxecB8XVY6T9nVE& PF%y4|+Qn@ABl_?cU?Eoz delta 990 zcmYk3$x;+S5QeiVyQ;gZtC|4@m>EV97*GTk_6B!R85NLW5pfqqzy%QjcSmm?yp5g> zPd)$#41EX>9(@5r#8=QPA`mO0zR1q}^RMixwXW~o`48#UzyW}OL7Jx%*tUYsD#pbh z{KDPOa;?Psn2gDlWLkYo_UZSjuT|!ER|hpP;DF$O00}O5;DdqyG#CguK#>O!qg_n9 zgmx+IIQ2joM}TsNP$3BUgmeLtNad7I-<67xw%8I7wrWBZdBQe}Y77BtY*dScj76R8 zt+%=DSOl=cMh&*Glg5Kaize&0%VM|1o)}?oF`*gqG*XM5tJMnIY}8&tQHK?FT0|CI z*08&juul>8+d~dm9E?--P#NKHIpIht;b;Y+MR}$(21I zn1wn+4vSQgOJwalq_TO04GhfVMn-(nL`V2fA)@$Ma|=D@^A^gO7ag4poV-2jCF^Do zykdz2WHWux4+GGb$-*GyOfE6BT+bEr45H$QSZKu_DUMA}EKV&iVTmur-2BY!LgBTZ z%nm4i1_u?-A>-Z<4&w-p;#nNSb2yHiv-3(IcP}V@5ij9oyn~ZnSFygdr#!`Ku}n;C=6q#TkioQQQoj5_*KAh? zt3~ZU4Y!h%HYA|;Uti_g7ZoZ{rVg7$>!wovY@`>VrFqCBH&iNbBB`}p-N<8zk*jpP z0kJpGY_m1c@kWfL;@Sxu9fo1#$zK~yA{3Ep!pLvaMy_pSWhlwY`)?>u#N?-%^#MS; dp-W|E3S*V;*l=O3GRsB^9qAf2S{P5i{R^>cWa$6^ diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TransactionFee.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TransactionFee.mv index 717e5b4bb49b1c853a0ef4c7168419b2a4e9dccd..9f1fa9bf84506c367c6b1441a4f0ed7886046241 100644 GIT binary patch literal 2130 zcmZ8iOK;mo5Z;~TE~#CLBK5Ko%Z_b1b{27gfd7wbpi{3?C%yBx~DIU0kyKFSrS7aau2Wq4a*)2u|lEEmal7ny=Rg5-}7vR+gsyOgU zr7Scs#Zgu!TY>Sk>wrpctqjJKi%Nw6wTTPKne7lNWP^Yam>T2FiV4JWg!vOSoIq*? zI@d{{PQoZ^9J*Rnj=(O;FnWh#f(jdv!A9r?u|8eqsrNLG(;}XfNtS-5b@O4C>j%?m zu8Tq!)}utvn?^iM=DH~3`GS4^;A{RQo9Ti*d-O~^&hsoU#5a0UW_j=NBAc8b$`|nq zoj=jXNm1tK&V`~IPp47&GL4>V9Zi;buG7hRV~j-@P0`aPI>OAltX$>>WpIqEc%CiO zGAgrZY9N#GveX@8s6$M2G>@m+GdhD_g%-PJSzh*6rHLk4k`^mSnWRaX#Ixj;9$kK3 z!qz}oQ{77UiqAStCn+k-=+Zd#PI7KG%c=DoCx0|K2Wj7%1Z=+_%Ej~n@M_#L{B3;Mx}PIcGS=HJUi7yUEDvySk?n?QEL3fr8>ZuX z1k9YdArua})wBL+(|Z)m1ftBQ9}=V-KOt;EHTH&H&<`mSxFZ`iyIAEBmKFNY#QA}) zyWJ};NOIs}Rc0HIc0;$1v_a4U4{_;U7n|6Y^bRs3!MD07Shp{sW%br2DQK}Cw20ZH z(ddFMfh?`USXa`1 JIMlG~{{U?UY>)r| delta 786 zcmXX^!EVz)5S^J_&&FQcvD36oLkgupb13Su7!||;_yO+7N|R9KKq4iM1QJr<#)XqF z95}!Y2|j}_;0x##PW=OB*OjcdyKmmS+4aot>?+)R8~n2x01||ZvVpq)8TBt51b^@Y znoD}GTbG>i6%V3Mrft6%9e*_+Dfu4i^k>MDh(Mq~LjVj0poM@$+Tm90aL=LEQlkZk z0HMc7vcQ7cpoUm0!9<)O#Xzu)0YIii9dw=lHpMbLs%ZTG_&sn zH$x}51(D!^6$Ran1<@NFwn>OPxk%Jq7rVFV$PzJg%!$0S!&}_tZQf0L3@N95Mvg&h zic<*0v0O?vXh~36CFmo@f}@Q;py%~e22(QPUAq0gSuXQsGiaD z7v0fhQdV!~<*Vtm9Iuzl>3sY)JYO$8v+7+;t8(;uv7T3DwJ0aERkfU*ud8X_1*+v} zz8a0I*`iUGA&^U;HZ8VoV=vmm+biWNkdcD6zoKhhXoXPpsZZn zKyHT-6l9@L58(-r`@zsU%2O{y6*a2%u+S%GG58o`vh;w8FvbW; zdLknjHnB$#%P&8LBJiUGnK-%};U(u(x?4o#Mg=+Fb4BGUme>)>;2DriqRd_qlbc7# b(mX9tv4Q=(J@hu-Ua}IILs3Yd<+1+(qts0! diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TransferScripts.mv b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/bytecode_modules/TransferScripts.mv index 062636ac17f3a23d1c0696c60a95ec4a70f15b46..ae8918f2bbe847a345ef3069fb7978ca18e9fc36 100644 GIT binary patch delta 189 zcmWNKDGmZb6h!MU{d<{am_`vou;U4iJ0Q3V8WbqR1U-TyAUFZnAVDIy1YM%?l2=KM z?yJZ9^4BPUNNBmuve@WO-G1w@bmDN8&PJK%r(CFx2n>P3!6+(3Ds~?5)gUlI6Dh25 z2Fj)cnz#UJBUPM+TE!ahEKi``yks|=d*Q&tV>Nu39c$aJ+GD%;ur5YkI1PTX( z=crIsSn)up9vUXNmJ~iY0}o7Vp>qK|Y^bg|5NKpAcw9mD(g6MakxF3Kza8Y^`Q384 zS}Dqrk|IU6+6YCW<02FsfQl1P<^nWPBszppYD#XBBhXQB z1-yyC#n<=Ov-JHM4!V6`ekTW@B6QN-xd-)+x8aRGxjIUxU$V~6?uU#ZFa!=Bih#;? z)NB%k5E7|r4rJO?HG$e_GNBsO`2;PEhfK}+i@JupH0Ndwb>J(rJZ}l&o%g%L#aD^!z4Xdwiy^vFRlTfL{u4SSH#$Bw&cI}NUbM&@xzw2=l_*VO u3Mgr?Ew8NEEU|T*Tg+?+v^-%NsHE!=ijo7L`6$yr+sYz{r7aAZFn$3QHW^X? delta 444 zcmX|6K}rKb5bW-mp4r`*-RwqV5{(i;NDhKG{e*uA5u>bxToQ>0Ay3c{@FpmpbMgZo z{e(Afe!`we>_bsi-Ca$;nP)qHZT&b601-m2@@qXcJUg}T_(jp9&drPN`cJ(gnLr>= zpn<`Fg-A5SB#;Df3c-3bf~iHpEQ%4Zk_hA&0~YMSR6T>*62{wc47$ed2=tCe&~-6& zLl`xMQ5@KACJkmbi-%)Io{W3J7+hYIlcXG# zld?Z7?+43od{VZEmNRP3`NFAYt5OTgwsdCLxk#SvoQnG=q^(C{p Xpm@= diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Ancestry.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Ancestry.md index 9eaf2b5e6f..262f6b28c3 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Ancestry.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Ancestry.md @@ -16,7 +16,6 @@
use 0x1::CoreAddresses;
-use 0x1::Debug;
 use 0x1::Option;
 use 0x1::Signer;
 use 0x1::Vector;
@@ -67,7 +66,7 @@
 
 
 
public fun init(new_account_sig: &signer, onboarder_sig: &signer ) acquires Ancestry{
-    print(&100100);
+    // print(&100100);
     let parent = Signer::address_of(onboarder_sig);
     set_tree(new_account_sig, parent);
 }
@@ -94,7 +93,7 @@
 
 
fun set_tree(new_account_sig: &signer, parent: address ) acquires Ancestry {
   let child = Signer::address_of(new_account_sig);
-    print(&100200);
+    // print(&100200);
   let new_tree = Vector::empty<address>();
 
   // get the parent's ancestry if initialized.
@@ -103,31 +102,31 @@
   if (exists<Ancestry>(parent)) {
     let parent_state = borrow_global_mut<Ancestry>(parent);
     let parent_tree = *&parent_state.tree;
-    print(&100210);
+    // print(&100210);
     if (Vector::length<address>(&parent_tree) > 0) {
       Vector::append(&mut new_tree, parent_tree);
     };
-    print(&100220);
+    // print(&100220);
   };
 
   // add the parent to the tree
   Vector::push_back(&mut new_tree, parent);
-    print(&100230);
+    // print(&100230);
 
   if (!exists<Ancestry>(child)) {
     move_to<Ancestry>(new_account_sig, Ancestry {
       tree: new_tree,
     });
-    print(&100240);
+    // print(&100240);
 
   } else {
     // this is only for migration cases.
     let child_ancestry = borrow_global_mut<Ancestry>(child);
     child_ancestry.tree = new_tree;
-    print(&100250);
+    // print(&100250);
 
   };
-  print(&100260);
+  // print(&100260);
 
 }
 
@@ -183,40 +182,40 @@
public fun is_family(left: address, right: address): (bool, address) acquires Ancestry {
   let is_family = false;
   let common_ancestor = @0x0;
-  print(&100300);
-  print(&exists<Ancestry>(left));
-  print(&exists<Ancestry>(right));
+  // // print(&100300);
+  // // print(&exists<Ancestry>(left));
+  // // print(&exists<Ancestry>(right));
 
   // if (exists<Ancestry>(left) && exists<Ancestry>(right)) {
     // if tree is empty it will still work.
-    print(&100310);
+    // // print(&100310);
     let left_tree = get_tree(left);
-    print(&100311);
+    // // print(&100311);
     let right_tree = get_tree(right);
 
-    print(&100320);
+    // // print(&100320);
 
     // check for direct relationship.
     if (Vector::contains(&left_tree, &right)) return (true, right);
     if (Vector::contains(&right_tree, &left)) return (true, left);
 
-    print(&100330);
+    // // print(&100330);
     let i = 0;
     // check every address on the list if there are overlaps.
     while (i < Vector::length<address>(&left_tree)) {
-      print(&100341);
+      // // print(&100341);
       let family_addr = Vector::borrow(&left_tree, i);
       if (Vector::contains(&right_tree, family_addr)) {
         is_family = true;
         common_ancestor = *family_addr;
-        print(&100342);
+        // // print(&100342);
         break
       };
       i = i + 1;
     };
-    print(&100350);
+    // // print(&100350);
   // };
-  print(&100360);
+  // // print(&100360);
   (is_family, common_ancestor)
 }
 
@@ -322,13 +321,13 @@ move_to<Ancestry>(child_sig, Ancestry { tree: migrate_tree, }); - print(&100240); + // print(&100240); } else { // this is only for migration cases. let child_ancestry = borrow_global_mut<Ancestry>(child); child_ancestry.tree = migrate_tree; - print(&100250); + // print(&100250); }; } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Audit.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Audit.md deleted file mode 100644 index b651103134..0000000000 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Audit.md +++ /dev/null @@ -1,82 +0,0 @@ - - - -# Module `0x1::Audit` - - - -- [Function `val_audit_passing`](#0x1_Audit_val_audit_passing) -- [Function `test_helper_make_passing`](#0x1_Audit_test_helper_make_passing) - - -
use 0x1::AutoPay;
-use 0x1::DiemAccount;
-use 0x1::Testnet;
-use 0x1::TowerState;
-use 0x1::ValidatorConfig;
-
- - - - - -## Function `val_audit_passing` - - - -
public fun val_audit_passing(val: address): bool
-
- - - -
-Implementation - - -
public fun val_audit_passing(val: address): bool {
-  // has valid configs
-  if (!ValidatorConfig::is_valid(val)) return false;
-  // has operator account set to another address
-  let oper = ValidatorConfig::get_operator(val);
-  if (oper == val) return false;
-  // operator account has balance
-  // has mining state
-  if (!TowerState::is_init(val)) return false;
-
-  // is a slow wallet
-  if (!DiemAccount::is_slow(val)) return false;
-
-  // if (!Vouch::unrelated_buddies_above_thresh(val)) return false;
-
-  true
-}
-
- - - -
- - - -## Function `test_helper_make_passing` - - - -
public fun test_helper_make_passing(account: &signer)
-
- - - -
-Implementation - - -
public fun test_helper_make_passing(account: &signer){
-  assert!(Testnet::is_testnet(), 1905001);
-  AutoPay::enable_autopay(account);
-}
-
- - - -
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/AutoPay.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/AutoPay.md index 9389d7c33d..d4d7504094 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/AutoPay.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/AutoPay.md @@ -37,8 +37,7 @@ This module enables automatic payments from accounts to community wallets at epo - [Function `find`](#0x1_AutoPay_find) -
use 0x1::CommunityWallet;
-use 0x1::DiemAccount;
+
use 0x1::DiemAccount;
 use 0x1::DiemConfig;
 use 0x1::Errors;
 use 0x1::FixedPoint32;
@@ -352,16 +351,6 @@ Maximum value for the Payment type selection
 
 
 
-
-
-Attempt to make a payment to a non-community-wallet
-
-
-
const PAYEE_NOT_COMMUNITY_WALLET: u64 = 10024;
-
- - - send percent of balance at end of epoch payment type @@ -601,7 +590,6 @@ Attempt to use a UID that is already taken let bal_change_since_last_run = if (pre_run_bal > my_autopay_state.prev_bal) { pre_run_bal - my_autopay_state.prev_bal } else { 0 }; - // go through the pledges while (payments_idx < payments_len) { let payment = Vector::borrow_mut<Payment>(payments, payments_idx); @@ -648,10 +636,6 @@ Attempt to use a UID that is already taken payment: &mut Payment, bal_change_since_last_run: u64, ): bool { - // check payees are community wallets, only community wallets are allowed - // to receive autopay (bypassing account limits) - if (!CommunityWallet::is_comm(payment.payee)) { return false }; // do nothing but don't delete instruction }; - Roles::assert_diem_root(vm); let epoch = DiemConfig::get_current_epoch(); let account_bal = DiemAccount::balance<GAS>(*account_addr); @@ -687,7 +671,7 @@ Attempt to use a UID that is already taken }; if (amount != 0 && amount <= account_bal) { - DiemAccount::vm_make_payment_no_limit<GAS>( + DiemAccount::vm_pay_from<GAS>( *account_addr, payment.payee, amount, b"autopay", b"", vm ); }; @@ -807,16 +791,16 @@ Attempt to use a UID that is already taken payee: address, end_epoch: u64, amt: u64 -) acquires UserAutoPay, AccountLimitsEnable { +) acquires UserAutoPay { let addr = Signer::address_of(sender); // Confirm that no payment exists with the same uid let index = find(addr, uid); assert!(Option::is_none<u64>(&index), Errors::invalid_argument(UID_TAKEN)); - // TODO: This check already exists at the time of execution. - if (borrow_global<AccountLimitsEnable>(@DiemRoot).enabled) { - assert!(CommunityWallet::is_comm(payee), Errors::invalid_argument(PAYEE_NOT_COMMUNITY_WALLET)); - }; + // // TODO: This check already exists at the time of execution. + // if (borrow_global<AccountLimitsEnable>(@DiemRoot).enabled) { + // assert!(CommunityWallet::is_comm(payee), Errors::invalid_argument(PAYEE_NOT_COMMUNITY_WALLET)); + // }; let payments = &mut borrow_global_mut<UserAutoPay>(addr).payments; assert!( diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Burn.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Burn.md index 2606714c94..4479de9b6f 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Burn.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Burn.md @@ -7,23 +7,24 @@ - [Resource `BurnPreference`](#0x1_Burn_BurnPreference) - [Resource `DepositInfo`](#0x1_Burn_DepositInfo) +- [Function `epoch_burn_fees`](#0x1_Burn_epoch_burn_fees) - [Function `reset_ratios`](#0x1_Burn_reset_ratios) - [Function `get_address_list`](#0x1_Burn_get_address_list) -- [Function `get_value`](#0x1_Burn_get_value) -- [Function `epoch_start_burn`](#0x1_Burn_epoch_start_burn) -- [Function `burn`](#0x1_Burn_burn) -- [Function `send`](#0x1_Burn_send) +- [Function `get_payee_value`](#0x1_Burn_get_payee_value) +- [Function `burn_or_recycle_user_fees`](#0x1_Burn_burn_or_recycle_user_fees) +- [Function `recycle`](#0x1_Burn_recycle) - [Function `set_send_community`](#0x1_Burn_set_send_community) - [Function `get_ratios`](#0x1_Burn_get_ratios)
use 0x1::CoreAddresses;
-use 0x1::Debug;
+use 0x1::Diem;
 use 0x1::DiemAccount;
 use 0x1::DonorDirected;
 use 0x1::FixedPoint32;
 use 0x1::GAS;
 use 0x1::Signer;
+use 0x1::TransactionFee;
 use 0x1::Vector;
 
@@ -93,6 +94,54 @@ + + + + +## Function `epoch_burn_fees` + + + +
public fun epoch_burn_fees(vm: &signer)
+
+ + + +
+Implementation + + +
public fun epoch_burn_fees(
+    vm: &signer,
+)  acquires BurnPreference, DepositInfo {
+    CoreAddresses::assert_vm(vm);
+    // extract fees
+    let coins = TransactionFee::vm_withdraw_all_coins<GAS>(vm);
+
+    // get the list of fee makers
+    // let state = borrow_global<EpochFeeMakerRegistry>(@VMReserved);
+    let fee_makers = TransactionFee::get_fee_makers();
+    let len = Vector::length(&fee_makers);
+
+    // for every user in the list burn their fees per Burn.move preferences
+    let i = 0;
+    while (i < len) {
+        let user = Vector::borrow(&fee_makers, i);
+        let amount = TransactionFee::get_epoch_fees_made(*user);
+        let user_share = Diem::withdraw(&mut coins, amount);
+        burn_or_recycle_user_fees(vm, *user, user_share);
+
+        i = i + 1;
+    };
+
+  // Superman 3 decimal errors. https://www.youtube.com/watch?v=N7JBXGkBoFc
+  // anything that is remaining should be burned
+  Diem::vm_burn_this_coin(vm, coins);
+}
+
+ + +
@@ -129,13 +178,15 @@ i = i + 1; }; + if (global_deposits == 0) return; + let ratios_vec = Vector::empty<FixedPoint32::FixedPoint32>(); let k = 0; while (k < len) { let cumu = *Vector::borrow(&deposit_vec, k); let ratio = FixedPoint32::create_from_rational(cumu, global_deposits); - print(&ratio); + // print(&ratio); Vector::push_back(&mut ratios_vec, ratio); k = k + 1; @@ -187,13 +238,13 @@ - + -## Function `get_value` +## Function `get_payee_value` -
fun get_value(payee: address, value: u64): u64
+
fun get_payee_value(payee: address, value: u64): u64
 
@@ -202,23 +253,23 @@ Implementation -
fun get_value(payee: address, value: u64): u64 acquires DepositInfo {
+
fun get_payee_value(payee: address, value: u64): u64 acquires DepositInfo {
   if (!exists<DepositInfo>(@VMReserved))
     return 0;
 
   let d = borrow_global<DepositInfo>(@VMReserved);
-  let contains = Vector::contains(&d.addr, &payee);
-  print(&contains);
+  let _contains = Vector::contains(&d.addr, &payee);
+  // print(&contains);
   let (is_found, i) = Vector::index_of(&d.addr, &payee);
   if (is_found) {
-    print(&is_found);
+    // print(&is_found);
     let len = Vector::length(&d.ratio);
-    print(&i);
-    print(&len);
+    // print(&i);
+    // print(&len);
     if (i + 1 > len) return 0;
     let ratio = *Vector::borrow(&d.ratio, i);
     if (FixedPoint32::is_zero(copy ratio)) return 0;
-    print(&ratio);
+    // print(&ratio);
     return FixedPoint32::multiply_u64(value, ratio)
   };
 
@@ -230,13 +281,13 @@
 
 
 
-
+
 
-## Function `epoch_start_burn`
+## Function `burn_or_recycle_user_fees`
 
 
 
-
public fun epoch_start_burn(vm: &signer, payer: address, value: u64)
+
public fun burn_or_recycle_user_fees(vm: &signer, payer: address, user_share: Diem::Diem<GAS::GAS>)
 
@@ -245,49 +296,19 @@ Implementation -
public fun epoch_start_burn(
-  vm: &signer, payer: address, value: u64
+
public fun burn_or_recycle_user_fees(
+  vm: &signer, payer: address, user_share: Diem<GAS>
 ) acquires DepositInfo, BurnPreference {
   CoreAddresses::assert_vm(vm);
 
   if (exists<BurnPreference>(payer)) {
     if (borrow_global<BurnPreference>(payer).send_community) {
-      return send(vm, payer, value)
-    } else {
-      return burn(vm, payer, value)
+      recycle(vm, payer, &mut user_share);
     }
-  } else {
-    burn(vm, payer, value);
   };
-}
-
- - - - - - -## Function `burn` - - - -
fun burn(vm: &signer, addr: address, value: u64)
-
- - - -
-Implementation - - -
fun burn(vm: &signer, addr: address, value: u64) {
-    DiemAccount::vm_burn_from_balance<GAS>(
-      addr,
-      value,
-      b"burn",
-      vm,
-    );
+  // Superman 3
+  Diem::vm_burn_this_coin(vm, user_share);
 }
 
@@ -295,13 +316,13 @@
- + -## Function `send` +## Function `recycle` -
fun send(vm: &signer, payer: address, value: u64)
+
fun recycle(vm: &signer, payer: address, coin: &mut Diem::Diem<GAS::GAS>)
 
@@ -310,10 +331,12 @@ Implementation -
fun send(vm: &signer, payer: address, value: u64) acquires DepositInfo {
+
fun recycle(vm: &signer, payer: address, coin: &mut Diem<GAS>) acquires DepositInfo {
   let list = get_address_list();
   let len = Vector::length<address>(&list);
-  print(&list);
+
+  let total_coin_value_to_recycle = Diem::value(coin);
+  // print(&list);
 
   // There could be errors in the array, and underpayment happen.
   let value_sent = 0;
@@ -321,27 +344,23 @@
   let i = 0;
   while (i < len) {
     let payee = *Vector::borrow<address>(&list, i);
-    print(&payee);
-    let val = get_value(payee, value);
-    print(&val);
+    // print(&payee);
+    let amount_to_payee = get_payee_value(payee, total_coin_value_to_recycle);
+    // print(&val);
 
-    DiemAccount::vm_make_payment_no_limit<GAS>(
+    let to_deposit = Diem::withdraw(coin, amount_to_payee);
+
+    DiemAccount::vm_deposit_with_metadata<GAS>(
+        vm,
         payer,
         payee,
-        val,
-        b"epoch start send",
+        to_deposit,
+        b"recycle",
         b"",
-        vm,
     );
-    value_sent = value_sent + val;
+    value_sent = value_sent + amount_to_payee;
     i = i + 1;
   };
-
-  // prevent under-burn due to issues with index.
-  let diff = value - value_sent;
-  if (diff > 0) {
-    burn(vm, payer, diff)
-  };
 }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Cases.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Cases.md index 38eaad8d0b..a941ba237b 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Cases.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Cases.md @@ -20,7 +20,6 @@ set and/or jailed. To be compliant, validators must be BOTH validating and minin
use 0x1::Roles;
 use 0x1::Stats;
-use 0x1::TowerState;
 
@@ -30,38 +29,29 @@ set and/or jailed. To be compliant, validators must be BOTH validating and minin ## Constants - - - - -
const VALIDATOR_COMPLIANT: u64 = 1;
-
- - - - + -
const VALIDATOR_DOUBLY_NOT_COMPLIANT: u64 = 4;
+
const INVALID_DATA: u64 = 0;
 
- + -
const VALIDATOR_HALF_COMPLIANT: u64 = 2;
+
const VALIDATOR_COMPLIANT: u64 = 1;
 
- + -
const VALIDATOR_NOT_COMPLIANT: u64 = 3;
+
const VALIDATOR_DOUBLY_NOT_COMPLIANT: u64 = 4;
 
@@ -87,28 +77,31 @@ set and/or jailed. To be compliant, validators must be BOTH validating and minin // this is a failure mode. Only usually seen in rescue missions, // where epoch counters are reconfigured by writeset offline. - if (height_end < height_start) return VALIDATOR_DOUBLY_NOT_COMPLIANT; + if (height_end < height_start) return INVALID_DATA; Roles::assert_diem_root(vm); // did the validator sign blocks above threshold? let signs = Stats::node_above_thresh(vm, node_addr, height_start, height_end); - let mines = TowerState::node_above_thresh(node_addr); + // let mines = TowerState::node_above_thresh(node_addr); - if (signs && mines) { + if (signs) { // compliant: in next set, gets paid, weight increments VALIDATOR_COMPLIANT } - else if (signs && !mines) { - // half compliant: not in next set, does not get paid, weight - // does not increment. - VALIDATOR_HALF_COMPLIANT - } - else if (!signs && mines) { - // not compliant: jailed, not in next set, does not get paid, - // weight increments. - VALIDATOR_NOT_COMPLIANT - } + // V6: Simplify compliance cases by removing mining. + + // } + // else if (signs && !mines) { + // // half compliant: not in next set, does not get paid, weight + // // does not increment. + // VALIDATOR_HALF_COMPLIANT + // } + // else if (!signs && mines) { + // // not compliant: jailed, not in next set, does not get paid, + // // weight increments. + // VALIDATOR_NOT_COMPLIANT + // } else { // not compliant: jailed, not in next set, does not get paid, // weight does not increment. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DemoBonding.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DemoBonding.md index 738d37b9cf..37b6b734fe 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DemoBonding.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DemoBonding.md @@ -13,8 +13,7 @@ - [Function `get_curve_state`](#0x1_DemoBonding_get_curve_state) -
use 0x1::Debug;
-use 0x1::Decimal;
+
use 0x1::Decimal;
 
@@ -148,30 +147,30 @@
public fun deposit_calc(add_to_reserve: u128, reserve: u128, supply: u128): u128 {
 
   let one = Decimal::new(true, 1, 0);
-  print(&one);
+  // print(&one);
 
   let add_dec = Decimal::new(true, add_to_reserve, 0);
-  print(&add_dec);
+  // print(&add_dec);
 
   let reserve_dec = Decimal::new(true, reserve, 0);
-  print(&reserve_dec);
+  // print(&reserve_dec);
 
   let supply_dec = Decimal::new(true, supply, 0);
-  print(&supply_dec);
+  // print(&supply_dec);
 
   // formula:
   // supply * sqrt(one+(add_to_reserve/reserve))
 
   let a = Decimal::div(&add_dec, &reserve_dec);
-  print(&a);
+  // print(&a);
   let b = Decimal::add(&one, &a);
-  print(&b);
+  // print(&b);
   let c = Decimal::sqrt(&b);
-  print(&c);
+  // print(&c);
   let d = Decimal::mul(&supply_dec, &c);
-  print(&d);
+  // print(&d);
   let int = Decimal::borrow_int(&Decimal::trunc(&d));
-  print(int);
+  //print(int);
 
   return *int
 }
@@ -201,14 +200,14 @@
   let state = borrow_global_mut<CurveState>(service_addr);
 
   let post_supply = deposit_calc(deposit, state.reserve, state.supply_issued);
-  print(&post_supply);
+  // print(&post_supply);
   assert!(post_supply > state.supply_issued, 73570003);
   let mint = post_supply - state.supply_issued;
-  print(&mint);
+  // print(&mint);
   // update the new curve state
   state.reserve = state.reserve + deposit;
   state.supply_issued = state.supply_issued + mint;
-  // print(&state);
+  // // print(&state);
   mint
 }
 
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 89ddbd3261..a715fb6f0c 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 @@ -51,6 +51,8 @@ before and after every transaction. - [Function `restore_withdraw_capability`](#0x1_DiemAccount_restore_withdraw_capability) - [Function `get_withdraw_cap_address`](#0x1_DiemAccount_get_withdraw_cap_address) - [Function `vm_make_payment_no_limit`](#0x1_DiemAccount_vm_make_payment_no_limit) +- [Function `vm_pay_user_fee`](#0x1_DiemAccount_vm_pay_user_fee) +- [Function `vm_pay_from`](#0x1_DiemAccount_vm_pay_from) - [Function `vm_burn_from_balance`](#0x1_DiemAccount_vm_burn_from_balance) - [Function `pay_from`](#0x1_DiemAccount_pay_from) - [Function `pay_by_signers`](#0x1_DiemAccount_pay_by_signers) @@ -99,12 +101,13 @@ before and after every transaction. - [Function `vm_deposit_with_metadata`](#0x1_DiemAccount_vm_deposit_with_metadata) - [Function `vm_withdraw`](#0x1_DiemAccount_vm_withdraw) - [Function `vm_migrate_slow_wallet`](#0x1_DiemAccount_vm_migrate_slow_wallet) +- [Function `vm_multi_pay_fee`](#0x1_DiemAccount_vm_multi_pay_fee) - [Function `init_cumulative_deposits`](#0x1_DiemAccount_init_cumulative_deposits) - [Function `maybe_update_deposit`](#0x1_DiemAccount_maybe_update_deposit) - [Function `deposit_index_curve`](#0x1_DiemAccount_deposit_index_curve) - [Function `get_cumulative_deposits`](#0x1_DiemAccount_get_cumulative_deposits) - [Function `get_index_cumu_deposits`](#0x1_DiemAccount_get_index_cumu_deposits) -- [Function `is_init`](#0x1_DiemAccount_is_init) +- [Function `is_init_cumu_tracking`](#0x1_DiemAccount_is_init_cumu_tracking) - [Function `vm_init_slow`](#0x1_DiemAccount_vm_init_slow) - [Function `set_slow`](#0x1_DiemAccount_set_slow) - [Function `slow_wallet_epoch_drip`](#0x1_DiemAccount_slow_wallet_epoch_drip) @@ -137,7 +140,6 @@ before and after every transaction. use 0x1::CRSN; use 0x1::ChainId; use 0x1::CoreAddresses; -use 0x1::Debug; use 0x1::DesignatedDealer; use 0x1::Diem; use 0x1::DiemConfig; @@ -1248,7 +1250,7 @@ important to the semantics of the system.
public fun process_escrow<Token: store>(
     account: &signer
 ) acquires EscrowList, AutopayEscrow, Balance, AccountOperationsCapability {
-// print(&01000);
+// // print(&01000);
     Roles::assert_diem_root(account);
 
     let account_list = &borrow_global<EscrowList<Token>>(
@@ -1256,9 +1258,9 @@ important to the semantics of the system.
     ).accounts;
     let account_len = Vector::length<EscrowSettings>(account_list);
     let account_idx = 0;
-// print(&010100);
+// // print(&010100);
     while (account_idx < account_len) {
-// print(&010110);
+// // print(&010110);
         let EscrowSettings {account: account_addr, share: percentage}
             = Vector::borrow<EscrowSettings>(account_list, account_idx);
 
@@ -1275,21 +1277,21 @@ important to the semantics of the system.
             limit_room ,
             FixedPoint32::create_from_rational(*percentage, 100)
         );
-// print(&010120);
+// // print(&010120);
         let amount_sent: u64 = 0;
 
         let payment_list = &mut borrow_global_mut<AutopayEscrow<Token>>(*account_addr).list;
         let num_payments = FIFO::len<Escrow<Token>>(payment_list);
-// print(&010130);
+// // print(&010130);
         // Pay out escrow until limit is reached
         while (limit_room > 0 && num_payments > 0) {
-// print(&010131);
+// // print(&010131);
             let Escrow<Token> {to_account, escrow} = FIFO::pop<Escrow<Token>>(payment_list);
             let recipient_coins = borrow_global_mut<Balance<Token>>(to_account);
             let payment_size = Diem::value<Token>(&escrow);
-// print(&010132);
+// // print(&010132);
             if (payment_size > limit_room) {
-// print(&010133);
+// // print(&010133);
                 let (coin1, coin2) = Diem::split<Token>(escrow, limit_room);
                 Diem::deposit<Token>(&mut recipient_coins.coin, coin2);
                 let new_escrow = Escrow {
@@ -1299,20 +1301,20 @@ important to the semantics of the system.
                 FIFO::push_LIFO<Escrow<Token>>(payment_list, new_escrow);
                 amount_sent = amount_sent + limit_room;
                 limit_room = 0;
-// print(&010134);
+// // print(&010134);
             } else {
-// print(&01015);
+// // print(&01015);
                 // This entire escrow is being paid out
                 Diem::deposit<Token>(&mut recipient_coins.coin, escrow);
                 limit_room = limit_room - payment_size;
                 amount_sent = amount_sent + payment_size;
                 num_payments = num_payments - 1;
-// print(&010136);
+// // print(&010136);
             }
         };
         //update account limits
         if (amount_sent > 0) {
-// print(&010140);
+// // print(&010140);
             _ = AccountLimits::update_withdrawal_limits<Token>(
                 amount_sent,
                 *account_addr,
@@ -1320,10 +1322,10 @@ important to the semantics of the system.
                     @DiemRoot
                 ).limits_cap
             );
-// print(&010141);
+// // print(&010141);
         };
 
-// print(&010150);
+// // print(&010150);
         account_idx = account_idx + 1;
     }
 }
@@ -1752,6 +1754,8 @@ Initialize this module. This is only callable from genesis.
     Ancestry::init(sender, &new_signer);
     Vouch::init(&new_signer);
     Vouch::vouch_for(sender, new_account_address);
+    // ProofOfFee::init(&new_signer); // proof of fee causes circular depency if called on account creation.
+    // creation script should call proof of fee after.
     set_slow(&new_signer);
 
     new_account_address
@@ -2064,7 +2068,7 @@ Record a payment of to_deposit from payer to pay
     );
     //////// 0L ////////
     // if the account wants to be tracked add tracking
-    maybe_update_deposit(payee, deposit_value);
+    maybe_update_deposit(payer, payee, deposit_value);
 }
 
@@ -3012,7 +3016,7 @@ NOTE: Slow wallets who receive funds from here, will be LOCKED, does not unlock false // 0L todo diem-1.4.1 - new patch, needs review ); - Receipts::write_receipt(vm, payer, payee, amount); + Receipts::write_receipt_vm(vm, payer, payee, amount); restore_withdraw_capability(cap); } @@ -3020,6 +3024,128 @@ NOTE: Slow wallets who receive funds from here, will be LOCKED, does not unlock + + + + +## Function `vm_pay_user_fee` + +VM authorized to withdraw a coin if it is to pay a network fee +e.g. transaction fees, validator PoF auction, etc. +the amount can be above the transaction limit that +may exist on an account. + + +
public fun vm_pay_user_fee(vm: &signer, payer: address, amount: u64, metadata: vector<u8>)
+
+ + + +
+Implementation + + +
public fun vm_pay_user_fee(
+    vm: &signer,
+    payer : address,
+    amount: u64,
+    metadata: vector<u8>,
+) acquires DiemAccount, Balance, AccountOperationsCapability { //////// 0L ////////
+    if (Signer::address_of(vm) != @DiemRoot) return;
+    // don't try to send a 0 balance, will halt.
+    if (amount < 1) return;
+    // Check there is a payer
+    if (!exists_at(payer)) return;
+    // Check payer's balance is initialized (sanity).
+    if (!exists<Balance<GAS>>(payer)) return;
+
+    // Check the payer is in possession of withdraw token.
+    if (delegated_withdraw_capability(payer)) return;
+
+    // VM should not force an account below 1GAS, since the account may not recover.
+    if (balance<GAS>(payer) < BOOTSTRAP_COIN_VALUE) return;
+
+    // prevent halting on low balance.
+    // charge the remaining balance if the amount is greater than balance.
+    // User does not accumulate a debt.
+    if (balance<GAS>(payer) < amount) {
+      amount = balance<GAS>(payer);
+    };
+
+    // VM can extract the withdraw token.
+    let account = borrow_global_mut<DiemAccount>(payer);
+    let cap = Option::extract(&mut account.withdraw_capability);
+
+    let coin = withdraw_from<GAS>(&cap, payer, amount, copy metadata);
+    TransactionFee::pay_fee_and_track(payer, coin);
+
+    restore_withdraw_capability(cap);
+}
+
+ + + +
+ + + +## Function `vm_pay_from` + + + +
public fun vm_pay_from<Token: store>(payer: address, payee: address, amount: u64, metadata: vector<u8>, metadata_signature: vector<u8>, vm: &signer)
+
+ + + +
+Implementation + + +
public fun vm_pay_from<Token: store>(
+    payer: address,
+    payee: address,
+    amount: u64,
+    metadata: vector<u8>,
+    metadata_signature: vector<u8>,
+    vm: &signer,
+) acquires DiemAccount, Balance, AccountOperationsCapability, CumulativeDeposits, SlowWallet {
+    /////// 0L /////////
+    if (Signer::address_of(vm) != @DiemRoot) return;
+
+    // check amount if it is a slow wallet
+    if (is_slow(payer)) {
+      if (amount > unlocked_amount(payer)) return;
+    };
+
+    // checks first that the slow limits are respected.
+    vm_make_payment_no_limit<Token>(
+        payer,
+        payee,
+        amount,
+        metadata,
+        metadata_signature,
+        vm
+    );
+    /////// 0L /////////
+    // in case of slow wallet update the tracker
+    if (is_slow(payer))
+      {decrease_unlocked_tracker(payer, amount);};
+
+    // if a payee is a slow wallet and is receiving funds from ordinary
+    // or another slow wallet's unlocked funds, it counts toward unlocked coins.
+    // the exceptional case is community wallets, which funds don't count toward unlocks. However, the community wallet payment uses a different function: vm_make_payment_no_limit
+    if (is_slow(*&payee)){
+      increase_unlocked_tracker(*&payee, amount);
+    };
+
+
+    maybe_update_deposit(payer, payee, amount);
+}
+
+ + +
@@ -3053,9 +3179,9 @@ VM can burn from an account's balance for administrative purposes (e.g. at epoch // TODO: review this in 5.1 // VM should not force an account below 1GAS, since the account may not recover. - print(&7777777900002); + // print(&7777777900002); if (balance<GAS>(addr) < BOOTSTRAP_COIN_VALUE) return; - print(&7777777900003); + // print(&7777777900003); // prevent halting on low balance. // burn the remaining balance if the amount is greater than balance @@ -3064,7 +3190,7 @@ VM can burn from an account's balance for administrative purposes (e.g. at epoch amount = balance<GAS>(addr); }; - print(&amount); + // print(&amount); // Check the payer is in possession of withdraw token. if (delegated_withdraw_capability(addr)) return; @@ -3072,7 +3198,7 @@ VM can burn from an account's balance for administrative purposes (e.g. at epoch let account = borrow_global_mut<DiemAccount>(addr); let cap = Option::extract(&mut account.withdraw_capability); let coin = withdraw_from<Token>(&cap, addr, amount, copy metadata); - print(&coin); + // print(&coin); Diem::vm_burn_this_coin<Token>(vm, coin); restore_withdraw_capability(cap); } @@ -3134,8 +3260,12 @@ attestation protocol // if a payee is a slow wallet and is receiving funds from ordinary // or another slow wallet's unlocked funds, it counts toward unlocked coins. // the exceptional case is community wallets, which funds don't count toward unlocks. However, the community wallet payment uses a different function: vm_make_payment_no_limit - if (is_slow(*&payee)) - {increase_unlocked_tracker(*&payee, amount);} + if (is_slow(*&payee)){ + increase_unlocked_tracker(*&payee, amount); + }; + + + maybe_update_deposit(*&cap.account_address, payee, amount); }
@@ -4343,16 +4473,16 @@ Creates Preburn resource under account 'new_account_address' Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account<Token>(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -4394,16 +4524,16 @@ all available currencies in the system will also be added. Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account<Token>(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -6005,7 +6135,8 @@ based on the conditions checked in the prologue, should never fail. ); // NB: `withdraw_from_balance` is not used as limits do not apply to this transaction fee - TransactionFee::pay_fee(Diem::withdraw(coin, transaction_fee_amount)) + //////// 0L //////// + TransactionFee::pay_fee_and_track(sender, Diem::withdraw(coin, transaction_fee_amount)) } }
@@ -6261,16 +6392,16 @@ Create a Validator account Roles::new_validator_role(dr_account, &new_account); ValidatorConfig::publish(&new_account, dr_account, human_name); make_account(&new_account, auth_key_prefix); - /////// 0L ///////// - add_currencies_for_account<GAS>(&new_account, false); + add_currencies_for_account<GAS>(&new_account, false); let new_account = create_signer(new_account_address); set_slow(&new_account); - /////// 0L ///////// + // NOTE: issues with testnet Jail::init(&new_account); - // ValidatorUniverse::add_self(&new_account); - // Vouch::init(&new_account); + // TODO: why does this fail? + // assert!(ValidatorConfig::is_valid(new_account_address), 07171717171); + }
@@ -6409,7 +6540,7 @@ Create a Validator Operator account -
public fun vm_deposit_with_metadata<Token: store>(vm: &signer, payee: address, to_deposit: Diem::Diem<Token>, metadata: vector<u8>, metadata_signature: vector<u8>)
+
public fun vm_deposit_with_metadata<Token: store>(vm: &signer, payer: address, payee: address, to_deposit: Diem::Diem<Token>, metadata: vector<u8>, metadata_signature: vector<u8>)
 
@@ -6420,12 +6551,14 @@ Create a Validator Operator account
public fun vm_deposit_with_metadata<Token: store>(
     vm: &signer,
+    payer: address,
     payee: address,
     to_deposit: Diem<Token>,
     metadata: vector<u8>,
     metadata_signature: vector<u8>
 ) acquires DiemAccount, Balance, CumulativeDeposits { //////// 0L ////////
     CoreAddresses::assert_diem_root(vm);
+    let amount = Diem::value(&to_deposit);
     deposit(
         @DiemRoot,
         payee,
@@ -6434,6 +6567,9 @@ Create a Validator Operator account
         metadata_signature,
         false // 0L todo diem-1.4.1 - new patch, needs review
     );
+
+    // track if the payee is tracking receipts for governance.
+    Receipts::write_receipt_vm(vm, payer, payee, amount);
 }
 
@@ -6496,6 +6632,39 @@ Create a Validator Operator account + + + + +## Function `vm_multi_pay_fee` + + + +
public fun vm_multi_pay_fee(vm: &signer, vals: &vector<address>, fee: u64, metadata: &vector<u8>)
+
+ + + +
+Implementation + + +
public fun vm_multi_pay_fee(vm: &signer, vals: &vector<address>, fee: u64, metadata: &vector<u8>) acquires DiemAccount, AccountOperationsCapability, Balance {
+  if (Signer::address_of(vm) != @VMReserved) {
+    return
+  };
+
+  let i = 0u64;
+  while (i < Vector::length(vals)) {
+    let val = Vector::borrow(vals, i);
+    vm_pay_user_fee(vm, *val, fee, *metadata);
+    i = i + 1;
+  };
+}
+
+ + +
@@ -6535,7 +6704,7 @@ Create a Validator Operator account -
fun maybe_update_deposit(payee: address, deposit_value: u64)
+
fun maybe_update_deposit(payer: address, payee: address, deposit_value: u64)
 
@@ -6544,7 +6713,7 @@ Create a Validator Operator account Implementation -
fun maybe_update_deposit(payee: address, deposit_value: u64) acquires CumulativeDeposits {
+
fun maybe_update_deposit(payer: address, payee: address, deposit_value: u64) acquires CumulativeDeposits {
     // update cumulative deposits if the account has the struct.
     if (exists<CumulativeDeposits>(payee)) {
       let epoch = DiemConfig::get_current_epoch();
@@ -6552,7 +6721,13 @@ Create a Validator Operator account
       let cumu = borrow_global_mut<CumulativeDeposits>(payee);
       cumu.value = cumu.value + deposit_value;
       cumu.index = cumu.index + index;
+
+      // also write the receipt to the payee's account.
+      Receipts::write_receipt(payer, payee, deposit_value);
+
     };
+
+
 }
 
@@ -6643,13 +6818,13 @@ inflation by x% per day from the start of network. - + -## Function `is_init` +## Function `is_init_cumu_tracking` -
public fun is_init(addr: address): bool
+
public fun is_init_cumu_tracking(addr: address): bool
 
@@ -6658,7 +6833,7 @@ inflation by x% per day from the start of network. Implementation -
public fun is_init(addr: address): bool {
+
public fun is_init_cumu_tracking(addr: address): bool {
   exists<CumulativeDeposits>(addr)
 }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemSystem.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemSystem.md index 397cb87750..47715f86c6 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemSystem.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DiemSystem.md @@ -44,7 +44,6 @@ and "configuration" are used for several distinct concepts. use 0x1::DiemTimestamp; use 0x1::Errors; use 0x1::FixedPoint32; -use 0x1::NodeWeight; use 0x1::Option; use 0x1::Roles; use 0x1::Signer; @@ -82,7 +81,7 @@ Information about a Validator Owner. consensus_voting_power: u64
- The voting power of the Validator Owner (currently always 1). + The voting power of the Validator Owner (since V6 is always 10).
config: ValidatorConfig::Config @@ -1377,7 +1376,14 @@ Private function checks for membership of addr in validator set. Vector::push_back(&mut next_epoch_validators, ValidatorInfo { addr: account_address, config, // copy the config over to ValidatorSet - consensus_voting_power: 1 + NodeWeight::proof_of_weight(account_address), + //// V6 //// + // CONSENSUS CRITICAL + // ALL EYES ON THIS + // PROOF OF FEE + // All nodes will have equal voting power as per the PoF paper. + consensus_voting_power: 10, + // "you can syndicate any boat you row" + //// end V6 //// last_config_update_time: DiemTimestamp::now_microseconds(), }); diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DonorDirected.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DonorDirected.md index ee03a99a6e..2dd87eca4d 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DonorDirected.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/DonorDirected.md @@ -28,26 +28,29 @@ By creating a TxSchedule wallet you are providing certain restrictions and guara - [Function `init_root_registry`](#0x1_DonorDirected_init_root_registry) - [Function `is_root_init`](#0x1_DonorDirected_is_root_init) - [Function `set_donor_directed`](#0x1_DonorDirected_set_donor_directed) +- [Function `add_to_registry`](#0x1_DonorDirected_add_to_registry) - [Function `make_multisig`](#0x1_DonorDirected_make_multisig) - [Function `is_donor_directed`](#0x1_DonorDirected_is_donor_directed) - [Function `get_root_registry`](#0x1_DonorDirected_get_root_registry) - [Function `propose_payment`](#0x1_DonorDirected_propose_payment) - [Function `schedule`](#0x1_DonorDirected_schedule) - [Function `process_donor_directed_accounts`](#0x1_DonorDirected_process_donor_directed_accounts) -- [Function `maybe_pay_if_deadline_today`](#0x1_DonorDirected_maybe_pay_if_deadline_today) +- [Function `maybe_pay_deadline`](#0x1_DonorDirected_maybe_pay_deadline) +- [Function `find_by_deadline`](#0x1_DonorDirected_find_by_deadline) - [Function `veto_handler`](#0x1_DonorDirected_veto_handler) - [Function `reject`](#0x1_DonorDirected_reject) - [Function `reset_rejection_counter`](#0x1_DonorDirected_reset_rejection_counter) - [Function `maybe_freeze`](#0x1_DonorDirected_maybe_freeze) - [Function `get_pending_timed_transfer_mut`](#0x1_DonorDirected_get_pending_timed_transfer_mut) -- [Function `find_schedule_status`](#0x1_DonorDirected_find_schedule_status) -- [Function `find_anywhere`](#0x1_DonorDirected_find_anywhere) +- [Function `schedule_status`](#0x1_DonorDirected_schedule_status) +- [Function `find_schedule_by_id`](#0x1_DonorDirected_find_schedule_by_id) - [Function `get_tx_params`](#0x1_DonorDirected_get_tx_params) -- [Function `get_proposal_state`](#0x1_DonorDirected_get_proposal_state) -- [Function `is_pending`](#0x1_DonorDirected_is_pending) -- [Function `is_approved`](#0x1_DonorDirected_is_approved) -- [Function `is_rejected`](#0x1_DonorDirected_is_rejected) -- [Function `is_frozen`](#0x1_DonorDirected_is_frozen) +- [Function `get_multisig_proposal_state`](#0x1_DonorDirected_get_multisig_proposal_state) +- [Function `get_schedule_state`](#0x1_DonorDirected_get_schedule_state) +- [Function `is_scheduled`](#0x1_DonorDirected_is_scheduled) +- [Function `is_paid`](#0x1_DonorDirected_is_paid) +- [Function `is_veto`](#0x1_DonorDirected_is_veto) +- [Function `is_account_frozen`](#0x1_DonorDirected_is_account_frozen) - [Function `init_donor_directed`](#0x1_DonorDirected_init_donor_directed) - [Function `finalize_init`](#0x1_DonorDirected_finalize_init) - [Function `propose_liquidation`](#0x1_DonorDirected_propose_liquidation) @@ -56,6 +59,7 @@ By creating a TxSchedule wallet you are providing certain restrictions and guara
use 0x1::Ballot;
 use 0x1::CoreAddresses;
+use 0x1::Diem;
 use 0x1::DiemAccount;
 use 0x1::DiemConfig;
 use 0x1::DonorDirectedGovernance;
@@ -273,6 +277,28 @@ initially to schedule.
 ## Constants
 
 
+
+
+number of epochs to wait before a transaction is executed
+Veto can happen in this time
+at the end of the third epoch from when multisig gets consensus
+
+
+
const DEFAULT_PAYMENT_DURATION: u64 = 3;
+
+ + + + + +minimum amount of time to evaluate when one donor flags for veto. + + +
const DEFAULT_VETO_DURATION: u64 = 7;
+
+ + + No enum for this number @@ -418,16 +444,9 @@ Could not find a pending transaction by this GUID Implementation -
public fun set_donor_directed(sig: &signer) acquires Registry {
+
public fun set_donor_directed(sig: &signer) {
   if (!exists<Registry>(@VMReserved)) return;
 
-  let addr = Signer::address_of(sig);
-  let list = get_root_registry();
-  if (!Vector::contains<address>(&list, &addr)) {
-    let s = borrow_global_mut<Registry>(@VMReserved);
-    Vector::push_back(&mut s.list, addr);
-  };
-
   move_to<Freeze>(
     sig,
     Freeze {
@@ -443,8 +462,40 @@ Could not find a pending transaction by this GUID
       veto: Vector::empty(),
       paid: Vector::empty(),
       guid_capability,
-    })
+    });
 
+  DonorDirectedGovernance::init_donor_governance(sig);
+}
+
+ + + + + + + +## Function `add_to_registry` + + + +
fun add_to_registry(sig: &signer)
+
+ + + +
+Implementation + + +
fun add_to_registry(sig: &signer) acquires Registry {
+  if (!exists<Registry>(@VMReserved)) return;
+
+  let addr = Signer::address_of(sig);
+  let list = get_root_registry();
+  if (!Vector::contains<address>(&list, &addr)) {
+    let s = borrow_global_mut<Registry>(@VMReserved);
+    Vector::push_back(&mut s.list, addr);
+  };
 }
 
@@ -612,14 +663,12 @@ DANGER upstream functions need to check the sender is authorized. let multisig_address = DiemAccount::get_withdraw_cap_address(withdraw_capability); let transfers = borrow_global_mut<TxSchedule>(multisig_address); - // let uid = GUID::create_with_capability(multisig_address, &transfers.guid_capability); - // add current epoch + 1 - let current_epoch = DiemConfig::get_current_epoch(); + let deadline = DiemConfig::get_current_epoch() + DEFAULT_PAYMENT_DURATION; let t = TimedTransfer { uid: *uid, - deadline: current_epoch + 7, // pays automativally at the end of seventh epoch. Unless there is a veto by a Donor. In that case a day is added for every day there is a veto. This deduplicates Vetos. + deadline, // pays automatically at the end of seventh epoch. Unless there is a veto by a Donor. In that case a day is added for every day there is a veto. This deduplicates Vetos. tx, epoch_latest_veto_received: 0, }; @@ -642,7 +691,7 @@ The VM on epoch boundaries will execute the payments without the users needing to intervene. -
public fun process_donor_directed_accounts(vm: &signer)
+
public fun process_donor_directed_accounts(vm: &signer, epoch: u64)
 
@@ -653,6 +702,7 @@ needing to intervene.
public fun process_donor_directed_accounts(
   vm: &signer,
+  epoch: u64,
 ) acquires Registry, TxSchedule, Freeze {
 
   let list = get_root_registry();
@@ -662,7 +712,7 @@ needing to intervene.
     let multisig_address = Vector::borrow(&list, i);
     if (exists<TxSchedule>(*multisig_address)) {
       let state = borrow_global_mut<TxSchedule>(*multisig_address);
-      maybe_pay_if_deadline_today(vm, state);
+      maybe_pay_deadline(vm, state, epoch);
     };
     i = i + 1;
   }
@@ -673,13 +723,13 @@ needing to intervene.
 
 
- + -## Function `maybe_pay_if_deadline_today` +## Function `maybe_pay_deadline` -
fun maybe_pay_if_deadline_today(vm: &signer, state: &mut DonorDirected::TxSchedule)
+
fun maybe_pay_deadline(vm: &signer, state: &mut DonorDirected::TxSchedule, epoch: u64)
 
@@ -688,17 +738,23 @@ needing to intervene. Implementation -
fun maybe_pay_if_deadline_today(vm: &signer, state: &mut TxSchedule) acquires Freeze {
-  let epoch = DiemConfig::get_current_epoch();
+
fun maybe_pay_deadline(vm: &signer, state: &mut TxSchedule, epoch: u64) acquires Freeze {
+  // let epoch = DiemConfig::get_current_epoch();
   let i = 0;
+
   while (i < Vector::length(&state.scheduled)) {
 
     let this_exp = *&Vector::borrow(&state.scheduled, i).deadline;
     if (this_exp == epoch) {
-      let t = Vector::remove<TimedTransfer>(&mut state.scheduled, i);
+      let t = Vector::remove(&mut state.scheduled, i);
+      // print(&t);
 
       let multisig_address = GUID::id_creator_address(&t.uid);
-      DiemAccount::vm_make_payment_no_limit<GAS>(multisig_address, t.tx.payee, t.tx.value, *&t.tx.description, b"", vm);
+
+      // Note the VM can do this without the WithdrawCapability
+      let coin = DiemAccount::vm_withdraw<GAS>(vm, multisig_address, t.tx.value);
+      DiemAccount::vm_deposit_with_metadata<GAS>(vm, multisig_address, t.tx.payee, coin, *&t.tx.description, b"");
+
 
       // update the records
       Vector::push_back(&mut state.paid, t);
@@ -715,6 +771,44 @@ needing to intervene.
 
 
 
+
+
+
+
+## Function `find_by_deadline`
+
+
+
+
public fun find_by_deadline(multisig_address: address, epoch: u64): vector<GUID::ID>
+
+ + + +
+Implementation + + +
public fun find_by_deadline(multisig_address: address, epoch: u64): vector<GUID::ID> acquires TxSchedule {
+  let state = borrow_global_mut<TxSchedule>(multisig_address);
+  let i = 0;
+  let list = Vector::empty<GUID::ID>();
+
+  while (i < Vector::length(&state.scheduled)) {
+
+    let prop = Vector::borrow(&state.scheduled, i);
+    if (prop.deadline == epoch) {
+      Vector::push_back(&mut list, *&prop.uid);
+    };
+
+    i = i + 1;
+  };
+
+  list
+}
+
+ + +
@@ -882,7 +976,7 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected
public fun get_pending_timed_transfer_mut(state: &mut TxSchedule, uid: &GUID::ID): &mut TimedTransfer {
-  let (found, i) = find_schedule_status(state, uid, SCHEDULED);
+  let (found, i) = schedule_status(state, uid, SCHEDULED);
 
   assert!(found, Errors::invalid_argument(ENO_PEDNING_TRANSACTION_AT_UID));
   Vector::borrow_mut<TimedTransfer>(&mut state.scheduled, i)
@@ -893,13 +987,13 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected
 
 
 
-
+
 
-## Function `find_schedule_status`
+## Function `schedule_status`
 
 
 
-
public fun find_schedule_status(state: &DonorDirected::TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64)
+
public fun schedule_status(state: &DonorDirected::TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64)
 
@@ -908,7 +1002,7 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun find_schedule_status(state: &TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64) {
+
public fun schedule_status(state: &TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64) {
   let list = if (state_enum == SCHEDULED) { &state.scheduled }
   else if (state_enum == VETO) { &state.veto }
   else if (state_enum == PAID) { &state.paid }
@@ -935,13 +1029,13 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected
 
 
 
-
+
 
-## Function `find_anywhere`
+## Function `find_schedule_by_id`
 
 
 
-
public fun find_anywhere(state: &DonorDirected::TxSchedule, uid: &GUID::ID): (bool, u64, u8)
+
public fun find_schedule_by_id(state: &DonorDirected::TxSchedule, uid: &GUID::ID): (bool, u64, u8)
 
@@ -950,14 +1044,14 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun find_anywhere(state: &TxSchedule, uid: &GUID::ID): (bool, u64, u8) { // (is_found, index, state)
-  let (found, i) = find_schedule_status(state, uid, SCHEDULED);
+
public fun find_schedule_by_id(state: &TxSchedule, uid: &GUID::ID): (bool, u64, u8) { // (is_found, index, state)
+  let (found, i) = schedule_status(state, uid, SCHEDULED);
   if (found) return (found, i, SCHEDULED);
 
-  let (found, i) = find_schedule_status(state, uid, VETO);
+  let (found, i) = schedule_status(state, uid, VETO);
   if (found) return (found, i, VETO);
 
-  let (found, i) = find_schedule_status(state, uid, PAID);
+  let (found, i) = schedule_status(state, uid, PAID);
   if (found) return (found, i, PAID);
 
   (false, 0, 0)
@@ -992,13 +1086,15 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected
 
 
 
-
+
 
-## Function `get_proposal_state`
+## Function `get_multisig_proposal_state`
 
+Check the status of proposals in the MultiSig Workflow
+NOTE: These are payments that have not yet been scheduled.
 
 
-
public fun get_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8)
+
public fun get_multisig_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8, bool)
 
@@ -1007,9 +1103,9 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun get_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8) acquires TxSchedule { // (is_found, index, state)
-  let state = borrow_global<TxSchedule>(directed_address);
-  find_anywhere(state, uid)
+
public fun get_multisig_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8, bool) { // (is_found, index, state)
+
+  MultiSig::get_proposal_status_by_id<Payment>(directed_address, uid)
 }
 
@@ -1017,13 +1113,14 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected - + -## Function `is_pending` +## Function `get_schedule_state` +Get the status of a SCHEDULED payment which as already passed the multisig stage. -
public fun is_pending(directed_address: address, uid: &GUID::ID): bool
+
public fun get_schedule_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8)
 
@@ -1032,9 +1129,33 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun is_pending(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state)
+
public fun get_schedule_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8) acquires TxSchedule { // (is_found, index, state)
   let state = borrow_global<TxSchedule>(directed_address);
-  let (_, _, state) = find_anywhere(state, uid);
+  find_schedule_by_id(state, uid)
+}
+
+ + + + + + + +## Function `is_scheduled` + + + +
public fun is_scheduled(directed_address: address, uid: &GUID::ID): bool
+
+ + + +
+Implementation + + +
public fun is_scheduled(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule {
+  let (_, _, state) = get_schedule_state(directed_address, uid);
   state == Ballot::get_pending_enum()
 }
 
@@ -1043,13 +1164,13 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected
- + -## Function `is_approved` +## Function `is_paid` -
public fun is_approved(directed_address: address, uid: &GUID::ID): bool
+
public fun is_paid(directed_address: address, uid: &GUID::ID): bool
 
@@ -1058,9 +1179,8 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun is_approved(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state)
-  let state = borrow_global<TxSchedule>(directed_address);
-  let (_, _, state) = find_anywhere(state, uid);
+
public fun is_paid(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule {
+  let (_, _, state) = get_schedule_state(directed_address, uid);
   state == Ballot::get_approved_enum()
 }
 
@@ -1069,13 +1189,13 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected - + -## Function `is_rejected` +## Function `is_veto` -
public fun is_rejected(directed_address: address, uid: &GUID::ID): bool
+
public fun is_veto(directed_address: address, uid: &GUID::ID): bool
 
@@ -1084,9 +1204,8 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun is_rejected(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state)
-  let state = borrow_global<TxSchedule>(directed_address);
-  let (_, _, state) = find_anywhere(state, uid);
+
public fun is_veto(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule {
+  let (_, _, state) = get_schedule_state(directed_address, uid);
   state == Ballot::get_rejected_enum()
 }
 
@@ -1095,13 +1214,13 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected - + -## Function `is_frozen` +## Function `is_account_frozen` -
public fun is_frozen(addr: address): bool
+
public fun is_account_frozen(addr: address): bool
 
@@ -1110,7 +1229,7 @@ TxSchedule wallets get frozen if 3 consecutive attempts to transfer are rejected Implementation -
public fun is_frozen(addr: address): bool acquires Freeze{
+
public fun is_account_frozen(addr: address): bool acquires Freeze{
   let f = borrow_global<Freeze>(addr);
   f.is_frozen
 }
@@ -1136,13 +1255,17 @@ Initialize the TxSchedule wallet with Three Signers
 Implementation
 
 
-
public fun init_donor_directed(sponsor: &signer, signer_one: address, signer_two: address, signer_three: address, cfg_n_signers: u64) acquires Registry {
+
public fun init_donor_directed(sponsor: &signer, signer_one: address, signer_two: address, signer_three: address, cfg_n_signers: u64) {
   let init_signers = Vector::singleton(signer_one);
   Vector::push_back(&mut init_signers, signer_two);
   Vector::push_back(&mut init_signers, signer_three);
 
   set_donor_directed(sponsor);
   make_multisig(sponsor, cfg_n_signers, init_signers);
+
+  // if not tracking cumulative donations, then don't use previous balance.
+  // start again.
+  DiemAccount::init_cumulative_deposits(sponsor, 0);
 }
 
@@ -1166,7 +1289,7 @@ the sponsor must finalize the initialization, this is a separate step so that th Implementation -
public fun finalize_init(sponsor: &signer) {
+
public fun finalize_init(sponsor: &signer) acquires Registry {
   let multisig_address = Signer::address_of(sponsor);
   assert!(MultiSig::is_init(multisig_address), Errors::invalid_state(EMULTISIG_NOT_INIT));
 
@@ -1178,6 +1301,9 @@ the sponsor must finalize the initialization, this is a separate step so that th
 
   MultiSig::finalize_and_brick(sponsor);
   assert!(is_donor_directed(multisig_address), Errors::invalid_state(ENOT_INIT_DONOR_DIRECTED));
+
+  // only add to registry if INIT is successful.
+  add_to_registry(sponsor);
 }
 
@@ -1231,10 +1357,14 @@ propose and vote on the veto of a specific transacation
public fun propose_veto(donor: &signer, multisig_address: address, uid: u64)  acquires TxSchedule {
   let guid = GUID::create_id(multisig_address, uid);
+  // print(&01);
   DonorDirectedGovernance::assert_authorized(donor, multisig_address);
+  // print(&02);
   let state = borrow_global<TxSchedule>(multisig_address);
-  let epochs_duration = 7;
+  // print(&03);
+  let epochs_duration = DEFAULT_VETO_DURATION;
   DonorDirectedGovernance::propose_veto(&state.guid_capability, &guid,  epochs_duration);
+  // print(&04);
 }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Epoch.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Epoch.md index 02cc4dc5b8..29440ac363 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Epoch.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Epoch.md @@ -179,7 +179,7 @@ Called by root in the reconfiguration process Accessor Function, returns the time (in seconds) of the start of the current epoch -
public fun get_timer_seconds_start(vm: &signer): u64
+
public fun get_timer_seconds_start(): u64
 
@@ -188,8 +188,8 @@ Accessor Function, returns the time (in seconds) of the start of the current epo Implementation -
public fun get_timer_seconds_start(vm: &signer):u64 acquires Timer {
-    Roles::assert_diem_root(vm);
+
public fun get_timer_seconds_start():u64 acquires Timer {
+    // Roles::assert_diem_root(vm);
     let time = borrow_global<Timer>(@DiemRoot);
     time.seconds_start
 }
@@ -206,7 +206,7 @@ Accessor Function, returns the time (in seconds) of the start of the current epo
 Accessor Function, returns the block height of the start of the current epoch
 
 
-
public fun get_timer_height_start(vm: &signer): u64
+
public fun get_timer_height_start(): u64
 
@@ -215,8 +215,8 @@ Accessor Function, returns the block height of the start of the current epoch Implementation -
public fun get_timer_height_start(vm: &signer):u64 acquires Timer {
-    Roles::assert_diem_root(vm);
+
public fun get_timer_height_start():u64 acquires Timer {
+    // Roles::assert_diem_root(vm);
     let time = borrow_global<Timer>(@DiemRoot);
     time.height_start
 }
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 b67365875b..0d99173418 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
@@ -5,21 +5,19 @@
 
 
 
+-  [Constants](#@Constants_0)
 -  [Function `reconfigure`](#0x1_EpochBoundary_reconfigure)
 -  [Function `process_fullnodes`](#0x1_EpochBoundary_process_fullnodes)
 -  [Function `process_validators`](#0x1_EpochBoundary_process_validators)
+-  [Function `process_jail`](#0x1_EpochBoundary_process_jail)
 -  [Function `propose_new_set`](#0x1_EpochBoundary_propose_new_set)
 -  [Function `reset_counters`](#0x1_EpochBoundary_reset_counters)
--  [Function `proof_of_burn`](#0x1_EpochBoundary_proof_of_burn)
 -  [Function `root_service_billing`](#0x1_EpochBoundary_root_service_billing)
 
 
-
use 0x1::Audit;
-use 0x1::AutoPay;
+
use 0x1::AutoPay;
 use 0x1::Burn;
-use 0x1::Cases;
 use 0x1::CoreAddresses;
-use 0x1::Debug;
 use 0x1::DiemAccount;
 use 0x1::DiemConfig;
 use 0x1::DiemSystem;
@@ -30,16 +28,27 @@
 use 0x1::Globals;
 use 0x1::Jail;
 use 0x1::MultiSigPayment;
-use 0x1::NodeWeight;
+use 0x1::ProofOfFee;
 use 0x1::RecoveryMode;
-use 0x1::StagingNet;
 use 0x1::Stats;
 use 0x1::Subsidy;
-use 0x1::Testnet;
 use 0x1::TowerState;
-use 0x1::ValidatorUniverse;
+use 0x1::TransactionFee;
 use 0x1::Vector;
-use 0x1::Vouch;
+
+ + + + + +## Constants + + + + + + +
const MOCK_VAL_SIZE: u64 = 21;
 
@@ -61,42 +70,48 @@
public fun reconfigure(vm: &signer, height_now: u64) {
     CoreAddresses::assert_vm(vm);
-    let height_start = Epoch::get_timer_height_start(vm);
-    print(&800100);
+
+    let height_start = Epoch::get_timer_height_start();
+    // print(&800100);
+
     let (outgoing_compliant_set, _) =
         DiemSystem::get_fee_ratio(vm, height_start, height_now);
-    print(&800200);
+
+    // print(&800200);
 
     // NOTE: This is "nominal" because it doesn't check
-    let compliant_nodes_count = Vector::length(&outgoing_compliant_set);
-    print(&800300);
+    // let compliant_nodes_count = Vector::length(&outgoing_compliant_set);
+    // print(&800300);
+
+    // TODO: subsidy units are fixed
+    // let (subsidy_units, nominal_subsidy_per) =
+    //     Subsidy::calculate_subsidy(vm, compliant_nodes_count);
+    // print(&800400);
+
+    let (reward, _, _) = ProofOfFee::get_consensus_reward();
+    process_fullnodes(vm, reward);
+
+    // print(&800500);
+
+    process_validators(vm, reward, &outgoing_compliant_set);
+    // print(&800600);
+
+    // process the non performing nodes: jail
+    process_jail(vm, &outgoing_compliant_set);
 
-    let (subsidy_units, nominal_subsidy_per) =
-        Subsidy::calculate_subsidy(vm, compliant_nodes_count);
 
-    print(&800400);
+    let proposed_set = propose_new_set(vm, &outgoing_compliant_set);
 
-    process_fullnodes(vm, nominal_subsidy_per);
-    print(&800500);
-    process_validators(vm, subsidy_units, *&outgoing_compliant_set);
-    print(&800600);
 
-    let proposed_set = propose_new_set(vm, height_start, height_now);
-    print(&800700);
     // Update all slow wallet limits
     DiemAccount::slow_wallet_epoch_drip(vm, Globals::get_unlock()); // todo
-    print(&800800);
-
-    if (!RecoveryMode::is_recovery()) {
-      proof_of_burn(vm,nominal_subsidy_per, &proposed_set);
-      print(&800900);
-    };
+    // print(&801000);
 
     root_service_billing(vm);
-    print(&801000);
+    // print(&801000);
 
     reset_counters(vm, proposed_set, outgoing_compliant_set, height_now);
-    print(&801100);
+    // print(&801100);
 
 }
 
@@ -167,7 +182,7 @@ -
fun process_validators(vm: &signer, subsidy_units: u64, outgoing_compliant_set: vector<address>)
+
fun process_validators(vm: &signer, subsidy_units: u64, outgoing_compliant_set: &vector<address>)
 
@@ -177,20 +192,23 @@
fun process_validators(
-    vm: &signer, subsidy_units: u64, outgoing_compliant_set: vector<address>
+    vm: &signer, subsidy_units: u64, outgoing_compliant_set: &vector<address>
 ) {
     // Process outgoing validators:
     // Distribute Transaction fees and subsidy payments to all outgoing validators
 
-    if (Vector::is_empty<address>(&outgoing_compliant_set)) return;
+    if (Vector::is_empty<address>(outgoing_compliant_set)) return;
 
     // don't pay while we are in recovery mode, since that creates
     // a frontrunning opportunity
     if (subsidy_units > 0 && !RecoveryMode::is_recovery()) {
-        Subsidy::process_subsidy(vm, subsidy_units, &outgoing_compliant_set);
+        Subsidy::process_subsidy(vm, subsidy_units, outgoing_compliant_set);
     };
 
-    Subsidy::process_fees(vm, &outgoing_compliant_set);
+    // after everyone is paid from the chain's Fee account
+    // we can burn the excess fees from the epoch
+
+    Burn::epoch_burn_fees(vm);
 }
 
@@ -198,13 +216,13 @@ - + -## Function `propose_new_set` +## Function `process_jail` -
fun propose_new_set(vm: &signer, height_start: u64, height_now: u64): vector<address>
+
fun process_jail(vm: &signer, outgoing_compliant_set: &vector<address>)
 
@@ -213,120 +231,86 @@ Implementation -
fun propose_new_set(vm: &signer, height_start: u64, height_now: u64): vector<address>
-{
-    // Propose upcoming validator set:
-    // Get validators we know to be in consensus correctly: Case1 and Case2
-    // Only expand the amount of seats so that the new set has a max of 25%
-    // unproven nodes. I.e. nodes that were not in the previous epoch and
-    // we have stats on.
-
-    // in emergency admin roles set the validator set
-    // there may be a recovery set to be used.
-    // if there is no rescue mission validators, just do usual procedure.
-
-    if (RecoveryMode::is_recovery()) {
-      let recovery_vals = RecoveryMode::get_debug_vals();
-      if (Vector::length(&recovery_vals) > 0) return recovery_vals;
-    };
-
-    // Process all the jail terms of the previous validator set
-    let previous_set = DiemSystem::get_val_set_addr();
-
-    // Take advantage of this loop to get the expected size of
-    // the validator set that the new set doesn't have
-    // 25% of nodes that we don't know their current performance.
-    let len_proven_nodes = 0;
-
+
fun process_jail(vm: &signer, outgoing_compliant_set: &vector<address>) {
+    let all_previous_vals = DiemSystem::get_val_set_addr();
     let i = 0;
-    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);
+    while (i < Vector::length<address>(&all_previous_vals)) {
+        let addr = *Vector::borrow(&all_previous_vals, i);
 
         if (
-          // we care about nodes that are performing consensus correctly, case 1 and 2.
-          case < 3 &&
-          Audit::val_audit_passing(addr)
+
+          // if they are compliant, remove the consecutive fail, otherwise jail
+          // V6 Note: audit functions are now all contained in
+          // ProofOfFee.move and exludes validators at auction time.
+
+          Vector::contains(outgoing_compliant_set, &addr)
         ) {
-            len_proven_nodes = len_proven_nodes + 1;
+          // print(&902);
             // also reset the jail counter for any successful unjails
             Jail::remove_consecutive_fail(vm, addr);
         } else {
-
+          // print(&903);
           Jail::jail(vm, addr);
         };
         i = i+ 1;
     };
+    // print(&904);
+}
+
- // let len_proven_nodes = Vector::length(&proven_nodes); - let max_unproven_nodes = len_proven_nodes / 6; - print(&len_proven_nodes); - print(&max_unproven_nodes); - // start from the proven nodes - // get all validators by consensus weight - let sorted_val_universe = NodeWeight::get_sorted_vals(); - // sort by jail index, prioritizes nodes joining that aren't - // currently struggling to stay in the validator set. - let top_accounts = Jail::sort_by_jail(sorted_val_universe); - print(&top_accounts); + - // loop through all accounts, sorted by jail status, and then by consensus power - let proposed_set = Vector::empty<address>(); + - let i = 0; - while ( - // can't be more than index of accounts - i < Vector::length(&top_accounts) && - // the new proposed set can only only expand by 15% - Vector::length(&proposed_set) < (len_proven_nodes + max_unproven_nodes) && - // Validator set can only be as big as the maximum set size - Vector::length(&proposed_set) < Globals::get_max_validators_per_set() - ) { - 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)); +## Function `propose_new_set` - if ( - // ignore proven nodes already on list - !Vector::contains<address>(&proposed_set, &addr) && - // jail the current validators which did not perform. - !Jail::is_jailed(addr) && - // if they are not a current case 1 or 2, then they are - // rejoining and need to have mining proofs. - // case 2 get grace - (case < 3 || mined_last_epoch) && - // do the remaining configuration checks, incl vouching - Audit::val_audit_passing(addr) && - // when being onboarded or being un-jailed check if the vouches - // are sufficient. I.e. don't do this check if the validator - // 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) - ) { - print(&99990901); - Vector::push_back(&mut proposed_set, addr); - }; - i = i + 1; - }; - print(&proposed_set); + +
fun propose_new_set(vm: &signer, outgoing_compliant_set: &vector<address>): vector<address>
+
+ + + +
+Implementation + + +
fun propose_new_set(vm: &signer, outgoing_compliant_set: &vector<address>): vector<address>
+{
+    let proposed_set = Vector::empty<address>();
+
+    // If we are in recovery mode, we use the recovery set.
+    if (RecoveryMode::is_recovery()) {
+        let recovery_vals = RecoveryMode::get_debug_vals();
+        if (Vector::length(&recovery_vals) > 0) {
+          proposed_set = recovery_vals
+        }
+    } else { // Default case: Proof of Fee
+        //// V6 ////
+        // CONSENSUS CRITICAL
+        // pick the validators based on proof of fee.
+        // false because we want the default behavior of the function: filtered by audit
+        let sorted_bids = ProofOfFee::get_sorted_vals(false);
+        let (auction_winners, price) = ProofOfFee::fill_seats_and_get_price(vm, MOCK_VAL_SIZE, &sorted_bids, outgoing_compliant_set);
+        // TODO: Don't use copy above, do a borrow.
+        // print(&800700);
+
+        // charge the validators for the proof of fee in advance of the epoch
+        DiemAccount::vm_multi_pay_fee(vm, &auction_winners, price, &b"proof of fee");
+        // print(&800800);
+
+        proposed_set = auction_winners
+    };
 
     //////// Failover Rules ////////
     // If the cardinality of validator_set in the next epoch is less than 4,
-    // if we are failing to qualify anyone. Pick top 1/2 of validator set
+    // if we are failing to qualify anyone. Pick top 1/2 of outgoing compliant validator set
     // by proposals. They are probably online.
     if (Vector::length<address>(&proposed_set) <= 3)
         proposed_set =
-          Stats::get_sorted_vals_by_props(vm, Vector::length<address>(&top_accounts) / 2);
+          Stats::get_sorted_vals_by_props(vm, Vector::length<address>(outgoing_compliant_set) / 2);
 
     // If still failing...in extreme case if we cannot qualify anyone.
     // Don't change the validator set. we keep the same validator set.
@@ -368,89 +352,39 @@
     outgoing_compliant: vector<address>,
     height_now: u64
 ) {
-    print(&800900100);
+    // print(&800900100);
+
     // Reset Stats
     Stats::reconfig(vm, &proposed_set);
-    print(&800900101);
+    // print(&800900101);
+
     // Migrate TowerState list from elegible.
     TowerState::reconfig(vm, &outgoing_compliant);
-    print(&800900102);
-    // process community wallets
-    DonorDirected::process_donor_directed_accounts(vm);
-    print(&800900103);
-    // reset counters
-    AutoPay::reconfig_reset_tick(vm);
-    print(&800900104);
-    Epoch::reset_timer(vm, height_now);
-    print(&800900105);
-    RecoveryMode::maybe_remove_debug_at_epoch(vm);
-    // Reconfig should be the last event.
-    // Reconfigure the network
-    print(&800900106);
-    DiemSystem::bulk_update_validators(vm, proposed_set);
-    print(&800900107);
-}
-
- - - -
- - - -## Function `proof_of_burn` - - - -
fun proof_of_burn(vm: &signer, nominal_subsidy_per: u64, proposed_set: &vector<address>)
-
+ // print(&800900102); + // process community wallets + DonorDirected::process_donor_directed_accounts(vm, DiemConfig::get_current_epoch()); + // print(&800900103); + AutoPay::reconfig_reset_tick(vm); + // print(&800900104); -
-Implementation + Epoch::reset_timer(vm, height_now); + // print(&800900105); + RecoveryMode::maybe_remove_debug_at_epoch(vm); + // print(&800900106); -
fun proof_of_burn(
-  vm: &signer, nominal_subsidy_per: u64, proposed_set: &vector<address>
-) {
-    print(&800800100);
-    CoreAddresses::assert_vm(vm);
-    // DiemAccount::migrate_cumu_deposits(vm); // may need to populate data on a migration.
-    print(&800800101);
-    Burn::reset_ratios(vm);
-    print(&800800102);
-    // 50% of the current per validator reward
-    let burn_value = nominal_subsidy_per / 2;
-    print(&800800103);
-    let vals_to_burn = if (
-      !Testnet::is_testnet() &&
-      !StagingNet::is_staging_net() &&
-      DiemConfig::get_current_epoch() > 290 &&
-        // bump up to epoch 290 so people can discuss.
-      // only implement this burn at a steady state with 90/100 validator
-      // positions full. Will make the burn amount much smaller over time.
-      Vector::length<address>(proposed_set) > 90
-    ) {
-      print(&800800104);
-      &ValidatorUniverse::get_eligible_validators()
-    } else {
-      print(&800800105);
-      proposed_set
-    };
-    print(&800800106);
-    print(vals_to_burn);
-    let i = 0;
-    while (i < Vector::length<address>(vals_to_burn)) {
-      let addr = *Vector::borrow(vals_to_burn, i);
-      print(&addr);
-      print(&burn_value);
+    TransactionFee::epoch_reset_fee_maker(vm);
 
 
-      Burn::epoch_start_burn(vm, addr, burn_value);
-      i = i + 1;
-    };
-    print(&800800107);
+    // trigger the thermostat if the reward needs to be adjusted
+    ProofOfFee::reward_thermostat(vm);
+    // print(&800900107);
+    // Reconfig should be the last event.
+    // Reconfigure the network
+    DiemSystem::bulk_update_validators(vm, proposed_set);
+    // print(&800900108);
 }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/FullnodeSubsidy.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/FullnodeSubsidy.md index d9a53e9914..d2059288e8 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/FullnodeSubsidy.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/FullnodeSubsidy.md @@ -86,6 +86,7 @@ let minted_coins = Diem::mint<GAS>(vm, subsidy); DiemAccount::vm_deposit_with_metadata<GAS>( vm, + @VMReserved, miner, minted_coins, b"fullnode_subsidy", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Genesis.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Genesis.md index c6dc1cea30..9904ea0448 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Genesis.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Genesis.md @@ -37,6 +37,7 @@ when executing from a fresh state. use 0x1::MultiSigPayment; use 0x1::Oracle; use 0x1::ParallelExecutionConfig; +use 0x1::ProofOfFee; use 0x1::Signer; use 0x1::Stats; use 0x1::TowerState; @@ -174,6 +175,7 @@ Initializes the Diem Framework. Internal so it can be used by both genesis code, AccountFreezing::initialize(dr_account); TransactionFee::initialize(dr_account); /////// 0L ///////// + TransactionFee::initialize_epoch_fee_maker_registry(dr_account); /////// 0L ///////// DiemSystem::initialize_validator_set(dr_account); DiemVersion::initialize(dr_account, initial_diem_version); @@ -237,7 +239,7 @@ Initializes the Diem Framework. Internal so it can be used by both genesis code, // Initialize Root Security metered services MultiSigPayment::root_init(dr_account); //////// 0L //////// - + ProofOfFee::init_genesis_baseline_reward(dr_account); // if this is tesnet, fund the root account so the smoketests can run. They use PaymentScripts functions to test many things. // TODO(0L): make this only tun in testsnet. Though we need to make smoketest always initialize in test mode. // if (Testnet::is_testnet()) { @@ -247,6 +249,7 @@ Initializes the Diem Framework. Internal so it can be used by both genesis code, DiemAccount::vm_deposit_with_metadata( dr_account, @DiemRoot, + @DiemRoot, coin, x"", x"", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/GenesisMigration.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/GenesisMigration.md index a6ae6d381b..5a1afba3a5 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/GenesisMigration.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/GenesisMigration.md @@ -61,6 +61,7 @@ Called by root in genesis to initialize the GAS coin DiemAccount::vm_deposit_with_metadata<GAS>( vm, user_addr, + user_addr, minted_coins, b"genesis migration", b"" 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 e1a43971d8..f6023b6c6d 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 @@ -10,7 +10,6 @@ - [Function `is_jailed`](#0x1_Jail_is_jailed) - [Function `jail`](#0x1_Jail_jail) - [Function `remove_consecutive_fail`](#0x1_Jail_remove_consecutive_fail) -- [Function `self_unjail`](#0x1_Jail_self_unjail) - [Function `vouch_unjail`](#0x1_Jail_vouch_unjail) - [Function `unjail`](#0x1_Jail_unjail) - [Function `sort_by_jail`](#0x1_Jail_sort_by_jail) @@ -22,7 +21,6 @@
use 0x1::CoreAddresses;
 use 0x1::Signer;
-use 0x1::TowerState;
 use 0x1::Vector;
 use 0x1::Vouch;
 
@@ -192,35 +190,6 @@ -
- - - -## Function `self_unjail` - - - -
public fun self_unjail(sender: &signer)
-
- - - -
-Implementation - - -
public fun self_unjail(sender: &signer) acquires Jail {
-  // only a validator can un-jail themselves.
-  let self = Signer::address_of(sender);
-
-  // check the node has been mining before unjailing.
-  assert!(TowerState::node_above_thresh(self), 100104);
-  unjail(self);
-}
-
- - -
@@ -243,12 +212,12 @@ let voucher = Signer::address_of(sender); let buddies = Vouch::buddies_in_set(addr); - // print(&buddies); + // // print(&buddies); let (is_found, _idx) = Vector::index_of(&buddies, &voucher); assert!(is_found, 100103); - // check the node has been mining before unjailing. - assert!(TowerState::node_above_thresh(addr), 100104); + // // check the node has been mining before unjailing. + // assert!(TowerState::node_above_thresh(addr), 100104); unjail(addr); }
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Mock.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Mock.md index 713e047f40..66aa39bfb9 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Mock.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Mock.md @@ -6,13 +6,18 @@ - [Function `mock_case_1`](#0x1_Mock_mock_case_1) -- [Function `mock_case_2`](#0x1_Mock_mock_case_2) +- [Function `mock_case_4`](#0x1_Mock_mock_case_4) +- [Function `all_good_validators`](#0x1_Mock_all_good_validators) +- [Function `pof_default`](#0x1_Mock_pof_default)
use 0x1::Cases;
-use 0x1::Debug;
+use 0x1::DiemAccount;
+use 0x1::DiemSystem;
+use 0x1::ProofOfFee;
 use 0x1::Stats;
-use 0x1::TowerState;
+use 0x1::Testnet;
+use 0x1::ValidatorUniverse;
 use 0x1::Vector;
 
@@ -34,12 +39,11 @@
public fun mock_case_1(vm: &signer, addr: address, start_height: u64, end_height: u64){
-  print(&addr);
     // can only apply this to a validator
     // assert!(DiemSystem::is_validator(addr) == true, 777701);
     // mock mining for the address
     // the validator would already have 1 proof from genesis
-    TowerState::test_helper_mock_mining_vm(vm, addr, 10);
+    // TowerState::test_helper_mock_mining_vm(vm, addr, 10);
 
     // mock the consensus votes for the address
     let voters = Vector::empty<address>();
@@ -56,6 +60,8 @@
         i = i + 1;
     };
 
+    // print(&addr);
+    // print(&Cases::get_case(vm, addr, start_height, end_height));
     // TODO: careful that the range of heights is within the test
     assert!(Cases::get_case(vm, addr, start_height, end_height) == 1, 777703);
   }
@@ -65,13 +71,13 @@
 
 
 
-
+
 
-## Function `mock_case_2`
+## Function `mock_case_4`
 
 
 
-
public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64)
+
public fun mock_case_4(vm: &signer, addr: address, start_height: u64, end_height: u64)
 
@@ -80,31 +86,108 @@ Implementation -
public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64){
-  // can only apply this to a validator
-  // assert!(DiemSystem::is_validator(addr) == true, 777704);
-  // mock mining for the address
-  // insufficient number of proofs
-  TowerState::test_helper_mock_mining_vm(vm, addr, 0);
-  // assert!(TowerState::get_count_in_epoch(addr) == 0, 777705);
+
public fun mock_case_4(vm: &signer, addr: address, start_height: u64, end_height: u64){
 
-  // mock the consensus votes for the address
   let voters = Vector::singleton<address>(addr);
 
-  let num_blocks = end_height - start_height;
   // Overwrite the statistics to mock that all have been validating.
   let i = 1;
-  let above_thresh = num_blocks / 2; // just be above 5% signatures
-
+  let above_thresh = 1; // just be above 5% signatures
+  Stats::test_helper_remove_votes(vm, addr);
   while (i < above_thresh) {
       // Mock the validator doing work for 15 blocks, and stats being updated.
+
       Stats::process_set_votes(vm, &voters);
       i = i + 1;
   };
-
+  // print(&Cases::get_case(vm, addr, start_height, end_height) );
   // TODO: careful that the range of heights is within the test
-  assert!(Cases::get_case(vm, addr, start_height, end_height) == 2, 777706);
+  assert!(Cases::get_case(vm, addr, start_height, end_height) == 4, 777706);
+
+}
+
+ + + + + + + +## Function `all_good_validators` + + + +
public fun all_good_validators(vm: &signer)
+
+ + + +
+Implementation + + +
public fun all_good_validators(vm: &signer) {
+
+  Testnet::assert_testnet(vm);
+  let vals = DiemSystem::get_val_set_addr();
+
+  let i = 0;
+  while (i < Vector::length(&vals)) {
+
+    let a = Vector::borrow(&vals, i);
+    mock_case_1(vm, *a, 0, 15);
+    i = i + 1;
+  };
+
+}
+
+ + + +
+ + + +## Function `pof_default` + + + +
public fun pof_default(vm: &signer): (vector<address>, vector<u64>, vector<u64>)
+
+ + + +
+Implementation + + +
public fun pof_default(vm: &signer): (vector<address>, vector<u64>, vector<u64>){
+
+  Testnet::assert_testnet(vm);
+  let vals = ValidatorUniverse::get_eligible_validators();
+
+  let bids = Vector::empty<u64>();
+  let expiry = Vector::empty<u64>();
+  let i = 0;
+  let prev = 0;
+  let fib = 1;
+  while (i < Vector::length(&vals)) {
+
+    Vector::push_back(&mut expiry, 1000);
+    let b = prev + fib;
+    Vector::push_back(&mut bids, b);
+
+    let a = Vector::borrow(&vals, i);
+    let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a);
+    // initialize and set.
+    ProofOfFee::set_bid(&sig, b, 1000);
+    prev = fib;
+    fib = b;
+    i = i + 1;
+  };
+  DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators
 
+  (vals, bids, expiry)
 }
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSig.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSig.md index 401e9818e1..fe928fe06a 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSig.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSig.md @@ -32,6 +32,7 @@ - [Function `extract_proposal_data`](#0x1_MultiSig_extract_proposal_data) - [Function `search_proposals_for_guid`](#0x1_MultiSig_search_proposals_for_guid) - [Function `find_index_of_ballot_by_data`](#0x1_MultiSig_find_index_of_ballot_by_data) +- [Function `get_proposal_status_by_id`](#0x1_MultiSig_get_proposal_status_by_id) - [Function `propose_governance`](#0x1_MultiSig_propose_governance) - [Function `vote_governance`](#0x1_MultiSig_vote_governance) - [Function `maybe_update_authorities`](#0x1_MultiSig_maybe_update_authorities) @@ -41,7 +42,6 @@
use 0x1::Ballot;
-use 0x1::Debug;
 use 0x1::DiemAccount;
 use 0x1::DiemConfig;
 use 0x1::Errors;
@@ -712,32 +712,32 @@ Once the "sponsor" which is setting up the multisig has created all the multisig
   multisig_address: address,
   proposal_data: Proposal<ProposalData>,
 ): GUID::ID acquires Governance, Action {
-  print(&20);
+  // print(&20);
   assert_authorized(sig, multisig_address);
-print(&21);
+// print(&21);
   let ms = borrow_global_mut<Governance>(multisig_address);
   let action = borrow_global_mut<Action<ProposalData>>(multisig_address);
-  print(&22);
+  // print(&22);
   // go through all proposals and clean up expired ones.
   lazy_cleanup_expired(action);
-print(&23);
+// print(&23);
   // does this proposal already exist in the pending list?
   let (found, guid, _idx, status_enum, _is_complete) = search_proposals_for_guid<ProposalData>(&action.vote, &proposal_data);
-  print(&found);
-  print(&status_enum);
-  print(&24);
+  // print(&found);
+  // print(&status_enum);
+  // print(&24);
   if (found && status_enum == Ballot::get_pending_enum()) {
-    print(&2401);
+    // print(&2401);
     // this exact proposal is already pending, so we we will just return the guid of the existing proposal.
     // we'll let the caller decide what to do (we wont vote by default)
     return guid
   };
 
-print(&25);
+// print(&25);
   let ballot = Ballot::propose_ballot(&mut action.vote, &ms.guid_capability, proposal_data);
-print(&26);
+// print(&26);
   let id = Ballot::get_ballot_id(ballot);
-print(&27);
+// print(&27);
   id
 }
 
@@ -834,26 +834,30 @@ helper function to vote with ID only id: &GUID::ID ): (bool, Option<WithdrawCapability>) acquires Governance, Action { - print(&60); + // print(&60); assert_authorized(sig, multisig_address); // belt and suspenders let ms = borrow_global_mut<Governance>(multisig_address); let action = borrow_global_mut<Action<ProposalData>>(multisig_address); - print(&61); + // print(&61); lazy_cleanup_expired(action); - print(&62); + // print(&62); // does this proposal already exist in the pending list? let (found, _idx, status_enum, is_complete) = Ballot::find_anywhere<Proposal<ProposalData>>(&action.vote, id); - print(&63); + // print(&63); assert!((found && status_enum == Ballot::get_pending_enum() && !is_complete), Errors::invalid_argument(EPROPOSAL_NOT_FOUND)); - print(&64); + // print(&64); let b = Ballot::get_ballot_by_id_mut(&mut action.vote, id); let t = Ballot::get_type_struct_mut(b); - print(&65); + // print(&65); Vector::push_back(&mut t.votes, Signer::address_of(sig)); - print(&66); + // print(&66); let passed = tally(t, *&ms.cfg_default_n_sigs); - print(&67); + // print(&67); + + if (passed) { + Ballot::complete_ballot(b); + }; // get the withdrawal capability, we're not allowed copy, but we can // extract and fill, and then replace it. See DiemAccount for an example. @@ -868,8 +872,8 @@ helper function to vote with ID only Option::none() }; - print(&withdraw_cap); - print(&68); + // print(&withdraw_cap); + // print(&68); (passed, withdraw_cap) } @@ -895,13 +899,13 @@ helper function to vote with ID only
fun tally<ProposalData: store + drop>(prop: &mut Proposal<ProposalData>, n: u64): bool {
-  print(&40001);
+  // print(&40001);
 
-  print(&prop.votes);
+  // print(&prop.votes);
 
   if (Vector::length(&prop.votes) >= n) {
     prop.approved = true;
-    print(&40002);
+    // print(&40002);
 
     return true
   };
@@ -930,22 +934,22 @@ helper function to vote with ID only
 
 
 
fun find_expired<ProposalData: store + drop>(a: & Action<ProposalData>): vector<GUID::ID>{
-  print(&40);
+  // print(&40);
   let epoch = DiemConfig::get_current_epoch();
   let b_vec = Ballot::get_list_ballots_by_enum(&a.vote, Ballot::get_pending_enum());
   let id_vec = Vector::empty();
-  print(&41);
+  // print(&41);
   let i = 0;
   while (i < Vector::length(b_vec)) {
-    print(&4101);
+    // print(&4101);
     let b = Vector::borrow(b_vec, i);
     let t = Ballot::get_type_struct<Proposal<ProposalData>>(b);
 
 
     if (epoch > t.expiration_epoch) {
-      print(&4010101);
+      // print(&4010101);
       let id = Ballot::get_ballot_id(b);
-      print(&4010102);
+      // print(&4010102);
       Vector::push_back(&mut id_vec, id);
 
     };
@@ -977,9 +981,9 @@ helper function to vote with ID only
 
 
fun lazy_cleanup_expired<ProposalData: store + drop>(a: &mut Action<ProposalData>) {
   let expired_vec = find_expired(a);
-  print(&expired_vec);
+  // print(&expired_vec);
   let len = Vector::length(&expired_vec);
-  print(&len);
+  // print(&len);
   let i = 0;
   while (i < len) {
     let id = Vector::borrow(&expired_vec, i);
@@ -1187,6 +1191,31 @@ returns a tuple of (is_found: bool, index: u64, status_enum: u8, is_complete: bo
 
 
 
+
+ + + +## Function `get_proposal_status_by_id` + + + +
public fun get_proposal_status_by_id<ProposalData: drop, store>(multisig_address: address, uid: &GUID::ID): (bool, u64, u8, bool)
+
+ + + +
+Implementation + + +
public fun get_proposal_status_by_id<ProposalData: drop + store>(multisig_address: address, uid: &GUID::ID): (bool, u64, u8, bool) acquires Action { // found, index, status_enum, is_complete
+  let a = borrow_global<Action<ProposalData>>(multisig_address);
+  Ballot::find_anywhere(&a.vote, uid)
+}
+
+ + +
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSigPayment.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSigPayment.md index e01bda89af..e77afc633f 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSigPayment.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/MultiSigPayment.md @@ -20,7 +20,6 @@
use 0x1::CoreAddresses;
-use 0x1::Debug;
 use 0x1::Diem;
 use 0x1::DiemAccount;
 use 0x1::FixedPoint32;
@@ -206,16 +205,16 @@ create a payment object, whcih can be send in a proposal.
 
 
 
public fun propose_payment(sig: &signer, multisig_addr: address, recipient: address, amount: u64, note: vector<u8>, duration_epochs: Option<u64>) {
-  print(&10);
+  // print(&10);
   let pay = new_payment(recipient, amount, *¬e);
-  print(&11);
+  // print(&11);
   let prop = MultiSig::proposal_constructor(pay, duration_epochs);
-  print(&12);
+  // print(&12);
   let guid = MultiSig::propose_new<PaymentType>(sig, multisig_addr, prop);
-  print(&guid);
-  print(&13);
+  // print(&guid);
+  // print(&13);
   vote_payment(sig, multisig_addr, &guid);
-  print(&14);
+  // print(&14);
 }
 
@@ -239,26 +238,26 @@ create a payment object, whcih can be send in a proposal.
public fun vote_payment(sig: &signer, multisig_address: address, id: &GUID::ID) {
-  print(&50);
+  // print(&50);
   let (passed, cap_opt) = MultiSig::vote_with_id<PaymentType>(sig, id, multisig_address);
-  print(&passed);
-  // print(&data);
-  print(&cap_opt);
+  // print(&passed);
+  // // print(&data);
+  // print(&cap_opt);
 
-  print(&51);
+  // print(&51);
 
   if (passed && Option::is_some(&cap_opt)) {
     let cap = Option::borrow(&cap_opt);
-    print(&5010);
+    // print(&5010);
     let data = MultiSig::extract_proposal_data(multisig_address, id);
     release_payment(&data, cap);
-    print(&5011);
+    // print(&5011);
 
   };
 
 
   MultiSig::maybe_restore_withdraw_cap(sig, multisig_address, cap_opt); // don't need this and can't drop.
-  print(&52);
+  // print(&52);
 
 }
 
@@ -307,7 +306,7 @@ create a payment object, whcih can be send in a proposal.
fun release_payment(p: &PaymentType, cap: &WithdrawCapability) {
-  print(&90001);
+  // print(&90001);
   DiemAccount::pay_from<GAS>(
     cap,
     p.destination,
@@ -399,15 +398,15 @@ create a payment object, whcih can be send in a proposal.
   let reg = borrow_global<RootMultiSigRegistry>(@VMReserved);
   let i = 0;
   while (i < Vector::length(®.list)) {
-    print(&7777777790001);
+    // print(&7777777790001);
     let multi_sig_addr = Vector::borrow(®.list, i);
 
     let pct = FixedPoint32::create_from_rational(reg.fee, PERCENT_SCALE);
-    print(&pct);
+    // print(&pct);
     let fee = FixedPoint32::multiply_u64(DiemAccount::balance<GAS>(*multi_sig_addr), pct);
-    print(&fee);
+    // print(&fee);
     let c = DiemAccount::vm_withdraw<GAS>(vm, *multi_sig_addr, fee);
-    TransactionFee::pay_fee(c);
+    TransactionFee::pay_fee_and_track(*multi_sig_addr, c);
     i = i + 1;
   };
 
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ProofOfFee.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ProofOfFee.md
new file mode 100644
index 0000000000..9af2688b6e
--- /dev/null
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ProofOfFee.md
@@ -0,0 +1,1118 @@
+
+
+
+# Module `0x1::ProofOfFee`
+
+
+
+-  [Resource `ProofOfFeeAuction`](#0x1_ProofOfFee_ProofOfFeeAuction)
+-  [Resource `ConsensusReward`](#0x1_ProofOfFee_ConsensusReward)
+-  [Constants](#@Constants_0)
+-  [Function `init_genesis_baseline_reward`](#0x1_ProofOfFee_init_genesis_baseline_reward)
+-  [Function `init`](#0x1_ProofOfFee_init)
+-  [Function `get_sorted_vals`](#0x1_ProofOfFee_get_sorted_vals)
+-  [Function `fill_seats_and_get_price`](#0x1_ProofOfFee_fill_seats_and_get_price)
+-  [Function `audit_qualification`](#0x1_ProofOfFee_audit_qualification)
+-  [Function `reward_thermostat`](#0x1_ProofOfFee_reward_thermostat)
+-  [Function `set_history`](#0x1_ProofOfFee_set_history)
+-  [Function `get_median`](#0x1_ProofOfFee_get_median)
+-  [Function `get_consensus_reward`](#0x1_ProofOfFee_get_consensus_reward)
+-  [Function `current_bid`](#0x1_ProofOfFee_current_bid)
+-  [Function `is_already_retracted`](#0x1_ProofOfFee_is_already_retracted)
+-  [Function `top_n_accounts`](#0x1_ProofOfFee_top_n_accounts)
+-  [Function `set_bid`](#0x1_ProofOfFee_set_bid)
+-  [Function `retract_bid`](#0x1_ProofOfFee_retract_bid)
+-  [Function `init_bidding`](#0x1_ProofOfFee_init_bidding)
+-  [Function `pof_update_bid`](#0x1_ProofOfFee_pof_update_bid)
+-  [Function `pof_retract_bid`](#0x1_ProofOfFee_pof_retract_bid)
+-  [Function `test_set_val_bids`](#0x1_ProofOfFee_test_set_val_bids)
+-  [Function `test_set_one_bid`](#0x1_ProofOfFee_test_set_one_bid)
+-  [Function `test_mock_reward`](#0x1_ProofOfFee_test_mock_reward)
+
+
+
use 0x1::DiemAccount;
+use 0x1::DiemConfig;
+use 0x1::Errors;
+use 0x1::FixedPoint32;
+use 0x1::Jail;
+use 0x1::Signer;
+use 0x1::Testnet;
+use 0x1::ValidatorConfig;
+use 0x1::ValidatorUniverse;
+use 0x1::Vector;
+use 0x1::Vouch;
+
+ + + + + +## Resource `ProofOfFeeAuction` + + + +
struct ProofOfFeeAuction has key
+
+ + + +
+Fields + + +
+
+bid: u64 +
+
+ +
+
+epoch_expiration: u64 +
+
+ +
+
+last_epoch_retracted: u64 +
+
+ +
+
+ + +
+ + + +## Resource `ConsensusReward` + + + +
struct ConsensusReward has key
+
+ + + +
+Fields + + +
+
+value: u64 +
+
+ +
+
+clearing_price: u64 +
+
+ +
+
+median_win_bid: u64 +
+
+ +
+
+median_history: vector<u64> +
+
+ +
+
+ + +
+ + + +## Constants + + + + + + +
const ENOT_AN_ACTIVE_VALIDATOR: u64 = 190001;
+
+ + + + + + + +
const EABOVE_RETRACT_LIMIT: u64 = 190003;
+
+ + + + + + + +
const EBID_ABOVE_MAX_PCT: u64 = 190002;
+
+ + + + + + + +
const GENESIS_BASELINE_REWARD: u64 = 1000000;
+
+ + + + + +## Function `init_genesis_baseline_reward` + + + +
public fun init_genesis_baseline_reward(vm: &signer)
+
+ + + +
+Implementation + + +
public fun init_genesis_baseline_reward(vm: &signer) {
+  if (Signer::address_of(vm) != @VMReserved) return;
+
+  if (!exists<ConsensusReward>(@VMReserved)) {
+    move_to<ConsensusReward>(
+      vm,
+      ConsensusReward {
+        value: GENESIS_BASELINE_REWARD,
+        clearing_price: 0,
+        median_win_bid: 0,
+        median_history: Vector::empty<u64>(),
+      }
+    );
+  }
+}
+
+ + + +
+ + + +## Function `init` + + + +
public fun init(account_sig: &signer)
+
+ + + +
+Implementation + + +
public fun init(account_sig: &signer) {
+
+  let acc = Signer::address_of(account_sig);
+
+  assert!(ValidatorUniverse::is_in_universe(acc), Errors::requires_role(ENOT_AN_ACTIVE_VALIDATOR));
+
+  if (!exists<ProofOfFeeAuction>(acc)) {
+    move_to<ProofOfFeeAuction>(
+    account_sig,
+      ProofOfFeeAuction {
+        bid: 0,
+        epoch_expiration: 0,
+        last_epoch_retracted: 0,
+      }
+    );
+  }
+}
+
+ + + +
+ + + +## Function `get_sorted_vals` + + + +
public fun get_sorted_vals(unfiltered: bool): vector<address>
+
+ + + +
+Implementation + + +
public fun get_sorted_vals(unfiltered: bool): vector<address> acquires ProofOfFeeAuction, ConsensusReward {
+  let eligible_validators = ValidatorUniverse::get_eligible_validators();
+  let length = Vector::length<address>(&eligible_validators);
+  // print(&length);
+  // Vector to store each address's node_weight
+  let weights = Vector::empty<u64>();
+  let filtered_vals = Vector::empty<address>();
+  let k = 0;
+  while (k < length) {
+    // TODO: Ensure that this address is an active validator
+
+    let cur_address = *Vector::borrow<address>(&eligible_validators, k);
+    let (bid, _expire) = current_bid(cur_address);
+    // print(&bid);
+    // print(&expire);
+    if (!unfiltered && !audit_qualification(&cur_address)) {
+      k = k + 1;
+      continue
+    };
+    Vector::push_back<u64>(&mut weights, bid);
+    Vector::push_back<address>(&mut filtered_vals, cur_address);
+    k = k + 1;
+  };
+
+  // print(&weights);
+
+  // Sorting the accounts vector based on value (weights).
+  // Bubble sort algorithm
+  let len_filtered = Vector::length<address>(&filtered_vals);
+  // print(&len_filtered);
+  // print(&Vector::length(&weights));
+  if (len_filtered < 2) return filtered_vals;
+  let i = 0;
+  while (i < len_filtered){
+    let j = 0;
+    while(j < len_filtered-i-1){
+      // print(&8888801);
+
+      let value_j = *(Vector::borrow<u64>(&weights, j));
+      // print(&8888802);
+      let value_jp1 = *(Vector::borrow<u64>(&weights, j+1));
+      if(value_j > value_jp1){
+        // print(&8888803);
+        Vector::swap<u64>(&mut weights, j, j+1);
+        // print(&8888804);
+        Vector::swap<address>(&mut filtered_vals, j, j+1);
+      };
+      j = j + 1;
+      // print(&8888805);
+    };
+    i = i + 1;
+    // print(&8888806);
+  };
+
+  // print(&filtered_vals);
+  // Reverse to have sorted order - high to low.
+  Vector::reverse<address>(&mut filtered_vals);
+
+  return filtered_vals
+}
+
+ + + +
+ + + +## Function `fill_seats_and_get_price` + + + +
public fun fill_seats_and_get_price(vm: &signer, set_size: u64, sorted_vals_by_bid: &vector<address>, proven_nodes: &vector<address>): (vector<address>, u64)
+
+ + + +
+Implementation + + +
public fun fill_seats_and_get_price(
+  vm: &signer,
+  set_size: u64,
+  sorted_vals_by_bid: &vector<address>,
+  proven_nodes: &vector<address>
+): (vector<address>, u64) acquires ProofOfFeeAuction, ConsensusReward {
+  if (Signer::address_of(vm) != @VMReserved) return (Vector::empty<address>(), 0);
+
+  //print(sorted_vals_by_bid);
+
+  // let (baseline_reward, _, _) = get_consensus_reward();
+
+  let seats_to_fill = Vector::empty<address>();
+
+  // check the max size of the validator set.
+  // there may be too few "proven" validators to fill the set with 2/3rds proven nodes of the stated set_size.
+  let proven_len = Vector::length(proven_nodes);
+
+  // check if the proven len plus unproven quota will
+  // be greater than the set size. Which is the expected.
+  // Otherwise the set will need to be smaller than the
+  // declared size, because we will have to fill with more unproven nodes.
+  let one_third_of_max = proven_len/2;
+  let safe_set_size = proven_len + one_third_of_max;
+  // print(&77777777);
+  // print(&proven_len);
+  // print(&one_third_of_max);
+  // print(&safe_set_size);
+
+  let (set_size, max_unproven) = if (safe_set_size < set_size) {
+    (safe_set_size, safe_set_size/3)
+    // if (safe_set_size < 5) { // safety. mostly for test scenarios given rounding issues
+    //   (safe_set_size, 1)
+    // } else {
+
+    // }
+
+  } else {
+    // happy case, unproven bidders are a smaller minority
+    (set_size, set_size/3)
+  };
+  // print(&set_size);
+  // print(&max_unproven);
+
+
+  // print(&8006010201);
+
+  // Now we can seat the validators based on the algo above:
+  // 1. seat the proven nodes of previous epoch
+  // 2. seat validators who did not participate in the previous epoch:
+  // 2a. seat the vals with jail reputation < 2
+  // 2b. seat the remainder of the unproven vals with any jail reputation.
+
+  let num_unproven_added = 0;
+  let i = 0u64;
+  while (
+    (Vector::length(&seats_to_fill) < set_size) &&
+    (i < Vector::length(sorted_vals_by_bid))
+  ) {
+    // // print(&i);
+    let val = Vector::borrow(sorted_vals_by_bid, i);
+
+    // // belt and suspenders, we get_sorted_vals(true) should filter ineligible validators
+    // if (!audit_qualification(val, baseline_reward)) {
+    //   i = i + 1;
+    //   continue
+    // };
+
+
+    // check if a proven node
+    if (Vector::contains(proven_nodes, val)) {
+      // print(&8006010205);
+      // // print(&01);
+      Vector::push_back(&mut seats_to_fill, *val);
+    } else {
+      // print(&8006010206);
+      // print(&max_unproven);
+      // print(&num_unproven_added);
+      // // print(&02);
+      // for unproven nodes, push it to list if we haven't hit limit
+      if (num_unproven_added < max_unproven ) {
+        // TODO: check jail reputation
+        // // print(&03);
+        Vector::push_back(&mut seats_to_fill, *val);
+        // // print(&04);
+        // print(&8006010207);
+        num_unproven_added = num_unproven_added + 1;
+      };
+    };
+    // don't advance if we havent filled
+    i = i + 1;
+  };
+  // // print(&05);
+  // print(&8006010208);
+  // print(&seats_to_fill);
+
+
+
+  // Set history
+  set_history(vm, &seats_to_fill);
+
+  // we failed to seat anyone.
+  // let EpochBoundary deal with this.
+  if (Vector::is_empty(&seats_to_fill)) {
+    // print(&8006010209);
+
+    return (seats_to_fill, 0)
+  };
+
+  // Find the clearing price which all validators will pay
+  let lowest_bidder = Vector::borrow(&seats_to_fill, Vector::length(&seats_to_fill) - 1);
+
+  let (lowest_bid_pct, _) = current_bid(*lowest_bidder);
+
+  // print(&lowest_bid_pct);
+
+  // update the clearing price
+  let cr = borrow_global_mut<ConsensusReward>(@VMReserved);
+  cr.clearing_price = lowest_bid_pct;
+
+  return (seats_to_fill, lowest_bid_pct)
+}
+
+ + + +
+ + + +## Function `audit_qualification` + + + +
public fun audit_qualification(val: &address): bool
+
+ + + +
+Implementation + + +
public fun audit_qualification(val: &address): bool acquires ProofOfFeeAuction, ConsensusReward {
+
+    // Safety check: node has valid configs
+    if (!ValidatorConfig::is_valid(*val)) return false;
+    // has operator account set to another address
+    let oper = ValidatorConfig::get_operator(*val);
+    if (oper == *val) return false;
+
+    // is a slow wallet
+    if (!DiemAccount::is_slow(*val)) return false;
+
+    // print(&8006010203);
+    // we can't seat validators that were just jailed
+    // NOTE: epoch reconfigure needs to reset the jail
+    // before calling the proof of fee.
+    if (Jail::is_jailed(*val)) return false;
+    // print(&8006010204);
+    // we can't seat validators who don't have minimum viable vouches
+    if (!Vouch::unrelated_buddies_above_thresh(*val)) return false;
+
+    // print(&80060102041);
+
+    let (bid, expire) = current_bid(*val);
+    //print(val);
+    // print(&bid);
+    // print(&expire);
+
+    // Skip if the bid expired. belt and suspenders, this should have been checked in the sorting above.
+    // TODO: make this it's own function so it can be publicly callable, it's useful generally, and for debugging.
+    // print(&DiemConfig::get_current_epoch());
+    if (DiemConfig::get_current_epoch() > expire) return false;
+
+    // skip the user if they don't have sufficient UNLOCKED funds
+    // or if the bid expired.
+    // print(&80060102042);
+    let unlocked_coins = DiemAccount::unlocked_amount(*val);
+    // print(&unlocked_coins);
+
+    let (baseline_reward, _, _) = get_consensus_reward();
+    let coin_required = FixedPoint32::multiply_u64(baseline_reward, FixedPoint32::create_from_rational(bid, 1000));
+
+    // print(&coin_required);
+    if (unlocked_coins < coin_required) return false;
+
+    // print(&80060102043);
+    true
+}
+
+ + + +
+ + + +## Function `reward_thermostat` + + + +
public fun reward_thermostat(vm: &signer)
+
+ + + +
+Implementation + + +
public fun reward_thermostat(vm: &signer) acquires ConsensusReward {
+  if (Signer::address_of(vm) != @VMReserved) {
+    return
+  };
+  // check the bid history
+  // if there are 5 days above 95% adjust the reward up by 5%
+  // adjust by more if it has been 10 days then, 10%
+  // if there are 5 days below 50% adjust the reward down.
+  // adjust by more if it has been 10 days then 10%
+
+  let bid_upper_bound = 0950;
+  let bid_lower_bound = 0500;
+
+  let short_window: u64 = 5;
+  let long_window: u64 = 10;
+
+  let cr = borrow_global_mut<ConsensusReward>(@VMReserved);
+
+  // print(&8006010551);
+  let len = Vector::length<u64>(&cr.median_history);
+  let i = 0;
+
+  let epochs_above = 0;
+  let epochs_below = 0;
+  while (i < 16 && i < len) { // max ten days, but may have less in history, filling set should truncate the history at 15 epochs.
+  // print(&8006010552);
+    let avg_bid = *Vector::borrow<u64>(&cr.median_history, i);
+    // print(&8006010553);
+    if (avg_bid > bid_upper_bound) {
+      epochs_above = epochs_above + 1;
+    } else if (avg_bid < bid_lower_bound) {
+      epochs_below = epochs_below + 1;
+    };
+
+    i = i + 1;
+  };
+
+  // print(&8006010554);
+  if (cr.value > 0) {
+    // print(&8006010555);
+    // print(&epochs_above);
+    // print(&epochs_below);
+
+
+    // TODO: this is an initial implementation, we need to
+    // decide if we want more granularity in the reward adjustment
+    // Note: making this readable for now, but we can optimize later
+    if (epochs_above > epochs_below) {
+
+      // if (epochs_above > short_window) {
+      // print(&8006010556);
+      // check for zeros.
+      // TODO: put a better safety check here
+
+      // If the Validators are bidding near 100% that means
+      // the reward is very generous, i.e. their opportunity
+      // cost is met at small percentages. This means the
+      // implicit bond is very high on validators. E.g.
+      // at 1% median bid, the implicit bond is 100x the reward.
+      // We need to DECREASE the reward
+      // print(&8006010558);
+
+      if (epochs_above > long_window) {
+
+        // decrease the reward by 10%
+        // print(&8006010559);
+
+
+        cr.value = cr.value - (cr.value / 10);
+        return // return early since we can't increase and decrease simultaneously
+      } else if (epochs_above > short_window) {
+        // decrease the reward by 5%
+        // print(&80060105510);
+        cr.value = cr.value - (cr.value / 20);
+
+
+        return // return early since we can't increase and decrease simultaneously
+      }
+    };
+
+
+      // if validators are bidding low percentages
+      // it means the nominal reward is not high enough.
+      // That is the validator's opportunity cost is not met within a
+      // range where the bond is meaningful.
+      // For example: if the bids for the epoch's reward is 50% of the  value, that means the potential profit, is the same as the potential loss.
+      // At a 25% bid (potential loss), the profit is thus 75% of the value, which means the implicit bond is 25/75, or 1/3 of the bond, the risk favors the validator. This means among other things, that an attacker can pay for the cost of the attack with the profits. See paper, for more details.
+
+      // we need to INCREASE the reward, so that the bond is more meaningful.
+      // print(&80060105511);
+
+      if (epochs_below > long_window) {
+        // print(&80060105513);
+
+        // increase the reward by 10%
+        cr.value = cr.value + (cr.value / 10);
+      } else if (epochs_below > short_window) {
+        // print(&80060105512);
+
+        // increase the reward by 5%
+        cr.value = cr.value + (cr.value / 20);
+      };
+    // };
+  };
+}
+
+ + + +
+ + + +## Function `set_history` + +find the median bid to push to history + + +
public fun set_history(vm: &signer, seats_to_fill: &vector<address>)
+
+ + + +
+Implementation + + +
public fun set_history(vm: &signer, seats_to_fill: &vector<address>) acquires ProofOfFeeAuction, ConsensusReward {
+  if (Signer::address_of(vm) != @VMReserved) {
+    return
+  };
+
+  // print(&99901);
+  let median_bid = get_median(seats_to_fill);
+  // push to history
+  let cr = borrow_global_mut<ConsensusReward>(@VMReserved);
+  cr.median_win_bid = median_bid;
+  if (Vector::length(&cr.median_history) < 10) {
+    // print(&99902);
+    Vector::push_back(&mut cr.median_history, median_bid);
+  } else {
+    // print(&99903);
+    Vector::remove(&mut cr.median_history, 0);
+    Vector::push_back(&mut cr.median_history, median_bid);
+  };
+}
+
+ + + +
+ + + +## Function `get_median` + + + +
fun get_median(seats_to_fill: &vector<address>): u64
+
+ + + +
+Implementation + + +
fun get_median(seats_to_fill: &vector<address>):u64 acquires ProofOfFeeAuction {
+  // TODO: the list is sorted above, so
+  // we assume the median is the middle element
+  let len = Vector::length(seats_to_fill);
+  if (len == 0) {
+    return 0
+  };
+  let median_bidder = if (len > 2) {
+    Vector::borrow(seats_to_fill, len/2)
+  } else {
+    Vector::borrow(seats_to_fill, 0)
+  };
+  let (median_bid, _) = current_bid(*median_bidder);
+  return median_bid
+}
+
+ + + +
+ + + +## Function `get_consensus_reward` + + + +
public fun get_consensus_reward(): (u64, u64, u64)
+
+ + + +
+Implementation + + +
public fun get_consensus_reward(): (u64, u64, u64) acquires ConsensusReward {
+  let b = borrow_global<ConsensusReward>(@VMReserved );
+  return (b.value, b.clearing_price, b.median_win_bid)
+}
+
+ + + +
+ + + +## Function `current_bid` + + + +
public fun current_bid(node_addr: address): (u64, u64)
+
+ + + +
+Implementation + + +
public fun current_bid(node_addr: address): (u64, u64) acquires ProofOfFeeAuction {
+  if (exists<ProofOfFeeAuction>(node_addr)) {
+    let pof = borrow_global<ProofOfFeeAuction>(node_addr);
+    let e = DiemConfig::get_current_epoch();
+    // check the expiration of the bid
+    // the bid is zero if it expires.
+    // The expiration epoch number is inclusive of the epoch.
+    // i.e. the bid expires on e + 1.
+    if (pof.epoch_expiration >= e || pof.epoch_expiration == 0) {
+      return (pof.bid, pof.epoch_expiration)
+    };
+    return (0, pof.epoch_expiration)
+  };
+  return (0, 0)
+}
+
+ + + +
+ + + +## Function `is_already_retracted` + + + +
public fun is_already_retracted(node_addr: address): (bool, u64)
+
+ + + +
+Implementation + + +
public fun is_already_retracted(node_addr: address): (bool, u64) acquires ProofOfFeeAuction {
+  if (exists<ProofOfFeeAuction>(node_addr)) {
+    let when_retract = *&borrow_global<ProofOfFeeAuction>(node_addr).last_epoch_retracted;
+    return (DiemConfig::get_current_epoch() >= when_retract,  when_retract)
+  };
+  return (false, 0)
+}
+
+ + + +
+ + + +## Function `top_n_accounts` + + + +
public fun top_n_accounts(account: &signer, n: u64, unfiltered: bool): vector<address>
+
+ + + +
+Implementation + + +
public fun top_n_accounts(account: &signer, n: u64, unfiltered: bool): vector<address> acquires ProofOfFeeAuction, ConsensusReward {
+    assert!(Signer::address_of(account) == @DiemRoot, Errors::requires_role(140101));
+
+    let eligible_validators = get_sorted_vals(unfiltered);
+    let len = Vector::length<address>(&eligible_validators);
+    if(len <= n) return eligible_validators;
+
+    let diff = len - n;
+    while(diff > 0){
+      Vector::pop_back(&mut eligible_validators);
+      diff = diff - 1;
+    };
+
+    eligible_validators
+}
+
+ + + +
+ + + +## Function `set_bid` + + + +
public fun set_bid(account_sig: &signer, bid: u64, expiry_epoch: u64)
+
+ + + +
+Implementation + + +
public fun set_bid(account_sig: &signer, bid: u64, expiry_epoch: u64) acquires ProofOfFeeAuction {
+
+  let acc = Signer::address_of(account_sig);
+  if (!exists<ProofOfFeeAuction>(acc)) {
+    init(account_sig);
+  };
+
+  // bid must be below 110%
+  assert!(bid <= 1100, Errors::ol_tx(EBID_ABOVE_MAX_PCT));
+
+  let pof = borrow_global_mut<ProofOfFeeAuction>(acc);
+  pof.epoch_expiration = expiry_epoch;
+  pof.bid = bid;
+}
+
+ + + +
+ + + +## Function `retract_bid` + +Note that the validator will not be bidding on any future +epochs if they retract their bid. The must set a new bid. + + +
public fun retract_bid(account_sig: &signer)
+
+ + + +
+Implementation + + +
public fun retract_bid(account_sig: &signer) acquires ProofOfFeeAuction {
+
+  let acc = Signer::address_of(account_sig);
+  if (!exists<ProofOfFeeAuction>(acc)) {
+    init(account_sig);
+  };
+
+
+  let pof = borrow_global_mut<ProofOfFeeAuction>(acc);
+  let this_epoch = DiemConfig::get_current_epoch();
+
+  //////// LEAVE COMMENTED. Code for a potential upgrade. ////////
+  // See above discussion for retracting of bids.
+  //
+  // already retracted this epoch
+  // assert!(this_epoch > pof.last_epoch_retracted, Errors::ol_tx(EABOVE_RETRACT_LIMIT));
+  //////// LEAVE COMMENTED. Code for a potential upgrade. ////////
+
+
+  pof.epoch_expiration = 0;
+  pof.bid = 0;
+  pof.last_epoch_retracted = this_epoch;
+}
+
+ + + +
+ + + +## Function `init_bidding` + + + +
public(script) fun init_bidding(sender: signer)
+
+ + + +
+Implementation + + +
public(script) fun init_bidding(sender: signer) {
+  init(&sender);
+}
+
+ + + +
+ + + +## Function `pof_update_bid` + + + +
public(script) fun pof_update_bid(sender: signer, bid: u64, epoch_expiry: u64)
+
+ + + +
+Implementation + + +
public(script) fun pof_update_bid(sender: signer, bid: u64, epoch_expiry: u64) acquires ProofOfFeeAuction {
+  // update the bid, initializes if not already.
+  set_bid(&sender, bid, epoch_expiry);
+}
+
+ + + +
+ + + +## Function `pof_retract_bid` + + + +
public(script) fun pof_retract_bid(sender: signer)
+
+ + + +
+Implementation + + +
public(script) fun pof_retract_bid(sender: signer) acquires ProofOfFeeAuction {
+  // retract a bid
+  retract_bid(&sender);
+}
+
+ + + +
+ + + +## Function `test_set_val_bids` + + + +
public fun test_set_val_bids(vm: &signer, vals: &vector<address>, bids: &vector<u64>, expiry: &vector<u64>)
+
+ + + +
+Implementation + + +
public fun test_set_val_bids(vm: &signer, vals: &vector<address>, bids: &vector<u64>, expiry: &vector<u64>) acquires ProofOfFeeAuction {
+  Testnet::assert_testnet(vm);
+
+  let len = Vector::length(vals);
+  let i = 0;
+  while (i < len) {
+    let bid = Vector::borrow(bids, i);
+    let exp = Vector::borrow(expiry, i);
+    let addr = Vector::borrow(vals, i);
+    test_set_one_bid(vm, addr, *bid, *exp);
+    i = i + 1;
+  };
+}
+
+ + + +
+ + + +## Function `test_set_one_bid` + + + +
public fun test_set_one_bid(vm: &signer, val: &address, bid: u64, exp: u64)
+
+ + + +
+Implementation + + +
public fun test_set_one_bid(vm: &signer, val: &address, bid:  u64, exp: u64) acquires ProofOfFeeAuction {
+  Testnet::assert_testnet(vm);
+  let pof = borrow_global_mut<ProofOfFeeAuction>(*val);
+  pof.epoch_expiration = exp;
+  pof.bid = bid;
+}
+
+ + + +
+ + + +## Function `test_mock_reward` + + + +
public fun test_mock_reward(vm: &signer, value: u64, clearing_price: u64, median_win_bid: u64, median_history: vector<u64>)
+
+ + + +
+Implementation + + +
public fun test_mock_reward(
+  vm: &signer,
+  value: u64,
+  clearing_price: u64,
+  median_win_bid: u64,
+  median_history: vector<u64>,
+) acquires ConsensusReward {
+  Testnet::assert_testnet(vm);
+
+  let cr = borrow_global_mut<ConsensusReward>(@VMReserved );
+  cr.value = value;
+  cr.clearing_price = clearing_price;
+  cr.median_win_bid = median_win_bid;
+  cr.median_history = median_history;
+
+}
+
+ + + +
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Receipts.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Receipts.md index 43b5edfeb9..267b6e3fba 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Receipts.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Receipts.md @@ -7,6 +7,8 @@ - [Resource `UserReceipts`](#0x1_Receipts_UserReceipts) - [Function `init`](#0x1_Receipts_init) +- [Function `is_init`](#0x1_Receipts_is_init) +- [Function `write_receipt_vm`](#0x1_Receipts_write_receipt_vm) - [Function `write_receipt`](#0x1_Receipts_write_receipt) - [Function `read_receipt`](#0x1_Receipts_read_receipt) @@ -97,15 +99,67 @@ + + + + +## Function `is_init` + + + +
public fun is_init(addr: address): bool
+
+ + + +
+Implementation + + +
public fun is_init(addr: address):bool {
+  exists<UserReceipts>(addr)
+}
+
+ + + +
+ + + +## Function `write_receipt_vm` + + + +
public fun write_receipt_vm(sender: &signer, payer: address, destination: address, value: u64): (u64, u64, u64)
+
+ + + +
+Implementation + + +
public fun write_receipt_vm(sender: &signer, payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts {
+    // TODO: make a function for user to write own receipt.
+    CoreAddresses::assert_vm(sender);
+    write_receipt(payer, destination, value)
+}
+
+ + +
## Function `write_receipt` +Restricted to DiemAccount, we need to write receipts for certain users, like to DonorDirected Accounts. +Core Devs: Danger: only DiemAccount can use this. -
public fun write_receipt(sender: &signer, payer: address, destination: address, value: u64): (u64, u64, u64)
+
public(friend) fun write_receipt(payer: address, destination: address, value: u64): (u64, u64, u64)
 
@@ -114,9 +168,8 @@ Implementation -
public fun write_receipt(sender: &signer, payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts {
+
public(friend) fun write_receipt(payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts {
     // TODO: make a function for user to write own receipt.
-    CoreAddresses::assert_vm(sender);
     if (!exists<UserReceipts>(payer)) {
       return (0, 0, 0)
     };
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Stats.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Stats.md
index 3ccc273e3e..e6c6d84127 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Stats.md
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Stats.md
@@ -22,8 +22,9 @@
 -  [Function `get_total_votes`](#0x1_Stats_get_total_votes)
 -  [Function `get_total_props`](#0x1_Stats_get_total_props)
 -  [Function `get_history`](#0x1_Stats_get_history)
--  [Function `test_helper_inc_vote_addr`](#0x1_Stats_test_helper_inc_vote_addr)
 -  [Function `get_sorted_vals_by_props`](#0x1_Stats_get_sorted_vals_by_props)
+-  [Function `test_helper_inc_vote_addr`](#0x1_Stats_test_helper_inc_vote_addr)
+-  [Function `test_helper_remove_votes`](#0x1_Stats_test_helper_remove_votes)
 
 
 
use 0x1::Errors;
@@ -478,12 +479,12 @@
   } else {
     // debugging rescue mission. Remove after network stabilizes Apr 2022.
     // something bad happened and we can't find this node in our list.
-    // print(&666);
-    // print(&node_addr);
+    // // print(&666);
+    // // print(&node_addr);
   };
   // update total vote count anyways even if we can't find this person.
   stats.current.total_votes = stats.current.total_votes + 1;
-  // print(&stats.current);
+  // // print(&stats.current);
 }
 
@@ -599,35 +600,6 @@ - - - - -## Function `test_helper_inc_vote_addr` - -TEST HELPERS - - -
public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address)
-
- - - -
-Implementation - - -
public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats {
-  let sender = Signer::address_of(vm);
-  assert!(sender == @DiemRoot, Errors::requires_role(190015));
-  assert!(Testnet::is_testnet(), Errors::invalid_state(190015));
-
-  inc_vote(vm, node_addr);
-}
-
- - -
@@ -701,4 +673,66 @@ TEST HELPERS + + + + +## Function `test_helper_inc_vote_addr` + +TEST HELPERS + + +
public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address)
+
+ + + +
+Implementation + + +
public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats {
+  let sender = Signer::address_of(vm);
+  assert!(sender == @DiemRoot, Errors::requires_role(190015));
+  assert!(Testnet::is_testnet(), Errors::invalid_state(190015));
+
+  inc_vote(vm, node_addr);
+}
+
+ + + +
+ + + +## Function `test_helper_remove_votes` + + + +
public fun test_helper_remove_votes(vm: &signer, node_addr: address)
+
+ + + +
+Implementation + + +
public fun test_helper_remove_votes(vm: &signer, node_addr: address) acquires ValStats {
+  Testnet::assert_testnet(vm);
+
+  let stats = borrow_global_mut<ValStats>(@VMReserved);
+  let (is_true, i) = Vector::index_of<address>(&mut stats.current.addr, &node_addr);
+  if (is_true) {
+    let votes = *Vector::borrow<u64>(&mut stats.current.vote_count, i);
+    Vector::push_back(&mut stats.current.vote_count, 0);
+    Vector::swap_remove(&mut stats.current.vote_count, i);
+    stats.current.total_votes = stats.current.total_votes - votes;
+  }
+}
+
+ + +
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Subsidy.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Subsidy.md index ec4a809adf..952f784b21 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Subsidy.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Subsidy.md @@ -83,6 +83,7 @@ let minted_coins = Diem::mint<GAS>(vm, subsidy_granted); DiemAccount::vm_deposit_with_metadata<GAS>( vm, + @VMReserved, node_address, minted_coins, b"validator subsidy", @@ -241,6 +242,7 @@ let minted_coins = Diem::mint<GAS>(vm_sig, *&subsidy); DiemAccount::vm_deposit_with_metadata<GAS>( vm_sig, + @VMReserved, node_address, minted_coins, b"genesis subsidy", @@ -301,6 +303,7 @@ DiemAccount::vm_deposit_with_metadata<GAS>( vm, + @VMReserved, node_address, TransactionFee::get_transaction_fees_coins_amount<GAS>(vm, fees), b"transaction fees", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TestFixtures.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TestFixtures.md index 6a5921d2a8..c2d076a551 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TestFixtures.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TestFixtures.md @@ -22,9 +22,14 @@ - [Function `eve_0_easy_sol`](#0x1_TestFixtures_eve_0_easy_sol) - [Function `eve_1_easy_chal`](#0x1_TestFixtures_eve_1_easy_chal) - [Function `eve_1_easy_sol`](#0x1_TestFixtures_eve_1_easy_sol) +- [Function `pof_default`](#0x1_TestFixtures_pof_default) -
use 0x1::Testnet;
+
use 0x1::DiemAccount;
+use 0x1::ProofOfFee;
+use 0x1::Testnet;
+use 0x1::ValidatorUniverse;
+use 0x1::Vector;
 
@@ -449,4 +454,53 @@ + + + + +## Function `pof_default` + + + +
public fun pof_default(vm: &signer): (vector<address>, vector<u64>, vector<u64>)
+
+ + + +
+Implementation + + +
public fun pof_default(vm: &signer): (vector<address>, vector<u64>, vector<u64>){
+
+  Testnet::assert_testnet(vm);
+  let vals = ValidatorUniverse::get_eligible_validators();
+
+  let bids = Vector::empty<u64>();
+  let expiry = Vector::empty<u64>();
+  let i = 0;
+  let prev = 0;
+  let fib = 1;
+  while (i < Vector::length(&vals)) {
+
+    Vector::push_back(&mut expiry, 1000);
+    let b = prev + fib;
+    Vector::push_back(&mut bids, b);
+
+    let a = Vector::borrow(&vals, i);
+    let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a);
+    // initialize and set.
+    ProofOfFee::set_bid(&sig, b, 1000);
+    prev = fib;
+    fib = b;
+    i = i + 1;
+  };
+  DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators
+
+  (vals, bids, expiry)
+}
+
+ + +
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Testnet.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Testnet.md index 59fa5430a7..62b6434893 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Testnet.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Testnet.md @@ -6,6 +6,7 @@ - [Resource `IsStagingNet`](#0x1_StagingNet_IsStagingNet) +- [Constants](#@Constants_0) - [Function `initialize`](#0x1_StagingNet_initialize) - [Function `is_staging_net`](#0x1_StagingNet_is_staging_net) @@ -43,6 +44,20 @@ + + +## Constants + + + + + + +
const EWHY_U_NO_ROOT: u64 = 667;
+
+ + + ## Function `initialize` @@ -61,7 +76,7 @@
public fun initialize(account: &signer) {
     assert!(
         Signer::address_of(account) == @DiemRoot,
-        Errors::requires_role(190301)
+        Errors::requires_role(EWHY_U_NO_ROOT)
     );
     move_to(account, IsStagingNet{})
 }
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TowerState.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TowerState.md
index a0d702d894..c84bf14896 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TowerState.md
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TowerState.md
@@ -73,7 +73,6 @@
 
 
 
use 0x1::CoreAddresses;
-use 0x1::Debug;
 use 0x1::DiemConfig;
 use 0x1::Errors;
 use 0x1::Globals;
@@ -1373,24 +1372,24 @@ Reset the tower counter at the end of epoch.
     // double check
     if (len <= n) return 0;
 
-    print(&666602);
+    // print(&666602);
     let miner_addr = Vector::borrow<address>(&l, n);
 
-    print(&666603);
+    // print(&666603);
     let vec = if (exists<TowerProofHistory>(*miner_addr)) {
       *&borrow_global<TowerProofHistory>(*miner_addr).previous_proof_hash
     } else { return 0 };
 
-    print(&vec);
+    // print(&vec);
 
-    print(&666604);
+    // print(&666604);
     // take the last bit (B) from their last proof hash.
 
     n = (Vector::pop_back(&mut vec) as u64);
-    print(&666605);
+    // print(&666605);
     i = i + 1;
   };
-  print(&8888);
+  // print(&8888);
 
   n
 }
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TransactionFee.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TransactionFee.md
index 51dafbfc63..13008131fe 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TransactionFee.md
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/TransactionFee.md
@@ -6,18 +6,28 @@
 
 
 -  [Resource `TransactionFee`](#0x1_TransactionFee_TransactionFee)
+-  [Resource `FeeMaker`](#0x1_TransactionFee_FeeMaker)
+-  [Resource `EpochFeeMakerRegistry`](#0x1_TransactionFee_EpochFeeMakerRegistry)
 -  [Constants](#@Constants_0)
 -  [Function `initialize`](#0x1_TransactionFee_initialize)
 -  [Function `is_coin_initialized`](#0x1_TransactionFee_is_coin_initialized)
 -  [Function `is_initialized`](#0x1_TransactionFee_is_initialized)
 -  [Function `add_txn_fee_currency`](#0x1_TransactionFee_add_txn_fee_currency)
 -  [Function `pay_fee`](#0x1_TransactionFee_pay_fee)
+-  [Function `pay_fee_and_track`](#0x1_TransactionFee_pay_fee_and_track)
 -  [Function `burn_fees`](#0x1_TransactionFee_burn_fees)
     -  [Specification of the case where burn type is XDX.](#@Specification_of_the_case_where_burn_type_is_XDX._1)
     -  [Specification of the case where burn type is not XDX.](#@Specification_of_the_case_where_burn_type_is_not_XDX._2)
 -  [Function `get_amount_to_distribute`](#0x1_TransactionFee_get_amount_to_distribute)
--  [Function `get_transaction_fees_coins`](#0x1_TransactionFee_get_transaction_fees_coins)
+-  [Function `vm_withdraw_all_coins`](#0x1_TransactionFee_vm_withdraw_all_coins)
 -  [Function `get_transaction_fees_coins_amount`](#0x1_TransactionFee_get_transaction_fees_coins_amount)
+-  [Function `initialize_epoch_fee_maker_registry`](#0x1_TransactionFee_initialize_epoch_fee_maker_registry)
+-  [Function `initialize_fee_maker`](#0x1_TransactionFee_initialize_fee_maker)
+-  [Function `epoch_reset_fee_maker`](#0x1_TransactionFee_epoch_reset_fee_maker)
+-  [Function `reset_one_fee_maker`](#0x1_TransactionFee_reset_one_fee_maker)
+-  [Function `track_user_fee`](#0x1_TransactionFee_track_user_fee)
+-  [Function `get_fee_makers`](#0x1_TransactionFee_get_fee_makers)
+-  [Function `get_epoch_fees_made`](#0x1_TransactionFee_get_epoch_fees_made)
 -  [Module Specification](#@Module_Specification_3)
     -  [Initialization](#@Initialization_4)
     -  [Helper Function](#@Helper_Function_5)
@@ -29,6 +39,7 @@
 use 0x1::Errors;
 use 0x1::GAS;
 use 0x1::Roles;
+use 0x1::Vector;
 use 0x1::XDX;
 
@@ -67,6 +78,71 @@ fiat CoinType that can be collected as a transaction fee. + + + + +## Resource `FeeMaker` + +FeeMaker struct lives on an individual's account +We check how many fees the user has paid. +This will interact with Burn preferences when there is a remainder of fees in the TransactionFee account + + +
struct FeeMaker has key
+
+ + + +
+Fields + + +
+
+epoch: u64 +
+
+ +
+
+lifetime: u64 +
+
+ +
+
+ + +
+ + + +## Resource `EpochFeeMakerRegistry` + +We need a list of who is producing fees this epoch. +This lives on the VM address + + +
struct EpochFeeMakerRegistry has key
+
+ + + +
+Fields + + +
+
+fee_makers: vector<address> +
+
+ +
+
+ +
@@ -250,8 +326,8 @@ Deposit coin into the transaction fees bucket
public fun pay_fee<CoinType>(coin: Diem<CoinType>) acquires TransactionFee {
     DiemTimestamp::assert_operating();
     assert!(is_coin_initialized<CoinType>(), Errors::not_published(ETRANSACTION_FEE));
-    let fees = borrow_global_mut<TransactionFee<CoinType>>(@TreasuryCompliance);
-    Diem::deposit(&mut fees.balance, coin)
+    let fees = borrow_global_mut<TransactionFee<CoinType>>(@TreasuryCompliance); // TODO: this is just the VM root actually
+    Diem::deposit(&mut fees.balance, coin);
 }
 
@@ -299,6 +375,35 @@ Deposit coin into the transaction fees bucket + + + + +## Function `pay_fee_and_track` + + + +
public fun pay_fee_and_track<CoinType>(user: address, coin: Diem::Diem<CoinType>)
+
+ + + +
+Implementation + + +
public fun pay_fee_and_track<CoinType>(user: address, coin: Diem<CoinType>) acquires TransactionFee, FeeMaker, EpochFeeMakerRegistry {
+    DiemTimestamp::assert_operating();
+    assert!(is_coin_initialized<CoinType>(), Errors::not_published(ETRANSACTION_FEE));
+    let amount = Diem::value(&coin);
+    let fees = borrow_global_mut<TransactionFee<CoinType>>(@TreasuryCompliance); // TODO: this is just the VM root actually
+    Diem::deposit(&mut fees.balance, coin);
+    track_user_fee(user, amount);
+}
+
+ + +
@@ -477,13 +582,14 @@ BurnCapability is not transferrable [[J3]][PERMISSION]. - + -## Function `get_transaction_fees_coins` +## Function `vm_withdraw_all_coins` +only to be used by VM through the Burn.move module -
public fun get_transaction_fees_coins<Token: store>(dr_account: &signer): Diem::Diem<Token>
+
public(friend) fun vm_withdraw_all_coins<Token: store>(dr_account: &signer): Diem::Diem<Token>
 
@@ -492,7 +598,7 @@ BurnCapability is not transferrable [[J3]][PERMISSION]. Implementation -
public fun get_transaction_fees_coins<Token: store>(
+
public(friend) fun vm_withdraw_all_coins<Token: store>(
     dr_account: &signer
 ): Diem<Token> acquires TransactionFee {
     // Can only be invoked by DiemVM privilege.
@@ -545,6 +651,216 @@ BurnCapability is not transferrable [[J3]][PERMISSION].
 
 
 
+
+
+
+
+## Function `initialize_epoch_fee_maker_registry`
+
+Initialize the registry at the VM address.
+
+
+
public fun initialize_epoch_fee_maker_registry(vm: &signer)
+
+ + + +
+Implementation + + +
public fun initialize_epoch_fee_maker_registry(vm: &signer) {
+  CoreAddresses::assert_vm(vm);
+  let registry = EpochFeeMakerRegistry {
+    fee_makers: Vector::empty(),
+  };
+  move_to(vm, registry);
+}
+
+ + + +
+ + + +## Function `initialize_fee_maker` + +FeeMaker is initialized when the account is created + + +
public fun initialize_fee_maker(account: &signer)
+
+ + + +
+Implementation + + +
public fun initialize_fee_maker(account: &signer) {
+  let fee_maker = FeeMaker {
+    epoch: 0,
+    lifetime: 0,
+  };
+  move_to(account, fee_maker);
+}
+
+ + + +
+ + + +## Function `epoch_reset_fee_maker` + + + +
public fun epoch_reset_fee_maker(vm: &signer)
+
+ + + +
+Implementation + + +
public fun epoch_reset_fee_maker(vm: &signer) acquires EpochFeeMakerRegistry, FeeMaker {
+  CoreAddresses::assert_vm(vm);
+  let registry = borrow_global_mut<EpochFeeMakerRegistry>(@VMReserved);
+  let fee_makers = ®istry.fee_makers;
+
+  let i = 0;
+  while (i < Vector::length(fee_makers)) {
+    let account = *Vector::borrow(fee_makers, i);
+    reset_one_fee_maker(vm, account);
+    i = i + 1;
+  };
+  registry.fee_makers = Vector::empty();
+}
+
+ + + +
+ + + +## Function `reset_one_fee_maker` + +FeeMaker is reset at the epoch boundary, and the lifetime is updated. + + +
fun reset_one_fee_maker(vm: &signer, account: address)
+
+ + + +
+Implementation + + +
fun reset_one_fee_maker(vm: &signer, account: address) acquires FeeMaker {
+  CoreAddresses::assert_vm(vm);
+  let fee_maker = borrow_global_mut<FeeMaker>(account);
+    fee_maker.lifetime = fee_maker.lifetime + fee_maker.epoch;
+    fee_maker.epoch = 0;
+}
+
+ + + +
+ + + +## Function `track_user_fee` + +add a fee to the account fee maker for an epoch +PRIVATE function + + +
fun track_user_fee(account: address, amount: u64)
+
+ + + +
+Implementation + + +
fun track_user_fee(account: address, amount: u64) acquires FeeMaker, EpochFeeMakerRegistry {
+  if (!exists<FeeMaker>(account)) {
+    return
+  };
+
+  let fee_maker = borrow_global_mut<FeeMaker>(account);
+  fee_maker.epoch = fee_maker.epoch + amount;
+
+  // update the registry
+  let registry = borrow_global_mut<EpochFeeMakerRegistry>(@VMReserved);
+  if (!Vector::contains(®istry.fee_makers, &account)) {
+    Vector::push_back(&mut registry.fee_makers, account);
+  }
+}
+
+ + + +
+ + + +## Function `get_fee_makers` + + + +
public fun get_fee_makers(): vector<address>
+
+ + + +
+Implementation + + +
public fun get_fee_makers(): vector<address> acquires EpochFeeMakerRegistry {
+  let registry = borrow_global<EpochFeeMakerRegistry>(@VMReserved);
+  *®istry.fee_makers
+}
+
+ + + +
+ + + +## Function `get_epoch_fees_made` + + + +
public fun get_epoch_fees_made(account: address): u64
+
+ + + +
+Implementation + + +
public fun get_epoch_fees_made(account: address): u64 acquires FeeMaker {
+  if (!exists<FeeMaker>(account)) {
+    return 0
+  };
+  let fee_maker = borrow_global<FeeMaker>(account);
+  fee_maker.epoch
+}
+
+ + +
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Upgrade.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Upgrade.md index 27a98dd837..e3626cdacd 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Upgrade.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/Upgrade.md @@ -206,7 +206,7 @@ Structs for UpgradeHistory resource // unless the prologue gives it to us. // The upgrade reconfigure happens on round 2, so we'll increment the // new start by 2 from previous. - let new_epoch_height = Epoch::get_timer_height_start(vm) + 2; + let new_epoch_height = Epoch::get_timer_height_start() + 2; Epoch::reset_timer(vm, new_epoch_height); // TODO: check if this has any impact. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_transfer.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_transfer.md index 521278151c..ea9d6c8dac 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_transfer.md +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_transfer.md @@ -9,8 +9,7 @@ - [Function `community_transfer`](#0x1_TransferScripts_community_transfer) -
use 0x1::CommunityWallet;
-use 0x1::DiemAccount;
+
use 0x1::DiemAccount;
 use 0x1::DonorDirected;
 use 0x1::GAS;
 use 0x1::GUID;
@@ -89,8 +88,8 @@
     // unscaled_value. This script converts it to the Move internal scale
     // by multiplying by COIN_SCALING_FACTOR.
     let value = unscaled_value * Globals::get_coin_scaling_factor();
-    let sender_addr = Signer::address_of(&sender);
-    assert!(CommunityWallet::is_comm(sender_addr), 30001);
+    // let sender_addr = Signer::address_of(&sender);
+    // assert!(CommunityWallet::is_comm(sender_addr), 30001);
 
     // confirm the destination account has a slow wallet
     // TODO: this check only happens in this script since there's
diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_validator.md b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_validator.md
index 1ef61f1399..c9facf33ae 100644
--- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_validator.md
+++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/docs/ol_validator.md
@@ -6,7 +6,6 @@
 
 
 -  [Constants](#@Constants_0)
--  [Function `self_unjail`](#0x1_ValidatorScripts_self_unjail)
 -  [Function `voucher_unjail`](#0x1_ValidatorScripts_voucher_unjail)
 -  [Function `val_add_self`](#0x1_ValidatorScripts_val_add_self)
 -  [Function `ol_reconfig_bulk_update_setup`](#0x1_ValidatorScripts_ol_reconfig_bulk_update_setup)
@@ -64,48 +63,6 @@
 
 
 
-
-
-## Function `self_unjail`
-
-
-
-
public(script) fun self_unjail(validator: signer)
-
- - - -
-Implementation - - -
public(script) fun self_unjail(validator: signer) {
-    let addr = Signer::address_of(&validator);
-    // if is above threshold continue, or raise error.
-    assert!(
-        TowerState::node_above_thresh(addr),
-        Errors::invalid_state(NOT_ABOVE_THRESH_JOIN)
-    );
-    // if is not in universe, add back
-    if (!ValidatorUniverse::is_in_universe(addr)) {
-        ValidatorUniverse::add_self(&validator);
-    };
-    // Initialize jailbit if not present
-    if (!ValidatorUniverse::exists_jailedbit(addr)) {
-        ValidatorUniverse::initialize(&validator);
-    };
-
-    // if is jailed, try to unjail
-    if (Jail::is_jailed(addr)) {
-        Jail::self_unjail(&validator);
-    };
-}
-
- - - -
- ## Function `voucher_unjail` diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Ancestry.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Ancestry.mvsm index 2ff53cf679dfff43249f0c9620b7ba57369b779d..f8abc512e602bccdbb5f4f971dec73999ef9ab67 100644 GIT binary patch literal 10927 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 I4LHvK03;F<>i_@% diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Audit.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Audit.mvsm deleted file mode 100644 index 8de5738f9442ec3f0b31401ad8b99f0b70704f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1769 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Burn.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Burn.mvsm index ea5643b758a5eeba6cca606018ac6f484133e9fa..c7347de8013eef7e76ae2b427ffdfad1d8fde844 100644 GIT binary patch literal 15282 zcmb80d2m(b8HZ2yG=1f;DMAwmG*dXwD1CCd%DH<(~W$3h5- z8JSYCq84mx87VcP0!olY%Cs{DN?V1b33MJ^Oop z?{{L=XZwp54;wdO#`*CPxr07U{NPIQ=m6B=nPJ7uFf*FU@^eXJLReO=lV?%~og3L<{7Miz;J0E!uluVOVhSK1{W`+V;){JVE^Mk>Xn<9Xjw&|--#Jmw}E~q zreoQ*ekUel%>(_Wo9vkSO*g?Y^_%WV%ofmZx-zUF=r^4Ys}=N{?lH%7ahgt}egRhG zt(i>@U|-^1fSBdJ>IP}w#EeWLL?n32gSBCwi+K4{^sNw4q3*AxSXH(uQ{{iKZa{n> zIZ19W9kQJE#?N$4^S=E6QCa;bHnHd=soJ~105CjVjTh<6%S+m0d!Q{ zhIIsVR5TBZj*98ra~a@bCdTRudM3`o$_5=OdpMdLOdTrCqpCxtc}8`p%xBA^K!?ga ztfyIC(ou04WLuc_m2c2*Z zWBnO)!ZF*|3Fk8Pu7ExPm#}Vt&O#R*Q)i(bOkPPY*7Co`Ou*Dx=%!=pER;;W6wp~H z2`dwH7D{wXorNy2pS`hNoX`Rm$Vc0Y?!G@2V@`)?d)-^zsQ$`QKo3(Jur~B^Ga~&7^91M- zsS~RU^oaB>)?Y!7NbfkN9+6CU(Ch9wG=w`q4^u<2ia`%kX;@Q04^yV?>S5{`>NSHN zrdqHzf*z(qSTBJdrcCS9!_;Z&odG>eeU8-)dYJkOD}wuTi0mQBSbaf{UAb5Vpx52U zW8DpUK>H>8ITce6X!EfuKo4k(v6h1#(EM1Hpa--EvF3sv&|0w8f*#P;VLcCeKzkPJ zInV>zDy-F@2Q+)jt)K@qyU+a?TzoRV!3T%9SX4KE&Jd62fuv|(MTPv(KP-+j1<~aV zH4Q4%l^~WvtS#pjDg9;sUg|Z_L(rQEmbDEModD%s?k`u>&vA@jLh9n`U>PaO`KkQt zio^Wo1JLW>yRdfKW|i8P5JwpXH&Jvw6*qvZD7p~Q2kutOkFg7X0ne?q^^lvhScECxQXIz4t%FPev0r$_Uo>GYUEyCtp&ogSa2<|@$XaRJt9(CN{%dz~IPQ|~R%>2U|v zF3{<*4XYh=dThmd6?A$$j&&AvdOU~qG3fNT59<@q>G2}gCD7^dD%Lg7>G3kw70~JN z-&ozC)1$rR>!8!4hc`zS==3-cYY^!4*bi#}==2zil?OT#<~XL#Z}(ybK<78}<}8%6 zz~j_w1ich*a)e%rUroJc&`a@avDSfJieH1(0(vQaCDtj3Db z_}8%x!US1!i(^idrpc;zOY=H4Z^Av&?7>RmEZr;36PT%(lcZ@P-hI+6rryIaS(>x4 zN}*Vqg;?`oiZuOLm2kf_16WI8sx%j4ErDs$^kJ33bZOdKu7U@o`2yA^m?6y{U_Arh zk!B;-`}}R#_oVp-W*2;4nn$rZ;UQ`M8f!nyl%|=_9+u{L>ir95N%JGDb1>VL`3Yu; zE7RWkBhrlGtf#;nXWa@ zG|ip7NSYrZpGRGWzsCg>VR@-PQsc771A_k$1w5@2Qw;@>Ay_XEx~#O7@Fi6 z$->D7y`~V0l>>TB!R)DCQsi4;s^05j*uPNkV_2YxBzQi*zp8`GqufSRfdj2oP z3V@#f%~jI#|I5_-8R+?c4OR>2`QJ7-f}a0v)84wC|IL}#e~NdUdM7}y6hv?(J)l<# WI_-LxdZpkU%>AHO3d|8%)_(y8v5=zx literal 14536 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DemoBonding.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DemoBonding.mvsm index fd0750108b3cc776e0bf182a5560b7ae0b63b563..0f01f98060f57a7b2f5d0b5fa0451aec3d9003dc 100644 GIT binary patch literal 6546 zcma)=U1%I-6o$XaB)i?+xM`|3HffT^*jk&mNpL9yg4#wOT|6))`HMVtD3x&z+56L{{PIrGiT z+4GZB>!IG+2gfI4b*C=AH_#L7?2YtIIX%02?!MM`es1gR)5e$=z=8k&If;9{@!YnY zpUL{WtBgsBI6rdnf(_s*a}nupP~LT%2**-hCr&Ro(j34V1mmcfK2{N`_3d}m7?TF$ zCPy=wbSalEctx*J_S8K_xX6cSNWYA`4a>%5grkFIxT#&R~5GRnq(t>nm`jIfwN% zR7*2>bv4qwLcFUGk>(OsE$=BR%_LSGER*JWVlKywNi#_CxHPvDZvYa~d=%>msFmgr z)-c>4&8=8zNJ=wE)jDY&C*CwHm*x!C`%o{<53oLj71DeQ>m#^Pn!zvWCTVV@T%_P; zX>P&V1}ml6iq!`V(hSP$Ez-;ruLP^4S;l$}8l^dgH33c142tz?X`UqBEHq2=DApXb zNHb^vtVp-r0KW1WLrr5UuJc4=;+@pQs%(hOSlI%zf&&o=ejr5VHO zhV{}6n&chQ93b9futA!SRLl-(_E*dhO)gr`4-<@2SIp=9Vy=*8Vxe6Z)f~{kRqMd1 zDV9b{augUs-Dz*c*;MEk@m{x~rRiZ6K=R%$*&RpKCw%s}Rk2`CKt8r^2JS$01Rf+OodB<~05{P?gw~ zEfh=a1baPSjLP?Xw9pj>)jHTOK$0UXU%#{UB!OJT!E>pSdgW^n!|}7rk@D`vdf%XUz+s*SE`9OR!efx{FwsKrea=SigW?^sIRn^rB}? zdrrORHP-TdKredM+yootvv*;otS!yWSe>w0n$=h_Ylku$FuOvT_MF|)+<`R+#{2_S CVE`ro literal 7470 zcma)=ZA_JA7{~9!0S=r42#R3xqGPGFw}$9JX9rt5sU|;)i~BooDOY|2f<5+wZ=f`+1)G zT+ek~hc;B7FKpa1wC_^U2JkEMTcn>sc~@;Pwxzr!I4i&>&3mz$!T40nF02Hk>dW7k zX3Rz~{+zaOxV1Ol+7odiJ^c}NjTRPlLBON$;0{2#)0aqW-m1bsf%+r_{bdW6DcPT4 z%xv(rDKjfzOg04U&4weJlt0B5E`YCHnfDO25qvV{Al7zkhE>eNSZ{zo8tYZ=_jo^8 zHy)Gk?f`c*3Zdk?^YSDr(~YTx;D7JW%aQ@~9boG9IXudC-n9=}{tb>}oq!Z+zK8Wb z_@((8);Od}(|vSl(mYMPGmtLLkFh2pAkAN~euoTc{(+Uwv(J=fhP5Cl&F_dA#0*K( z{o7(KAC|n~=H;c@b<`LqZfFfzWj&%}>rCCBs zErSwimSa^zsWfx3YG9r;-Ots0X*LjVEnF+jl~}jJ0%<;s)eZ}#8OG{>>!f)lBPqvJ}8%FH&#DXNb@rOYyEP7&{GxJjB{V0{DC(ws?gm=875bW6#brJ0f}I+siH zC-zu?T_;Vqh+84e1;i_ZmC`K6S_G@4S&LN%tEE|!H0z~Vl{7sRcGJ0ZR$zQHoJ2h4 z#Cuw)(kW3LRr~&8SLLxV&FO9HmF4ep)YU*4CHKD`?-3hXnrpD`23?oB*VlFF7UK1T zu1l@C4Rp0Rh_w@RwQ0@gLD!H8tYPqQ^N-Sv4}kFpY@Zq3BwyDc_7DWZkwn~y%1&r6 z?kf;Vb}G@BUh@wAhmaELi1s+W^ub+`m^yY2{q;5o+AFkrI(pT9x*?!GlLu-R-dxZ} zuLP?U^wBHADh7S@LRb}`57d0Da?l6Ljj7w0cH(t{K6+1MJqx;h8N+%Tbop-_JFJg^=ZeO-zje%}o+~cp?mlPVuOwjF12&({e z`*Mjr{sp>yDJ0$;@NnoSGL88PNKUOzBo>bJs2nhbeF3tP$?V@xmRj^93;qPJ87(!) zsRe&(w}(kkQ-}r>LS#$QlBaRoVWJ-cZy(SEW*<;X$}HB1_YmkTwhHSO&{?b+s{?cv zYr%?u{(!nM^cRp0-YJ%C#o~!1o0+8XU4NwUxLnz);te7-%Vp(1fB1! zc^PyTJBjrh=q%=*Qk}(ood0alS?q7FoP(*eSTR;P=qy%=wG?y~vt~W$(Mko@V$h?N ze5^Y_k3rU8tphy<1L61Q?u{MJqgIIF_^l&4B)d70A;buua+}K6D-JpjX zgIIe&4>vx-ngBiAu;yo=M;7O>ra+G@&SHHIdSr1F>lo;fg*86_J+iQ--KQQ|T*0~u xdSqeEV3wCbL^f6)=s`pXD+}}>Vw$U81U-nb=4H@>2y5DX*2*tzmAxA<<{zCI$8Z1u 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 6ab229b900cc2896ce0f3f2dc2a4d6433220cf11..e16bcde15226669ad1dfe3d0bbe90c15e0dfd29f 100644 GIT binary patch literal 126407 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 LB9o%})OP+4qk~Hn diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DiemSystem.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DiemSystem.mvsm index f4dd88913940e68222918cf16fcb05d851a69fb9..e72a69207038135f85b1833683d8a63c53c897fa 100644 GIT binary patch literal 29028 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 literal 29238 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DonorDirected.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/DonorDirected.mvsm index 67be4418b0d600deaf12b627673e26e5ae95d93a..3826bfba8f646dd5a4a9a12c78e2eb2a576fe394 100644 GIT binary patch literal 36717 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 gQuFB}aJw1BQ-%a{vGU diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Epoch.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Epoch.mvsm index 824ba06b5d723cc5b5459e2f15e8cd297049a965..b4e47d90d265cc1a030543a7ee295da9b8aa9936 100644 GIT binary patch literal 3721 zcma);OGwmF6o=0|)$x_uWC}$ONQlHm8;urf3bjbe3|gfrqcfyVl&@&5IF-~Qdn_bc zxG5`&BFL2$6%+)5i$W^N9#GVxWfXmvnxNJ14)bk>?|<&S=bkzLv$$^dtQ+|L_X$LrkEFYj{Jbb4%mmGDfrXU$5bG%@ zZvkh?!~2T!10p))eAw(QSRj^6qZ0K3~>GWR6czQe42R;UM+aE z9jq$wXggSLecg5%u$n=)9cQ+J$MQGx%pQYpx{63`sY@?CRlP4Z<81|+3pp!L-bry88Ze!g6ovhbb zZ$KyOC)O{}ue3ExFm(`>XP+ZpGp2s|UBtW$`sKHqcrD;@r1iOGTfl-Ims*Wj1JOU@ zoT`CssP*92j7Bjt!0SLJZ3u6~MV974tmB{yW*X}T=z=+oH3hn0vS-o-^N4uwKo`sh ztdF1zW*O@}=z_V2H4A!La^@W9X~~&xpZW5RLbQlH(9_a4;(Z4_EjiP*9z88N)2*(j hrA=6kpr@r0tT^at$(b9WRA$MUZgo9ZIco=){RV6b%ZUI0 literal 3975 zcma);O-Phc6o&82IF2)F{?FuqL`Vsy2yMz*6s6#%$VzEZS<2`Pj*gIj(WZ^zP*IC4 zTS#r(lodtLB7&so2U_(9ZK@%wMUabVlNLRf`hr&P6`#%U-1FUg&-u=GmVVs-KGf0Q zS$DiOwkJ2UZn=E=@|yhvqX$YGva`LbvWI=f^aB6?{rQ5eLz$i=KQD<0bADrPf(a<| z0oD^x-YcA(gZI@s5Y!=`=Na=Jj4zT*r23M>U4xl1wT~PNzCf@zF_;5`VBkJfvMKF+C<=u z;FBqhW7UCQn%;&3(mcs7ryx(77qMm_=wx2O3`z4E)-x!O=2fgY2ut%k)&+=2^Iwfg zbAfmq#}rA^%Y3mk%Zb+rE2QbwYKb)4h_?$$rMVYtACx(ny_gl!Okt&=Qks2ONvM)$ zJJxQ9O4ED$W6~Ta-UO_aW)|xlR7>*&)+EHGIfgX_4ln$@h%qm~`23>-s-wL`d<{OQ zmR4IxF9BQCDsm-W6m*AL=J_#9-J!N%wSn$X^;jD~cPQ^nxiv3`M0Kn?R- zGw1}&6R#ChfBL5}FMmS+NYO3iPaK U%~~jzw`5KGbUjsCYdaY88%ZZ zQJTueg>2eW`_wX;Woe6+V`XVhT2_-vCWejn9OZmy`tUo-@O*pDd(QiwbN>I|d12#( z_bPU8?KAoFwVBVReOSI?!0~JT?D@Lsx?|_^y3u>r9IbO1vjX`2&yOqfhN@6mMM)?Y z^m)TIrj0Qh#Zc4JjfsFsNQlo=auhKRIl<7(K+s$1iNvNy0=^ngl|SqWhJ1cCzyc0l z2`NclpD(QJmP}*LKyn!qiYj|qdt;sf*9>JYV$261lSy#lt&>nk?Pu)YA?4gr5v8xr zFlIfZSA|2Ndp%X*K$%>gK3vowFn#rn+rZe{z$I_7eI*IfoWi*ykSNU|SW!rlrah-* zX)b2Ghap9p_6=+!%}*I`2c$~#2dqPoCe6>W4ntdM?!@{G(xtf-Yit&eq%^bI@%}+O zY35>egZ9!)!0HYir0Hrkv!rRiyxG#ckugi5qcrg9WImRN~}*H zPnvdV?Nwo0C1EE;N z6Zcl?Si(8p1Xn->m>;nY0`I(B)Qxz%tx=`98p}Gr4kL%K4ucLO_Lb@|(#&|LK!=fz ztgah$7&*;&1(-UF{EgWHI*c5{+TYbl#F)UD%RomAKi0jFA@5NMRypV}Qrv3lFk(Nk zI*inHp>=}}BQIjD2OUOguo^*!kvKDYmzCEMV?5Rb=q%UsHmo~AhmrnRlR$?N%eo76 z7+Hta2s(^xzPI}IHA2DlR4`TbQ#=-knm z(ZC}wSH3pen5CdQ!ZfU9pgY1;td*ea{FAMw{+P4o)C=^-oExhEbfwM5>J7Tm+AFH- z=T(ent-Y?Fg;!*EoUBR*#Zw=_W6vDb6bX|&I%?DkV7Gl+du1j}dtpr_{ENd0$ zx@6B?SDT@9?O~v+jT>t?=xSqGBfvonO3mR0fup#ZgP02!SvTAqIuz2J)Qxy|V;%(D z0jkCX@gnElfy$kVS9#toQtl+Y$#D~kp~K~Hrc$mXA{uj$=bCrEa*f!7@~4>H*F zs|rQ@J}1#X!aB}_%&@;K6!(W~90mEDO9-ft9tnk`oM?K$Cnxi9E-@X`+h<9TJKu7u+SPMY6PB+#<(5=%hGrD!!EgSHj^KzT)!KeJb>tosuB zTac8|dQ2qh4a*(qW{yZqx#%x~X&f4d3yQv*(~Q{yDPe!LH|$dr^Q0Q%2a2k^AKx>b z{h;&fR;&Y{^J@z8bA!&W_G0R-iZzV44s_CO#CjWa(%pphKIo)dhxGyIq&o|%26WQ3 zp9GzBL)^<{pp))>STjIxsgz??fX>AB)1));D~$IV=uG?u)@IO|xB=@O(3v=a7bFRE zCQiZ10G)~3VYxwP;-g$+0jAExk77LrIuk#EwGMP9o{O~}bSB<|wHI_I{ub*v=uEr~ zs|oaWl3mDjdM<6te|mu4<{ppb1D&%k$MS>TcxuGj06LLBiS;t%$x3?w>mcat{u9$LM=S^3V*^-m&^`8ctZL9b_GhdkpnL3ZSZ6@@ z*j-p>LHF1>`Nqrz-DBrtJrBCaj>UQbbdNoZ^$X}8yB+HY=pO6tO|SypW3R*-2)f5+ zV-iFy>zaxn)`a literal 24469 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 JYYjNgzX4V|L+k(m diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/FullnodeSubsidy.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/FullnodeSubsidy.mvsm index 8f255637138a284f2fd02155232b04eeace240cf..5cf2feb057bb6cd5bd580d0d76156d7d96ff16aa 100644 GIT binary patch literal 2068 zcma*oPe_w-9LMqBvpMIZlbQK1H9?I~>e4|$MNlfe<-v=FFw#wZaPCo;<{!j^U=V^< z-nxuD1bU4E4_z|o5O@#;r9+UH4$(nE0zuyoZ3j=EjlFNL-}kpa>^nQuGIavg_#{x zAmszpLkdaRiMmgPQZ}J_C@f`nT3(a#QCb#DnVETA$^~XFQi+sHs1+)eat!sH%B0Nv zKFX#1%)BpDA>|(Gm~KdUg8D_3Ql6qNs7gvZXiT-2l($ihbW_STZoY@Ck+K!lNm(qB zH|*anGFI44#3D0K;*l&@;Wnps$SNF(yMvsYm~!1=xeNC>^258ZK<~nzxJrLEZzD5R z@4{vNOx8*7!q=z`(!1~_>JDumCB|q~;+6=Y+D{iJdz&kJeG7k*-~T<`wTw9=p7$P>@A*_L7PrHZ-l>5^G(2lu#stN%-&w}w zc$njMO^+#D2rMSgSTr7)P`Vb`NZ!QV%Tc}++fG(K<0m8G(4ZZSC)BA|*~W~J@#{A` z!}K@K4f11oiAs`7$^ds)lUqtRs)n+p{LjtJ$ZRR=P>#%zvMD8VrA*I!AZ05v+bK`V zPSi8Xm$CyDqyj0QpnAwBWmifTN!gu}#ZsncmPnao<{XtuIgeVRGATzEB1W zlt;`vrbkl#K%G*Bl$WSqM=P$dz+pp5AcRIKMlSw~?NzH{2qB5o@G3 y+y~T0(i`qQYMngto0&(QkXOpjsD0AA@BsCV^e%MfIa=?+t<+4t3(t_}WXvrm>PJcd diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Genesis.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Genesis.mvsm index d0d4450111ebc7fc4876fec822ac126bd79b0820..38b9e93e5fc1004ab977c2afe3f04cd4cdb497af 100644 GIT binary patch literal 15466 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 Oky75_8F~k4%>MuqA{agZ diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/GenesisMigration.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/GenesisMigration.mvsm index 547bcf115b7525d51b3d93a75203c98fd344870b..574eb88d5e9ee6c29c364c9844079c9095b11711 100644 GIT binary patch literal 2417 zcma*nziSg=9LMqJ?$V}dgZ76_{MA~mQ4yqAilAf>gdin~*diTjxHd;U(q16R1sp`g zy4V&Sbny4ABK`-RDky@J9b7^uD>{idh#h>N7@^arA#bw0?)&8OJeS<7`Q=Y%Zl=y> z*Gk#v;frkJ;^|BGR(tIS<&9)^=;eZC%p>Bx>1B21yuhpa)x1Abach1#Ft#x{G3|A$ zF)L)OL|FAI1-DqNsB7NfKak~Q29GPe4!j&^0X~&Y;JV3@GMd_hw6`Rq_2W{Gp(d$K z%05&yGa=>wyVtk$mfiYDCT7>?)GyTluF=*v?FV{;+T5^qrBL#&swK8N#-u4e<<7dn zw5R+r>Iav`^L?7AoUsiij1@)&&y}jZDzJeIf}|ttCSO{Dbi0sfU1*z0@A1(q@RFaC~n8J z%kSx+V$>m}g|aCrNjs%{$GrEnOUhMLgLX^#1@)cwNckHT=bvS-lwGI{^+`E|8m4|J@3ZxvDekq&(st2UJ#k@rtl=3d>Asv)*33Z1uQeHznr9)CaMm?d!QZ{EE LkuqBO85#2joB?ye literal 2375 zcma*n&r8#B9LMp`cT>07oRu@RWtq-|ZbOJ5=$J$BP*Im)-@dso`fd6h?7K~r>J*yV z#ct96pwOjmL7+r8yGjs5KaN%qL}@<1(SlB|jXl}r@qK^x+4u8Z>h;TKFK&KZd$-x0 zx_$TQTBa~M*t?Ou(eG!94;THbtClfOi1&Xl>+qQCyMY%>cvBUp>Xm&HF(xIZJ#I5* zos5;J1#ZQ5ip7e$W&{76tmyDiPT_4}KE?ukD*FxdD;z9kICYOAP04Wmn3NY$V-%M% zh6-mUr2Mygy`@d=);5`zNPSlQQaix6)cj4`MgO3#wfC3jvek&GIXrr0fK#_=az z<hMqOKugIft63tdvuz2Q)0@B5H}wNZFV3(h6h`l>kCu55#e&5S6hnblK`4bPU{r?6WMUB#@LBsFZ3&$yt!;@>WRO`@ z#xTod2r2~(3J5BRp@g6)Vr3})Xb}=7L1GY$uATJ$@Yi=pSDKL3eeOADpMCayt#@s6 zYJJx?vp-ncV*Y`Tw&w3$w|~Hadn3Nf{WGQIg!)ORw?up14hVSv{}%{mD~i6_I|{Jz?zB$*on0pqMXb_m<~bD#u5!2r*<9nmg%0u3a51Tyj0Lri^EC+J+)Y@ zw;?DOAscHVG?V7DSYv>E7h7OvB`|qm4r($3A=V<$ zNjnQ`GrP)7Cq_Ssc?McbvkvQ5Xd}%dSZATFG!HkK?WF1FU3+QXA?AJPAkE8I*Wp2F zHek(VJs*;0FRZ@surxbjB||4^`e&4f5W6{vc$0xI2eSf=$|lSztZH~vnr~oLLYy>* zU=4+?PUb|+$DB-i&Uk5lh_xINq`3-fH6%)N1=dQSEQUQQXW)#Vy^STl97U;Y-vkfsF9yA%PhpACf z6@_Y_QV@HAdm5x;4}m~nstW!o+Gk*woN_Disx7QELs&CGC(LrJ^`H~xU92Ub3*l_6 znVfH(Fvl@}0-Z2>u#SRG7=J}|!dxZZO`vj!LRgP=5y&tH^9m+k4yKK+3t?N7cAyKP znem|e-z2PVp!?qhtVGcL@88Vk9(0s*H?tKnb*F5mJ*V!J$6}2G-6@+{1T;-zk4mwo z1D^v3vly!cbf=t(l?J*~Hggo{PT5R*PTeW5z}f)1Q=Wsh5p<_))+TT`#{1Dun(9(` zzehX;?uGX}b|W|x-fT|Oc(C)QHa8wG5p>~=#!3QRcr&q{2VHp6u=;^6ygjjMKo{Op ztZLAOcOuqQ(1q7uQC)a<5btBqg?BF2JkW*L%&kDZ5J%Na8=Z|8roWyJlh2`)6@nLN zRT0Sz*{=g4W%9GSB7UL@n&}VgMoXTBIm%M!uS4C)7Bw7rpXGNOmkc zacjU%rTHa&)ChO6qbSQ>x;|=YxPw3+wRo&di!8U%pP@c#qlh;e^ilJ-L$}Y9h&LJZ zp?nQ%3g|=mDpm*_4kgxQ)?OdAD$HuoN6k+#ebg2bZxQIDwiIhQa4yB6T!FO`^vj;b zGh25oVwW=vb4f zyP(dzUqWAL+Q{F+Q_?(( zbq@MTvmWar^q1y&tP7AX%`;fPzyN95$iG2`H2=W54-TJD9px^l1;-D`kE5P6-R09n zdzTJ^Zk%ot@-FDc=?2zFiz^o)6Kg2wb|?ia6?8k)0V@e~J7i`C=yu3Vdrtk1V)M=d zhtBB~ZNmldqN2+pMPdEx@p|M2aQdsE8;G|}4u%TCmFnID`I*0x7b@RWLcpE`y`&_I|ptIdy zUY+gNh<68cw*Q6oFX(JPk7fO*&UQa-^lO5@|N1qdJtN10eobhOl?eJZp$k?5=+^{4 brhZNMgm^WeUlX=t?Ey}sXur+c3!e8MljLTD literal 11390 zcma)?dra0<7{|{GuiO=HDCQ0Dl8To^AuMxdIn&JMB`mcV_`c$62q}V?x=dYLPFo_n zrQ*Dxc+LB~q?5IzTw++67fhF>D_3hXL(`^x&c^SL{`wxb&p+qpZm>)Mi#U4sUok;z-a_%fuQ2dTIl))`MTZ zgjra{&_tSVV$FaEC$k(gN}5?%){K^BCDvAOnEVN}vsQJ>!&=nyR(DyfDDou^^kO|E zq|Yf2?_o~D)QdF`D--l$C1Ldey;#;92YRvEHJW;{axtd@J6lzO9tlhd92aX4>T}?a z%qWF#~Oo}da@8K=6Pa)r2 zKGssu)xdiPdNs<4w;FURdT&doVkPmmf=hE)YRX)CZ!vZ}Fi z^xK$sAWoWhvHpgp(yYg7fM(LX(rCs@)62W&(rm%J6QPAP{a7*3Qkn*96SS7*2&^%X zAkBVQL!pf{y*=7inx({>2Z>H*8RiqxT#dB`+Dmg4RylN#=47lX(9y{(#_Z%|+UM*n z&AnLrAW51Bu?|79H1}g2fD~!&!rBd8q-jS!3|*z^?RSS_*D;3afbm6^Vgd0Mfj%G#v5G+-5CvG))(6B4 ztkJP9Wq%#!X3%B78tXK~$oF{z>u1mhL^RJB1NwkS$I1YGKvXjFFid?wtiUV>eL#5c z(_xVU3_TN!FPbe73gpZwlzmSD{#^SrEQ5Tz`w)+T&g(5$J3#04W-M##yxxFy1$4I7 zVtorbTWcCk-Oe;%J_g;++`#%1bY5FChFiPCgC?VOvuapa$xKz*x+C@g_cR!QJs5nx z87lZLwB5iVCljU^Z>|k1%_&%=pc7^#)>_aBvlMF?=t8&%tF)=hI(&&)2RdQ)VpW4q z81Iehg!zqle}FE8^;lOy7eZ^^0$m8LX-C(EFqU^22f7eivjgbE4ORwvN? z?>%O7A6m)$v}P1Bb*F4i`<%K{9*y-1=uX+1Z-efC3$O~Iot#lV)=bcyaxbh@(4De1 zM}qE@t!bZAcgkg0>p*wP?_;e8-6>nE0vxvSA+)cp>QZ>mBAx^H!h0F}1~?Snam|bw z59~j=xE=61fiAq^Se-!^-b}3LK^NXstp1=2?~_=cf zB;Hogg?BO563~U$nwvluUTfOXb>a2ir^Dn=6R-}9FQO<|5YV5<&Ldw0pT8)WKTWj> zeYq#40WU&k>q~fJKxb<@)~lei)f-=D>rvvJ0G+LCu}*^SK+CXdK;`>Ob~Rl zx)Q4lBJzU;d2^<#q)kK31p5i0IG8Pa;Tqgpu=U>h@AOwAB($b5gUQg_Vib|HKyQm@ zu_l7v7Tyf?wwO-55a?~;Er;F~rNo;DdRr{OS`2zyyo)s-^tPCV<>$++PWIK9Yd{xq zFTr#X-$uMD&_#SF);`eP^M0%Ypg$wnc-Gc^_Cc&ep!;k)vbA-ey&Y=@=stTR*01aj z-96vMq#bwYp2M)hL4RkyNlZVc?z4YsG6VI7Cw(zNlc-A9_su|9*o(!7Lq8Tv`{ zD%Owilr*nk)kA-2evfql(xhoez6JxN*?@Hq21@e*)OLlrD;e0 z7c!;Ul+!g49FExQEsVJdj=z4ng?iiSF5js;&_*VKZk*z=556-0%KvZoam7X;J*za!tZ133PXNg-|t(22;cv>dMtbPmtM zS_L|Xz43MPUroF(Kxg|-tka;g-Fv+{+vC~jZ9!*yJFH~T+5U)UOu^LI?xl^sCV11AR^K aV(QQFXNXq|`aEOEWdUzo(~f&$GAv zH_zS5be*2a9q{+%-k%sN8mn2~vU1fY8~^tA6^wpd-fWC%0T=xL&*iBLZQE`<#`KE` zdy|bh3dR)|>r(PD#Mi*>@+)<9iZN@z6;$SwwK}FJ=HC%f@>S%otrz6zxArOCMR3WR za2D$lxTSdmYZ5%tw68Q?nr`dOgIAjNt(qatROZctnbIu8DuY?l%)ly#1Zk#Wr9+}L zeOM4us#PJ68odl zAt`1Llvw*f-cNhS=#V_hyn67-nN3(vflf{XRwL--*xv!2oEMn4A9QjKVGV&!&H=20 zpp&x)t2&;44dh))#7Y7kk`%0T3psO=)iW@4NQ$tEL5HLas~mJlO0Y^nha?XxA9P5p zl`BApL6`ds))mknsJ*@}_X6J3LeS;5Z-FlN ze&!vtZkBxS16YHg%iV@`1a!HFu|`0by9TQkbh$^dPJu4>>sXtUob z-Q#quTF^ay5^DqK9yee$g6?r0Rz2t=;Nw{9L6_TFxe0W+J^Ya21zql$SU%9@PR7ax zUGDiHl z!TnrNUdI$(oOQ+W$H!Zk--BmoI1p2p@C)Ma;En`4lzW@y?^?IQ$*-DEFti>_jgDU} z-fGbC%fng&I%!Q<`#>knzEYjEA?CdYI%)Ps&`FzM-Zjukvv-S5+K8g$a$!Fm^T(hgyr z0iCoju)YF)7`=*h4fJ7j9P2vh!>C;|eHcx(b{y!#XeL$`=)-8n15+PH@9}Q3v5VwC zJ$7n}rP<897ATSCvshc8RGM3{+M!IE>#zb)F3lL$Zm5uE2rB}W(tHVP5UQkk0BZmq zmgbvSCt-;+N3l-9Bhnnk8iA$Kd;{w^ER&|S@>@_X&2O-7z;bEc#QFhNNb>`%+ptoa cDXG)|R!K7rD+_9*nS+%JwbD$+S`5bg3-GV*p8x;= literal 4459 zcmb8xNk~+20LSsaI?lMaIOd*}O_s|ch)9YyQ>pNhEl`lS3_0aeGvg2~l!u5)Lc~Mb zp+lgeqnSoY1eF9<7fH(?sUV_*$D&h6ec$0hx8E3iZ=d&n&Ad1Do9kEzPj#P+d2JSE z=1VUG;wMvn{2nR$<$HT~Xv{sGam*NVf}-gEKT(dV*7`Fh+L$?ULLQeET9-SbL(K{o z0ZYhH+tA=wcpGpBB?W@D{$Nd`*LSKhs4lAHf@(_ewlqX|$#HlCIg)DYT0`ENV58p~ zXjC_vh%x3BMfsHMM-5OyOIveIT@&AHKwVM{-%8F*(_%G;<;%9gSV)k8T_wxN0{ zSIR-u5UrMS1oeROqzt2mX^oV9sD4^2rFG{~S|??GtT7(Sm$Cp=MC+w2L6wq6%I&Cf z+8|{rs)7onJb*e#8>Os7?WavrCZY~gp_EmqYATY_KC@U#>&{0gg8vTh!3HfF$&7&<*JWA0OgL#H0KY9y*^CxiDYll0KB-$Fffws77~(nDttYA@-bvkSGG^w6FMm-^&eZee8`6c$l)v|M>pap!CmWSRdgx?Y z=UH0bJr(69J#?%)=aL>eov1F-L#G>chxE|tMfH&$Is>RN(nIGeYMk`Yd4ifCJ#-$S d9+MtA=TR?751pr|7o>-deWo5d)}1HGn146h*XjTO diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/MultiSig.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/MultiSig.mvsm index 6a431748817f7bc1cfa9e129197b02a6cfa98730..f85c665db5b52d7e3b38aafbe0c7eb0c9a801d5f 100644 GIT binary patch literal 41676 zcmbWAcXU-%+J{ft1wsi(4WI%6LkUQS&=Yb~AS8i=DtHaa1+Ju#TtLM_(;3SrFp33m z{A|pKiVbnZf{q0NMFn9T94jJ7aYR4?k(p;hw%?lXpWnVSYdvet(&xNqpR(Wm?!8a0 zM>;;;D*C2Q+mmy@Ix=GEzgBfU-u8x-y|epgR*hb?_q&D_1ALx09HPAc{9jbvF>}kp zp~BG2SkF5mf=p=Uc~c>(K|yt8Rb@?aSw?ZVSRFNuBSH|Z#Dz$Afb#CcSp!kh^qP8J zJa};`W+GM!C~p8xj)PZ(bA^LfjdQbucNFI=M9UVwHp%ne120Bh%lBBPKzSV|dtNtC zUOG-T#7MJ23(so?k-bRGIifwps)ke|T@T7zhx4?9w+H8Q2QRUu=XHUL^{KNGJ#P|t z(J?ilnW~|aF{eV~a?@EkAW&RdS{G=kuMUKQv}WTWa#G>>>UfgaHoW8DI=vYp1f z7j({Ah_wiG&NA&ZF&&cYt2rchh-~QH#SvdXbi^ajPaNeN#Vwp0DpilW30^aZi|Lfq zOUd;{d){h@k_G5!Lgqr$bQNiXL~2~`@EibPlJA+pTgPzdbHk%^%Cee|8A^Jpx=D^#Pn!=hIqe# z9<8@wodrEw+vizdKFvS!emn>bq-o!4J+9mLPLI|$rXH=Yqm2tdkHI#k9)nj9?+>6y zRvS}~tTTu=6ZClbIMznc@gO^0;fuRFsfcu_9pdp721V|(>=zYinM2i@;0u+yw75S}hkzc4_hEelURT{AH*!_G&6Ua2ZSR5Zko7os zJm?Nt7b^jDhirn?4RnV*z}2K+>JDk&0o@^o6E6>RhqO;gcgRZORe|o1_MOrL@eRbg z5%fU39BU=$srVwSdq5A_H(@OVJr$pa^$V}Q9u;b3cbil6 z1iK|y(+YGMaDX!>V(K!$_G3N4?oPbkpbLh6Sp7j4493iYwlXvH!RiYaOS22sKDbnx z%dnP1J852vwF25p(+jG>n#S4-mr2v!&(6~PC-HuO zF48=XbppCd^BC5T&`p|$v5r8BG|ib$LU(CK`^m@PFeD_6Wq$}FD^o^rL@vbC30D`F z%nnwovA+~~HZ%!UlvI|R3AR}|GCN7?$kiP6B-F177l-H81cDWF%hfUO<9`D6T-Fon zjANA)aC@u3F-6SgK$lz-3t8uf$W{~v5Ie)fm&H^YVz)K%f4iYBD;B9-XC}m!vCN?^ z_9etuL044^X~-gQS?l?l%i9m$P+fto;p|VD7RWdLw}&WAdkb{6WMk@T=^EO2E$AA^ z#?&>?GU6=avICyiRyYK+Ps9I7b9LbXU5c(jeYZUWpgR<+JUZY zY=_a6&E>@F3A(aL$I1j<+4RB60$thk!s-pWvgvGMj(4e7uEwl@HnMkAVa)+u*<68D z4Z5uBQw z(DjOqsq2-yh<7*WD#XUrRY)oEf^fOKqUW$SLr-bGiS;4$lIH7Je}&%CT#wa_e$-c* zpJRHM1EqNm^IwoE&4aZu2T9Y8oP(v=j5fA{A<}G(bukQ;=A~HeV3;%;V6}(g(zJIz zO`5618wBan9EvpzMoM!q))2^$Wq*d$!=7J1j$Oq281&=ViFE+<E7j88~dY_$QFr zfg3L0wsO21K);tcSQ9|Mm-hVnyp{@Z&6qEP!-mEKZ9VTX@M2sx znAc)H4i}Zo;FFc$jAA|$4O9g9P*i>)x`D&qF^851YJ$PiK=Iu0tjg+8I24qJzRzJ_ zK;%R6D87)L0?aey?Tx}~3i?5`z-kHlK{Uf^4!Q%K=K6+X>Ls1tSVKW4%tWkVptrT` z+4bU274d37FaAu!3WMI(vQJ4b6ZtM-q5*oDs5MqM(91+8X=4heUM4z$X>7erbOdWU zG4=9G7S>gumtT5d6@%VbvS-&DON)rN0`x*n1y&gJLQOfAvGqbt2>`L`55TMpBIR?5%l7ZeeQbk=K%432EF+6F4hj{A@AoFEMx0sqBpT(+q*3O#J3~Q zfnNL>hBXrU$acPkbsY3EQ3BRk=qF=FW7UKH(zMs^uph85iNO^jE2)lh#A$H)yOe~E zWL;=bQd|+39}3SZtuB@yb+_k$?htv|Fo~mP0bBF(M%{?F$ecx*v#}O~E*tFmb=gqT ziQyP@-F*dC7d03BvE=BCwbt$rwcwd7qMP9&q8FVSK0n6CB z6nPS>#bqvK!#T`mn7VA(kJ%hk?=IQ1>)oYp$(}a=^zKqJ)=bbv%T%lY=%OVJ>nhMi z%RH=WK^HBnu-1YuT9P|^UJ>Y`WdZS~Vd|o#0&_0t-K8su7XXJBbX^u>CwS2f|Kl(3 z)J*e5j(H25rllVs?gEDevFL2(Ea0;6&Vb)df}lj)KBWz$!9fb%I+;<#Rjy7vtw0 z9JU6cT)u~S9x=fzRyeGMzk|ES1eUkNM12YLyJpX?-=K5EYeY-+8}tR{e$a1_J-fq{ zwwa%T9U`lCpa<>g!Pd%Rms6QsES>o(9C$ld_`{=7}Rk3hda8?knRet+!M>m~UU z#5)PPtg{bFmvzzR8G$bAd|35BmvymNaiGh(U$~lYF?BBMhBW~6x=||DAkgbZZLtP} zUN^FDvn~K{Bi`+x3&5MPmV+(;|A2Kj=mPK_tY<)fUi2K+`=Cq3IaoVDmx_C_J_TJW zevb78=u+_?Sf7C|758BM4Ron!&ip0lQqjDd2f*QFD(lRj^@7{qdHoLaHi(HSDVBc@ z{c#tr45G{BLVG4!HblJj{XC6%(=?x7R8aZ)?|A}FZO^Z>^*Q1-;u3YX zK8$$`bhh4yHJF$>vv$Qw1)W)&U=0GDS?$?%W(^VVTF{wwG}ctm6K4C$=p4L~c=v+N z!FOXl0XhdS#d;ES4qk|r!5?Ai%(@Zt70?+ghIl^E8EY@`>R{@OWqYg6SnY|I1Uh52 z#To!QW2IsZ0X?}*z#0nr(@A^h9UjtT0@i@rW@H$1K14QUUd$28AWE(uuEJUk(Joo` zu1wiY3{;01v*(K(#p#~Crckz1JKFx9A_@X z)TM1Y)>zP`Z5OO@pcAk?yH3F6#H$3IfTv+qflk1av6{0Lt<&m5nCn5O)g@SWgHEgV zz0+y+BjWuHbXt7_>l4tWt?eK>0slz66QE1mqgZvhpSrY-H+LO$Y5OHH8)53wwkK9E z&;vyqtlppp3S;#Fha389fD6CMBuj^!(*m&-#Pj`1pgLGyIWMT{v~KAApkD1yfa&iv zhGJ(ztkZJjTgB|dLEMbWxfSv!TTWsA3VNC0Cai@J6Dqw%UE{y-qNjUKf1Z5}SGEXr zDxQh87<4Kw!8!>#!5+Xm3OaE`b4?9EC$4kEdy1>q^BO~?c=v!#Tz|%T7IfmeAL}{LiR)gh`#>kI zJFy<+4bgS$Ud(-<>(>2P--51Nw__auUANj?qU+XH=4wFKtu3)SKs#Abb;Rln?WO6% z>H;04X){xjG;L<=D9u#PJPbNXvme${&|i|w#0o)Y8FM<;9Oxp=8mxKHRhoHN^C3l= zcVn%D?$W#u>wf4V&3mx!h0CS69BT#il%_fJD(EFm(=Q)`e$q5Kemyv(uuW(m8a3LX zsQ3tR7sOWtDrW@B1C>?sZ+yQ+|G~s((2?zKUBVypgC23?u{wbsaeY`J&?D|dtYXkp znry7;pr&wV&FNe=IS(SvY(-)6 z|4yQR0$>kE?gwfb*8VI_>w5&CChq3L{ z-5{5k#h|-^jj0P{`;>Hn`~YWO2f9Fh3F{-!U27lKLC^(qGz;|YK^Mp!vHE~6kUL-{ zfi93MXyYJEhr0Lc$t(hZ=X3eHgp-)3AmWXSm?^Xy+$Xu0U?)QaGwDI-8Q{AxPO3?1 zF6ualG$9ppOqDr}OG4^#1)UXKeuZQ>Ud{!#k81o_yonI&^79~#5u1U-7XdGzy=daP z`~q+Yu^e1hSYP9gy#YFBzKOL9bk2Md>toO>toAYJoM|6|&V=?6=uBv1>P%?csS5&o zcAYa@@`SDgoipuwqI2d-;@uBAXRgLt2Rdg~VLbslXWI8p=gd9C`#b2I`6>|Bj`m1+wJtCLfxs9i=Y=38e&}xdNuS?tPY@;A5L*KNtk;1p(|DjI9&W^ zJsDOZvNH5LjyMTUe^3|Si}xQQ9=O_aP>MM?qFQ$_M`T01%Mfv_5BIb$DL3G-k~#=^ z7&HikY6AS^R#jOrESH$aaKL2n6_=R8Ta7Ipd$T40zUjqfWtDQSncR=*KDaF~cc&e_ zA$F$24~X|g90(2r*GgJ&FF4Gnzvamsgh+mRYy_A{P{-UNE6dj;z~&_ms0 zSnq=#>gw_25JL+MBUffF5Y?!g>hwKsycVVbBAu?c{o(wePYXXl=I91Fh|;dZ4ulKo7Jg zG5!R4ptUJf51(g<7e}(y!)HA#la}@H>BFiEdib>M)T`o0X=g*yS$mmn&T{5Dn4P2< zgJsOiq-kR&OEZ^v<3O)VXJJi*E;8m6tf|mdnv=20pqn%+uoi$`!S0E5J?Ir|JMifh z>}QC#5%jwBDy$bluS?qjueZGR_lUOx9JZ{w=CZK|k(FW@98mz#u0I<(3%L@UX0Hz- zJ^~5)*ExST#`As;G1HU!sw(IGJnjnMrYg5t0a*y@x>j79X~Y(&Zx2Z7)l;1$mlG60 z{BOtfQ-{RmlO@2d^lC(dnnIoPUjpd=B1<86XA;!<{Z(sL(UJ$jskCcOLlVJf>Oj3b zJB4;!2^aJMswofAjK{#`!*Mb} zmyOw2xuDC&Jgixu%f=2^A<$*xZ}&@H(QnUKn!ml8(hSqaYeAQdRajX(DP0UM!F(Qc ziT5bh6QE1Hr?8#_UEZzf~#o_dLEWg zYwCHJy-Rv_l}yYOa47Nzvay+EHaDF%AG0w>L&Tep6F6uFIBb8-L92n-I{c}!%NL^i zkPn#yTs|QA{gv#2fWzimHrgogRTbCN1m)kGd`c6(0%ij8HQs>tBIqvs64qAGUHD_4f?go$gEbuV0!b^Z5zs;APy5b0tW7N+#P?kgS)sRzBi4e` zsQ5DCYY_3M_#FqG28U6x?qG5jGt>m+_!O^z8l&-gb(4s@e`n5xM@-7dduw~ci}sTlK=hT3AA-0xNTPL;Ox7g zegxk+9mGEl4rR)#T;OJKEK~k6jF%N6`DEx*TJkOE|IS`#B6ooX_9s^ZF26U!v1|g-HI_;I(?Hi)c8JiGQ!(+%KvzyxSZ3JKl~XxZCFsh@wo}(Gb|BLg z$uiEo3UozsCzi2wMPkpMEPHW2@wS8B4%mpb74&w%16bQYZwJ`3>+OI>r155;w*%^7 zC4$}#XoGbz=7!4oH{gcC4>JZyao^HTA~98<<~% z-Z-$uk={7qMtVNTl2>$=Gxx&O+X0=iy1*zIvoTgz&>IKF>IQn_z_wFw2bj|S1nBJm zJ7Lg^{0WrPO+YX5H^S-!h4L<)qm5>|QY1~=&dE-unbuq(&7N5OVXBj9VqPgtJE;mv z(@v>oO0$wP&w*Leyc+9f2uX7a)-7V>pj?{vF3pkVv&7pB z)zY*v!_xei_tVUK=1TJ%XO2zdH!h^J^HpO&Ul=_-aZhwHt)=-Xd#INAA zhSIPdwgz!-0MCKoF8{f~IJ~+*9WP&^XKBF((9`ja zSnq(Ijz5UC1@v@0hO24{dOH3o@s5C=j@$dHH!>!2kEVg1j!(dv4thFXid6=BI^F}T z9Q1VDzKwc1ZeKw?9k<;=Psi=sq^INd9o5tE>$&blpr_+utY<+_o!4MJ4SMRl1nU{l z+Y|QedXoJi@pgfpWbek>4|dxm{SlfKGBDHVDcv{?N>!Lu~_@eCmaXC}` z8F5|{f7-~Rocz3i`4^e_=@(c0{({cm;Nd-CM{2BGUrv8la1-UsR(~A57 z`)_0Tr}qE<-|_KYGk;e8g!BI(CoiWcCoR{UD%NYB;m=GPpIa307vzu3F075szMySF zTJAW1TE=AlMNVN+VU*YEd}}jv@-9R;A2EGg&dAX|FVTPDA_F7S@`?iKetS(tlk0o` E1_`;ffB*mh literal 45646 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/MultiSigPayment.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/MultiSigPayment.mvsm index c13c06ad3158ab13e6c61869272dc72b4ec257c9..aacd1874892436165dea4c632a58f96cdef1f26d 100644 GIT binary patch literal 8889 zcma)=TWl0%7>57dSz3FdP-vx;L!k$I02L7h6oFtNMh=A*jAB@p-R-i5?ryqUl?0(6 zO#=o9Q5qDB-e8pAg;6N{%N`4)&-LBnB|Bk(QU3OvlaBpI51+O%n z`&-hyK)p-gljeD>E6_ul*RZZbnlz7M{R`>RJc4E0_ek>xtPv%~WJ-v#!62n;<030&PqFW2V_TM z(UdDJ_3+=0GMBbgP`BWG<$Q4!Fv5-Ljv}$_j;(sc0;aipFDVFm7{2WWG5XbK0Ti725=-REiSdT_aqe$+6y+Q&tR3CImK zH{EF}e>f2jE|iDvQm$D8mM_vA4XG!1uF#lyU?l>JmAi|oyTO-eiYJuprDz%$T3xvZ zD0&!l7ygKK0(2Li!a57O3r}{N`VilP`77u{+*vAph*z*i)u0dY;aHD@KEyMy#(_S> zon6w0_)6-vflgMdu-ZW8F^)@8_( zH4k82fj-i-t*hXo?Y0aiaDnl9Wu|`m^-Vak7#=>CxD9u zoy?oB|IXX5i#DB)xB${TLDkX0GGjtuHH2mK{1$e5A?hfQ0+HkR|&PA z;tRk^1Z6f|i?`l(U3}cy!B6P~Gh9#YR=jPXr*=KohoGnSG}cAXQ~NpAx1guic_uxz zH>h_LbXaq?P0x1*E1wB^z6W9zgP!jJSY@E+I|r*A^n7PwW!uQp+KY9SLC_Jb8S`b( z^PR$a1#|>khSdT(f`ze`gN|U%H0cPogL<9NSFVz6egOs2{1WRR+$+sDuns{#X*x4s zD9vH)>?_g=RQm+k)rMVhwBMgz| zs%~?rG~dGPfD&m&ur@=fG@XA^WzyVFy(3UA&3)bGebPLJ`4dz~^F6HNP$|vdvCcu2 zH2=W52-VU&k97ftN%IWWSr{%&`_7l(ereig=QVKgFQKqM2R#_e&Bv~C%u48W*T=4K zQhq6Vn2VkSul`Il18pYsu*ynCsBkl~h&KkXT)bI^@FI|o>yIa7s#(d8cny4^Kq{bq z$QBBJ0BMOpG8vZN!j@2X1#m3M-TWADJLnX&6RQ(+3fhg;1v&+-!#W5$1v%@bQ;_rY zItAJLJI3BKxk^qa=xj5Mdb2@in{ilncj;{7++C-O2dG!VM}M6e7Go|4of%%hS^+vU zI5Uth*RzXyCqSo*lUToiP8Zv-PJ>Pt&N%6Gah-a%K&K1Bg0VoSi}Td;Vd`{YTRlLh z3uoVTW~ilJ9q7z38!HStGeodrpff`?RvdI@u&o3bZ+2b%#98%EO`qbQTvOvQIkh#j RCe=)@_t#CDIJL%@{{aC|jWqxO literal 11265 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 WV;YSt7(Jw*u*g4V$l&1x#{3Tf#prkd diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/ProofOfFee.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/ProofOfFee.mvsm new file mode 100644 index 0000000000000000000000000000000000000000..62c0daba2b4ad855f5a60e84ab4ba2f15cda9414 GIT binary patch literal 39724 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 literal 7488 zcmb8ye@xVM9LMnwaQr&JR6sFO`JtW?Vkcmb&@WW9>`H30LRTku;sqQh9JZ_+x{UOX z@JG?aa%=0Sw$=}#{>UlI)Y4j;t?3^Y{n(o1%88n5W9#`H_xYp0UKiW*FCP1Rzu&v> z_w#*U`>qp*2fK5x54zXoSL{9D>$!e-)4SE{e;C@{H#V?mY43Z9#tcw``R`vsT0^iY z7>YzY`A@r8#G7PHEg6@RKGY+mTnFZvINWZ`+i|$hG2c=gw9aKrJ(+}5e^XO?S2(Ip zb~*ZfN=ces>{WPrvN4r}U8rm$u6^8=E4v%_=D4j;_6Y9GxUE$77cT4qx%`1Zhr-Rk z7BW-xSG*PX0wu_sA&lBViBj6*CrSAM>kW`g%KfO_c7V3rLgFe*A7J z?TwWwrM;~tNNI1XiBj5IYO<8}in67&SCk{AJ$kN`_S&aNX|H{%lvnvShxs=1q#Qz? zq-k-<5!Sp>N_#KeB&Bo5jZz$soF~JWax#hWZh{r)#gq{Uc1A;Ce>Bt{R@=og{3=Ru zHFdRhDP53d%q&V<&!!xBEF|~kyi8*XC?TYlEnOx^cMOV>LjJhHIw+<-A+>e&U#lULrQzA=xw>0Bi~6`a?L8#O41v+5A`VBAlLMu z8cA>U_FGcGy?e8iYgx}v zrBbem$@x+SkRd9QvMDAPNZE>v&@EE7#H3fsM&w3{;}x5g!nQ!hmC_ju2ZHivRX(_o zk|X}7v@S(@>Hkb(HTZhx2yx9Q4an7wj%#i^mdg8=;-1?!gSU~M+nz&hcclCX>rhK5 z-I>@rqyDyt8r!y{8Ph{%g&xFy<-@o@dJy{>H9~q2%j9e)ksieUX1y`ezh$qX9IZ#T z%cw;hT@PY&P#)5Q*gRAT=|QX%HJ|h#HUm{gdJtQN7q9>nZjr3bP7toJJE zL98G34(UPcAZn2GAhrYbDd|DXK2drQvrnlW#7=SK)1-f$+pR*6Y-d?-nDnpn?@>iO z$9iN-N4ZIlY-y-m(j(hcR37P(?F#2P4XH=A(U{aD+ePFh(j%LfBUh3h*{V>rq(`dm<+F$hH)@k@U#66ZID9km4UOvK>X8Cq1$aqee)NY(K@M9@*YU{y}Z&!Wyzt(0d_ z7wL8>|3v*ocSv~zb&2khGMi65hwheg0%|7JNm+<0q9s!P!#Nfsmr3cUSyV6OgQ$mS vxs*QCh!p}rDV3_1Kkf>A6Cqs=FQ5$5DLVM45)ySE4U;v zJu@%eFSP_HH;sTXAJ`Ze{s1upBe5!(2pcNN&cL7y#0-q=iOI?NrFkWU3|9fF)&}Wd z;2~^$22f!>5Hk|=T_{jh0T440R9OO4RSU$-1XUISRTTp<3qh3*Kvlbdn4O@?g+Nv7 zftZ7!%5I>l4M5CEP$kTEE`lo00L{A$#M}f`UInUp48*(yRUQGVIt|2pM5%lNR7pg1 z{st=J(b F0RY?@k~aVV literal 929 zcmd1a_f8`#)nDe40AD(Pd5+$(cR$Y*A6_#{c21;yPh-o|x6BL--+`Es0TnQE1(zhI zXXd5*rIrBYvI!WI%gVq|3B(MH#HwT>Z0IzgfeXNfvL_}d=a=S{5HfrrQ1uFs4h9~= z#yOV diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Stats.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Stats.mvsm index eb16eec85473c4e66455b96844c004d7196774f9..2843daf8d8903f77801e93afaea400a6d05b7085 100644 GIT binary patch literal 33257 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 literal 30952 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 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Subsidy.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Subsidy.mvsm index 3dd920ff6659cd6bd55e8037e32f738ee5db5c83..fd425be1cf2ba8ab2d6abdd13746c026f90d0e15 100644 GIT binary patch literal 14678 zcmbW8YjhOl0fr~!9uh(VA|wz{Ku{nhDj0${E&)+W5(q~Gao8lovXJbC-A#z#?MMaA z(V*BC0S$Oi1L24$<)TIdVp<^Bps_7lLut!VplYqs7WI#PhUPmx{q;`t`22h3o6F98 z`|!=?OiAFA&Heu{Hu}Yc_mgYO*Im8ZUhwL9J0h1aIwJ zV&uQqP5DuFu?qTh`F6Pzs0;-Cw%->~+ivJ-Sua9wvu(8#zI>=^!^hd-v+lV?>w@-T z$FY4?Ue2u_`x*w;czrKK`G{&EM&30GuvS11X>P@O17fAwfaTh8()=aX$B-z^53o)_ zk~EvKK7wRvn!Tq;vzY5X8+uA}1lAl#m8SVT)1RiZ_W*}x%89fLyY$@Tq#X6lk}J7R>s=~1Egst ziY#e<%6OL`TbkcvCH1nbfztdI^E((M&A(v1$vi(;nmO!wEDVw64Oo-lDrx3nT@P1F zvoBUQ43%av*4;2nn)9)$V7N5rVci4QNOLCEb{Hwm$FMfRwbERL^(b5?&53-HlVOxJ z3$aRJv^1w+O@%SiG|li6Y0hW70F0GpB~}&WNpmUIGPquv<~VPX=6J??4JJtQNvw@f zAkAm68eyU|-SJ%eW@$cv^#t4^&3Ccd;8tnAht&zUN%IKSY4DIN7y4M%KfsDfsI9Ui z0lx~auaPf7Ql{StI*~xcuJu(0DtysUSXN&A70mt+6Ht4(v7cp)gV;(ZsNC6%I2TgM z;V4yH9ts5Iq3|tarMg`1VP8c>*onxEY>sFdWP~a!{&(7TnXghE<11`+2)wp*KiomC z&xhh3oEm>=U&~q!+{E(kSc_K=x@V(U>p}Od*}v}Dt&H~)=$>uD+6(dWj2f|aLV`3m zVs(J-**2{ALHF!FtPeo`1J!pnG;i zm#KR;9WxJf&zdi;5%S6}XS@}l%Xc-_deG&&1*;Ks`R>JP0bRarSe>BD_dM3;pv!k6 z*1sTEUZtn|^K^i2-PY3($h$9zz>)7CD5FhKIWD~MDM~GvwRR*(@%|9za2mdz= zc@ew>|4ELu!#&CFwEG|q<67YHmG|%=27d>1Ava!a5DQ{r-)033U6JM^(390?%6_==Mv&N(0?~Nm$9C z+wTX?X7fNVMK_J{W`i!eQmnb4i*5|o-JpwZbeE}%&dg!D=qedA1iI*|u_B<0&K=LS zbX{x@xQl z=%QQ0c|V9bPJYKdj`akLm*$gLPl2w)daU)JD{(E>I?$Eq?s)^~N_3y~E#ToR_UG{= zGFY)5nrau~%aCT?P1ghiQJFq(vqc+ptHe&R!C6S~@{53+MAnEv$JIfs*TG9%-OH~d zZ0Oc%s-48bD0HjH{>l;k9n#Hp^_adXRf*~Irmc^1-j&NvGPEd+-R&Zpi9o&bGpyQG2Ud*eO8F&-p6`XbPCo~ z&?RS%Q)@!kX7d?&FwKsVoSvD!g5U#mN2vX|!T$#iuk=;j-Ml?A%_zG3eJF?I8O-DT?L zGqa>_zK7WJBcPk_QLGK1n=gp2Tse>$Q0eJfH=e>ycK?-l5`OTu2m$d=(2*kye zhaz%yZfOob{DkC?`*|m}AQY-ZRJ?>*T0D1D#_nSm!|Jm^oXWW5pche9$?ThqVB7j+wL9Ikuef!k}}^ zeBwICUSPbvpcmHmV;uk;Zok6X2RhugVSNia$4+2<0{SKOpRm3J{gS#9>on+>)U8;@ zK)ma=xkhsbU`P2j~UB)mS@0N2_`Mb+o?8ct=4; zYa3QO=x9BLbsTiGzK-<<=xE)CMO}JG(a$h1f=H94?jxSW)XDr4>GFQWEI5yh`#|D$xrqQAldzmT)5n+mfg{i$*X?oMc8!X zuSPa;fQ=9zsU%obJeLkeE z#vTSb2}-bR&`D5+RSh}`7Ge27CqWo10{Wd`E>;xu@7BKJDm{Rys8S4V5TY^54SJ{P6HheGq7fXUhyiyS_FE4Pbr#HYFYmQHxS7t literal 14552 zcmbW8eQ*@z0f#r_8}iLZ$Poe|5ekHlfDjTsBtUFJJGGcJQYBrE+;Lu$?1kJVL|cR? zlYku|1PO?-Sjs3M^#jII2~NL|wo0v}wI|O1TKC`m8;~S@s##q(~;Q#;o zFD9|NbyGO#d%#MttWq(^C&`wTGMep2jcRLBaw=lFi{p=M4Yf4bKED$VMjlYxdDvzq zB*xxWP^{#Fbj!L2vI4E%7OxZW`+as(&Bueuf z)=wZwn#Zty3dzzmvyYZ$Dd&ADjFDyr)-p(urujTmrPQLJD$QK1S&%PH57s1@ zCe2UT&p6BiX_jKGghFYq#;S$eq*;!&3Z_eQ5!QF$3(|D3I$)+WeOL`JOPYmzlCxc; zITvd=6iKrPYmSRFO*71s=4!^f8|F*%Ygn~VEX``H8dxArv!5l>oWgjAp;VgfSlgjY znme%e!cu9v6_e1`WQT(R z6_{JLkm7;g{gp6$VU65{3cz87mBBuH~R zRzK*TJ%jZM=$?HF>m2BwHM8rUjpg&72fAm?J*9j0tBh9-TPy#H$Zpqvsjlvcdt1Sx_c8j@?_B6`z|w& z#?))W=1S0O!nOH@jJ8eBPFUGuG zUY~2QDqxW`E3v9Tx8I#uUj*HLE3wK!x1T%nTF~w1-oe!n#TV!PcwUu)6&uB?_>+jI zAl1A_ZgqkY88ol5#p^JlzIulZu0ujJZ}0OGE$dFu$#fR$M-WXiZQz#-HjHTH(@x?m z7Dm)r@3BW8K)N}vfm^>p@Tqml3+&x*fm=*oyLot1LHAiaRzB!Hdl0J=bf0a)>H^(o z=B(>Jb3gUjp!;ktRx#*4E5e!sy3fotr>kobrK!lcLA%P-&yGuw=q1fvO$+z4weUW$^Dbrb1`+v-554?$(g65F1d%8 zc?al{dl+jU=#q1=dO(+)`3le_H^6wm16^|0u>Jv_;6_Y&4=&?WZ*){CG^?gZ9J&?V>2 zdcKP3&vO-7C8=a=IVvtcyvfBDs5G_Omip%+11Tzx1kSJDdd_~#)c zhumK!Ml*f`V@Du0wAI}u7T~;2yO(6Rl^q5AvPc7x3H7ht7d zUaAN1j)0D=tyoWkjx2MuI#IeHygvlwqS=*TjkxQ?t1jMo5q z5zN5~fzGi;tR~PowjS#x(2=zh>v7Ppi4S5u1Nt@b0jyrouZg!|b%1_NoW=D&0dx%J zV0l2tU^do7(2I3xSY1=2dHGw5xe@eY-7+jM=oB^gzfRFGH{5^pJ65OY3i516R@U$PSH77#h_F44y?OCr)VA4 zM$jqhU^RnI(Tg1Ww=s2!y4E((DQfNx9hmMtvSvx61;dH!y|!YMGm9T4LK+RKdRo7V7e*in^L?{3N diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/TestFixtures.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/TestFixtures.mvsm index c07660f99b758e87df932286c9f86a4c5367a00d..cb11bf2b96eaeb1719018563e305117bdafd5457 100644 GIT binary patch literal 6878 zcma)h)ZfaYmQ*g`K!?ZaU<;vMoYNEB(YUM+&l-z2p4XX7y&hw&I-~VrX#+%Q+_kX^e zd;W(-(+7s$e5&Qqrk&A@H!eq73(h>2Q=Yi?#UH~buKqjmm6ykiF{wUd`1#-Xf-PN% zP0jHwn_lSYN|=x_i$v0(-MJFa5`2U=mw%#wV)etnYw|6re%3) zU<5OQsT&Alg+VvqGIayR1wU8Zhe zDS3q@tVyf68OD@>9S;pGL0tv9fd;HN=my%bo&nu}%hb!-NZyCQn$&^yCEE8^y=zN- z95svmtsD3gvj|f+5W*@1-GIx~4V062989WQQVm;WiQO)Yhdt1V+6%gYHmp}cH}E3X z4$uv_Ox?ii!_77!KsS)YdIxj^yRi;}Zop;g29A+80wzN?5UA%L z99Zy~j7%Z7MQuhPd* z4cY$gxO|Rfc+0^TSE)0wN+7VIrz@%C8pK-gC*tdrTh_=Q0|Lp8^|FdxtZlDdA73IB zybZ4p^jBg%)(+4ceIM32&>P)7ss5khJMw-9efM@7LElmRl%EIsF6VZOzVnomHxu+7 z#_bjTuCFI=0qA$4+fw@7@i=);fIeg0?$>8gJ9%qBpDi1)k}yT?&luKb2uX7-RtIED zvlZ(OU#47X?!i0=Q>A$b>nP+&a~oDagr#{J>tl#W^HZ$PV45@su|9!(X}Z(*erf(h z-mg#~&0AQvp-`GbSR+s*%}oB1Iq-lqr()$nu`~@<7^X|pz0GDwvyHrVD3N9dRt!p| zx%Qq}Ce0}3(@-u=_o|sG&9})r3>DHmf^`%sr8$80F3ghVYgor2D$PNxv+$raKf*c# zv!!_nYZ&H8^8(gaP$kWuv93b3G;d)20&}H#4eL70ljaXtKSGT(?I+)ahoqU`#Hj!e zOS1^86dsZ0Uwm>IX00?=Vzoh?G~2OaFkhOTSkFSeG+VKr0}n5`S=`9y*;_f|;S#?X IwfV08AI2e5MF0Q* literal 3955 zcma);OGp$@6o$`eIckoY&|}eKp(~Y~=z%2!K@HBBXY;sU+;XgLl#DzlZsm&ByOOAJ@y&RZee-#INspu=Q@o z)wQvirJ4R?HLuIM7tj2-@iu)p{>RMnB4&L4n@CZ8V@vD)rYo&&mm6DbwOO5L+M8>3 zoVZ!3@k^lXBqEEOpt?woByU2cNUkJ(=L$)t={s7)PWqtdz!DB+0u1zkJ|VjJHq;2w z2A)B^A=-fN)CR`sI~Zdp{pSyqn4KbS0t_TTJBT*W4An>U5jvrIi8kOnwShtUPOfJs zU3vj5=};!XKpOM~(FVGp-Vtr!CDa(vhxMJ>z!ZH0m}| z`cAZgIjC<$8}OZat)KMmEY9wvUcy6QryZK5=}D63qpy}&fi$p#gYH{4z?XV9>R}ojUMSHc9H7A+f(dY&0PP^!Z8KCK(QZ4T zdWm-HJGI+E`YLnTX_YiE%q5&~7m*1t@CEcY(FSIr^5Y=}79pdM+JNuW21@B0uVtqq zY2XvsfXpsI?ZJ?UIW@5$CKs#8{KERT;#z_x<`}YOTDqTV7eV%D$%E4uN=zorJ5&TGFki|>fO1J diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Testnet.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/Testnet.mvsm index d6940f999832fb806d1e02f37e3735b95c04b57d..fb44c3f4d4aff8cf087a101bcdf041dd105ec21a 100644 GIT binary patch literal 2237 zcma)+KWGzS9EQKU{MRJ730+Gz#X$)g$l!1gD&|lxnoQAz;A9j`YDFi(qM(CIIs}Kh zs9O+Y6gA?YqX-fZDKr_~N|weY?Q=q)+j|GkbkF_1@8jP0>wG!(b@20Ceq4@b|2?>H z{l(+L=xwWec6@xNKUwQ`vc{M^Sa9&MVqW8RtJ!Grq9bPf#+mp7te|FC56y&(ISIzH zS8u4frx3HgY|?si8}SZU@?bTrHL#_5AL}86qW;vA!$xA=Wtk>TUdLLl;&dflr-b)F$n=8GAH+O+gD@P>h+uL zW=mx?fqlgPf-TFPoJaIPXElda0-eK4{h(79Ty zu5DbXqpCUO`&^P2U_sfS)u%+xAr+(yc-j#z}$B$&{fp&^htVG&2JP zWrebo{}(1`3o6)G{V#&FpocgBeY)pZ??IpL6V^A-E%<=-5p)Y4VcC%&H}+r5UC=l7 zFRU5pW-V6N%{svzPlImO64o;4W+kzXg1(2(VCBHrNvG&~RnNKP6&;VTIadmmYN=Xu Ks~26@v&=q{H^aaH literal 1526 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 HFqQgWOg1;$ literal 66079 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 DBQs3V literal 5961 zcmb7|duWwq9LJxtv+eAnyU*IpowJLVWI~05P*Fs7$UrB0FtFI!@$9v9^BmbGDWbw8 zs3CLGg)uG4u*#&lHOLUiBM4S%+InFAq1&}4p*Rgg&P@4T%gODxFFR-kg zBhB})0)@upN%MEizaU?l7qK2ffi(Tr3#A#MkF#NtG&`}jz+`D2z&Zv+()<+bI223s zWvm~dM4E+IWl-v5Uchuny9tsww-nR4!b8}__K6H?rW(Hif_ZBmF5DhA*hq) z1XhTOtCwazRw*<{bA*^>nA4@{*So_8I;X~%X2|FSit@k;$SO%}w70x?GTqtfC40Pf zbzTG`)GRn1E(gQL90sm3a>$iciy*)-BM7%TcUB(1(jZCVe-Y#WXcS zt{nSJtht~MtSMMcpbsp6q4a^Zh0bo6JmKfy5@9-uygtPHZDu%4?Nr$sog1pIs@F2=lup_c7w~?^f*zU*vK-? zu3&K(I3&+mtjnO2=M${`pp(ZRlTMyT#G3$}JP)vPrn@9h2x~Iv?P-*lMVJon*hAUI z3`0iS$S4nt*@qaPT(WSEF$+O2ZX4DH&^yB`SRJ4jcL-}3^x_U+T?M_k*184`t6Rm^ z*$D3MymPRdfL~Bg?gq^5HojbjrC2SXC)b)gz+pezjrO@!`2}=ukD#8jx=!KhNnAO> zed6k{XWJ*7-s2lFU-;K{d6B<|`3LafMox4)-a9t3H1}ei0KFt1Vf_j^-!EZZ2c7RH zu|`1WyWhIr%xamRxu8$NaazvB)S2MVy}oO$B;IP!9|x9UwSxXQ(1z6x`rF7@$yxRm&BH~ERRQ)^Q4(zV7vuhEhQ9<@X zhYnsM@Dve5d8n+rA%T~`AcQWZbqS(3=+<|u0dK!m_})JMXLfc5pN(cu&t2*6O5eWK z-Cz6e(!~2cOC4@vtozmY=lSL;Z#Hg>Nl*!`{wt~L%i0-#(9NE7vfgOUH>Jiz#jyQM zIZ>EYR_?o*q?=U-65s) zwX6XVOY5Z!-uN0RqakD3s8-6aT)7=tCuQ)4 z)=PPadA-yi<#AMkB2u0~IkZ7a7j=#{N_if2kv2)W8#PXiQqG`WP?MCCsF&0%a59Cj3m2wUhVdfSo>rf4}Rmx!IHYq!qcZAxcjG>NFyOeR1 zMcbu3hU%dmQnsR!6qC|MIkZ#CU}lGug)6&M#PYZbn<~(7k-r|M!S|^?oloUF-y8b7 zlU?6e%WsxL^R$+q9ZUEXTI0`--yEqZHzt&J(YCFMgqg>y+S{9)7$(hGkOHAH&h2cJ|g{C(X0fx4hK6)C>PI^RAO#_%~5^NiY0+s0XAM{zKGb(hGkE^_29&cTmqrFZ|$r)(gKd?>QOs E2Z?gSzyJUM literal 3683 zcmb8xOGs2<7>DuC%Xk}8b4oLH%I=$>MTF!OphH(YL4}7 z|M`Q&;OmYz8D)c2S0=X=jx~?YjQ{lSHO9141}*%{C~l2gG3T%yZwbXCJqgET8sini zb}(gsYEo8?W5>dFTpefw2gny7zzT=u{rT{ID*b;ZjmtH1terfIy1Qwf&J5-C zMiNH@A*)Ay9CM6*M`ojbtg{S$K^gJ|m`8b-nknT=E2qllv}xSEqSD@LDf-? zl?#vBRrmh^MMf`Z2feodoXOY{(FnEMYx{}dE z#EBgF`>5t6TkFK43XzWe1Xxu+lC0#vGt@ z7LrT3#$2PtZ52((X5yPbKIm3lko1yZqt20D5<;jj=_SGaPxX>8!MwYqmxK}2J<>~p z`>Ejpnj2F65N@3N!Y?0SW9|Is6^F~UJ`t$ourq9 z?WlUvOM*L7FA06jJ572?=to^3y(C;jT_wFFTt|(PUJ`DiZj)XT4x+|LFA45S!`5Q9EZvj)f(t%iO93e;qKHHvG~l#CVu=v_PV6=M^t+RMZ{Pi&JLjDH z`=7Zp%Uj-X?&uvq3~hMzz=IXzFXu&lTg$sgpS@Cf|LnrfU5Q_fF(crC|9(8)s>Zrl zO>HRIm|3F61unj13#2I1lVnUTD6bHw)P+}p^Mng8hO-(xa^&q;yTN$WJs!mR9Fk=px1OG);7>< z+JW^I=r#Qk>jdaE-H&w=^qM-O>ov_{Rwsg9(_u!w0eVdnScTNoYkD4Y8fLm&{qHfY zo#D!~HC-%H2BDk}#^bFC2BXc9CKXl%*i-ElhI>)+JjBO9@2lBZRiO9PlUU0@@2khL z7J=SZGqF~K-UBPKUI4uZYO!7fy$77p^&Z$ly)Mvu;C-x*AXBcW^* z(1}xq_Xz03DaD!tI&l_YEdrf5bFt=wPMq7Zo&(*<8nIeHce1CjT0y6nGrCT(PpNkj zbc&5&dF;Z+R=9?&UPi4_E$Vw)K~f~ix?*-bjddZ^b6I>p+twt-GDXZ!0EJ4L;3 zL8sUt)js?wU08cSC%`*cy-*-`@_ShOV4^f_J!?;r=JQzlVX`!xG`U%thpBf2rnoXs zV@{RkS*-JLi!{H%O2Dns{CdnRl;#!8QJ5yp-?7qp2~;G_kulRR%}na$La{5e2(v_* zhZxWd7T?by5Kha~jZQ$-eyExUDrQqg3dxWa}wz8a%UaSGo zt>*;RSmt{?#7x6`atW9uG`s5)LRd_odvO)K({kzFY9*JL%qGA+u3VaJ3zNHYrYM- zomtb4uG^Wl-US!iZtpl_4ukO|wX9G-V?ROs3_LmZ9a*R`8mxEuHtt^j?yCS!EHVYs zyzE%ed6D2=GB9;s__3yg&Wn7k63}_^FyE&hbY3jSY5<)VVXS9B=Y=z)Ixjk@w-$6> itjF33IxkwWUI(2Q?Yty;1$177u{uEKg|#}tn7;u9xo~O# literal 8230 zcma)>S!`5Q9EZPV5AW@kfuQ8dRyhS*RU3g1z9(CbGa5jKPj=U9XHyDq)$3d*a;FUES zn46eAKeA>wRu3fWDO#0f%#&b$QnbDo^?lGYumx)y=ZP4_rPZAy#aa;3}Af#X>yJFunt1HG&f?s3iG5n zigg_3OY;)ef<$97q*g8L0VyHtnd*oY2uI}2y^zjX227q# zoN~P7pcAJIs{(Z5ti*Z(bmBaSwE}eF+=$fte+uAnjd1tAy=BVH3cp<{SZGdM#24Q<0$qC@FccaP0cD>4y4lbz)esT z;1z=oiWIC8&_QtnRvGA^D8;%SbWnJ)9s(T{4`8hT9Tc}?tpptu&geQQo~2#~=%BE$ z8bAj{71mDBLD7fx4(Ooh#M%KmD4fxCP<&0jNzg$th&2j2D4e~lgTh1m%>f-0Q;a+V zIw)-OGU%YNO?z}56n|ToF1B*vd}Hng9;GBJ)S^!nu?%C@f!k9^7sX$Jghopq$ADoGuGRnQ{~@#l~H_wdNZI?pi^ZoRs-m)D8cfBPJo-SZULPDi?QwlodD%nRiG1~8mk6$0yy7DC%|^< z?F5|weOP-zC%}HJe#nzM`8})yaFsOedbYhln(MI!AYYnJnk;0Jaky5Rr)SMY()Z_QZaR26k(Ns&Wl{EQqXx(%lD}Vofr3GtpS}EO;{n&dC`E?2s$sExz~BoO}$N^ j^WtT!H$mq`4C^h>dC|%1lovtgMFUnB=)AD4ZZPIAzjcx8 diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/ValidatorScripts.mvsm b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/source_maps/ValidatorScripts.mvsm index 454ded340daffefbc5f318866bb6251ba7096a64..e0fec08819952590e6b4fc19c59f5ee373754790 100644 GIT binary patch literal 4884 zcma*qOGs2v9LMo9GrmX1snpV*+RL75w2^XjY&2gvlqPLL#u-h)GDe%ChqZ{xGKk(% z5%yGxB3dS{vmz)Wf{JL87+|8Yj|x#vE-oi~1K+GOGNUE5Z? zZaDjUPTuFX;qW$vIy)kvo~~#^INGthr`x!Uc_^l3 zrWvz_OoB7EQ{nYMAH}m!xK-&Yn?aOW%= z4awJc7dJuQtwcMa(NEmz3*JWfUi67RpcYQnsOX zQG%4aQQed%Wi6_QlB66!4N|g{H&H{BB4saXnA}pnK)s<rQJR#GQ18hjr6Zl! zP3cm)Q6BP2`I(i|k<+9sMwQTXDRWUinjvL5Y6E3RS&H&grj*&Jjg%#21*(!}N@>rW zCFLOVZc(R#l0DLtrkS|Fu8 zGgr!W%=1y6lzFI9S}5fP)J9q)Wf`iR7E76fs--1TR-Sa( z%cVSmI!Y^~JcK$-E2Z3uIzg+XJcc?>tEIGO7D#EW+(%QmZI7lH^Ms5eIcA^2)UAFT z|B9S(p-3dEw8zb+OYXn(7Z$0X`OfqS>$l3#N0dp+F<&21?5X;QlFz&%(npj`)Ed%9 z6#IS9N0brf-6wrS=|?>veMH%dnjn3gc#Zl>`ZzI$`bPRVVXv-_6Twtt8b}`}R-qb6 zA179#EUk|d`KSw|4+%$5eWVWw5!6Z2hXhNVB7I1(e@}huw_eRfGWwtXaiTHfWSohy zu07%QR(WYZMZcse?E~+CAFc7+-sKL~l4ML9>5Dpm+ClpD6`<~szNq_AgQPF&80rS; zi`rgYU(^}N#>^spQBSgRHc~%#d_p!M^>c?0RZDuK$Vb(Y-YD$V^+s`?d6!9V6fx8Q z>5U?UdP91n7(+cHy-^IIo|As=uvgbxN&+{s6w+JDBrCg-dQ16)tVZfBr4Z#K{oIj* zDkZ)7*sJU3j?>J$K>E4k66y-+=Z^iTtE8VhEOm`cTw0UAuDL$g*jyRhS|4y4kNtU# nzq+m>;4&H3H~rmB9~!rB}q literal 6161 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 literal 12716 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 // get the parent's ancestry if initialized. @@ -38,31 +38,31 @@ address DiemFramework { if (exists(parent)) { let parent_state = borrow_global_mut(parent); let parent_tree = *&parent_state.tree; - print(&100210); + // print(&100210); if (Vector::length
(&parent_tree) > 0) { Vector::append(&mut new_tree, parent_tree); }; - print(&100220); + // print(&100220); }; // add the parent to the tree Vector::push_back(&mut new_tree, parent); - print(&100230); + // print(&100230); if (!exists(child)) { move_to(new_account_sig, Ancestry { tree: new_tree, }); - print(&100240); + // print(&100240); } else { // this is only for migration cases. let child_ancestry = borrow_global_mut(child); child_ancestry.tree = new_tree; - print(&100250); + // print(&100250); }; - print(&100260); + // print(&100260); } @@ -80,40 +80,40 @@ address DiemFramework { public fun is_family(left: address, right: address): (bool, address) acquires Ancestry { let is_family = false; let common_ancestor = @0x0; - print(&100300); - print(&exists(left)); - print(&exists(right)); + // // print(&100300); + // // print(&exists(left)); + // // print(&exists(right)); // if (exists(left) && exists(right)) { // if tree is empty it will still work. - print(&100310); + // // print(&100310); let left_tree = get_tree(left); - print(&100311); + // // print(&100311); let right_tree = get_tree(right); - print(&100320); + // // print(&100320); // check for direct relationship. if (Vector::contains(&left_tree, &right)) return (true, right); if (Vector::contains(&right_tree, &left)) return (true, left); - print(&100330); + // // print(&100330); let i = 0; // check every address on the list if there are overlaps. while (i < Vector::length
(&left_tree)) { - print(&100341); + // // print(&100341); let family_addr = Vector::borrow(&left_tree, i); if (Vector::contains(&right_tree, family_addr)) { is_family = true; common_ancestor = *family_addr; - print(&100342); + // // print(&100342); break }; i = i + 1; }; - print(&100350); + // // print(&100350); // }; - print(&100360); + // // print(&100360); (is_family, common_ancestor) } @@ -160,13 +160,13 @@ address DiemFramework { move_to(child_sig, Ancestry { tree: migrate_tree, }); - print(&100240); + // print(&100240); } else { // this is only for migration cases. let child_ancestry = borrow_global_mut(child); child_ancestry.tree = migrate_tree; - print(&100250); + // print(&100250); }; } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/AutoPay.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/AutoPay.move index 2a6818e2cc..62b6ff71b5 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/AutoPay.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/AutoPay.move @@ -16,7 +16,6 @@ address DiemFramework { use Std::FixedPoint32; use DiemFramework::DiemConfig; use Std::Errors; - use DiemFramework::CommunityWallet; use DiemFramework::Roles; /// Attempted to send funds to an account that does not exist @@ -51,8 +50,8 @@ address DiemFramework { const INVALID_PERCENTAGE: u64 = 010022; /// Attempt to use a UID that is already taken const UID_TAKEN: u64 = 010023; - /// Attempt to make a payment to a non-community-wallet - const PAYEE_NOT_COMMUNITY_WALLET: u64 = 010024; + // /// Attempt to make a payment to a non-community-wallet + // const PAYEE_NOT_COMMUNITY_WALLET: u64 = 010024; // triggered once per epoch struct Tick has key { @@ -202,7 +201,6 @@ address DiemFramework { let bal_change_since_last_run = if (pre_run_bal > my_autopay_state.prev_bal) { pre_run_bal - my_autopay_state.prev_bal } else { 0 }; - // go through the pledges while (payments_idx < payments_len) { let payment = Vector::borrow_mut(payments, payments_idx); @@ -231,10 +229,6 @@ address DiemFramework { payment: &mut Payment, bal_change_since_last_run: u64, ): bool { - // check payees are community wallets, only community wallets are allowed - // to receive autopay (bypassing account limits) - if (!CommunityWallet::is_comm(payment.payee)) { return false }; // do nothing but don't delete instruction }; - Roles::assert_diem_root(vm); let epoch = DiemConfig::get_current_epoch(); let account_bal = DiemAccount::balance(*account_addr); @@ -268,9 +262,9 @@ address DiemFramework { // in remaining cases, payment is simple amount given, not a percentage payment.amt }; - + if (amount != 0 && amount <= account_bal) { - DiemAccount::vm_make_payment_no_limit( + DiemAccount::vm_pay_from( *account_addr, payment.payee, amount, b"autopay", b"", vm ); }; @@ -341,16 +335,16 @@ address DiemFramework { payee: address, end_epoch: u64, amt: u64 - ) acquires UserAutoPay, AccountLimitsEnable { + ) acquires UserAutoPay { let addr = Signer::address_of(sender); // Confirm that no payment exists with the same uid let index = find(addr, uid); assert!(Option::is_none(&index), Errors::invalid_argument(UID_TAKEN)); - // TODO: This check already exists at the time of execution. - if (borrow_global(@DiemRoot).enabled) { - assert!(CommunityWallet::is_comm(payee), Errors::invalid_argument(PAYEE_NOT_COMMUNITY_WALLET)); - }; + // // TODO: This check already exists at the time of execution. + // if (borrow_global(@DiemRoot).enabled) { + // assert!(CommunityWallet::is_comm(payee), Errors::invalid_argument(PAYEE_NOT_COMMUNITY_WALLET)); + // }; let payments = &mut borrow_global_mut(addr).payments; assert!( diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Burn.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Burn.move index fada758c2a..f1f010f89e 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Burn.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Burn.move @@ -6,8 +6,9 @@ module Burn { use DiemFramework::DiemAccount; use DiemFramework::CoreAddresses; use DiemFramework::GAS::GAS; + use DiemFramework::TransactionFee; use Std::Signer; - use DiemFramework::Debug::print; + use DiemFramework::Diem::{Self, Diem}; struct BurnPreference has key { send_community: bool @@ -19,6 +20,36 @@ module Burn { ratio: vector, } + + public fun epoch_burn_fees( + vm: &signer, + ) acquires BurnPreference, DepositInfo { + CoreAddresses::assert_vm(vm); + // extract fees + let coins = TransactionFee::vm_withdraw_all_coins(vm); + + // get the list of fee makers + // let state = borrow_global(@VMReserved); + let fee_makers = TransactionFee::get_fee_makers(); + let len = Vector::length(&fee_makers); + + // for every user in the list burn their fees per Burn.move preferences + let i = 0; + while (i < len) { + let user = Vector::borrow(&fee_makers, i); + let amount = TransactionFee::get_epoch_fees_made(*user); + let user_share = Diem::withdraw(&mut coins, amount); + burn_or_recycle_user_fees(vm, *user, user_share); + + i = i + 1; + }; + + // Superman 3 decimal errors. https://www.youtube.com/watch?v=N7JBXGkBoFc + // anything that is remaining should be burned + Diem::vm_burn_this_coin(vm, coins); + } + + public fun reset_ratios(vm: &signer) acquires DepositInfo { CoreAddresses::assert_diem_root(vm); let list = DonorDirected::get_root_registry(); @@ -38,13 +69,15 @@ module Burn { i = i + 1; }; + if (global_deposits == 0) return; + let ratios_vec = Vector::empty(); let k = 0; while (k < len) { let cumu = *Vector::borrow(&deposit_vec, k); let ratio = FixedPoint32::create_from_rational(cumu, global_deposits); - print(&ratio); + // print(&ratio); Vector::push_back(&mut ratios_vec, ratio); k = k + 1; @@ -72,59 +105,51 @@ module Burn { } // calculate the ratio which the community wallet should receive - fun get_value(payee: address, value: u64): u64 acquires DepositInfo { + fun get_payee_value(payee: address, value: u64): u64 acquires DepositInfo { if (!exists(@VMReserved)) return 0; let d = borrow_global(@VMReserved); - let contains = Vector::contains(&d.addr, &payee); - print(&contains); + let _contains = Vector::contains(&d.addr, &payee); + // print(&contains); let (is_found, i) = Vector::index_of(&d.addr, &payee); if (is_found) { - print(&is_found); + // print(&is_found); let len = Vector::length(&d.ratio); - print(&i); - print(&len); + // print(&i); + // print(&len); if (i + 1 > len) return 0; let ratio = *Vector::borrow(&d.ratio, i); if (FixedPoint32::is_zero(copy ratio)) return 0; - print(&ratio); + // print(&ratio); return FixedPoint32::multiply_u64(value, ratio) }; 0 } - public fun epoch_start_burn( - vm: &signer, payer: address, value: u64 + public fun burn_or_recycle_user_fees( + vm: &signer, payer: address, user_share: Diem ) acquires DepositInfo, BurnPreference { CoreAddresses::assert_vm(vm); if (exists(payer)) { if (borrow_global(payer).send_community) { - return send(vm, payer, value) - } else { - return burn(vm, payer, value) + recycle(vm, payer, &mut user_share); } - } else { - burn(vm, payer, value); - }; - } + }; - fun burn(vm: &signer, addr: address, value: u64) { - DiemAccount::vm_burn_from_balance( - addr, - value, - b"burn", - vm, - ); + // Superman 3 + Diem::vm_burn_this_coin(vm, user_share); } - fun send(vm: &signer, payer: address, value: u64) acquires DepositInfo { + fun recycle(vm: &signer, payer: address, coin: &mut Diem) acquires DepositInfo { let list = get_address_list(); let len = Vector::length
(&list); - print(&list); + + let total_coin_value_to_recycle = Diem::value(coin); + // print(&list); // There could be errors in the array, and underpayment happen. let value_sent = 0; @@ -132,27 +157,23 @@ module Burn { let i = 0; while (i < len) { let payee = *Vector::borrow
(&list, i); - print(&payee); - let val = get_value(payee, value); - print(&val); + // print(&payee); + let amount_to_payee = get_payee_value(payee, total_coin_value_to_recycle); + // print(&val); + + let to_deposit = Diem::withdraw(coin, amount_to_payee); - DiemAccount::vm_make_payment_no_limit( + DiemAccount::vm_deposit_with_metadata( + vm, payer, payee, - val, - b"epoch start send", + to_deposit, + b"recycle", b"", - vm, ); - value_sent = value_sent + val; + value_sent = value_sent + amount_to_payee; i = i + 1; }; - - // prevent under-burn due to issues with index. - // let diff = value - value_sent; - // if (diff > 0) { - // burn(vm, payer, diff) - // }; } public fun set_send_community(sender: &signer, community: bool) acquires BurnPreference { diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Cases.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Cases.move index ad92bc7f7e..638897ea03 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Cases.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Cases.move @@ -10,15 +10,17 @@ address DiemFramework{ /// Validators who are no longer compliant may be kicked out of the validator /// set and/or jailed. To be compliant, validators must be BOTH validating and mining. module Cases{ - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use DiemFramework::Stats; use DiemFramework::Roles; const VALIDATOR_COMPLIANT: u64 = 1; - const VALIDATOR_HALF_COMPLIANT: u64 = 2; - const VALIDATOR_NOT_COMPLIANT: u64 = 3; + // const VALIDATOR_HALF_COMPLIANT: u64 = 2; + // const VALIDATOR_NOT_COMPLIANT: u64 = 3; const VALIDATOR_DOUBLY_NOT_COMPLIANT: u64 = 4; + const INVALID_DATA: u64 = 0; + // Determine the consensus case for the validator. // This happens at an epoch prologue, and labels the validator based on // performance in the outgoing epoch. @@ -32,28 +34,31 @@ address DiemFramework{ // this is a failure mode. Only usually seen in rescue missions, // where epoch counters are reconfigured by writeset offline. - if (height_end < height_start) return VALIDATOR_DOUBLY_NOT_COMPLIANT; + if (height_end < height_start) return INVALID_DATA; Roles::assert_diem_root(vm); // did the validator sign blocks above threshold? let signs = Stats::node_above_thresh(vm, node_addr, height_start, height_end); - let mines = TowerState::node_above_thresh(node_addr); + // let mines = TowerState::node_above_thresh(node_addr); - if (signs && mines) { + if (signs) { // compliant: in next set, gets paid, weight increments VALIDATOR_COMPLIANT - } - else if (signs && !mines) { - // half compliant: not in next set, does not get paid, weight - // does not increment. - VALIDATOR_HALF_COMPLIANT - } - else if (!signs && mines) { - // not compliant: jailed, not in next set, does not get paid, - // weight increments. - VALIDATOR_NOT_COMPLIANT } + // V6: Simplify compliance cases by removing mining. + + // } + // else if (signs && !mines) { + // // half compliant: not in next set, does not get paid, weight + // // does not increment. + // VALIDATOR_HALF_COMPLIANT + // } + // else if (!signs && mines) { + // // not compliant: jailed, not in next set, does not get paid, + // // weight increments. + // VALIDATOR_NOT_COMPLIANT + // } else { // not compliant: jailed, not in next set, does not get paid, // weight does not increment. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DemoBonding.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DemoBonding.move index 5d0d04fd49..0b95d00950 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DemoBonding.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DemoBonding.move @@ -2,7 +2,7 @@ address DiemFramework { module DemoBonding { use DiemFramework::Decimal; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; struct CurveState has key { is_deprecated: bool, @@ -51,30 +51,30 @@ module DemoBonding { public fun deposit_calc(add_to_reserve: u128, reserve: u128, supply: u128): u128 { let one = Decimal::new(true, 1, 0); - print(&one); + // print(&one); let add_dec = Decimal::new(true, add_to_reserve, 0); - print(&add_dec); + // print(&add_dec); let reserve_dec = Decimal::new(true, reserve, 0); - print(&reserve_dec); + // print(&reserve_dec); let supply_dec = Decimal::new(true, supply, 0); - print(&supply_dec); + // print(&supply_dec); // formula: // supply * sqrt(one+(add_to_reserve/reserve)) let a = Decimal::div(&add_dec, &reserve_dec); - print(&a); + // print(&a); let b = Decimal::add(&one, &a); - print(&b); + // print(&b); let c = Decimal::sqrt(&b); - print(&c); + // print(&c); let d = Decimal::mul(&supply_dec, &c); - print(&d); + // print(&d); let int = Decimal::borrow_int(&Decimal::trunc(&d)); - print(int); + //print(int); return *int } @@ -95,14 +95,14 @@ module DemoBonding { let state = borrow_global_mut(service_addr); let post_supply = deposit_calc(deposit, state.reserve, state.supply_issued); - print(&post_supply); + // print(&post_supply); assert!(post_supply > state.supply_issued, 73570003); let mint = post_supply - state.supply_issued; - print(&mint); + // print(&mint); // update the new curve state state.reserve = state.reserve + deposit; state.supply_issued = state.supply_issued + mint; - // print(&state); + // // print(&state); mint } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemAccount.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemAccount.move index 5436f835de..36b2e991a1 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemAccount.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemAccount.move @@ -11,6 +11,8 @@ module DiemFramework::DiemAccount { friend DiemFramework::MakeWhole; friend DiemFramework::MigrateJail; friend DiemFramework::Genesis; + friend DiemFramework::TestFixtures; // Todo: remove + friend DiemFramework::Mock; use DiemFramework::AccountFreezing; use DiemFramework::CoreAddresses; @@ -52,7 +54,7 @@ module DiemFramework::DiemAccount { // use DiemFramework::DonorDirected; use DiemFramework::Ancestry; use DiemFramework::Vouch; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::Jail; use DiemFramework::Testnet; @@ -163,6 +165,7 @@ module DiemFramework::DiemAccount { role_id: u64 } + const MAX_U64: u128 = 18446744073709551615; /////// 0L ///////// @@ -298,7 +301,7 @@ module DiemFramework::DiemAccount { public fun process_escrow( account: &signer ) acquires EscrowList, AutopayEscrow, Balance, AccountOperationsCapability { -// print(&01000); +// // print(&01000); Roles::assert_diem_root(account); let account_list = &borrow_global>( @@ -306,9 +309,9 @@ module DiemFramework::DiemAccount { ).accounts; let account_len = Vector::length(account_list); let account_idx = 0; -// print(&010100); +// // print(&010100); while (account_idx < account_len) { -// print(&010110); +// // print(&010110); let EscrowSettings {account: account_addr, share: percentage} = Vector::borrow(account_list, account_idx); @@ -325,21 +328,21 @@ module DiemFramework::DiemAccount { limit_room , FixedPoint32::create_from_rational(*percentage, 100) ); -// print(&010120); +// // print(&010120); let amount_sent: u64 = 0; let payment_list = &mut borrow_global_mut>(*account_addr).list; let num_payments = FIFO::len>(payment_list); -// print(&010130); +// // print(&010130); // Pay out escrow until limit is reached while (limit_room > 0 && num_payments > 0) { -// print(&010131); +// // print(&010131); let Escrow {to_account, escrow} = FIFO::pop>(payment_list); let recipient_coins = borrow_global_mut>(to_account); let payment_size = Diem::value(&escrow); -// print(&010132); +// // print(&010132); if (payment_size > limit_room) { -// print(&010133); +// // print(&010133); let (coin1, coin2) = Diem::split(escrow, limit_room); Diem::deposit(&mut recipient_coins.coin, coin2); let new_escrow = Escrow { @@ -349,20 +352,20 @@ module DiemFramework::DiemAccount { FIFO::push_LIFO>(payment_list, new_escrow); amount_sent = amount_sent + limit_room; limit_room = 0; -// print(&010134); +// // print(&010134); } else { -// print(&01015); +// // print(&01015); // This entire escrow is being paid out Diem::deposit(&mut recipient_coins.coin, escrow); limit_room = limit_room - payment_size; amount_sent = amount_sent + payment_size; num_payments = num_payments - 1; -// print(&010136); +// // print(&010136); } }; //update account limits if (amount_sent > 0) { -// print(&010140); +// // print(&010140); _ = AccountLimits::update_withdrawal_limits( amount_sent, *account_addr, @@ -370,10 +373,10 @@ module DiemFramework::DiemAccount { @DiemRoot ).limits_cap ); -// print(&010141); +// // print(&010141); }; -// print(&010150); +// // print(&010150); account_idx = account_idx + 1; } } @@ -689,6 +692,8 @@ module DiemFramework::DiemAccount { Ancestry::init(sender, &new_signer); Vouch::init(&new_signer); Vouch::vouch_for(sender, new_account_address); + // ProofOfFee::init(&new_signer); // proof of fee causes circular depency if called on account creation. + // creation script should call proof of fee after. set_slow(&new_signer); new_account_address @@ -915,7 +920,7 @@ module DiemFramework::DiemAccount { ); //////// 0L //////// // if the account wants to be tracked add tracking - maybe_update_deposit(payee, deposit_value); + maybe_update_deposit(payer, payee, deposit_value); } spec deposit { pragma opaque; @@ -1435,9 +1440,94 @@ module DiemFramework::DiemAccount { false // 0L todo diem-1.4.1 - new patch, needs review ); + Receipts::write_receipt_vm(vm, payer, payee, amount); + + restore_withdraw_capability(cap); + } + + /// VM authorized to withdraw a coin if it is to pay a network fee + /// e.g. transaction fees, validator PoF auction, etc. + /// the amount can be above the transaction limit that + /// may exist on an account. + public fun vm_pay_user_fee( + vm: &signer, + payer : address, + amount: u64, + metadata: vector, + ) acquires DiemAccount, Balance, AccountOperationsCapability { //////// 0L //////// + if (Signer::address_of(vm) != @DiemRoot) return; + // don't try to send a 0 balance, will halt. + if (amount < 1) return; + // Check there is a payer + if (!exists_at(payer)) return; + // Check payer's balance is initialized (sanity). + if (!exists>(payer)) return; + + // Check the payer is in possession of withdraw token. + if (delegated_withdraw_capability(payer)) return; + + // VM should not force an account below 1GAS, since the account may not recover. + if (balance(payer) < BOOTSTRAP_COIN_VALUE) return; + + // prevent halting on low balance. + // charge the remaining balance if the amount is greater than balance. + // User does not accumulate a debt. + if (balance(payer) < amount) { + amount = balance(payer); + }; + + // VM can extract the withdraw token. + let account = borrow_global_mut(payer); + let cap = Option::extract(&mut account.withdraw_capability); + + let coin = withdraw_from(&cap, payer, amount, copy metadata); + TransactionFee::pay_fee_and_track(payer, coin); restore_withdraw_capability(cap); } + + // respects slow wallet limits + public fun vm_pay_from( + payer: address, + payee: address, + amount: u64, + metadata: vector, + metadata_signature: vector, + vm: &signer, + ) acquires DiemAccount, Balance, AccountOperationsCapability, CumulativeDeposits, SlowWallet { + /////// 0L ///////// + if (Signer::address_of(vm) != @DiemRoot) return; + + // check amount if it is a slow wallet + if (is_slow(payer)) { + if (amount > unlocked_amount(payer)) return; + }; + + // checks first that the slow limits are respected. + vm_make_payment_no_limit( + payer, + payee, + amount, + metadata, + metadata_signature, + vm + ); + /////// 0L ///////// + // in case of slow wallet update the tracker + if (is_slow(payer)) + {decrease_unlocked_tracker(payer, amount);}; + + // if a payee is a slow wallet and is receiving funds from ordinary + // or another slow wallet's unlocked funds, it counts toward unlocked coins. + // the exceptional case is community wallets, which funds don't count toward unlocks. However, the community wallet payment uses a different function: vm_make_payment_no_limit + if (is_slow(*&payee)){ + increase_unlocked_tracker(*&payee, amount); + }; + + + maybe_update_deposit(payer, payee, amount); + } + //////// 0L //////// /// VM can burn from an account's balance for administrative purposes (e.g. at epoch boundaries) @@ -1456,9 +1546,9 @@ module DiemFramework::DiemAccount { // TODO: review this in 5.1 // VM should not force an account below 1GAS, since the account may not recover. - print(&7777777900002); + // print(&7777777900002); if (balance(addr) < BOOTSTRAP_COIN_VALUE) return; - print(&7777777900003); + // print(&7777777900003); // prevent halting on low balance. // burn the remaining balance if the amount is greater than balance @@ -1467,7 +1557,7 @@ module DiemFramework::DiemAccount { amount = balance(addr); }; - print(&amount); + // print(&amount); // Check the payer is in possession of withdraw token. if (delegated_withdraw_capability(addr)) return; @@ -1475,7 +1565,7 @@ module DiemFramework::DiemAccount { let account = borrow_global_mut(addr); let cap = Option::extract(&mut account.withdraw_capability); let coin = withdraw_from(&cap, addr, amount, copy metadata); - print(&coin); + // print(&coin); Diem::vm_burn_this_coin(vm, coin); restore_withdraw_capability(cap); } @@ -1520,10 +1610,15 @@ module DiemFramework::DiemAccount { // if a payee is a slow wallet and is receiving funds from ordinary // or another slow wallet's unlocked funds, it counts toward unlocked coins. // the exceptional case is community wallets, which funds don't count toward unlocks. However, the community wallet payment uses a different function: vm_make_payment_no_limit - if (is_slow(*&payee)) - {increase_unlocked_tracker(*&payee, amount);} + if (is_slow(*&payee)){ + increase_unlocked_tracker(*&payee, amount); + }; + + + maybe_update_deposit(*&cap.account_address, payee, amount); } + /// Withdraw `amount` Diem from the address embedded in `WithdrawCapability` and /// deposits it into the `payee`'s account balance. /// The included `metadata` will appear in the `SentPaymentEvent` and `ReceivedPaymentEvent`. @@ -2191,16 +2286,16 @@ module DiemFramework::DiemAccount { Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -2230,16 +2325,16 @@ module DiemFramework::DiemAccount { Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -2989,7 +3084,8 @@ module DiemFramework::DiemAccount { ); // NB: `withdraw_from_balance` is not used as limits do not apply to this transaction fee - TransactionFee::pay_fee(Diem::withdraw(coin, transaction_fee_amount)) + //////// 0L //////// + TransactionFee::pay_fee_and_track(sender, Diem::withdraw(coin, transaction_fee_amount)) } } spec epilogue_common { @@ -3106,16 +3202,16 @@ module DiemFramework::DiemAccount { Roles::new_validator_role(dr_account, &new_account); ValidatorConfig::publish(&new_account, dr_account, human_name); make_account(&new_account, auth_key_prefix); - /////// 0L ///////// - add_currencies_for_account(&new_account, false); + add_currencies_for_account(&new_account, false); let new_account = create_signer(new_account_address); set_slow(&new_account); - /////// 0L ///////// + // NOTE: issues with testnet Jail::init(&new_account); - // ValidatorUniverse::add_self(&new_account); - // Vouch::init(&new_account); + // TODO: why does this fail? + // assert!(ValidatorConfig::is_valid(new_account_address), 07171717171); + } spec create_validator_account { pragma disable_invariants_in_body; @@ -3462,12 +3558,14 @@ module DiemFramework::DiemAccount { // with the attached `metadata` public fun vm_deposit_with_metadata( vm: &signer, + payer: address, payee: address, to_deposit: Diem, metadata: vector, metadata_signature: vector ) acquires DiemAccount, Balance, CumulativeDeposits { //////// 0L //////// CoreAddresses::assert_diem_root(vm); + let amount = Diem::value(&to_deposit); deposit( @DiemRoot, payee, @@ -3476,6 +3574,9 @@ module DiemFramework::DiemAccount { metadata_signature, false // 0L todo diem-1.4.1 - new patch, needs review ); + + // track if the payee is tracking receipts for governance. + Receipts::write_receipt_vm(vm, payer, payee, amount); } // for billing. TODO: merge with other implementation on separate branch. @@ -3508,6 +3609,22 @@ module DiemFramework::DiemAccount { index: u64, } + //////// 0L //////// + // Blockchain Fee helpers + // used for example in making all upcoming validators pay PoF fee in advance. + public fun vm_multi_pay_fee(vm: &signer, vals: &vector
, fee: u64, metadata: &vector) acquires DiemAccount, AccountOperationsCapability, Balance { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + + let i = 0u64; + while (i < Vector::length(vals)) { + let val = Vector::borrow(vals, i); + vm_pay_user_fee(vm, *val, fee, *metadata); + i = i + 1; + }; + } + //////// 0L //////// // init struct for storing cumulative deposits, for community wallets public fun init_cumulative_deposits(sender: &signer, starting_balance: u64) { @@ -3521,7 +3638,7 @@ module DiemFramework::DiemAccount { }; } - fun maybe_update_deposit(payee: address, deposit_value: u64) acquires CumulativeDeposits { + fun maybe_update_deposit(payer: address, payee: address, deposit_value: u64) acquires CumulativeDeposits { // update cumulative deposits if the account has the struct. if (exists(payee)) { let epoch = DiemConfig::get_current_epoch(); @@ -3529,7 +3646,13 @@ module DiemFramework::DiemAccount { let cumu = borrow_global_mut(payee); cumu.value = cumu.value + deposit_value; cumu.index = cumu.index + index; + + // also write the receipt to the payee's account. + Receipts::write_receipt(payer, payee, deposit_value); + }; + + } /// adjust the points of the deposits favoring more recent deposits. @@ -3556,7 +3679,7 @@ module DiemFramework::DiemAccount { borrow_global(addr).index } - public fun is_init(addr: address): bool { + public fun is_init_cumu_tracking(addr: address): bool { exists(addr) } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemSystem.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemSystem.move index e03979517f..8c66e255c5 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemSystem.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DiemSystem.move @@ -21,13 +21,13 @@ module DiemFramework::DiemSystem { use Std::FixedPoint32; use DiemFramework::Stats; use DiemFramework::Cases; - use DiemFramework::NodeWeight; /// Information about a Validator Owner. struct ValidatorInfo has copy, drop, store { /// The address (account) of the Validator Owner addr: address, - /// The voting power of the Validator Owner (currently always 1). + //////// 0L //////// + /// The voting power of the Validator Owner (since V6 is always 10). consensus_voting_power: u64, /// Configuration information about the Validator, such as the /// Validator Operator, human name, and info such as consensus key @@ -734,7 +734,14 @@ module DiemFramework::DiemSystem { Vector::push_back(&mut next_epoch_validators, ValidatorInfo { addr: account_address, config, // copy the config over to ValidatorSet - consensus_voting_power: 1 + NodeWeight::proof_of_weight(account_address), + //// V6 //// + // CONSENSUS CRITICAL + // ALL EYES ON THIS + // PROOF OF FEE + // All nodes will have equal voting power as per the PoF paper. + consensus_voting_power: 10, + // "you can syndicate any boat you row" + //// end V6 //// last_config_update_time: DiemTimestamp::now_microseconds(), }); diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DonorDirected.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DonorDirected.move index 42b36b0ae8..93e1135a4d 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DonorDirected.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/DonorDirected.move @@ -37,6 +37,9 @@ module DonorDirected { use DiemFramework::DiemAccount::{Self, WithdrawCapability}; use DiemFramework::DonorDirectedGovernance; use DiemFramework::Ballot; + // use DiemFramework::Testnet; + + // use DiemFramework::Debug::print; /// Not initialized as a donor directed account. const ENOT_INIT_DONOR_DIRECTED: u64 = 231001; @@ -53,6 +56,14 @@ module DonorDirected { const VETO: u8 = 2; const PAID: u8 = 3; + /// number of epochs to wait before a transaction is executed + /// Veto can happen in this time + /// at the end of the third epoch from when multisig gets consensus + const DEFAULT_PAYMENT_DURATION: u64 = 3; + /// minimum amount of time to evaluate when one donor flags for veto. + const DEFAULT_VETO_DURATION: u64 = 7; + + // root registry for the donor directed accounts struct Registry has key { list: vector
@@ -116,16 +127,9 @@ module DonorDirected { // 3. Once the MultiSig is initialized, the account needs to be bricked, before the MultiSig can be used. - public fun set_donor_directed(sig: &signer) acquires Registry { + public fun set_donor_directed(sig: &signer) { if (!exists(@VMReserved)) return; - let addr = Signer::address_of(sig); - let list = get_root_registry(); - if (!Vector::contains
(&list, &addr)) { - let s = borrow_global_mut(@VMReserved); - Vector::push_back(&mut s.list, addr); - }; - move_to( sig, Freeze { @@ -141,11 +145,25 @@ module DonorDirected { veto: Vector::empty(), paid: Vector::empty(), guid_capability, - }) + }); + + DonorDirectedGovernance::init_donor_governance(sig); + } + + // add to root registry + fun add_to_registry(sig: &signer) acquires Registry { + if (!exists(@VMReserved)) return; + let addr = Signer::address_of(sig); + let list = get_root_registry(); + if (!Vector::contains
(&list, &addr)) { + let s = borrow_global_mut(@VMReserved); + Vector::push_back(&mut s.list, addr); + }; } + /// Like any MultiSig instance, a sponsor which is the original owner of the account, needs to initialize the account. /// The account must be "bricked" by the owner before MultiSig actions can be taken. /// Note, as with any multisig, the new_authorities cannot include the sponsor, since that account will no longer be able to sign transactions. @@ -225,14 +243,12 @@ module DonorDirected { let multisig_address = DiemAccount::get_withdraw_cap_address(withdraw_capability); let transfers = borrow_global_mut(multisig_address); - // let uid = GUID::create_with_capability(multisig_address, &transfers.guid_capability); - // add current epoch + 1 - let current_epoch = DiemConfig::get_current_epoch(); - + let deadline = DiemConfig::get_current_epoch() + DEFAULT_PAYMENT_DURATION; + let t = TimedTransfer { uid: *uid, - deadline: current_epoch + 7, // pays automativally at the end of seventh epoch. Unless there is a veto by a Donor. In that case a day is added for every day there is a veto. This deduplicates Vetos. + deadline, // pays automatically at the end of seventh epoch. Unless there is a veto by a Donor. In that case a day is added for every day there is a veto. This deduplicates Vetos. tx, epoch_latest_veto_received: 0, }; @@ -247,6 +263,7 @@ module DonorDirected { /// needing to intervene. public fun process_donor_directed_accounts( vm: &signer, + epoch: u64, ) acquires Registry, TxSchedule, Freeze { let list = get_root_registry(); @@ -256,23 +273,29 @@ module DonorDirected { let multisig_address = Vector::borrow(&list, i); if (exists(*multisig_address)) { let state = borrow_global_mut(*multisig_address); - maybe_pay_if_deadline_today(vm, state); + maybe_pay_deadline(vm, state, epoch); }; i = i + 1; } } - fun maybe_pay_if_deadline_today(vm: &signer, state: &mut TxSchedule) acquires Freeze { - let epoch = DiemConfig::get_current_epoch(); + fun maybe_pay_deadline(vm: &signer, state: &mut TxSchedule, epoch: u64) acquires Freeze { + // let epoch = DiemConfig::get_current_epoch(); let i = 0; + while (i < Vector::length(&state.scheduled)) { let this_exp = *&Vector::borrow(&state.scheduled, i).deadline; if (this_exp == epoch) { - let t = Vector::remove(&mut state.scheduled, i); + let t = Vector::remove(&mut state.scheduled, i); + // print(&t); let multisig_address = GUID::id_creator_address(&t.uid); - DiemAccount::vm_make_payment_no_limit(multisig_address, t.tx.payee, t.tx.value, *&t.tx.description, b"", vm); + + // Note the VM can do this without the WithdrawCapability + let coin = DiemAccount::vm_withdraw(vm, multisig_address, t.tx.value); + DiemAccount::vm_deposit_with_metadata(vm, multisig_address, t.tx.payee, coin, *&t.tx.description, b""); + // update the records Vector::push_back(&mut state.paid, t); @@ -286,6 +309,25 @@ module DonorDirected { } + public fun find_by_deadline(multisig_address: address, epoch: u64): vector acquires TxSchedule { + let state = borrow_global_mut(multisig_address); + let i = 0; + let list = Vector::empty(); + + while (i < Vector::length(&state.scheduled)) { + + let prop = Vector::borrow(&state.scheduled, i); + if (prop.deadline == epoch) { + Vector::push_back(&mut list, *&prop.uid); + }; + + i = i + 1; + }; + + list + } + + //////// GOVERNANCE HANDLERS //////// @@ -369,13 +411,13 @@ module DonorDirected { } public fun get_pending_timed_transfer_mut(state: &mut TxSchedule, uid: &GUID::ID): &mut TimedTransfer { - let (found, i) = find_schedule_status(state, uid, SCHEDULED); + let (found, i) = schedule_status(state, uid, SCHEDULED); assert!(found, Errors::invalid_argument(ENO_PEDNING_TRANSACTION_AT_UID)); Vector::borrow_mut(&mut state.scheduled, i) } - public fun find_schedule_status(state: &TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64) { + public fun schedule_status(state: &TxSchedule, uid: &GUID::ID, state_enum: u8): (bool, u64) { let list = if (state_enum == SCHEDULED) { &state.scheduled } else if (state_enum == VETO) { &state.veto } else if (state_enum == PAID) { &state.paid } @@ -397,14 +439,14 @@ module DonorDirected { (false, 0) } - public fun find_anywhere(state: &TxSchedule, uid: &GUID::ID): (bool, u64, u8) { // (is_found, index, state) - let (found, i) = find_schedule_status(state, uid, SCHEDULED); + public fun find_schedule_by_id(state: &TxSchedule, uid: &GUID::ID): (bool, u64, u8) { // (is_found, index, state) + let (found, i) = schedule_status(state, uid, SCHEDULED); if (found) return (found, i, SCHEDULED); - let (found, i) = find_schedule_status(state, uid, VETO); + let (found, i) = schedule_status(state, uid, VETO); if (found) return (found, i, VETO); - let (found, i) = find_schedule_status(state, uid, PAID); + let (found, i) = schedule_status(state, uid, PAID); if (found) return (found, i, PAID); (false, 0, 0) @@ -416,33 +458,37 @@ module DonorDirected { } + /// Check the status of proposals in the MultiSig Workflow + /// NOTE: These are payments that have not yet been scheduled. + public fun get_multisig_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8, bool) { // (is_found, index, state) + + MultiSig::get_proposal_status_by_id(directed_address, uid) + } - public fun get_proposal_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8) acquires TxSchedule { // (is_found, index, state) + /// Get the status of a SCHEDULED payment which as already passed the multisig stage. + public fun get_schedule_state(directed_address: address, uid: &GUID::ID): (bool, u64, u8) acquires TxSchedule { // (is_found, index, state) let state = borrow_global(directed_address); - find_anywhere(state, uid) + find_schedule_by_id(state, uid) } - public fun is_pending(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state) - let state = borrow_global(directed_address); - let (_, _, state) = find_anywhere(state, uid); + public fun is_scheduled(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { + let (_, _, state) = get_schedule_state(directed_address, uid); state == Ballot::get_pending_enum() } - public fun is_approved(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state) - let state = borrow_global(directed_address); - let (_, _, state) = find_anywhere(state, uid); + public fun is_paid(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { + let (_, _, state) = get_schedule_state(directed_address, uid); state == Ballot::get_approved_enum() } - public fun is_rejected(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { // (is_found, index, state) - let state = borrow_global(directed_address); - let (_, _, state) = find_anywhere(state, uid); + public fun is_veto(directed_address: address, uid: &GUID::ID): bool acquires TxSchedule { + let (_, _, state) = get_schedule_state(directed_address, uid); state == Ballot::get_rejected_enum() } // getter to check if wallet is frozen // used in DiemAccount before attempting a transfer. - public fun is_frozen(addr: address): bool acquires Freeze{ + public fun is_account_frozen(addr: address): bool acquires Freeze{ let f = borrow_global(addr); f.is_frozen } @@ -452,17 +498,21 @@ module DonorDirected { /// Initialize the TxSchedule wallet with Three Signers // TODO: this version of Diem, does not allow vector
in the script arguments. So we are hard coding this to initialize with three signers. Gross. - public fun init_donor_directed(sponsor: &signer, signer_one: address, signer_two: address, signer_three: address, cfg_n_signers: u64) acquires Registry { + public fun init_donor_directed(sponsor: &signer, signer_one: address, signer_two: address, signer_three: address, cfg_n_signers: u64) { let init_signers = Vector::singleton(signer_one); Vector::push_back(&mut init_signers, signer_two); Vector::push_back(&mut init_signers, signer_three); set_donor_directed(sponsor); make_multisig(sponsor, cfg_n_signers, init_signers); + + // if not tracking cumulative donations, then don't use previous balance. + // start again. + DiemAccount::init_cumulative_deposits(sponsor, 0); } /// the sponsor must finalize the initialization, this is a separate step so that the user can optionally check everything is in order before bricking the account key. - public fun finalize_init(sponsor: &signer) { + public fun finalize_init(sponsor: &signer) acquires Registry { let multisig_address = Signer::address_of(sponsor); assert!(MultiSig::is_init(multisig_address), Errors::invalid_state(EMULTISIG_NOT_INIT)); @@ -474,6 +524,9 @@ module DonorDirected { MultiSig::finalize_and_brick(sponsor); assert!(is_donor_directed(multisig_address), Errors::invalid_state(ENOT_INIT_DONOR_DIRECTED)); + + // only add to registry if INIT is successful. + add_to_registry(sponsor); } /// propose and vote on the liquidation of this wallet @@ -487,10 +540,14 @@ module DonorDirected { /// propose and vote on the veto of a specific transacation public fun propose_veto(donor: &signer, multisig_address: address, uid: u64) acquires TxSchedule { let guid = GUID::create_id(multisig_address, uid); + // print(&01); DonorDirectedGovernance::assert_authorized(donor, multisig_address); + // print(&02); let state = borrow_global(multisig_address); - let epochs_duration = 7; + // print(&03); + let epochs_duration = DEFAULT_VETO_DURATION; DonorDirectedGovernance::propose_veto(&state.guid_capability, &guid, epochs_duration); + // print(&04); } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Epoch.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Epoch.move index 6fd19766a8..e92f92d35b 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Epoch.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Epoch.move @@ -66,15 +66,15 @@ module Epoch { } /// Accessor Function, returns the time (in seconds) of the start of the current epoch - public fun get_timer_seconds_start(vm: &signer):u64 acquires Timer { - Roles::assert_diem_root(vm); + public fun get_timer_seconds_start():u64 acquires Timer { + // Roles::assert_diem_root(vm); let time = borrow_global(@DiemRoot); time.seconds_start } /// Accessor Function, returns the block height of the start of the current epoch - public fun get_timer_height_start(vm: &signer):u64 acquires Timer { - Roles::assert_diem_root(vm); + public fun get_timer_height_start():u64 acquires Timer { + // Roles::assert_diem_root(vm); let time = borrow_global(@DiemRoot); time.height_start } 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 8c19cddfdc..6e483b5997 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 @@ -11,7 +11,7 @@ address DiemFramework { module EpochBoundary { use DiemFramework::CoreAddresses; use DiemFramework::Subsidy; - use DiemFramework::NodeWeight; + use DiemFramework::ProofOfFee; use DiemFramework::DiemSystem; use DiemFramework::TowerState; use DiemFramework::Globals; @@ -20,61 +20,70 @@ module EpochBoundary { use DiemFramework::AutoPay; use DiemFramework::Epoch; use DiemFramework::DiemConfig; - use DiemFramework::Audit; use DiemFramework::DiemAccount; use DiemFramework::Burn; - use DiemFramework::FullnodeSubsidy; - use DiemFramework::ValidatorUniverse; - use DiemFramework::Debug::print; - use DiemFramework::Testnet; - use DiemFramework::StagingNet; + use DiemFramework::FullnodeSubsidy; use DiemFramework::RecoveryMode; - use DiemFramework::Cases; use DiemFramework::Jail; - use DiemFramework::Vouch; + use DiemFramework::TransactionFee; use DiemFramework::MultiSigPayment; use DiemFramework::DonorDirected; + //// V6 //// + // THIS IS TEMPORARY + // depends on the future "musical chairs" algo. + const MOCK_VAL_SIZE: u64 = 21; + + // TODO: this will depend on an adjustment algo. + // const MOCK_BASELINE_CONSENSUS_FEES: u64 = 1000000; + + // This function is called by block-prologue once after n blocks. // Function code: 01. Prefix: 180001 public fun reconfigure(vm: &signer, height_now: u64) { CoreAddresses::assert_vm(vm); - let height_start = Epoch::get_timer_height_start(vm); - print(&800100); + + let height_start = Epoch::get_timer_height_start(); + // print(&800100); + let (outgoing_compliant_set, _) = DiemSystem::get_fee_ratio(vm, height_start, height_now); - print(&800200); + + // print(&800200); // NOTE: This is "nominal" because it doesn't check - let compliant_nodes_count = Vector::length(&outgoing_compliant_set); - print(&800300); + // let compliant_nodes_count = Vector::length(&outgoing_compliant_set); + // print(&800300); + + // TODO: subsidy units are fixed + // let (subsidy_units, nominal_subsidy_per) = + // Subsidy::calculate_subsidy(vm, compliant_nodes_count); + // print(&800400); + + let (reward, _, _) = ProofOfFee::get_consensus_reward(); + process_fullnodes(vm, reward); + + // print(&800500); + + process_validators(vm, reward, &outgoing_compliant_set); + // print(&800600); + + // process the non performing nodes: jail + process_jail(vm, &outgoing_compliant_set); - let (subsidy_units, nominal_subsidy_per) = - Subsidy::calculate_subsidy(vm, compliant_nodes_count); - print(&800400); + let proposed_set = propose_new_set(vm, &outgoing_compliant_set); - process_fullnodes(vm, nominal_subsidy_per); - print(&800500); - process_validators(vm, subsidy_units, *&outgoing_compliant_set); - print(&800600); - let proposed_set = propose_new_set(vm, height_start, height_now); - print(&800700); // Update all slow wallet limits DiemAccount::slow_wallet_epoch_drip(vm, Globals::get_unlock()); // todo - print(&800800); - - if (!RecoveryMode::is_recovery()) { - proof_of_burn(vm,nominal_subsidy_per, &proposed_set); - print(&800900); - }; + // print(&801000); root_service_billing(vm); - print(&801000); + // print(&801000); reset_counters(vm, proposed_set, outgoing_compliant_set, height_now); - print(&801100); + // print(&801100); } @@ -116,136 +125,85 @@ module EpochBoundary { } fun process_validators( - vm: &signer, subsidy_units: u64, outgoing_compliant_set: vector
+ vm: &signer, subsidy_units: u64, outgoing_compliant_set: &vector
) { // Process outgoing validators: // Distribute Transaction fees and subsidy payments to all outgoing validators - if (Vector::is_empty
(&outgoing_compliant_set)) return; + if (Vector::is_empty
(outgoing_compliant_set)) return; // don't pay while we are in recovery mode, since that creates // a frontrunning opportunity if (subsidy_units > 0 && !RecoveryMode::is_recovery()) { - Subsidy::process_subsidy(vm, subsidy_units, &outgoing_compliant_set); + Subsidy::process_subsidy(vm, subsidy_units, outgoing_compliant_set); }; - Subsidy::process_fees(vm, &outgoing_compliant_set); - } + // after everyone is paid from the chain's Fee account + // we can burn the excess fees from the epoch - fun propose_new_set(vm: &signer, height_start: u64, height_now: u64): vector
- { - // Propose upcoming validator set: - // Get validators we know to be in consensus correctly: Case1 and Case2 - // Only expand the amount of seats so that the new set has a max of 25% - // unproven nodes. I.e. nodes that were not in the previous epoch and - // we have stats on. - - // in emergency admin roles set the validator set - // there may be a recovery set to be used. - // if there is no rescue mission validators, just do usual procedure. - - if (RecoveryMode::is_recovery()) { - let recovery_vals = RecoveryMode::get_debug_vals(); - if (Vector::length(&recovery_vals) > 0) return recovery_vals; - }; - - // Process all the jail terms of the previous validator set - let previous_set = DiemSystem::get_val_set_addr(); - - // Take advantage of this loop to get the expected size of - // the validator set that the new set doesn't have - // 25% of nodes that we don't know their current performance. - let len_proven_nodes = 0; + Burn::epoch_burn_fees(vm); + } + fun process_jail(vm: &signer, outgoing_compliant_set: &vector
) { + let all_previous_vals = DiemSystem::get_val_set_addr(); let i = 0; - while (i < Vector::length
(&previous_set)) { - let addr = *Vector::borrow(&previous_set, i); - let case = Cases::get_case(vm, addr, height_start, height_now); + while (i < Vector::length
(&all_previous_vals)) { + let addr = *Vector::borrow(&all_previous_vals, i); if ( - // we care about nodes that are performing consensus correctly, case 1 and 2. - case < 3 && - Audit::val_audit_passing(addr) + + // if they are compliant, remove the consecutive fail, otherwise jail + // V6 Note: audit functions are now all contained in + // ProofOfFee.move and exludes validators at auction time. + + Vector::contains(outgoing_compliant_set, &addr) ) { - len_proven_nodes = len_proven_nodes + 1; + // print(&902); // also reset the jail counter for any successful unjails Jail::remove_consecutive_fail(vm, addr); } else { - + // print(&903); Jail::jail(vm, addr); }; i = i+ 1; }; + // print(&904); + } - // let len_proven_nodes = Vector::length(&proven_nodes); - let max_unproven_nodes = len_proven_nodes / 6; - print(&len_proven_nodes); - print(&max_unproven_nodes); - // start from the proven nodes - - // get all validators by consensus weight - let sorted_val_universe = NodeWeight::get_sorted_vals(); - - // sort by jail index, prioritizes nodes joining that aren't - // currently struggling to stay in the validator set. - let top_accounts = Jail::sort_by_jail(sorted_val_universe); - print(&top_accounts); - - // loop through all accounts, sorted by jail status, and then by consensus power + fun propose_new_set(vm: &signer, outgoing_compliant_set: &vector
): vector
+ { let proposed_set = Vector::empty
(); - let i = 0; - while ( - // can't be more than index of accounts - i < Vector::length(&top_accounts) && - // the new proposed set can only only expand by 15% - Vector::length(&proposed_set) < (len_proven_nodes + max_unproven_nodes) && - // Validator set can only be as big as the maximum set size - Vector::length(&proposed_set) < Globals::get_max_validators_per_set() - ) { - 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 - !Vector::contains
(&proposed_set, &addr) && - // jail the current validators which did not perform. - !Jail::is_jailed(addr) && - // if they are not a current case 1 or 2, then they are - // rejoining and need to have mining proofs. - // case 2 get grace - (case < 3 || mined_last_epoch) && - // do the remaining configuration checks, incl vouching - Audit::val_audit_passing(addr) && - // when being onboarded or being un-jailed check if the vouches - // are sufficient. I.e. don't do this check if the validator - // 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) - ) { - print(&99990901); - Vector::push_back(&mut proposed_set, addr); - }; - i = i + 1; + // If we are in recovery mode, we use the recovery set. + if (RecoveryMode::is_recovery()) { + let recovery_vals = RecoveryMode::get_debug_vals(); + if (Vector::length(&recovery_vals) > 0) { + proposed_set = recovery_vals + } + } else { // Default case: Proof of Fee + //// V6 //// + // CONSENSUS CRITICAL + // pick the validators based on proof of fee. + // false because we want the default behavior of the function: filtered by audit + let sorted_bids = ProofOfFee::get_sorted_vals(false); + let (auction_winners, price) = ProofOfFee::fill_seats_and_get_price(vm, MOCK_VAL_SIZE, &sorted_bids, outgoing_compliant_set); + // TODO: Don't use copy above, do a borrow. + // print(&800700); + + // charge the validators for the proof of fee in advance of the epoch + DiemAccount::vm_multi_pay_fee(vm, &auction_winners, price, &b"proof of fee"); + // print(&800800); + + proposed_set = auction_winners }; - print(&proposed_set); - //////// Failover Rules //////// // If the cardinality of validator_set in the next epoch is less than 4, - // if we are failing to qualify anyone. Pick top 1/2 of validator set + // if we are failing to qualify anyone. Pick top 1/2 of outgoing compliant validator set // by proposals. They are probably online. if (Vector::length
(&proposed_set) <= 3) proposed_set = - Stats::get_sorted_vals_by_props(vm, Vector::length
(&top_accounts) / 2); + Stats::get_sorted_vals_by_props(vm, Vector::length
(outgoing_compliant_set) / 2); // If still failing...in extreme case if we cannot qualify anyone. // Don't change the validator set. we keep the same validator set. @@ -267,71 +225,39 @@ module EpochBoundary { outgoing_compliant: vector
, height_now: u64 ) { - print(&800900100); + // print(&800900100); + // Reset Stats Stats::reconfig(vm, &proposed_set); - print(&800900101); + // print(&800900101); + // Migrate TowerState list from elegible. TowerState::reconfig(vm, &outgoing_compliant); - print(&800900102); + // print(&800900102); + // process community wallets - DonorDirected::process_donor_directed_accounts(vm); - print(&800900103); - // reset counters + DonorDirected::process_donor_directed_accounts(vm, DiemConfig::get_current_epoch()); + // print(&800900103); + AutoPay::reconfig_reset_tick(vm); - print(&800900104); + // print(&800900104); + Epoch::reset_timer(vm, height_now); - print(&800900105); + // print(&800900105); + RecoveryMode::maybe_remove_debug_at_epoch(vm); - // Reconfig should be the last event. - // Reconfigure the network - print(&800900106); - DiemSystem::bulk_update_validators(vm, proposed_set); - print(&800900107); - } + // print(&800900106); - // NOTE: this was previously in propose_new_set since it used the same loop. - // copied implementation from Teams proposal. - fun proof_of_burn( - vm: &signer, nominal_subsidy_per: u64, proposed_set: &vector
- ) { - print(&800800100); - CoreAddresses::assert_vm(vm); - // DiemAccount::migrate_cumu_deposits(vm); // may need to populate data on a migration. - print(&800800101); - Burn::reset_ratios(vm); - print(&800800102); - // 50% of the current per validator reward - let burn_value = nominal_subsidy_per / 2; - print(&800800103); - let vals_to_burn = if ( - !Testnet::is_testnet() && - !StagingNet::is_staging_net() && - DiemConfig::get_current_epoch() > 290 && - // bump up to epoch 290 so people can discuss. - // only implement this burn at a steady state with 90/100 validator - // positions full. Will make the burn amount much smaller over time. - Vector::length
(proposed_set) > 90 - ) { - print(&800800104); - &ValidatorUniverse::get_eligible_validators() - } else { - print(&800800105); - proposed_set - }; - print(&800800106); - print(vals_to_burn); - let i = 0; - while (i < Vector::length
(vals_to_burn)) { - let addr = *Vector::borrow(vals_to_burn, i); - print(&addr); - print(&burn_value); + TransactionFee::epoch_reset_fee_maker(vm); - Burn::epoch_start_burn(vm, addr, burn_value); - i = i + 1; - }; - print(&800800107); + // trigger the thermostat if the reward needs to be adjusted + ProofOfFee::reward_thermostat(vm); + // print(&800900107); + // Reconfig should be the last event. + // Reconfigure the network + DiemSystem::bulk_update_validators(vm, proposed_set); + // print(&800900108); } fun root_service_billing(vm: &signer) { diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/FullnodeSubsidy.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/FullnodeSubsidy.move index e8ab7cec85..307370e125 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/FullnodeSubsidy.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/FullnodeSubsidy.move @@ -48,6 +48,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm, subsidy); DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, miner, minted_coins, b"fullnode_subsidy", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Genesis.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Genesis.move index c499e9cf62..b17a848b27 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Genesis.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Genesis.move @@ -36,6 +36,8 @@ module DiemFramework::Genesis { use DiemFramework::TowerState; use DiemFramework::DonorDirected; use DiemFramework::Migrations; + // use DiemFramework::Testnet; + use DiemFramework::ProofOfFee; use DiemFramework::MultiSigPayment; // use DiemFramework::Testnet; @@ -106,6 +108,7 @@ module DiemFramework::Genesis { AccountFreezing::initialize(dr_account); TransactionFee::initialize(dr_account); /////// 0L ///////// + TransactionFee::initialize_epoch_fee_maker_registry(dr_account); /////// 0L ///////// DiemSystem::initialize_validator_set(dr_account); DiemVersion::initialize(dr_account, initial_diem_version); @@ -169,7 +172,7 @@ module DiemFramework::Genesis { // Initialize Root Security metered services MultiSigPayment::root_init(dr_account); //////// 0L //////// - + ProofOfFee::init_genesis_baseline_reward(dr_account); // if this is tesnet, fund the root account so the smoketests can run. They use PaymentScripts functions to test many things. // TODO(0L): make this only tun in testsnet. Though we need to make smoketest always initialize in test mode. // if (Testnet::is_testnet()) { @@ -179,6 +182,7 @@ module DiemFramework::Genesis { DiemAccount::vm_deposit_with_metadata( dr_account, @DiemRoot, + @DiemRoot, coin, x"", x"", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/GenesisMigration.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/GenesisMigration.move index 8bf3d82e82..5746a0e86f 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/GenesisMigration.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/GenesisMigration.move @@ -13,7 +13,7 @@ module GenesisMigration { use DiemFramework::GAS::GAS; use DiemFramework::ValidatorUniverse; use DiemFramework::ValidatorOperatorConfig; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; /// Called by root in genesis to initialize the GAS coin @@ -44,6 +44,7 @@ module GenesisMigration { DiemAccount::vm_deposit_with_metadata( vm, user_addr, + user_addr, minted_coins, b"genesis migration", b"" 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 b34782c295..a6ab705279 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 @@ -19,7 +19,7 @@ address DiemFramework { module Jail { use DiemFramework::CoreAddresses; - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use Std::Signer; use Std::Vector; use DiemFramework::Vouch; @@ -79,26 +79,36 @@ address DiemFramework { } } - public fun self_unjail(sender: &signer) acquires Jail { - // only a validator can un-jail themselves. - let self = Signer::address_of(sender); - - // check the node has been mining before unjailing. - assert!(TowerState::node_above_thresh(self), 100104); - unjail(self); - } + //////// V6 ////// + // V6 NOTE: there's no practical or explicit hurdle that the validator + // needs to overcome now that we have deprecated Towers. + // So absent some other check that is objective, we could + // lean on the Vouch network. + // There was a plan elsewhere discussed to make a + // voucher be the only one that can unjail a validator. + // We can promote that idea in V6. Seems like it fits + // well with POF. + + // public fun self_unjail(sender: &signer) acquires Jail { + // // only a validator can un-jail themselves. + // let self = Signer::address_of(sender); + + // // check the node has been mining before unjailing. + // assert!(TowerState::node_above_thresh(self), 100104); + // unjail(self); + // } public fun vouch_unjail(sender: &signer, addr: address) acquires Jail { // only a validator can un-jail themselves. let voucher = Signer::address_of(sender); let buddies = Vouch::buddies_in_set(addr); - // print(&buddies); + // // print(&buddies); let (is_found, _idx) = Vector::index_of(&buddies, &voucher); assert!(is_found, 100103); - // check the node has been mining before unjailing. - assert!(TowerState::node_above_thresh(addr), 100104); + // // check the node has been mining before unjailing. + // assert!(TowerState::node_above_thresh(addr), 100104); unjail(addr); } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Mock.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Mock.move index daf985a136..f2a351e330 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Mock.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Mock.move @@ -2,20 +2,23 @@ address DiemFramework { module Mock { - // use DiemFramework::DiemSystem; - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use Std::Vector; use DiemFramework::Stats; use DiemFramework::Cases; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; + use DiemFramework::Testnet; + use DiemFramework::ValidatorUniverse; + use DiemFramework::DiemAccount; + use DiemFramework::ProofOfFee; + use DiemFramework::DiemSystem; public fun mock_case_1(vm: &signer, addr: address, start_height: u64, end_height: u64){ - print(&addr); // can only apply this to a validator // assert!(DiemSystem::is_validator(addr) == true, 777701); // mock mining for the address // the validator would already have 1 proof from genesis - TowerState::test_helper_mock_mining_vm(vm, addr, 10); + // TowerState::test_helper_mock_mining_vm(vm, addr, 10); // mock the consensus votes for the address let voters = Vector::empty
(); @@ -32,36 +35,107 @@ module Mock { i = i + 1; }; + // print(&addr); + // print(&Cases::get_case(vm, addr, start_height, end_height)); // TODO: careful that the range of heights is within the test assert!(Cases::get_case(vm, addr, start_height, end_height) == 1, 777703); } + // V6: deprecated + + // // did not do enough mining, but did validate. + // public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64){ + // // can only apply this to a validator + // // assert!(DiemSystem::is_validator(addr) == true, 777704); + // // mock mining for the address + // // insufficient number of proofs + // // TowerState::test_helper_mock_mining_vm(vm, addr, 0); + // // assert!(TowerState::get_count_in_epoch(addr) == 0, 777705); + + // // mock the consensus votes for the address + // let voters = Vector::singleton
(addr); + + // let num_blocks = end_height - start_height; + // // Overwrite the statistics to mock that all have been validating. + // let i = 1; + // let above_thresh = num_blocks / 2; // just be above 5% signatures + + // while (i < above_thresh) { + // // Mock the validator doing work for 15 blocks, and stats being updated. + // Stats::process_set_votes(vm, &voters); + // i = i + 1; + // }; + + // // TODO: careful that the range of heights is within the test + // assert!(Cases::get_case(vm, addr, start_height, end_height) == 2, 777706); + + // } + // did not do enough mining, but did validate. - public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64){ - // can only apply this to a validator - // assert!(DiemSystem::is_validator(addr) == true, 777704); - // mock mining for the address - // insufficient number of proofs - TowerState::test_helper_mock_mining_vm(vm, addr, 0); - // assert!(TowerState::get_count_in_epoch(addr) == 0, 777705); + public fun mock_case_4(vm: &signer, addr: address, start_height: u64, end_height: u64){ - // mock the consensus votes for the address let voters = Vector::singleton
(addr); - let num_blocks = end_height - start_height; // Overwrite the statistics to mock that all have been validating. let i = 1; - let above_thresh = num_blocks / 2; // just be above 5% signatures - + let above_thresh = 1; // just be above 5% signatures + Stats::test_helper_remove_votes(vm, addr); while (i < above_thresh) { // Mock the validator doing work for 15 blocks, and stats being updated. + Stats::process_set_votes(vm, &voters); i = i + 1; }; - + // print(&Cases::get_case(vm, addr, start_height, end_height) ); // TODO: careful that the range of heights is within the test - assert!(Cases::get_case(vm, addr, start_height, end_height) == 2, 777706); + assert!(Cases::get_case(vm, addr, start_height, end_height) == 4, 777706); + + } + + // Mockl all nodes being compliant case 1 + public fun all_good_validators(vm: &signer) { + + Testnet::assert_testnet(vm); + let vals = DiemSystem::get_val_set_addr(); + + let i = 0; + while (i < Vector::length(&vals)) { + + let a = Vector::borrow(&vals, i); + mock_case_1(vm, *a, 0, 15); + i = i + 1; + }; + + } + + //////// PROOF OF FEE //////// + public fun pof_default(vm: &signer): (vector
, vector, vector){ + + Testnet::assert_testnet(vm); + let vals = ValidatorUniverse::get_eligible_validators(); + + let bids = Vector::empty(); + let expiry = Vector::empty(); + let i = 0; + let prev = 0; + let fib = 1; + while (i < Vector::length(&vals)) { + + Vector::push_back(&mut expiry, 1000); + let b = prev + fib; + Vector::push_back(&mut bids, b); + + let a = Vector::borrow(&vals, i); + let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a); + // initialize and set. + ProofOfFee::set_bid(&sig, b, 1000); + prev = fib; + fib = b; + i = i + 1; + }; + DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators + (vals, bids, expiry) } } } \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSig.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSig.move index e1c8be6576..d83c0afb35 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSig.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSig.move @@ -24,7 +24,7 @@ module MultiSig { use DiemFramework::DiemAccount::{Self, WithdrawCapability}; use DiemFramework::Ballot::{Self, BallotTracker}; use DiemFramework::DiemConfig; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; const EGOV_NOT_INITIALIZED: u64 = 440000; @@ -268,32 +268,32 @@ module MultiSig { multisig_address: address, proposal_data: Proposal, ): GUID::ID acquires Governance, Action { - print(&20); + // print(&20); assert_authorized(sig, multisig_address); -print(&21); +// print(&21); let ms = borrow_global_mut(multisig_address); let action = borrow_global_mut>(multisig_address); - print(&22); + // print(&22); // go through all proposals and clean up expired ones. lazy_cleanup_expired(action); -print(&23); +// print(&23); // does this proposal already exist in the pending list? let (found, guid, _idx, status_enum, _is_complete) = search_proposals_for_guid(&action.vote, &proposal_data); - print(&found); - print(&status_enum); - print(&24); + // print(&found); + // print(&status_enum); + // print(&24); if (found && status_enum == Ballot::get_pending_enum()) { - print(&2401); + // print(&2401); // this exact proposal is already pending, so we we will just return the guid of the existing proposal. // we'll let the caller decide what to do (we wont vote by default) return guid }; -print(&25); +// print(&25); let ballot = Ballot::propose_ballot(&mut action.vote, &ms.guid_capability, proposal_data); -print(&26); +// print(&26); let id = Ballot::get_ballot_id(ballot); -print(&27); +// print(&27); id } @@ -332,26 +332,30 @@ print(&27); id: &GUID::ID ): (bool, Option) acquires Governance, Action { - print(&60); + // print(&60); assert_authorized(sig, multisig_address); // belt and suspenders let ms = borrow_global_mut(multisig_address); let action = borrow_global_mut>(multisig_address); - print(&61); + // print(&61); lazy_cleanup_expired(action); - print(&62); + // print(&62); // does this proposal already exist in the pending list? let (found, _idx, status_enum, is_complete) = Ballot::find_anywhere>(&action.vote, id); - print(&63); + // print(&63); assert!((found && status_enum == Ballot::get_pending_enum() && !is_complete), Errors::invalid_argument(EPROPOSAL_NOT_FOUND)); - print(&64); + // print(&64); let b = Ballot::get_ballot_by_id_mut(&mut action.vote, id); let t = Ballot::get_type_struct_mut(b); - print(&65); + // print(&65); Vector::push_back(&mut t.votes, Signer::address_of(sig)); - print(&66); + // print(&66); let passed = tally(t, *&ms.cfg_default_n_sigs); - print(&67); + // print(&67); + + if (passed) { + Ballot::complete_ballot(b); + }; // get the withdrawal capability, we're not allowed copy, but we can // extract and fill, and then replace it. See DiemAccount for an example. @@ -366,46 +370,47 @@ print(&27); Option::none() }; - print(&withdraw_cap); - print(&68); + // print(&withdraw_cap); + // print(&68); (passed, withdraw_cap) } fun tally(prop: &mut Proposal, n: u64): bool { - print(&40001); + // print(&40001); - print(&prop.votes); + // print(&prop.votes); if (Vector::length(&prop.votes) >= n) { prop.approved = true; - print(&40002); + // print(&40002); return true }; false } + fun find_expired(a: & Action): vector{ - print(&40); + // print(&40); let epoch = DiemConfig::get_current_epoch(); let b_vec = Ballot::get_list_ballots_by_enum(&a.vote, Ballot::get_pending_enum()); let id_vec = Vector::empty(); - print(&41); + // print(&41); let i = 0; while (i < Vector::length(b_vec)) { - print(&4101); + // print(&4101); let b = Vector::borrow(b_vec, i); let t = Ballot::get_type_struct>(b); if (epoch > t.expiration_epoch) { - print(&4010101); + // print(&4010101); let id = Ballot::get_ballot_id(b); - print(&4010102); + // print(&4010102); Vector::push_back(&mut id_vec, id); }; @@ -417,9 +422,9 @@ print(&27); fun lazy_cleanup_expired(a: &mut Action) { let expired_vec = find_expired(a); - print(&expired_vec); + // print(&expired_vec); let len = Vector::length(&expired_vec); - print(&len); + // print(&len); let i = 0; while (i < len) { let id = Vector::borrow(&expired_vec, i); @@ -525,6 +530,11 @@ print(&27); (false, GUID::create_id(@0x0, 0), 0) } + public fun get_proposal_status_by_id(multisig_address: address, uid: &GUID::ID): (bool, u64, u8, bool) acquires Action { // found, index, status_enum, is_complete + let a = borrow_global>(multisig_address); + Ballot::find_anywhere(&a.vote, uid) + } + //////// GOVERNANCE //////// // Governance of the multisig happens through an instance of Action. This action has no special privileges, and is just a normal proposal type. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSigPayment.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSigPayment.move index eb6b45b432..9fdbc56a5b 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSigPayment.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/MultiSigPayment.move @@ -50,7 +50,7 @@ module MultiSigPayment { use Std::Signer; use Std::GUID; use DiemFramework::DiemAccount::{Self, WithdrawCapability}; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::GAS::GAS; use DiemFramework::MultiSig; use DiemFramework::CoreAddresses; @@ -101,39 +101,39 @@ module MultiSigPayment { public fun propose_payment(sig: &signer, multisig_addr: address, recipient: address, amount: u64, note: vector, duration_epochs: Option) { - print(&10); + // print(&10); let pay = new_payment(recipient, amount, *¬e); - print(&11); + // print(&11); let prop = MultiSig::proposal_constructor(pay, duration_epochs); - print(&12); + // print(&12); let guid = MultiSig::propose_new(sig, multisig_addr, prop); - print(&guid); - print(&13); + // print(&guid); + // print(&13); vote_payment(sig, multisig_addr, &guid); - print(&14); + // print(&14); } public fun vote_payment(sig: &signer, multisig_address: address, id: &GUID::ID) { - print(&50); + // print(&50); let (passed, cap_opt) = MultiSig::vote_with_id(sig, id, multisig_address); - print(&passed); - // print(&data); - print(&cap_opt); + // print(&passed); + // // print(&data); + // print(&cap_opt); - print(&51); + // print(&51); if (passed && Option::is_some(&cap_opt)) { let cap = Option::borrow(&cap_opt); - print(&5010); + // print(&5010); let data = MultiSig::extract_proposal_data(multisig_address, id); release_payment(&data, cap); - print(&5011); + // print(&5011); }; MultiSig::maybe_restore_withdraw_cap(sig, multisig_address, cap_opt); // don't need this and can't drop. - print(&52); + // print(&52); } @@ -148,7 +148,7 @@ module MultiSigPayment { // Withdrawal capabilities are "hot potato" data. Meaning, they cannot ever be dropped and need to be moved to a final resting place, or returned to the struct that was housing it. That is what happens at the end of release_payment, it is only borrowed, and never leaves the data structure. fun release_payment(p: &PaymentType, cap: &WithdrawCapability) { - print(&90001); + // print(&90001); DiemAccount::pay_from( cap, p.destination, @@ -188,15 +188,15 @@ module MultiSigPayment { let reg = borrow_global(@VMReserved); let i = 0; while (i < Vector::length(®.list)) { - print(&7777777790001); + // print(&7777777790001); let multi_sig_addr = Vector::borrow(®.list, i); let pct = FixedPoint32::create_from_rational(reg.fee, PERCENT_SCALE); - print(&pct); + // print(&pct); let fee = FixedPoint32::multiply_u64(DiemAccount::balance(*multi_sig_addr), pct); - print(&fee); + // print(&fee); let c = DiemAccount::vm_withdraw(vm, *multi_sig_addr, fee); - TransactionFee::pay_fee(c); + TransactionFee::pay_fee_and_track(*multi_sig_addr, c); i = i + 1; }; diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ProofOfFee.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ProofOfFee.move new file mode 100644 index 0000000000..80cd944411 --- /dev/null +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ProofOfFee.move @@ -0,0 +1,682 @@ +///////////////////////////////////////////////////////////////////////// +// 0L Module +// Proof of Fee +///////////////////////////////////////////////////////////////////////// +// NOTE: this module replaces NodeWeight.move, which becomes redundant since +// all validators have equal weight in consensus. +// TODO: the bubble sort functions were lifted directly from NodeWeight, needs checking. +/////////////////////////////////////////////////////////////////////////// + + +//// V6 //// +address DiemFramework { + module ProofOfFee { + use Std::Errors; + use DiemFramework::DiemConfig; + // use DiemFramework::ValidatorConfig; + use Std::Signer; + use DiemFramework::ValidatorUniverse; + use Std::Vector; + use DiemFramework::Jail; + use DiemFramework::DiemAccount; + // use DiemFramework::Debug::print; + use DiemFramework::Vouch; + use Std::FixedPoint32; + use DiemFramework::Testnet; + use DiemFramework::ValidatorConfig; + + const ENOT_AN_ACTIVE_VALIDATOR: u64 = 190001; + const EBID_ABOVE_MAX_PCT: u64 = 190002; + const EABOVE_RETRACT_LIMIT: u64 = 190003; // Potential update + + + const GENESIS_BASELINE_REWARD: u64 = 1000000; + + + // A struct on the validators account which indicates their + // latest bid (and epoch) + struct ProofOfFeeAuction has key { + bid: u64, + epoch_expiration: u64, + last_epoch_retracted: u64, + // TODO: show past 5 bids + } + + struct ConsensusReward has key { + value: u64, + clearing_price: u64, + median_win_bid: u64, + median_history: vector, + } + public fun init_genesis_baseline_reward(vm: &signer) { + if (Signer::address_of(vm) != @VMReserved) return; + + if (!exists(@VMReserved)) { + move_to( + vm, + ConsensusReward { + value: GENESIS_BASELINE_REWARD, + clearing_price: 0, + median_win_bid: 0, + median_history: Vector::empty(), + } + ); + } + } + + public fun init(account_sig: &signer) { + + let acc = Signer::address_of(account_sig); + + assert!(ValidatorUniverse::is_in_universe(acc), Errors::requires_role(ENOT_AN_ACTIVE_VALIDATOR)); + + if (!exists(acc)) { + move_to( + account_sig, + ProofOfFeeAuction { + bid: 0, + epoch_expiration: 0, + last_epoch_retracted: 0, + } + ); + } + } + + + + + + + //////// CONSENSUS CRITICAL //////// + // Get the validator universe sorted by bid + // By default this will return a FILTERED list of validators + // which excludes validators which cannot pass the audit. + // Leaving the unfiltered option for testing purposes, and any future use. + // TODO: there's a known issue when many validators have the exact same + // bid, the preferred node will be the one LAST included in the validator universe. + public fun get_sorted_vals(unfiltered: bool): vector
acquires ProofOfFeeAuction, ConsensusReward { + let eligible_validators = ValidatorUniverse::get_eligible_validators(); + let length = Vector::length
(&eligible_validators); + // print(&length); + // Vector to store each address's node_weight + let weights = Vector::empty(); + let filtered_vals = Vector::empty
(); + let k = 0; + while (k < length) { + // TODO: Ensure that this address is an active validator + + let cur_address = *Vector::borrow
(&eligible_validators, k); + let (bid, _expire) = current_bid(cur_address); + // print(&bid); + // print(&expire); + if (!unfiltered && !audit_qualification(&cur_address)) { + k = k + 1; + continue + }; + Vector::push_back(&mut weights, bid); + Vector::push_back
(&mut filtered_vals, cur_address); + k = k + 1; + }; + + // print(&weights); + + // Sorting the accounts vector based on value (weights). + // Bubble sort algorithm + let len_filtered = Vector::length
(&filtered_vals); + // print(&len_filtered); + // print(&Vector::length(&weights)); + if (len_filtered < 2) return filtered_vals; + let i = 0; + while (i < len_filtered){ + let j = 0; + while(j < len_filtered-i-1){ + // print(&8888801); + + let value_j = *(Vector::borrow(&weights, j)); + // print(&8888802); + let value_jp1 = *(Vector::borrow(&weights, j+1)); + if(value_j > value_jp1){ + // print(&8888803); + Vector::swap(&mut weights, j, j+1); + // print(&8888804); + Vector::swap
(&mut filtered_vals, j, j+1); + }; + j = j + 1; + // print(&8888805); + }; + i = i + 1; + // print(&8888806); + }; + + // print(&filtered_vals); + // Reverse to have sorted order - high to low. + Vector::reverse
(&mut filtered_vals); + + return filtered_vals + } + + // Here we place the bidders into their seats. + // The order of the bids will determine placement. + // One important aspect of picking the next validator set: + // it should have 2/3rds of known good ("proven") validators + // from the previous epoch. Otherwise the unproven nodes, who + // may not be ready for consensus, might be offline and cause a halt. + // Validators can be inattentive and have bids that qualify, but their nodes + // are not ready. + // So the selection algorithm needs to stop filling seats with "unproven" + // validators if the max unproven nodes limit is hit (1/3). + + // The paper does not specify what happens with the "Jail reputation" + // of a validator. E.g. if a validator has a bid with no expiry + // but has a bad jail reputation does this penalize in the ordering? + // This is a potential issue again with inattentive validators who + // have have a high bid, but again they fail repeatedly to finalize an epoch + // successfully. Their bids should not penalize validators who don't have + // a streak of jailed epochs. So of the 1/3 unproven nodes, we'll first seat the validators with Jail.consecutive_failure_to_rejoin < 2, and after that the remainder. + + // There's some code implemented which is not enabled in the current form. + // Unsealed auctions are tricky. The Proof Of Fee + // paper states that since the bids are not private, we need some + // constraint to minimize shill bids, "bid shading" or other strategies + // which allow validators to drift from their private valuation. + // As such per epoch the validator is only allowed to revise their bids / + // down once. To do this in practice they need to retract a bid (sit out + // the auction), and then place a new bid. + // A validator can always leave the auction, but if they rejoin a second time in the epoch, then they've committed a bid until the next epoch. + // So retracting should be done with care. The ergonomics are not great. + // The preference would be not to have this constraint if on the margins + // the ergonomics brings more bidders than attackers. + // After more experience in the wild, the network may decide to + // limit bid retracting. + + + // The Validator must qualify on a number of metrics: have funds in their Unlocked account to cover bid, have miniumum viable vouches, and not have been jailed in the previous round. + + + // This function assumes we have already filtered out ineligible validators. + // but we will check again here. + public fun fill_seats_and_get_price( + vm: &signer, + set_size: u64, + sorted_vals_by_bid: &vector
, + proven_nodes: &vector
+ ): (vector
, u64) acquires ProofOfFeeAuction, ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) return (Vector::empty
(), 0); + + //print(sorted_vals_by_bid); + + // let (baseline_reward, _, _) = get_consensus_reward(); + + let seats_to_fill = Vector::empty
(); + + // check the max size of the validator set. + // there may be too few "proven" validators to fill the set with 2/3rds proven nodes of the stated set_size. + let proven_len = Vector::length(proven_nodes); + + // check if the proven len plus unproven quota will + // be greater than the set size. Which is the expected. + // Otherwise the set will need to be smaller than the + // declared size, because we will have to fill with more unproven nodes. + let one_third_of_max = proven_len/2; + let safe_set_size = proven_len + one_third_of_max; + // print(&77777777); + // print(&proven_len); + // print(&one_third_of_max); + // print(&safe_set_size); + + let (set_size, max_unproven) = if (safe_set_size < set_size) { + (safe_set_size, safe_set_size/3) + // if (safe_set_size < 5) { // safety. mostly for test scenarios given rounding issues + // (safe_set_size, 1) + // } else { + + // } + + } else { + // happy case, unproven bidders are a smaller minority + (set_size, set_size/3) + }; + // print(&set_size); + // print(&max_unproven); + + + // print(&8006010201); + + // Now we can seat the validators based on the algo above: + // 1. seat the proven nodes of previous epoch + // 2. seat validators who did not participate in the previous epoch: + // 2a. seat the vals with jail reputation < 2 + // 2b. seat the remainder of the unproven vals with any jail reputation. + + let num_unproven_added = 0; + let i = 0u64; + while ( + (Vector::length(&seats_to_fill) < set_size) && + (i < Vector::length(sorted_vals_by_bid)) + ) { + // // print(&i); + let val = Vector::borrow(sorted_vals_by_bid, i); + + // // belt and suspenders, we get_sorted_vals(true) should filter ineligible validators + // if (!audit_qualification(val, baseline_reward)) { + // i = i + 1; + // continue + // }; + + + // check if a proven node + if (Vector::contains(proven_nodes, val)) { + // print(&8006010205); + // // print(&01); + Vector::push_back(&mut seats_to_fill, *val); + } else { + // print(&8006010206); + // print(&max_unproven); + // print(&num_unproven_added); + // // print(&02); + // for unproven nodes, push it to list if we haven't hit limit + if (num_unproven_added < max_unproven ) { + // TODO: check jail reputation + // // print(&03); + Vector::push_back(&mut seats_to_fill, *val); + // // print(&04); + // print(&8006010207); + num_unproven_added = num_unproven_added + 1; + }; + }; + // don't advance if we havent filled + i = i + 1; + }; + // // print(&05); + // print(&8006010208); + // print(&seats_to_fill); + + + + // Set history + set_history(vm, &seats_to_fill); + + // we failed to seat anyone. + // let EpochBoundary deal with this. + if (Vector::is_empty(&seats_to_fill)) { + // print(&8006010209); + + return (seats_to_fill, 0) + }; + + // Find the clearing price which all validators will pay + let lowest_bidder = Vector::borrow(&seats_to_fill, Vector::length(&seats_to_fill) - 1); + + let (lowest_bid_pct, _) = current_bid(*lowest_bidder); + + // print(&lowest_bid_pct); + + // update the clearing price + let cr = borrow_global_mut(@VMReserved); + cr.clearing_price = lowest_bid_pct; + + return (seats_to_fill, lowest_bid_pct) + } + + // consolidate all the checks for a validator to be seated + public fun audit_qualification(val: &address): bool acquires ProofOfFeeAuction, ConsensusReward { + + // Safety check: node has valid configs + if (!ValidatorConfig::is_valid(*val)) return false; + // has operator account set to another address + let oper = ValidatorConfig::get_operator(*val); + if (oper == *val) return false; + + // is a slow wallet + if (!DiemAccount::is_slow(*val)) return false; + + // print(&8006010203); + // we can't seat validators that were just jailed + // NOTE: epoch reconfigure needs to reset the jail + // before calling the proof of fee. + if (Jail::is_jailed(*val)) return false; + // print(&8006010204); + // we can't seat validators who don't have minimum viable vouches + if (!Vouch::unrelated_buddies_above_thresh(*val)) return false; + + // print(&80060102041); + + let (bid, expire) = current_bid(*val); + //print(val); + // print(&bid); + // print(&expire); + + // Skip if the bid expired. belt and suspenders, this should have been checked in the sorting above. + // TODO: make this it's own function so it can be publicly callable, it's useful generally, and for debugging. + // print(&DiemConfig::get_current_epoch()); + if (DiemConfig::get_current_epoch() > expire) return false; + + // skip the user if they don't have sufficient UNLOCKED funds + // or if the bid expired. + // print(&80060102042); + let unlocked_coins = DiemAccount::unlocked_amount(*val); + // print(&unlocked_coins); + + let (baseline_reward, _, _) = get_consensus_reward(); + let coin_required = FixedPoint32::multiply_u64(baseline_reward, FixedPoint32::create_from_rational(bid, 1000)); + + // print(&coin_required); + if (unlocked_coins < coin_required) return false; + + // print(&80060102043); + true + } + // Adjust the reward at the end of the epoch + // as described in the paper, the epoch reward needs to be adjustable + // given that the implicit bond needs to be sufficient, eg 5-10x the reward. + public fun reward_thermostat(vm: &signer) acquires ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + // check the bid history + // if there are 5 days above 95% adjust the reward up by 5% + // adjust by more if it has been 10 days then, 10% + // if there are 5 days below 50% adjust the reward down. + // adjust by more if it has been 10 days then 10% + + let bid_upper_bound = 0950; + let bid_lower_bound = 0500; + + let short_window: u64 = 5; + let long_window: u64 = 10; + + let cr = borrow_global_mut(@VMReserved); + + // print(&8006010551); + let len = Vector::length(&cr.median_history); + let i = 0; + + let epochs_above = 0; + let epochs_below = 0; + while (i < 16 && i < len) { // max ten days, but may have less in history, filling set should truncate the history at 15 epochs. + // print(&8006010552); + let avg_bid = *Vector::borrow(&cr.median_history, i); + // print(&8006010553); + if (avg_bid > bid_upper_bound) { + epochs_above = epochs_above + 1; + } else if (avg_bid < bid_lower_bound) { + epochs_below = epochs_below + 1; + }; + + i = i + 1; + }; + + // print(&8006010554); + if (cr.value > 0) { + // print(&8006010555); + // print(&epochs_above); + // print(&epochs_below); + + + // TODO: this is an initial implementation, we need to + // decide if we want more granularity in the reward adjustment + // Note: making this readable for now, but we can optimize later + if (epochs_above > epochs_below) { + + // if (epochs_above > short_window) { + // print(&8006010556); + // check for zeros. + // TODO: put a better safety check here + + // If the Validators are bidding near 100% that means + // the reward is very generous, i.e. their opportunity + // cost is met at small percentages. This means the + // implicit bond is very high on validators. E.g. + // at 1% median bid, the implicit bond is 100x the reward. + // We need to DECREASE the reward + // print(&8006010558); + + if (epochs_above > long_window) { + + // decrease the reward by 10% + // print(&8006010559); + + + cr.value = cr.value - (cr.value / 10); + return // return early since we can't increase and decrease simultaneously + } else if (epochs_above > short_window) { + // decrease the reward by 5% + // print(&80060105510); + cr.value = cr.value - (cr.value / 20); + + + return // return early since we can't increase and decrease simultaneously + } + }; + + + // if validators are bidding low percentages + // it means the nominal reward is not high enough. + // That is the validator's opportunity cost is not met within a + // range where the bond is meaningful. + // For example: if the bids for the epoch's reward is 50% of the value, that means the potential profit, is the same as the potential loss. + // At a 25% bid (potential loss), the profit is thus 75% of the value, which means the implicit bond is 25/75, or 1/3 of the bond, the risk favors the validator. This means among other things, that an attacker can pay for the cost of the attack with the profits. See paper, for more details. + + // we need to INCREASE the reward, so that the bond is more meaningful. + // print(&80060105511); + + if (epochs_below > long_window) { + // print(&80060105513); + + // increase the reward by 10% + cr.value = cr.value + (cr.value / 10); + } else if (epochs_below > short_window) { + // print(&80060105512); + + // increase the reward by 5% + cr.value = cr.value + (cr.value / 20); + }; + // }; + }; + } + + /// find the median bid to push to history + // this is needed for reward_thermostat + public fun set_history(vm: &signer, seats_to_fill: &vector
) acquires ProofOfFeeAuction, ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + + // print(&99901); + let median_bid = get_median(seats_to_fill); + // push to history + let cr = borrow_global_mut(@VMReserved); + cr.median_win_bid = median_bid; + if (Vector::length(&cr.median_history) < 10) { + // print(&99902); + Vector::push_back(&mut cr.median_history, median_bid); + } else { + // print(&99903); + Vector::remove(&mut cr.median_history, 0); + Vector::push_back(&mut cr.median_history, median_bid); + }; + } + + fun get_median(seats_to_fill: &vector
):u64 acquires ProofOfFeeAuction { + // TODO: the list is sorted above, so + // we assume the median is the middle element + let len = Vector::length(seats_to_fill); + if (len == 0) { + return 0 + }; + let median_bidder = if (len > 2) { + Vector::borrow(seats_to_fill, len/2) + } else { + Vector::borrow(seats_to_fill, 0) + }; + let (median_bid, _) = current_bid(*median_bidder); + return median_bid + } + + //////////////// GETTERS //////////////// + // get the current bid for a validator + + + // get the baseline reward from ConsensusReward + public fun get_consensus_reward(): (u64, u64, u64) acquires ConsensusReward { + let b = borrow_global(@VMReserved ); + return (b.value, b.clearing_price, b.median_win_bid) + } + + // CONSENSUS CRITICAL + // ALL EYES ON THIS + // Proof of Fee returns the current bid of the validator during the auction for upcoming epoch seats. + // returns (current bid, expiration epoch) + public fun current_bid(node_addr: address): (u64, u64) acquires ProofOfFeeAuction { + if (exists(node_addr)) { + let pof = borrow_global(node_addr); + let e = DiemConfig::get_current_epoch(); + // check the expiration of the bid + // the bid is zero if it expires. + // The expiration epoch number is inclusive of the epoch. + // i.e. the bid expires on e + 1. + if (pof.epoch_expiration >= e || pof.epoch_expiration == 0) { + return (pof.bid, pof.epoch_expiration) + }; + return (0, pof.epoch_expiration) + }; + return (0, 0) + } + + // which epoch did they last retract a bid? + public fun is_already_retracted(node_addr: address): (bool, u64) acquires ProofOfFeeAuction { + if (exists(node_addr)) { + let when_retract = *&borrow_global(node_addr).last_epoch_retracted; + return (DiemConfig::get_current_epoch() >= when_retract, when_retract) + }; + return (false, 0) + } + + // Get the top N validators by bid, this is FILTERED by default + public fun top_n_accounts(account: &signer, n: u64, unfiltered: bool): vector
acquires ProofOfFeeAuction, ConsensusReward { + assert!(Signer::address_of(account) == @DiemRoot, Errors::requires_role(140101)); + + let eligible_validators = get_sorted_vals(unfiltered); + let len = Vector::length
(&eligible_validators); + if(len <= n) return eligible_validators; + + let diff = len - n; + while(diff > 0){ + Vector::pop_back(&mut eligible_validators); + diff = diff - 1; + }; + + eligible_validators + } + + + ////////// SETTERS ////////// + // validator can set a bid. See transaction script below. + // the validator can set an "expiry epoch: for the bid. + // Zero means never expires. + // Bids are denomiated in percentages, with ONE decimal place.. + // i.e. 0123 = 12.3% + // Provisionally 110% is the maximum bid. Which could be reviewed. + public fun set_bid(account_sig: &signer, bid: u64, expiry_epoch: u64) acquires ProofOfFeeAuction { + + let acc = Signer::address_of(account_sig); + if (!exists(acc)) { + init(account_sig); + }; + + // bid must be below 110% + assert!(bid <= 1100, Errors::ol_tx(EBID_ABOVE_MAX_PCT)); + + let pof = borrow_global_mut(acc); + pof.epoch_expiration = expiry_epoch; + pof.bid = bid; + } + + + /// Note that the validator will not be bidding on any future + /// epochs if they retract their bid. The must set a new bid. + public fun retract_bid(account_sig: &signer) acquires ProofOfFeeAuction { + + let acc = Signer::address_of(account_sig); + if (!exists(acc)) { + init(account_sig); + }; + + + let pof = borrow_global_mut(acc); + let this_epoch = DiemConfig::get_current_epoch(); + + //////// LEAVE COMMENTED. Code for a potential upgrade. //////// + // See above discussion for retracting of bids. + // + // already retracted this epoch + // assert!(this_epoch > pof.last_epoch_retracted, Errors::ol_tx(EABOVE_RETRACT_LIMIT)); + //////// LEAVE COMMENTED. Code for a potential upgrade. //////// + + + pof.epoch_expiration = 0; + pof.bid = 0; + pof.last_epoch_retracted = this_epoch; + } + + ////////// TRANSACTION APIS ////////// + // manually init the struct, fallback in case of migration fail + public(script) fun init_bidding(sender: signer) { + init(&sender); + } + + // update the bid for the sender + public(script) fun pof_update_bid(sender: signer, bid: u64, epoch_expiry: u64) acquires ProofOfFeeAuction { + // update the bid, initializes if not already. + set_bid(&sender, bid, epoch_expiry); + } + + // retract bid + public(script) fun pof_retract_bid(sender: signer) acquires ProofOfFeeAuction { + // retract a bid + retract_bid(&sender); + } + + //////// TEST HELPERS //////// + + public fun test_set_val_bids(vm: &signer, vals: &vector
, bids: &vector, expiry: &vector) acquires ProofOfFeeAuction { + Testnet::assert_testnet(vm); + + let len = Vector::length(vals); + let i = 0; + while (i < len) { + let bid = Vector::borrow(bids, i); + let exp = Vector::borrow(expiry, i); + let addr = Vector::borrow(vals, i); + test_set_one_bid(vm, addr, *bid, *exp); + i = i + 1; + }; + } + + public fun test_set_one_bid(vm: &signer, val: &address, bid: u64, exp: u64) acquires ProofOfFeeAuction { + Testnet::assert_testnet(vm); + let pof = borrow_global_mut(*val); + pof.epoch_expiration = exp; + pof.bid = bid; + } + + public fun test_mock_reward( + vm: &signer, + value: u64, + clearing_price: u64, + median_win_bid: u64, + median_history: vector, + ) acquires ConsensusReward { + Testnet::assert_testnet(vm); + + let cr = borrow_global_mut(@VMReserved ); + cr.value = value; + cr.clearing_price = clearing_price; + cr.median_win_bid = median_win_bid; + cr.median_history = median_history; + + } + } +} + + diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Receipts.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Receipts.move index e1c39e533c..1fe1f7f5a4 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Receipts.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Receipts.move @@ -9,6 +9,8 @@ address DiemFramework { module Receipts { + friend DiemFramework::DiemAccount; + use Std::Vector; use DiemFramework::DiemTimestamp; use Std::Signer; @@ -36,10 +38,21 @@ module Receipts { ) }; } - - public fun write_receipt(sender: &signer, payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts { + + public fun is_init(addr: address):bool { + exists(addr) + } + + public fun write_receipt_vm(sender: &signer, payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts { // TODO: make a function for user to write own receipt. CoreAddresses::assert_vm(sender); + write_receipt(payer, destination, value) + } + + /// Restricted to DiemAccount, we need to write receipts for certain users, like to DonorDirected Accounts. + /// Core Devs: Danger: only DiemAccount can use this. + public(friend) fun write_receipt(payer: address, destination: address, value: u64):(u64, u64, u64) acquires UserReceipts { + // TODO: make a function for user to write own receipt. if (!exists(payer)) { return (0, 0, 0) }; diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Stats.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Stats.move index 7115de4cd4..70eda78fd5 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Stats.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Stats.move @@ -189,12 +189,12 @@ module Stats{ } else { // debugging rescue mission. Remove after network stabilizes Apr 2022. // something bad happened and we can't find this node in our list. - // print(&666); - // print(&node_addr); + // // print(&666); + // // print(&node_addr); }; // update total vote count anyways even if we can't find this person. stats.current.total_votes = stats.current.total_votes + 1; - // print(&stats.current); + // // print(&stats.current); } //Permissions: Public, VM only. @@ -232,15 +232,6 @@ module Stats{ *&borrow_global(@DiemRoot).history } - /// TEST HELPERS - //Function: 15 - public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats { - let sender = Signer::address_of(vm); - assert!(sender == @DiemRoot, Errors::requires_role(190015)); - assert!(Testnet::is_testnet(), Errors::invalid_state(190015)); - - inc_vote(vm, node_addr); - } // TODO: this code is duplicated with NodeWeight, opportunity to make sorting in to a module. public fun get_sorted_vals_by_props(account: &signer, n: u64): vector
acquires ValStats { @@ -295,5 +286,31 @@ module Stats{ return eligible_validators } + + + /// TEST HELPERS + //Function: 15 + public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats { + let sender = Signer::address_of(vm); + assert!(sender == @DiemRoot, Errors::requires_role(190015)); + assert!(Testnet::is_testnet(), Errors::invalid_state(190015)); + + inc_vote(vm, node_addr); + } + + + + public fun test_helper_remove_votes(vm: &signer, node_addr: address) acquires ValStats { + Testnet::assert_testnet(vm); + + let stats = borrow_global_mut(@VMReserved); + let (is_true, i) = Vector::index_of
(&mut stats.current.addr, &node_addr); + if (is_true) { + let votes = *Vector::borrow(&mut stats.current.vote_count, i); + Vector::push_back(&mut stats.current.vote_count, 0); + Vector::swap_remove(&mut stats.current.vote_count, i); + stats.current.total_votes = stats.current.total_votes - votes; + } + } } } \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Subsidy.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Subsidy.move index fab747ad34..d4cf4e2c8f 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Subsidy.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Subsidy.move @@ -57,6 +57,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm, subsidy_granted); DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, node_address, minted_coins, b"validator subsidy", @@ -159,6 +160,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm_sig, *&subsidy); DiemAccount::vm_deposit_with_metadata( vm_sig, + @VMReserved, node_address, minted_coins, b"genesis subsidy", @@ -200,6 +202,7 @@ address DiemFramework { DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, node_address, TransactionFee::get_transaction_fees_coins_amount(vm, fees), b"transaction fees", diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TestFixtures.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TestFixtures.move index 8ce70082d8..9d60c2b688 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TestFixtures.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TestFixtures.move @@ -7,6 +7,10 @@ address DiemFramework { module TestFixtures{ use DiemFramework::Testnet; + use DiemFramework::ValidatorUniverse; + use DiemFramework::DiemAccount; + use DiemFramework::ProofOfFee; + use Std::Vector; public fun easy_difficulty(): u64 { 100 } @@ -89,5 +93,36 @@ module TestFixtures{ assert!(Testnet::is_testnet(), 130102014010); x"00105f2013b1de8c7b6ba93501c6136dbbc16ebb728f12199222f9878f68515b7cfff6d75658cd87a0e39449c613290b5820fdb255758c57e5675a4d7dcc473f1341" } + + //////// PROOF OF FEE //////// + public fun pof_default(vm: &signer): (vector
, vector, vector){ + + Testnet::assert_testnet(vm); + let vals = ValidatorUniverse::get_eligible_validators(); + + let bids = Vector::empty(); + let expiry = Vector::empty(); + let i = 0; + let prev = 0; + let fib = 1; + while (i < Vector::length(&vals)) { + + Vector::push_back(&mut expiry, 1000); + let b = prev + fib; + Vector::push_back(&mut bids, b); + + let a = Vector::borrow(&vals, i); + let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a); + // initialize and set. + ProofOfFee::set_bid(&sig, b, 1000); + prev = fib; + fib = b; + i = i + 1; + }; + DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators + + (vals, bids, expiry) + } + } } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Testnet.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Testnet.move index 0dcafcb9c2..d57a3b0fe8 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Testnet.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Testnet.move @@ -10,6 +10,9 @@ module Testnet { use Std::Errors; use Std::Signer; + const ENOT_TESTNET: u64 = 666; // out satan! + const EWHY_U_NO_ROOT: u64 = 667; + struct IsTestnet has key { } public fun initialize(account: &signer) { @@ -24,11 +27,21 @@ module Testnet { exists(@DiemRoot) } + public fun assert_testnet(vm: &signer): bool { + assert!( + Signer::address_of(vm) == @DiemRoot, + Errors::requires_role(EWHY_U_NO_ROOT) + ); + assert!(is_testnet(), Errors::invalid_state(ENOT_TESTNET)); + true + } + + // only used for testing purposes public fun remove_testnet(account: &signer) acquires IsTestnet { assert!( Signer::address_of(account) == @DiemRoot, - Errors::requires_role(200202) + Errors::requires_role(EWHY_U_NO_ROOT) ); IsTestnet{} = move_from(@DiemRoot); } @@ -43,12 +56,13 @@ module StagingNet { use Std::Errors; use Std::Signer; + const EWHY_U_NO_ROOT: u64 = 667; struct IsStagingNet has key { } public fun initialize(account: &signer) { assert!( Signer::address_of(account) == @DiemRoot, - Errors::requires_role(190301) + Errors::requires_role(EWHY_U_NO_ROOT) ); move_to(account, IsStagingNet{}) } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TowerState.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TowerState.move index 5a0fe78147..c2e1eada05 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TowerState.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TowerState.move @@ -598,7 +598,7 @@ module TowerState { // We want to see where it breaks. // the first use case is to change the VDF difficulty parameter by tiny margins, in order to make it difficult to stockpile VDFs in a previous epoch, but not change the security properties. // the goal is to push all the RNG work to all the tower miners in the network, and minimize compute on the Move side - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; public fun toy_rng(seed: u64, iters: u64): u64 acquires TowerList, TowerProofHistory { // Get the list of all miners L @@ -625,24 +625,24 @@ module TowerState { // double check if (len <= n) return 0; - print(&666602); + // print(&666602); let miner_addr = Vector::borrow
(&l, n); - print(&666603); + // print(&666603); let vec = if (exists(*miner_addr)) { *&borrow_global(*miner_addr).previous_proof_hash } else { return 0 }; - print(&vec); + // print(&vec); - print(&666604); + // print(&666604); // take the last bit (B) from their last proof hash. n = (Vector::pop_back(&mut vec) as u64); - print(&666605); + // print(&666605); i = i + 1; }; - print(&8888); + // print(&8888); n } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TransactionFee.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TransactionFee.move index 1ac207054c..a7b643414e 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TransactionFee.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/TransactionFee.move @@ -4,6 +4,8 @@ // File Prefix for errors: 2000 /////////////////////////////////////////////////////////////////////////// module DiemFramework::TransactionFee { + friend DiemFramework::Burn; + // use DiemFramework::XUS::XUS; /////// 0L ///////// use DiemFramework::GAS::GAS; /////// 0L ///////// use DiemFramework::CoreAddresses; @@ -13,6 +15,8 @@ module DiemFramework::TransactionFee { use DiemFramework::DiemTimestamp; use Std::Errors; use Std::Signer; + use Std::Vector; + // use DiemFramework::Burn; /// The `TransactionFee` resource holds a preburn resource for each /// fiat `CoinType` that can be collected as a transaction fee. @@ -78,8 +82,19 @@ module DiemFramework::TransactionFee { public fun pay_fee(coin: Diem) acquires TransactionFee { DiemTimestamp::assert_operating(); assert!(is_coin_initialized(), Errors::not_published(ETRANSACTION_FEE)); - let fees = borrow_global_mut>(@TreasuryCompliance); - Diem::deposit(&mut fees.balance, coin) + let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is just the VM root actually + Diem::deposit(&mut fees.balance, coin); + } + + //////// 0L //////// + // Pay fee and track who it came from. + public fun pay_fee_and_track(user: address, coin: Diem) acquires TransactionFee, FeeMaker, EpochFeeMakerRegistry { + DiemTimestamp::assert_operating(); + assert!(is_coin_initialized(), Errors::not_published(ETRANSACTION_FEE)); + let amount = Diem::value(&coin); + let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is just the VM root actually + Diem::deposit(&mut fees.balance, coin); + track_user_fee(user, amount); } spec pay_fee { @@ -143,6 +158,45 @@ module DiemFramework::TransactionFee { /// All the fees is burnt so the balance becomes 0. ensures spec_transaction_fee().balance.value == 0; } + + //////// 0L //////// + // modified the above function to burn fees + // this is used to clear the Fee account of the VM after each epoch + // in the event that there are more funds that necessary + // to pay validators their agreed rate. + + // public fun ol_burn_fees( + // vm: &signer, + // ) acquires TransactionFee, EpochFeeMakerRegistry, FeeMaker { + // if (Signer::address_of(vm) != @VMReserved) { + // return + // }; + // // extract fees + // // let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is same as VM address + // // let coin = Diem::withdraw_all(&mut fees.balance); + + // // either the user is burning or recyling the coin + // // Burn::epoch_start_burn(vm, coin); + + // // get the list of fee makers + // let state = borrow_global(@VMReserved); + // let fee_makers = &state.fee_makers; + // let len = Vector::length(fee_makers); + + // // for every user in the list burn their fees per Burn.move preferences + // let i = 0; + // while (i < len) { + // let user = Vector::borrow(fee_makers, i); + // let amount = borrow_global(*user).epoch; + // // Burn::epoch_start_burn(vm, user, amount); + // i = i + 1; + // } + + + + // // Diem::vm_burn_this_coin(vm, coin); + // } + /// STUB: To be filled in at a later date once the makeup of the XDX has been determined. /// /// # Specification of the case where burn type is XDX. @@ -195,7 +249,8 @@ module DiemFramework::TransactionFee { } /////// 0L ///////// - public fun get_transaction_fees_coins( + /// only to be used by VM through the Burn.move module + public(friend) fun vm_withdraw_all_coins( dr_account: &signer ): Diem acquires TransactionFee { // Can only be invoked by DiemVM privilege. @@ -211,6 +266,7 @@ module DiemFramework::TransactionFee { } /////// 0L ///////// + // TODO deprecate this public fun get_transaction_fees_coins_amount( dr_account: &signer, amount: u64 ): Diem acquires TransactionFee { @@ -225,4 +281,93 @@ module DiemFramework::TransactionFee { Diem::withdraw(&mut fees.balance, amount) } + + /// FeeMaker struct lives on an individual's account + /// We check how many fees the user has paid. + /// This will interact with Burn preferences when there is a remainder of fees in the TransactionFee account + struct FeeMaker has key { + epoch: u64, + lifetime: u64, + } + + /// We need a list of who is producing fees this epoch. + /// This lives on the VM address + struct EpochFeeMakerRegistry has key { + fee_makers: vector
, + } + + /// Initialize the registry at the VM address. + public fun initialize_epoch_fee_maker_registry(vm: &signer) { + CoreAddresses::assert_vm(vm); + let registry = EpochFeeMakerRegistry { + fee_makers: Vector::empty(), + }; + move_to(vm, registry); + } + + /// FeeMaker is initialized when the account is created + public fun initialize_fee_maker(account: &signer) { + let fee_maker = FeeMaker { + epoch: 0, + lifetime: 0, + }; + move_to(account, fee_maker); + } + + public fun epoch_reset_fee_maker(vm: &signer) acquires EpochFeeMakerRegistry, FeeMaker { + CoreAddresses::assert_vm(vm); + let registry = borrow_global_mut(@VMReserved); + let fee_makers = ®istry.fee_makers; + + let i = 0; + while (i < Vector::length(fee_makers)) { + let account = *Vector::borrow(fee_makers, i); + reset_one_fee_maker(vm, account); + i = i + 1; + }; + registry.fee_makers = Vector::empty(); + } + + /// FeeMaker is reset at the epoch boundary, and the lifetime is updated. + fun reset_one_fee_maker(vm: &signer, account: address) acquires FeeMaker { + CoreAddresses::assert_vm(vm); + let fee_maker = borrow_global_mut(account); + fee_maker.lifetime = fee_maker.lifetime + fee_maker.epoch; + fee_maker.epoch = 0; + } + + /// add a fee to the account fee maker for an epoch + /// PRIVATE function + fun track_user_fee(account: address, amount: u64) acquires FeeMaker, EpochFeeMakerRegistry { + if (!exists(account)) { + return + }; + + let fee_maker = borrow_global_mut(account); + fee_maker.epoch = fee_maker.epoch + amount; + + // update the registry + let registry = borrow_global_mut(@VMReserved); + if (!Vector::contains(®istry.fee_makers, &account)) { + Vector::push_back(&mut registry.fee_makers, account); + } + } + + //////// GETTERS /////// + + // get list of fee makers + public fun get_fee_makers(): vector
acquires EpochFeeMakerRegistry { + let registry = borrow_global(@VMReserved); + *®istry.fee_makers + } + + // get the fees made by the user in the epoch + public fun get_epoch_fees_made(account: address): u64 acquires FeeMaker { + if (!exists(account)) { + return 0 + }; + let fee_maker = borrow_global(account); + fee_maker.epoch + } + } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Upgrade.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Upgrade.move index 3ee1c500d8..7bf985a950 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Upgrade.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Upgrade.move @@ -55,7 +55,7 @@ module Upgrade { // unless the prologue gives it to us. // The upgrade reconfigure happens on round 2, so we'll increment the // new start by 2 from previous. - let new_epoch_height = Epoch::get_timer_height_start(vm) + 2; + let new_epoch_height = Epoch::get_timer_height_start() + 2; Epoch::reset_timer(vm, new_epoch_height); // TODO: check if this has any impact. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Vouch.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Vouch.move index 1ac5b6641a..8f007e83db 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Vouch.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Vouch.move @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////// // 0L Module -// Vouce Module +// Vouch Module // Error code: ///////////////////////////////////////////////////////////////////////// diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_transfer.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_transfer.move index 62a1cd9f9f..6a3c377a85 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_transfer.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_transfer.move @@ -5,7 +5,7 @@ module TransferScripts { use DiemFramework::GAS::GAS; use DiemFramework::Globals; use Std::Signer; - use DiemFramework::CommunityWallet; + // use DiemFramework::CommunityWallet; use DiemFramework::DonorDirected; public(script) fun balance_transfer( diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_validator.move b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_validator.move index 75205ddf52..ea1f00ea11 100644 --- a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_validator.move +++ b/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/ol_validator.move @@ -28,27 +28,29 @@ module ValidatorScripts { // assert!(DiemSystem::is_validator(Vector::pop_back(&mut new_validators)), 3); // } - public(script) fun self_unjail(validator: signer) { - let addr = Signer::address_of(&validator); - // if is above threshold continue, or raise error. - assert!( - TowerState::node_above_thresh(addr), - Errors::invalid_state(NOT_ABOVE_THRESH_JOIN) - ); - // if is not in universe, add back - if (!ValidatorUniverse::is_in_universe(addr)) { - ValidatorUniverse::add_self(&validator); - }; - // Initialize jailbit if not present - if (!ValidatorUniverse::exists_jailedbit(addr)) { - ValidatorUniverse::initialize(&validator); - }; + // V6: See note in Jail on deprecating self_unjail. + + // public(script) fun self_unjail(validator: signer) { + // let addr = Signer::address_of(&validator); + // // if is above threshold continue, or raise error. + // assert!( + // TowerState::node_above_thresh(addr), + // Errors::invalid_state(NOT_ABOVE_THRESH_JOIN) + // ); + // // if is not in universe, add back + // if (!ValidatorUniverse::is_in_universe(addr)) { + // ValidatorUniverse::add_self(&validator); + // }; + // // Initialize jailbit if not present + // if (!ValidatorUniverse::exists_jailedbit(addr)) { + // ValidatorUniverse::initialize(&validator); + // }; - // if is jailed, try to unjail - if (Jail::is_jailed(addr)) { - Jail::self_unjail(&validator); - }; - } + // // if is jailed, try to unjail + // if (Jail::is_jailed(addr)) { + // Jail::self_unjail(&validator); + // }; + // } public(script) fun voucher_unjail(voucher: signer, addr: address) { // if is above threshold continue, or raise error. diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/error_description/error_description.errmap b/diem-move/diem-framework/DPN/releases/artifacts/current/error_description/error_description.errmap index a5a65a124f3d04e47fa174945df0fb6ff9937889..1c969976d3cfbfeb81cf3710176f9cd07e831ff2 100644 GIT binary patch delta 229 zcmX>!opI|-#tl}ijHa8dSy_b4*+Wu`OY%}nm}W6CfB}!IpMOYvh-+|&pKA!iY^W%o zYq&>bd}zF%e|(U?e+a{7eep;xzJQ|q{51bGx71W-!)HvB3*_bM8H}Dmv encode_freeze_account_script_function(sliding_nonce, to_freeze_account), + InitBidding {} => encode_init_bidding_script_function(), InitCommunityMultisig { signer_one, signer_two, @@ -3905,6 +3913,10 @@ impl ScriptFunctionCall { metadata, metadata_signature, ), + PofRetractBid {} => encode_pof_retract_bid_script_function(), + PofUpdateBid { bid, epoch_expiry } => { + encode_pof_update_bid_script_function(bid, epoch_expiry) + } Preburn { token, amount } => encode_preburn_script_function(token, amount), PublishSharedEd25519PublicKey { public_key } => { encode_publish_shared_ed25519_public_key_script_function(public_key) @@ -3964,7 +3976,6 @@ impl ScriptFunctionCall { RotateSharedEd25519PublicKey { public_key } => { encode_rotate_shared_ed25519_public_key_script_function(public_key) } - SelfUnjail {} => encode_self_unjail_script_function(), SetBurnPref { to_community } => encode_set_burn_pref_script_function(to_community), SetGasConstants { sliding_nonce, @@ -5237,6 +5248,18 @@ pub fn encode_freeze_account_script_function( )) } +pub fn encode_init_bidding_script_function() -> TransactionPayload { + TransactionPayload::ScriptFunction(ScriptFunction::new( + ModuleId::new( + AccountAddress::new([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), + ident_str!("ProofOfFee").to_owned(), + ), + ident_str!("init_bidding").to_owned(), + vec![], + vec![], + )) +} + /// Helper to initialize the PaymentMultisig, but also while confirming that the signers are not related family /// These transactions can be sent directly to DonorDirected, but this is a helper to make it easier to initialize the multisig with the acestry requirements. pub fn encode_init_community_multisig_script_function( @@ -5650,6 +5673,33 @@ pub fn encode_peer_to_peer_with_metadata_script_function( )) } +pub fn encode_pof_retract_bid_script_function() -> TransactionPayload { + TransactionPayload::ScriptFunction(ScriptFunction::new( + ModuleId::new( + AccountAddress::new([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), + ident_str!("ProofOfFee").to_owned(), + ), + ident_str!("pof_retract_bid").to_owned(), + vec![], + vec![], + )) +} + +pub fn encode_pof_update_bid_script_function(bid: u64, epoch_expiry: u64) -> TransactionPayload { + TransactionPayload::ScriptFunction(ScriptFunction::new( + ModuleId::new( + AccountAddress::new([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), + ident_str!("ProofOfFee").to_owned(), + ), + ident_str!("pof_update_bid").to_owned(), + vec![], + vec![ + bcs::to_bytes(&bid).unwrap(), + bcs::to_bytes(&epoch_expiry).unwrap(), + ], + )) +} + /// # Summary /// Moves a specified number of coins in a given currency from the account's /// balance to its preburn area after which the coins may be burned. This @@ -6204,18 +6254,6 @@ pub fn encode_rotate_shared_ed25519_public_key_script_function( )) } -pub fn encode_self_unjail_script_function() -> TransactionPayload { - TransactionPayload::ScriptFunction(ScriptFunction::new( - ModuleId::new( - AccountAddress::new([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]), - ident_str!("ValidatorScripts").to_owned(), - ), - ident_str!("self_unjail").to_owned(), - vec![], - vec![], - )) -} - pub fn encode_set_burn_pref_script_function(to_community: bool) -> TransactionPayload { TransactionPayload::ScriptFunction(ScriptFunction::new( ModuleId::new( @@ -8940,6 +8978,14 @@ fn decode_freeze_account_script_function( } } +fn decode_init_bidding_script_function(payload: &TransactionPayload) -> Option { + if let TransactionPayload::ScriptFunction(_script) = payload { + Some(ScriptFunctionCall::InitBidding {}) + } else { + None + } +} + fn decode_init_community_multisig_script_function( payload: &TransactionPayload, ) -> Option { @@ -9140,6 +9186,29 @@ fn decode_peer_to_peer_with_metadata_script_function( } } +fn decode_pof_retract_bid_script_function( + payload: &TransactionPayload, +) -> Option { + if let TransactionPayload::ScriptFunction(_script) = payload { + Some(ScriptFunctionCall::PofRetractBid {}) + } else { + None + } +} + +fn decode_pof_update_bid_script_function( + payload: &TransactionPayload, +) -> Option { + if let TransactionPayload::ScriptFunction(script) = payload { + Some(ScriptFunctionCall::PofUpdateBid { + bid: bcs::from_bytes(script.args().get(0)?).ok()?, + epoch_expiry: bcs::from_bytes(script.args().get(1)?).ok()?, + }) + } else { + None + } +} + fn decode_preburn_script_function(payload: &TransactionPayload) -> Option { if let TransactionPayload::ScriptFunction(script) = payload { Some(ScriptFunctionCall::Preburn { @@ -9294,14 +9363,6 @@ fn decode_rotate_shared_ed25519_public_key_script_function( } } -fn decode_self_unjail_script_function(payload: &TransactionPayload) -> Option { - if let TransactionPayload::ScriptFunction(_script) = payload { - Some(ScriptFunctionCall::SelfUnjail {}) - } else { - None - } -} - fn decode_set_burn_pref_script_function( payload: &TransactionPayload, ) -> Option { @@ -10040,6 +10101,10 @@ static SCRIPT_FUNCTION_DECODER_MAP: once_cell::sync::Lazy(); // get the parent's ancestry if initialized. @@ -38,31 +38,31 @@ address DiemFramework { if (exists(parent)) { let parent_state = borrow_global_mut(parent); let parent_tree = *&parent_state.tree; - print(&100210); + // print(&100210); if (Vector::length
(&parent_tree) > 0) { Vector::append(&mut new_tree, parent_tree); }; - print(&100220); + // print(&100220); }; // add the parent to the tree Vector::push_back(&mut new_tree, parent); - print(&100230); + // print(&100230); if (!exists(child)) { move_to(new_account_sig, Ancestry { tree: new_tree, }); - print(&100240); + // print(&100240); } else { // this is only for migration cases. let child_ancestry = borrow_global_mut(child); child_ancestry.tree = new_tree; - print(&100250); + // print(&100250); }; - print(&100260); + // print(&100260); } @@ -80,40 +80,40 @@ address DiemFramework { public fun is_family(left: address, right: address): (bool, address) acquires Ancestry { let is_family = false; let common_ancestor = @0x0; - print(&100300); - print(&exists(left)); - print(&exists(right)); + // // print(&100300); + // // print(&exists(left)); + // // print(&exists(right)); // if (exists(left) && exists(right)) { // if tree is empty it will still work. - print(&100310); + // // print(&100310); let left_tree = get_tree(left); - print(&100311); + // // print(&100311); let right_tree = get_tree(right); - print(&100320); + // // print(&100320); // check for direct relationship. if (Vector::contains(&left_tree, &right)) return (true, right); if (Vector::contains(&right_tree, &left)) return (true, left); - print(&100330); + // // print(&100330); let i = 0; // check every address on the list if there are overlaps. while (i < Vector::length
(&left_tree)) { - print(&100341); + // // print(&100341); let family_addr = Vector::borrow(&left_tree, i); if (Vector::contains(&right_tree, family_addr)) { is_family = true; common_ancestor = *family_addr; - print(&100342); + // // print(&100342); break }; i = i + 1; }; - print(&100350); + // // print(&100350); // }; - print(&100360); + // // print(&100360); (is_family, common_ancestor) } @@ -160,13 +160,13 @@ address DiemFramework { move_to(child_sig, Ancestry { tree: migrate_tree, }); - print(&100240); + // print(&100240); } else { // this is only for migration cases. let child_ancestry = borrow_global_mut(child); child_ancestry.tree = migrate_tree; - print(&100250); + // print(&100250); }; } diff --git a/diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Audit.move b/diem-move/diem-framework/DPN/sources/0L/Audit.depr similarity index 100% rename from diem-move/diem-framework/DPN/releases/artifacts/current/build/DPNFramework/sources/Audit.move rename to diem-move/diem-framework/DPN/sources/0L/Audit.depr diff --git a/diem-move/diem-framework/DPN/sources/0L/Audit.move b/diem-move/diem-framework/DPN/sources/0L/Audit.move deleted file mode 100644 index d317835f8f..0000000000 --- a/diem-move/diem-framework/DPN/sources/0L/Audit.move +++ /dev/null @@ -1,41 +0,0 @@ -///////////////////////////////////////////////////////////////////////// -// 0L Module -// Audit Module -// Error code: 1905 -///////////////////////////////////////////////////////////////////////// - -address DiemFramework { - module Audit { - use DiemFramework::ValidatorConfig; - use DiemFramework::DiemAccount; - // use DiemFramework::GAS::GAS; - use DiemFramework::AutoPay; - use DiemFramework::TowerState; - use DiemFramework::Testnet; - // use DiemFramework::Vouch; - - public fun val_audit_passing(val: address): bool { - // has valid configs - if (!ValidatorConfig::is_valid(val)) return false; - // has operator account set to another address - let oper = ValidatorConfig::get_operator(val); - if (oper == val) return false; - // operator account has balance - // has mining state - if (!TowerState::is_init(val)) return false; - - // is a slow wallet - if (!DiemAccount::is_slow(val)) return false; - - // if (!Vouch::unrelated_buddies_above_thresh(val)) return false; - - true - } - - ////////// TEST HELPERS - public fun test_helper_make_passing(account: &signer){ - assert!(Testnet::is_testnet(), 1905001); - AutoPay::enable_autopay(account); - } - } -} \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/sources/0L/Burn.move b/diem-move/diem-framework/DPN/sources/0L/Burn.move index e9007a42a5..177a03afc4 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Burn.move +++ b/diem-move/diem-framework/DPN/sources/0L/Burn.move @@ -6,8 +6,9 @@ module Burn { use DiemFramework::DiemAccount; use DiemFramework::CoreAddresses; use DiemFramework::GAS::GAS; + use DiemFramework::TransactionFee; use Std::Signer; - use DiemFramework::Debug::print; + use DiemFramework::Diem::{Self, Diem}; struct BurnPreference has key { send_community: bool @@ -19,6 +20,38 @@ module Burn { ratio: vector, } + + public fun epoch_burn_fees( + vm: &signer, + ) acquires BurnPreference, DepositInfo { + CoreAddresses::assert_vm(vm); + + // extract fees + let coins = TransactionFee::vm_withdraw_all_coins(vm); + + // get the list of fee makers + let fee_makers = TransactionFee::get_fee_makers(); + + let len = Vector::length(&fee_makers); + + // for every user in the list burn their fees per Burn.move preferences + let i = 0; + while (i < len) { + let user = Vector::borrow(&fee_makers, i); + let amount = TransactionFee::get_epoch_fees_made(*user); + let user_share = Diem::withdraw(&mut coins, amount); + burn_or_recycle_user_fees(vm, *user, user_share); + + i = i + 1; + }; + + // Transaction fee account should be empty at the end of the epoch + // Superman 3 decimal errors. https://www.youtube.com/watch?v=N7JBXGkBoFc + // anything that is remaining should be burned + Diem::vm_burn_this_coin(vm, coins); + } + + public fun reset_ratios(vm: &signer) acquires DepositInfo { CoreAddresses::assert_diem_root(vm); let list = DonorDirected::get_root_registry(); @@ -46,7 +79,6 @@ module Burn { let cumu = *Vector::borrow(&deposit_vec, k); let ratio = FixedPoint32::create_from_rational(cumu, global_deposits); - print(&ratio); Vector::push_back(&mut ratios_vec, ratio); k = k + 1; @@ -74,85 +106,67 @@ module Burn { } // calculate the ratio which the community wallet should receive - fun get_value(payee: address, value: u64): u64 acquires DepositInfo { + fun get_payee_value(payee: address, value: u64): u64 acquires DepositInfo { if (!exists(@VMReserved)) return 0; let d = borrow_global(@VMReserved); - let contains = Vector::contains(&d.addr, &payee); - print(&contains); + let _contains = Vector::contains(&d.addr, &payee); let (is_found, i) = Vector::index_of(&d.addr, &payee); if (is_found) { - print(&is_found); let len = Vector::length(&d.ratio); - print(&i); - print(&len); if (i + 1 > len) return 0; let ratio = *Vector::borrow(&d.ratio, i); if (FixedPoint32::is_zero(copy ratio)) return 0; - print(&ratio); return FixedPoint32::multiply_u64(value, ratio) }; 0 } - public fun epoch_start_burn( - vm: &signer, payer: address, value: u64 + public fun burn_or_recycle_user_fees( + vm: &signer, payer: address, user_share: Diem ) acquires DepositInfo, BurnPreference { CoreAddresses::assert_vm(vm); - if (exists(payer)) { if (borrow_global(payer).send_community) { - return send(vm, payer, value) - } else { - return burn(vm, payer, value) + recycle(vm, payer, &mut user_share); } - } else { - burn(vm, payer, value); - }; - } + }; - fun burn(vm: &signer, addr: address, value: u64) { - DiemAccount::vm_burn_from_balance( - addr, - value, - b"burn", - vm, - ); + // Superman 3 + Diem::vm_burn_this_coin(vm, user_share); } - fun send(vm: &signer, payer: address, value: u64) acquires DepositInfo { + fun recycle(vm: &signer, payer: address, coin: &mut Diem) acquires DepositInfo { let list = get_address_list(); let len = Vector::length
(&list); - print(&list); - + + + let total_coin_value_to_recycle = Diem::value(coin); + // There could be errors in the array, and underpayment happen. let value_sent = 0; let i = 0; while (i < len) { + let payee = *Vector::borrow
(&list, i); - print(&payee); - let val = get_value(payee, value); - print(&val); - - DiemAccount::vm_make_payment_no_limit( + let amount_to_payee = get_payee_value(payee, total_coin_value_to_recycle); + let to_deposit = Diem::withdraw(coin, amount_to_payee); + + DiemAccount::vm_deposit_with_metadata( + vm, payer, payee, - val, - b"epoch start send", + to_deposit, + b"recycle", b"", - vm, ); - value_sent = value_sent + val; + value_sent = value_sent + amount_to_payee; i = i + 1; }; - - // NOTE: there may be underpayment due to - // Superman 3 decimal errors. https://www.youtube.com/watch?v=N7JBXGkBoFc - // Explicitly let the user keep these, so that total supply is unchanged. } public fun set_send_community(sender: &signer, community: bool) acquires BurnPreference { diff --git a/diem-move/diem-framework/DPN/sources/0L/Cases.move b/diem-move/diem-framework/DPN/sources/0L/Cases.move index ad92bc7f7e..638897ea03 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Cases.move +++ b/diem-move/diem-framework/DPN/sources/0L/Cases.move @@ -10,15 +10,17 @@ address DiemFramework{ /// Validators who are no longer compliant may be kicked out of the validator /// set and/or jailed. To be compliant, validators must be BOTH validating and mining. module Cases{ - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use DiemFramework::Stats; use DiemFramework::Roles; const VALIDATOR_COMPLIANT: u64 = 1; - const VALIDATOR_HALF_COMPLIANT: u64 = 2; - const VALIDATOR_NOT_COMPLIANT: u64 = 3; + // const VALIDATOR_HALF_COMPLIANT: u64 = 2; + // const VALIDATOR_NOT_COMPLIANT: u64 = 3; const VALIDATOR_DOUBLY_NOT_COMPLIANT: u64 = 4; + const INVALID_DATA: u64 = 0; + // Determine the consensus case for the validator. // This happens at an epoch prologue, and labels the validator based on // performance in the outgoing epoch. @@ -32,28 +34,31 @@ address DiemFramework{ // this is a failure mode. Only usually seen in rescue missions, // where epoch counters are reconfigured by writeset offline. - if (height_end < height_start) return VALIDATOR_DOUBLY_NOT_COMPLIANT; + if (height_end < height_start) return INVALID_DATA; Roles::assert_diem_root(vm); // did the validator sign blocks above threshold? let signs = Stats::node_above_thresh(vm, node_addr, height_start, height_end); - let mines = TowerState::node_above_thresh(node_addr); + // let mines = TowerState::node_above_thresh(node_addr); - if (signs && mines) { + if (signs) { // compliant: in next set, gets paid, weight increments VALIDATOR_COMPLIANT - } - else if (signs && !mines) { - // half compliant: not in next set, does not get paid, weight - // does not increment. - VALIDATOR_HALF_COMPLIANT - } - else if (!signs && mines) { - // not compliant: jailed, not in next set, does not get paid, - // weight increments. - VALIDATOR_NOT_COMPLIANT } + // V6: Simplify compliance cases by removing mining. + + // } + // else if (signs && !mines) { + // // half compliant: not in next set, does not get paid, weight + // // does not increment. + // VALIDATOR_HALF_COMPLIANT + // } + // else if (!signs && mines) { + // // not compliant: jailed, not in next set, does not get paid, + // // weight increments. + // VALIDATOR_NOT_COMPLIANT + // } else { // not compliant: jailed, not in next set, does not get paid, // weight does not increment. diff --git a/diem-move/diem-framework/DPN/sources/0L/DemoBonding.move b/diem-move/diem-framework/DPN/sources/0L/DemoBonding.move index 5d0d04fd49..0b95d00950 100644 --- a/diem-move/diem-framework/DPN/sources/0L/DemoBonding.move +++ b/diem-move/diem-framework/DPN/sources/0L/DemoBonding.move @@ -2,7 +2,7 @@ address DiemFramework { module DemoBonding { use DiemFramework::Decimal; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; struct CurveState has key { is_deprecated: bool, @@ -51,30 +51,30 @@ module DemoBonding { public fun deposit_calc(add_to_reserve: u128, reserve: u128, supply: u128): u128 { let one = Decimal::new(true, 1, 0); - print(&one); + // print(&one); let add_dec = Decimal::new(true, add_to_reserve, 0); - print(&add_dec); + // print(&add_dec); let reserve_dec = Decimal::new(true, reserve, 0); - print(&reserve_dec); + // print(&reserve_dec); let supply_dec = Decimal::new(true, supply, 0); - print(&supply_dec); + // print(&supply_dec); // formula: // supply * sqrt(one+(add_to_reserve/reserve)) let a = Decimal::div(&add_dec, &reserve_dec); - print(&a); + // print(&a); let b = Decimal::add(&one, &a); - print(&b); + // print(&b); let c = Decimal::sqrt(&b); - print(&c); + // print(&c); let d = Decimal::mul(&supply_dec, &c); - print(&d); + // print(&d); let int = Decimal::borrow_int(&Decimal::trunc(&d)); - print(int); + //print(int); return *int } @@ -95,14 +95,14 @@ module DemoBonding { let state = borrow_global_mut(service_addr); let post_supply = deposit_calc(deposit, state.reserve, state.supply_issued); - print(&post_supply); + // print(&post_supply); assert!(post_supply > state.supply_issued, 73570003); let mint = post_supply - state.supply_issued; - print(&mint); + // print(&mint); // update the new curve state state.reserve = state.reserve + deposit; state.supply_issued = state.supply_issued + mint; - // print(&state); + // // print(&state); mint } diff --git a/diem-move/diem-framework/DPN/sources/0L/DonorDirected.move b/diem-move/diem-framework/DPN/sources/0L/DonorDirected.move index 6240efbb1f..93e1135a4d 100644 --- a/diem-move/diem-framework/DPN/sources/0L/DonorDirected.move +++ b/diem-move/diem-framework/DPN/sources/0L/DonorDirected.move @@ -39,7 +39,7 @@ module DonorDirected { use DiemFramework::Ballot; // use DiemFramework::Testnet; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; /// Not initialized as a donor directed account. const ENOT_INIT_DONOR_DIRECTED: u64 = 231001; @@ -288,13 +288,13 @@ module DonorDirected { let this_exp = *&Vector::borrow(&state.scheduled, i).deadline; if (this_exp == epoch) { let t = Vector::remove(&mut state.scheduled, i); - print(&t); + // print(&t); let multisig_address = GUID::id_creator_address(&t.uid); // Note the VM can do this without the WithdrawCapability let coin = DiemAccount::vm_withdraw(vm, multisig_address, t.tx.value); - DiemAccount::vm_deposit_with_metadata(vm, t.tx.payee, coin, *&t.tx.description, b""); + DiemAccount::vm_deposit_with_metadata(vm, multisig_address, t.tx.payee, coin, *&t.tx.description, b""); // update the records @@ -540,14 +540,14 @@ module DonorDirected { /// propose and vote on the veto of a specific transacation public fun propose_veto(donor: &signer, multisig_address: address, uid: u64) acquires TxSchedule { let guid = GUID::create_id(multisig_address, uid); - print(&01); + // print(&01); DonorDirectedGovernance::assert_authorized(donor, multisig_address); - print(&02); + // print(&02); let state = borrow_global(multisig_address); - print(&03); + // print(&03); let epochs_duration = DEFAULT_VETO_DURATION; DonorDirectedGovernance::propose_veto(&state.guid_capability, &guid, epochs_duration); - print(&04); + // print(&04); } diff --git a/diem-move/diem-framework/DPN/sources/0L/Epoch.move b/diem-move/diem-framework/DPN/sources/0L/Epoch.move index 6fd19766a8..e92f92d35b 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Epoch.move +++ b/diem-move/diem-framework/DPN/sources/0L/Epoch.move @@ -66,15 +66,15 @@ module Epoch { } /// Accessor Function, returns the time (in seconds) of the start of the current epoch - public fun get_timer_seconds_start(vm: &signer):u64 acquires Timer { - Roles::assert_diem_root(vm); + public fun get_timer_seconds_start():u64 acquires Timer { + // Roles::assert_diem_root(vm); let time = borrow_global(@DiemRoot); time.seconds_start } /// Accessor Function, returns the block height of the start of the current epoch - public fun get_timer_height_start(vm: &signer):u64 acquires Timer { - Roles::assert_diem_root(vm); + public fun get_timer_height_start():u64 acquires Timer { + // Roles::assert_diem_root(vm); let time = borrow_global(@DiemRoot); time.height_start } diff --git a/diem-move/diem-framework/DPN/sources/0L/EpochBoundary.move b/diem-move/diem-framework/DPN/sources/0L/EpochBoundary.move index 3d2fa2b05e..f78611ec31 100644 --- a/diem-move/diem-framework/DPN/sources/0L/EpochBoundary.move +++ b/diem-move/diem-framework/DPN/sources/0L/EpochBoundary.move @@ -11,7 +11,7 @@ address DiemFramework { module EpochBoundary { use DiemFramework::CoreAddresses; use DiemFramework::Subsidy; - use DiemFramework::NodeWeight; + use DiemFramework::ProofOfFee; use DiemFramework::DiemSystem; use DiemFramework::TowerState; use DiemFramework::Globals; @@ -20,61 +20,70 @@ module EpochBoundary { use DiemFramework::AutoPay; use DiemFramework::Epoch; use DiemFramework::DiemConfig; - use DiemFramework::Audit; use DiemFramework::DiemAccount; use DiemFramework::Burn; - use DiemFramework::FullnodeSubsidy; - use DiemFramework::ValidatorUniverse; - use DiemFramework::Debug::print; - use DiemFramework::Testnet; - use DiemFramework::StagingNet; + use DiemFramework::FullnodeSubsidy; use DiemFramework::RecoveryMode; - use DiemFramework::Cases; use DiemFramework::Jail; - use DiemFramework::Vouch; + use DiemFramework::TransactionFee; use DiemFramework::MultiSigPayment; use DiemFramework::DonorDirected; + //// V6 //// + // THIS IS TEMPORARY + // depends on the future "musical chairs" algo. + const MOCK_VAL_SIZE: u64 = 21; + + // TODO: this will depend on an adjustment algo. + // const MOCK_BASELINE_CONSENSUS_FEES: u64 = 1000000; + + // This function is called by block-prologue once after n blocks. // Function code: 01. Prefix: 180001 public fun reconfigure(vm: &signer, height_now: u64) { CoreAddresses::assert_vm(vm); - let height_start = Epoch::get_timer_height_start(vm); - print(&800100); + + let height_start = Epoch::get_timer_height_start(); + // print(&800100); + let (outgoing_compliant_set, _) = DiemSystem::get_fee_ratio(vm, height_start, height_now); - print(&800200); + + // print(&800200); // NOTE: This is "nominal" because it doesn't check - let compliant_nodes_count = Vector::length(&outgoing_compliant_set); - print(&800300); + // let compliant_nodes_count = Vector::length(&outgoing_compliant_set); + // print(&800300); + + // TODO: subsidy units are fixed + // let (subsidy_units, nominal_subsidy_per) = + // Subsidy::calculate_subsidy(vm, compliant_nodes_count); + // print(&800400); + + let (reward, _, _) = ProofOfFee::get_consensus_reward(); + process_fullnodes(vm, reward); + + // print(&800500); + + process_validators(vm, reward, &outgoing_compliant_set); + // print(&800600); + + // process the non performing nodes: jail + process_jail(vm, &outgoing_compliant_set); - let (subsidy_units, nominal_subsidy_per) = - Subsidy::calculate_subsidy(vm, compliant_nodes_count); - print(&800400); + let proposed_set = propose_new_set(vm, &outgoing_compliant_set); - process_fullnodes(vm, nominal_subsidy_per); - print(&800500); - process_validators(vm, subsidy_units, *&outgoing_compliant_set); - print(&800600); - let proposed_set = propose_new_set(vm, height_start, height_now); - print(&800700); // Update all slow wallet limits DiemAccount::slow_wallet_epoch_drip(vm, Globals::get_unlock()); // todo - print(&800800); - - if (!RecoveryMode::is_recovery()) { - proof_of_burn(vm,nominal_subsidy_per, &proposed_set); - print(&800900); - }; + // print(&801000); root_service_billing(vm); - print(&801000); + // print(&801000); reset_counters(vm, proposed_set, outgoing_compliant_set, height_now); - print(&801100); + // print(&801100); } @@ -116,136 +125,85 @@ module EpochBoundary { } fun process_validators( - vm: &signer, subsidy_units: u64, outgoing_compliant_set: vector
+ vm: &signer, subsidy_units: u64, outgoing_compliant_set: &vector
) { // Process outgoing validators: // Distribute Transaction fees and subsidy payments to all outgoing validators - if (Vector::is_empty
(&outgoing_compliant_set)) return; + if (Vector::is_empty
(outgoing_compliant_set)) return; // don't pay while we are in recovery mode, since that creates // a frontrunning opportunity if (subsidy_units > 0 && !RecoveryMode::is_recovery()) { - Subsidy::process_subsidy(vm, subsidy_units, &outgoing_compliant_set); + Subsidy::process_subsidy(vm, subsidy_units, outgoing_compliant_set); }; - Subsidy::process_fees(vm, &outgoing_compliant_set); + // after everyone is paid from the chain's Fee account + // we can burn the excess fees from the epoch + Burn::reset_ratios(vm); + Burn::epoch_burn_fees(vm); } - fun propose_new_set(vm: &signer, height_start: u64, height_now: u64): vector
- { - // Propose upcoming validator set: - // Get validators we know to be in consensus correctly: Case1 and Case2 - // Only expand the amount of seats so that the new set has a max of 25% - // unproven nodes. I.e. nodes that were not in the previous epoch and - // we have stats on. - - // in emergency admin roles set the validator set - // there may be a recovery set to be used. - // if there is no rescue mission validators, just do usual procedure. - - if (RecoveryMode::is_recovery()) { - let recovery_vals = RecoveryMode::get_debug_vals(); - if (Vector::length(&recovery_vals) > 0) return recovery_vals; - }; - - // Process all the jail terms of the previous validator set - let previous_set = DiemSystem::get_val_set_addr(); - - // Take advantage of this loop to get the expected size of - // the validator set that the new set doesn't have - // 25% of nodes that we don't know their current performance. - let len_proven_nodes = 0; - + fun process_jail(vm: &signer, outgoing_compliant_set: &vector
) { + let all_previous_vals = DiemSystem::get_val_set_addr(); let i = 0; - while (i < Vector::length
(&previous_set)) { - let addr = *Vector::borrow(&previous_set, i); - let case = Cases::get_case(vm, addr, height_start, height_now); + while (i < Vector::length
(&all_previous_vals)) { + let addr = *Vector::borrow(&all_previous_vals, i); if ( - // we care about nodes that are performing consensus correctly, case 1 and 2. - case < 3 && - Audit::val_audit_passing(addr) + + // if they are compliant, remove the consecutive fail, otherwise jail + // V6 Note: audit functions are now all contained in + // ProofOfFee.move and exludes validators at auction time. + + Vector::contains(outgoing_compliant_set, &addr) ) { - len_proven_nodes = len_proven_nodes + 1; + // print(&902); // also reset the jail counter for any successful unjails Jail::remove_consecutive_fail(vm, addr); } else { - + // print(&903); Jail::jail(vm, addr); }; i = i+ 1; }; + // print(&904); + } - // let len_proven_nodes = Vector::length(&proven_nodes); - let max_unproven_nodes = len_proven_nodes / 6; - print(&len_proven_nodes); - print(&max_unproven_nodes); - // start from the proven nodes - - // get all validators by consensus weight - let sorted_val_universe = NodeWeight::get_sorted_vals(); - - // sort by jail index, prioritizes nodes joining that aren't - // currently struggling to stay in the validator set. - let top_accounts = Jail::sort_by_jail(sorted_val_universe); - print(&top_accounts); - - // loop through all accounts, sorted by jail status, and then by consensus power + fun propose_new_set(vm: &signer, outgoing_compliant_set: &vector
): vector
+ { let proposed_set = Vector::empty
(); - let i = 0; - while ( - // can't be more than index of accounts - i < Vector::length(&top_accounts) && - // the new proposed set can only only expand by 15% - Vector::length(&proposed_set) < (len_proven_nodes + max_unproven_nodes) && - // Validator set can only be as big as the maximum set size - Vector::length(&proposed_set) < Globals::get_max_validators_per_set() - ) { - 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 - !Vector::contains
(&proposed_set, &addr) && - // jail the current validators which did not perform. - !Jail::is_jailed(addr) && - // if they are not a current case 1 or 2, then they are - // rejoining and need to have mining proofs. - // case 2 get grace - (case < 3 || mined_last_epoch) && - // do the remaining configuration checks, incl vouching - Audit::val_audit_passing(addr) && - // when being onboarded or being un-jailed check if the vouches - // are sufficient. I.e. don't do this check if the validator - // 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) - ) { - print(&99990901); - Vector::push_back(&mut proposed_set, addr); - }; - i = i + 1; + // If we are in recovery mode, we use the recovery set. + if (RecoveryMode::is_recovery()) { + let recovery_vals = RecoveryMode::get_debug_vals(); + if (Vector::length(&recovery_vals) > 0) { + proposed_set = recovery_vals + } + } else { // Default case: Proof of Fee + //// V6 //// + // CONSENSUS CRITICAL + // pick the validators based on proof of fee. + // false because we want the default behavior of the function: filtered by audit + let sorted_bids = ProofOfFee::get_sorted_vals(false); + let (auction_winners, price) = ProofOfFee::fill_seats_and_get_price(vm, MOCK_VAL_SIZE, &sorted_bids, outgoing_compliant_set); + // TODO: Don't use copy above, do a borrow. + // print(&800700); + + // charge the validators for the proof of fee in advance of the epoch + DiemAccount::vm_multi_pay_fee(vm, &auction_winners, price, &b"proof of fee"); + // print(&800800); + + proposed_set = auction_winners }; - print(&proposed_set); - //////// Failover Rules //////// // If the cardinality of validator_set in the next epoch is less than 4, - // if we are failing to qualify anyone. Pick top 1/2 of validator set + // if we are failing to qualify anyone. Pick top 1/2 of outgoing compliant validator set // by proposals. They are probably online. if (Vector::length
(&proposed_set) <= 3) proposed_set = - Stats::get_sorted_vals_by_props(vm, Vector::length
(&top_accounts) / 2); + Stats::get_sorted_vals_by_props(vm, Vector::length
(outgoing_compliant_set) / 2); // If still failing...in extreme case if we cannot qualify anyone. // Don't change the validator set. we keep the same validator set. @@ -267,71 +225,39 @@ module EpochBoundary { outgoing_compliant: vector
, height_now: u64 ) { - print(&800900100); + // print(&800900100); + // Reset Stats Stats::reconfig(vm, &proposed_set); - print(&800900101); + // print(&800900101); + // Migrate TowerState list from elegible. TowerState::reconfig(vm, &outgoing_compliant); - print(&800900102); + // print(&800900102); + // process community wallets DonorDirected::process_donor_directed_accounts(vm, DiemConfig::get_current_epoch()); - print(&800900103); - // reset counters + // print(&800900103); + AutoPay::reconfig_reset_tick(vm); - print(&800900104); + // print(&800900104); + Epoch::reset_timer(vm, height_now); - print(&800900105); + // print(&800900105); + RecoveryMode::maybe_remove_debug_at_epoch(vm); - // Reconfig should be the last event. - // Reconfigure the network - print(&800900106); - DiemSystem::bulk_update_validators(vm, proposed_set); - print(&800900107); - } + // print(&800900106); - // NOTE: this was previously in propose_new_set since it used the same loop. - // copied implementation from Teams proposal. - fun proof_of_burn( - vm: &signer, nominal_subsidy_per: u64, proposed_set: &vector
- ) { - print(&800800100); - CoreAddresses::assert_vm(vm); - // DiemAccount::migrate_cumu_deposits(vm); // may need to populate data on a migration. - print(&800800101); - Burn::reset_ratios(vm); - print(&800800102); - // 50% of the current per validator reward - let burn_value = nominal_subsidy_per / 2; - print(&800800103); - let vals_to_burn = if ( - !Testnet::is_testnet() && - !StagingNet::is_staging_net() && - DiemConfig::get_current_epoch() > 290 && - // bump up to epoch 290 so people can discuss. - // only implement this burn at a steady state with 90/100 validator - // positions full. Will make the burn amount much smaller over time. - Vector::length
(proposed_set) > 90 - ) { - print(&800800104); - &ValidatorUniverse::get_eligible_validators() - } else { - print(&800800105); - proposed_set - }; - print(&800800106); - print(vals_to_burn); - let i = 0; - while (i < Vector::length
(vals_to_burn)) { - let addr = *Vector::borrow(vals_to_burn, i); - print(&addr); - print(&burn_value); + TransactionFee::epoch_reset_fee_maker(vm); - Burn::epoch_start_burn(vm, addr, burn_value); - i = i + 1; - }; - print(&800800107); + // trigger the thermostat if the reward needs to be adjusted + ProofOfFee::reward_thermostat(vm); + // print(&800900107); + // Reconfig should be the last event. + // Reconfigure the network + DiemSystem::bulk_update_validators(vm, proposed_set); + // print(&800900108); } fun root_service_billing(vm: &signer) { diff --git a/diem-move/diem-framework/DPN/sources/0L/FullnodeSubsidy.move b/diem-move/diem-framework/DPN/sources/0L/FullnodeSubsidy.move index e8ab7cec85..307370e125 100644 --- a/diem-move/diem-framework/DPN/sources/0L/FullnodeSubsidy.move +++ b/diem-move/diem-framework/DPN/sources/0L/FullnodeSubsidy.move @@ -48,6 +48,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm, subsidy); DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, miner, minted_coins, b"fullnode_subsidy", diff --git a/diem-move/diem-framework/DPN/sources/0L/GenesisMigration.move b/diem-move/diem-framework/DPN/sources/0L/GenesisMigration.move index 8bf3d82e82..5746a0e86f 100644 --- a/diem-move/diem-framework/DPN/sources/0L/GenesisMigration.move +++ b/diem-move/diem-framework/DPN/sources/0L/GenesisMigration.move @@ -13,7 +13,7 @@ module GenesisMigration { use DiemFramework::GAS::GAS; use DiemFramework::ValidatorUniverse; use DiemFramework::ValidatorOperatorConfig; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; /// Called by root in genesis to initialize the GAS coin @@ -44,6 +44,7 @@ module GenesisMigration { DiemAccount::vm_deposit_with_metadata( vm, user_addr, + user_addr, minted_coins, b"genesis migration", b"" diff --git a/diem-move/diem-framework/DPN/sources/0L/Jail.move b/diem-move/diem-framework/DPN/sources/0L/Jail.move index b34782c295..a6ab705279 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Jail.move +++ b/diem-move/diem-framework/DPN/sources/0L/Jail.move @@ -19,7 +19,7 @@ address DiemFramework { module Jail { use DiemFramework::CoreAddresses; - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use Std::Signer; use Std::Vector; use DiemFramework::Vouch; @@ -79,26 +79,36 @@ address DiemFramework { } } - public fun self_unjail(sender: &signer) acquires Jail { - // only a validator can un-jail themselves. - let self = Signer::address_of(sender); - - // check the node has been mining before unjailing. - assert!(TowerState::node_above_thresh(self), 100104); - unjail(self); - } + //////// V6 ////// + // V6 NOTE: there's no practical or explicit hurdle that the validator + // needs to overcome now that we have deprecated Towers. + // So absent some other check that is objective, we could + // lean on the Vouch network. + // There was a plan elsewhere discussed to make a + // voucher be the only one that can unjail a validator. + // We can promote that idea in V6. Seems like it fits + // well with POF. + + // public fun self_unjail(sender: &signer) acquires Jail { + // // only a validator can un-jail themselves. + // let self = Signer::address_of(sender); + + // // check the node has been mining before unjailing. + // assert!(TowerState::node_above_thresh(self), 100104); + // unjail(self); + // } public fun vouch_unjail(sender: &signer, addr: address) acquires Jail { // only a validator can un-jail themselves. let voucher = Signer::address_of(sender); let buddies = Vouch::buddies_in_set(addr); - // print(&buddies); + // // print(&buddies); let (is_found, _idx) = Vector::index_of(&buddies, &voucher); assert!(is_found, 100103); - // check the node has been mining before unjailing. - assert!(TowerState::node_above_thresh(addr), 100104); + // // check the node has been mining before unjailing. + // assert!(TowerState::node_above_thresh(addr), 100104); unjail(addr); } diff --git a/diem-move/diem-framework/DPN/sources/0L/MakeWhole.depr b/diem-move/diem-framework/DPN/sources/0L/MakeWhole.depr deleted file mode 100644 index c04501c2a2..0000000000 --- a/diem-move/diem-framework/DPN/sources/0L/MakeWhole.depr +++ /dev/null @@ -1,7977 +0,0 @@ -address 0x1 { - module MakeWhole { - use 0x1::CoreAddresses; - use 0x1::Vector; - use 0x1::Signer; - use 0x1::Diem; - use 0x1::GAS::GAS; - use 0x1::DiemAccount; - use 0x1::Errors; - - struct Payments has key { - payees: vector
, - amounts: vector, - paid: vector, - coins: Diem::Diem, - } - - const EPAYEE_NOT_DELETED: u64 = 22015; - const EWRONG_PAYEE: u64 = 22016; - const EALREADY_PAID: u64 = 22017; - - - public fun make_whole_init(vm: &signer){ - CoreAddresses::assert_diem_root(vm); - if (!exists(CoreAddresses::DIEM_ROOT_ADDRESS())) { - let payees: vector
= Vector::empty
(); - let amounts: vector = Vector::empty(); - - // TODO: A new address and amount must be pushed back for each miner that needs to be repaid - // This can be done more easily in more recent version of move, but it seems 0L currently does not support them. - Vector::push_back
(&mut payees, @0xb94b8aa1b69a47802f8d66a7a33affef); - Vector::push_back(&mut amounts, 85794438); - - Vector::push_back
(&mut payees, @0x613b6d9599f72134a4fa20bba4c75c36); - Vector::push_back(&mut amounts, 85794438); - - Vector::push_back
(&mut payees, @0x7b2eb58b8589a6c36da57c5875b12b0b); - Vector::push_back(&mut amounts, 1419055455); - - Vector::push_back
(&mut payees, @0x1bea7d44bc9d2fa151a393319ab75530); - Vector::push_back(&mut amounts, 286312432); - - Vector::push_back
(&mut payees, @0x5a82287240450b7cc4ba9e09e74a2bd5); - Vector::push_back(&mut amounts, 235518755); - - Vector::push_back
(&mut payees, @0x74745f89883134d270d0a57c6c854b4b); - Vector::push_back(&mut amounts, 4196902216); - - Vector::push_back
(&mut payees, @0x83d389e87414849de5e483dd94ec2f28); - Vector::push_back(&mut amounts, 1632711735); - - Vector::push_back
(&mut payees, @0x53726a2d4ad271f5ee955703ee099d1c); - Vector::push_back(&mut amounts, 1618224973); - - Vector::push_back
(&mut payees, @0xd876c3c28ad5d1a20b23796bf968a422); - Vector::push_back(&mut amounts, 1638279458); - - Vector::push_back
(&mut payees, @0x3c54f7b1c106065ea89623585d1297c7); - Vector::push_back(&mut amounts, 1640419594); - - Vector::push_back
(&mut payees, @0xb3b70da983ec63d88cc53abd266591f8); - Vector::push_back(&mut amounts, 1639583771); - - Vector::push_back
(&mut payees, @0xdc47fbac49a0c711de1b90a68e795d5d); - Vector::push_back(&mut amounts, 1653570804); - - Vector::push_back
(&mut payees, @0xde71bdcfef072856c165f711d4bb327c); - Vector::push_back(&mut amounts, 1668694265); - - Vector::push_back
(&mut payees, @0x5b35607b309843a0099b5b7b5216d360); - Vector::push_back(&mut amounts, 1636010466); - - Vector::push_back
(&mut payees, @0x07d114f33659da59700423a0dad6ce7b); - Vector::push_back(&mut amounts, 1650713203); - - Vector::push_back
(&mut payees, @0x7282cbc15b49127bd207ad4c19c12bfb); - Vector::push_back(&mut amounts, 1647256285); - - Vector::push_back
(&mut payees, @0x9c522bd75cc7a1f6803e98de96284169); - Vector::push_back(&mut amounts, 1661198869); - - Vector::push_back
(&mut payees, @0xcb7a218ebc69ef139b733d83775cf66f); - Vector::push_back(&mut amounts, 1679642886); - - Vector::push_back
(&mut payees, @0x3bae220b259ee2bfd33d844f2a223a47); - Vector::push_back(&mut amounts, 1688287149); - - Vector::push_back
(&mut payees, @0x41c497685d313414e98af14f0543484f); - Vector::push_back(&mut amounts, 1674755187); - - Vector::push_back
(&mut payees, @0xb1cc93b8faecc6c3ba52239eb3452b96); - Vector::push_back(&mut amounts, 1651889731); - - Vector::push_back
(&mut payees, @0x543b4fb6b12092e088e6db90573c6d96); - Vector::push_back(&mut amounts, 1651681533); - - Vector::push_back
(&mut payees, @0x7daae7f9ba449820756b4e207ec33006); - Vector::push_back(&mut amounts, 1651780926); - - Vector::push_back
(&mut payees, @0x2749ee9566399c97828f6e3e83496d66); - Vector::push_back(&mut amounts, 1622281747); - - Vector::push_back
(&mut payees, @0x1bc321f8d224223514cd12afd3ebebcb); - Vector::push_back(&mut amounts, 1614570677); - - Vector::push_back
(&mut payees, @0xad50e8b6c9236b9c4d186797f0ccf5f2); - Vector::push_back(&mut amounts, 1666851318); - - Vector::push_back
(&mut payees, @0xbe0335fcc3113205b3b0ec67711398a3); - Vector::push_back(&mut amounts, 1647840685); - - Vector::push_back
(&mut payees, @0x662114fcbcd16bfb3fce559b5458ee74); - Vector::push_back(&mut amounts, 1332879574); - - Vector::push_back
(&mut payees, @0xf538b64ba66555ba50617fd2ed04153a); - Vector::push_back(&mut amounts, 1353481064); - - Vector::push_back
(&mut payees, @0x5f54a85b86d672edc807946d0eacde7f); - Vector::push_back(&mut amounts, 2203650962); - - Vector::push_back
(&mut payees, @0xa7d8272554725d6d1de6eb089f5e6e9a); - Vector::push_back(&mut amounts, 2206498375); - - Vector::push_back
(&mut payees, @0x240905dd3b6b90d2bc90fafc63c5d198); - Vector::push_back(&mut amounts, 1642731976); - - Vector::push_back
(&mut payees, @0x6374bbc81eddd9533739c439b9ffed0c); - Vector::push_back(&mut amounts, 1632042252); - - Vector::push_back
(&mut payees, @0xc22e383ab15a8f9e4084ac9230bc6936); - Vector::push_back(&mut amounts, 2945723298); - - Vector::push_back
(&mut payees, @0xc464c2be4a6f5b4bd28413699f6d527f); - Vector::push_back(&mut amounts, 3047037557); - - Vector::push_back
(&mut payees, @0x47195a81bf1f66324d3edae1564eb802); - Vector::push_back(&mut amounts, 2437634789); - - Vector::push_back
(&mut payees, @0xab6a140582085c2a4acfd1595e1686cb); - Vector::push_back(&mut amounts, 2446085102); - - Vector::push_back
(&mut payees, @0x9eacae16e4d9f406fda87b1ec021f9ff); - Vector::push_back(&mut amounts, 2426648514); - - Vector::push_back
(&mut payees, @0xe2513703e5df0d2fd8b05654158dbda7); - Vector::push_back(&mut amounts, 2217137093); - - Vector::push_back
(&mut payees, @0xa96e427180d93854e9a41ec9820dcba6); - Vector::push_back(&mut amounts, 2252226734); - - Vector::push_back
(&mut payees, @0x3c639971cab4aaa59d499145e3ab1535); - Vector::push_back(&mut amounts, 2333265469); - - Vector::push_back
(&mut payees, @0x12ad8e25d6d24502167aa7ba664c0ddf); - Vector::push_back(&mut amounts, 2283929604); - - Vector::push_back
(&mut payees, @0x328dff341a2a3a272172c4ac445c4b71); - Vector::push_back(&mut amounts, 2211792276); - - Vector::push_back
(&mut payees, @0xaefefac2767e39cbad4d0ab32adff58f); - Vector::push_back(&mut amounts, 2208960123); - - Vector::push_back
(&mut payees, @0xf3ff6fafa3c5ea214acd930514e06125); - Vector::push_back(&mut amounts, 2183943614); - - Vector::push_back
(&mut payees, @0x50bf9cec5cd43db322eb8e3ff2cd1d34); - Vector::push_back(&mut amounts, 2160322181); - - Vector::push_back
(&mut payees, @0x5edfbf4c520972e9d36e07384b9a37e4); - Vector::push_back(&mut amounts, 2148150941); - - Vector::push_back
(&mut payees, @0x908c2885afbc075a53c6125b0b1ad50a); - Vector::push_back(&mut amounts, 2182124496); - - Vector::push_back
(&mut payees, @0x044e5acc10a1d6ba383e9667d6b8b886); - Vector::push_back(&mut amounts, 2162802896); - - Vector::push_back
(&mut payees, @0xb98f9dc049753834d3a0aecf9a6f1960); - Vector::push_back(&mut amounts, 2029463343); - - Vector::push_back
(&mut payees, @0xf8ae1377cb8a4166c3408b80bea1dc62); - Vector::push_back(&mut amounts, 1996257559); - - Vector::push_back
(&mut payees, @0xb0f01eb296cff738f87e07df35b39a1f); - Vector::push_back(&mut amounts, 478491717); - - Vector::push_back
(&mut payees, @0x744da35c0c7eac6a23144c79f7afbb0a); - Vector::push_back(&mut amounts, 1363608994); - - Vector::push_back
(&mut payees, @0x753e72be1e993d2b469b1987550787b8); - Vector::push_back(&mut amounts, 1358411973); - - Vector::push_back
(&mut payees, @0x0cbfd120dcdbbd8358d0c4ded831d17b); - Vector::push_back(&mut amounts, 484324533); - - Vector::push_back
(&mut payees, @0x45d856b1ba25310561d8aa5f5575c1c0); - Vector::push_back(&mut amounts, 1139015237); - - Vector::push_back
(&mut payees, @0x3fb5330c2b5899edc41d16102222cacf); - Vector::push_back(&mut amounts, 1759773899); - - Vector::push_back
(&mut payees, @0xaa66edcbe676b691ac87f45b95e5467a); - Vector::push_back(&mut amounts, 1634509423); - - Vector::push_back
(&mut payees, @0x098523db266e79ffad2df45480df9041); - Vector::push_back(&mut amounts, 2676547485); - - Vector::push_back
(&mut payees, @0xbe1744c30abefa2260f62e4049eceb1c); - Vector::push_back(&mut amounts, 2258261019); - - Vector::push_back
(&mut payees, @0x80ca4c38988cd6f70a017e141bf7068a); - Vector::push_back(&mut amounts, 2262049384); - - Vector::push_back
(&mut payees, @0x43bd1ba38bfaf8bf81b46521065b5cca); - Vector::push_back(&mut amounts, 2076721754); - - Vector::push_back
(&mut payees, @0x50165494792ff874902a6d624e0066f1); - Vector::push_back(&mut amounts, 2108143298); - - Vector::push_back
(&mut payees, @0x8971b2cb602defc628a7110864547af3); - Vector::push_back(&mut amounts, 2220246184); - - Vector::push_back
(&mut payees, @0x0b02fa610b1ba84351bf74d290b5e7c8); - Vector::push_back(&mut amounts, 2256973634); - - Vector::push_back
(&mut payees, @0xa37997fd15a9bf06fc7c8eff82235af4); - Vector::push_back(&mut amounts, 1690428420); - - Vector::push_back
(&mut payees, @0xb3581f04cd1985d6f5c80410507605a7); - Vector::push_back(&mut amounts, 1498060856); - - Vector::push_back
(&mut payees, @0x5c8aff27002ac0bff02fbf4318304a3a); - Vector::push_back(&mut amounts, 1483283311); - - Vector::push_back
(&mut payees, @0xcefe81e4948954675ca33d53cb5818ed); - Vector::push_back(&mut amounts, 1382166722); - - Vector::push_back
(&mut payees, @0x2595f1802869c1f8d3eb07b47fe4a58d); - Vector::push_back(&mut amounts, 1333689768); - - Vector::push_back
(&mut payees, @0xa6e1103a1045bb1e2970a0c7aa65e180); - Vector::push_back(&mut amounts, 1425546516); - - Vector::push_back
(&mut payees, @0x6f71e21e30f29c1fc8430efa0a7451ac); - Vector::push_back(&mut amounts, 1601136470); - - Vector::push_back
(&mut payees, @0x47c1c8eb30fef756c1376eaeeb2ef184); - Vector::push_back(&mut amounts, 1590391900); - - Vector::push_back
(&mut payees, @0x070e30ca603de3067e2f510879eaa389); - Vector::push_back(&mut amounts, 1584286045); - - Vector::push_back
(&mut payees, @0x086a2f42855967208247682dba0d71fe); - Vector::push_back(&mut amounts, 1678419070); - - Vector::push_back
(&mut payees, @0x6d02ccf040f4c9722b670d816c02feb9); - Vector::push_back(&mut amounts, 1652375787); - - Vector::push_back
(&mut payees, @0x000d01405a2b5f3f875ae98df897222c); - Vector::push_back(&mut amounts, 1624801911); - - Vector::push_back
(&mut payees, @0xe93e077a4093c3da5c33cc2acd2aabcb); - Vector::push_back(&mut amounts, 1680738381); - - Vector::push_back
(&mut payees, @0x590a525a9ad902e51d1bec0677f19abe); - Vector::push_back(&mut amounts, 1675686455); - - Vector::push_back
(&mut payees, @0x5904babb2d996fdf65e0baf405a6504b); - Vector::push_back(&mut amounts, 1585230099); - - Vector::push_back
(&mut payees, @0xea271f9dbeac61d9ffbbb833a590c49b); - Vector::push_back(&mut amounts, 1677955211); - - Vector::push_back
(&mut payees, @0x27529afdddfbd7294c37594ac4d5d4c1); - Vector::push_back(&mut amounts, 1655213062); - - Vector::push_back
(&mut payees, @0x987b9a90ea1e70b2637b15c4e36a6aa1); - Vector::push_back(&mut amounts, 1642324403); - - Vector::push_back
(&mut payees, @0x05c41a075617852d2cddfd9e8ae69177); - Vector::push_back(&mut amounts, 1654380150); - - Vector::push_back
(&mut payees, @0x57d824956b8f1fe86b069852dae82a5a); - Vector::push_back(&mut amounts, 1641665211); - - Vector::push_back
(&mut payees, @0x867f04f5f8f99a57d4c98a6da965ac87); - Vector::push_back(&mut amounts, 1642227062); - - Vector::push_back
(&mut payees, @0x5050ba46dcf513a371564eb36e338e6d); - Vector::push_back(&mut amounts, 1665437774); - - Vector::push_back
(&mut payees, @0xc3930fec6992ec4d965881b01f440737); - Vector::push_back(&mut amounts, 1686904262); - - Vector::push_back
(&mut payees, @0x3ae360a80ad5c68edb5dc1d1479631af); - Vector::push_back(&mut amounts, 1615881485); - - Vector::push_back
(&mut payees, @0xf8e41b78e0d7eef7c6d4731dd819b83b); - Vector::push_back(&mut amounts, 1688716115); - - Vector::push_back
(&mut payees, @0x06b20fd8ba407060b8c76cd82b39a63d); - Vector::push_back(&mut amounts, 1626601967); - - Vector::push_back
(&mut payees, @0x64b70dbeddc7c52d331d926797ffa93a); - Vector::push_back(&mut amounts, 1625849064); - - Vector::push_back
(&mut payees, @0xffaa8a7b976575d9ad145eea3bf4b934); - Vector::push_back(&mut amounts, 1648695927); - - Vector::push_back
(&mut payees, @0xd7002d7cc52dd5066e5e01168a79591e); - Vector::push_back(&mut amounts, 1561276011); - - Vector::push_back
(&mut payees, @0xe450473a77114343341e137995486bb5); - Vector::push_back(&mut amounts, 1552400767); - - Vector::push_back
(&mut payees, @0xe1827272c86577ee4d02505bb46d798c); - Vector::push_back(&mut amounts, 1566214268); - - Vector::push_back
(&mut payees, @0x9c922f53174936961f29a934ce2b4409); - Vector::push_back(&mut amounts, 1553970921); - - Vector::push_back
(&mut payees, @0x1a23ee70b3984ebfee639f77d1a22131); - Vector::push_back(&mut amounts, 1554231055); - - Vector::push_back
(&mut payees, @0xb4a29a3edaca74ad9ed767f8c26d096c); - Vector::push_back(&mut amounts, 1665715985); - - Vector::push_back
(&mut payees, @0xccfbc98cf7ffd6a211878190394428b3); - Vector::push_back(&mut amounts, 1660723511); - - Vector::push_back
(&mut payees, @0x62ab37450a2ad9d141d8f6bb399ca9eb); - Vector::push_back(&mut amounts, 1653971276); - - Vector::push_back
(&mut payees, @0xbd8fc8d68131d6040c0daae0270292e4); - Vector::push_back(&mut amounts, 1605295787); - - Vector::push_back
(&mut payees, @0xd581ad7c890c293a63c1f71d65da03f0); - Vector::push_back(&mut amounts, 1630444216); - - Vector::push_back
(&mut payees, @0x2695407c8107717e495bd1c24d43f322); - Vector::push_back(&mut amounts, 1680393966); - - Vector::push_back
(&mut payees, @0xcf8d65eeaca9a6863d057b778ee24e12); - Vector::push_back(&mut amounts, 1648388554); - - Vector::push_back
(&mut payees, @0x2c6cfef082e833308c21a5ece621e8d1); - Vector::push_back(&mut amounts, 1665429173); - - Vector::push_back
(&mut payees, @0xa8382f5c5c07978cd28d321499aac49c); - Vector::push_back(&mut amounts, 1663808531); - - Vector::push_back
(&mut payees, @0x1a6cdc5ed178a2fe49b1c2cc2f60c06a); - Vector::push_back(&mut amounts, 2091715486); - - Vector::push_back
(&mut payees, @0x5910ae2439a7d4e024d0518682efa771); - Vector::push_back(&mut amounts, 2058162353); - - Vector::push_back
(&mut payees, @0x02485b620ce54f8943d666a3db932e28); - Vector::push_back(&mut amounts, 2026161025); - - Vector::push_back
(&mut payees, @0xd8956ce10a22c034056fe7ef4a43b48e); - Vector::push_back(&mut amounts, 2086558820); - - Vector::push_back
(&mut payees, @0x43df98c689a2497d9e625a51684717da); - Vector::push_back(&mut amounts, 2018481310); - - Vector::push_back
(&mut payees, @0x4f2fc6394e5e73fc6f7d91a98cb74f26); - Vector::push_back(&mut amounts, 2224686631); - - Vector::push_back
(&mut payees, @0x0a30e5a6bdaa26b4eb3e755078be14bc); - Vector::push_back(&mut amounts, 2194991630); - - Vector::push_back
(&mut payees, @0xf4a40c8d47d49984c1f3ff5a31895941); - Vector::push_back(&mut amounts, 2146111250); - - Vector::push_back
(&mut payees, @0x67f7fa1369b7b3ed0ef34dd04811cf1e); - Vector::push_back(&mut amounts, 2258955613); - - Vector::push_back
(&mut payees, @0x1a61af18bce2c7355dad1916f70e5341); - Vector::push_back(&mut amounts, 2189474888); - - Vector::push_back
(&mut payees, @0x22fb9aa5b4f8aac786a0752a22d53eb3); - Vector::push_back(&mut amounts, 2227740827); - - Vector::push_back
(&mut payees, @0x1f41da5b1216ba90be7cd0f9aafce276); - Vector::push_back(&mut amounts, 2170875121); - - Vector::push_back
(&mut payees, @0x2844a9d716153213263de5f333982d29); - Vector::push_back(&mut amounts, 2032735356); - - Vector::push_back
(&mut payees, @0x40eaed88c828649f06976386be3aa35f); - Vector::push_back(&mut amounts, 2068813186); - - Vector::push_back
(&mut payees, @0x2678e7c2be4708df1bdea9856ab399e5); - Vector::push_back(&mut amounts, 1846340083); - - Vector::push_back
(&mut payees, @0x60ad6155e2a1d755320185712cd6561b); - Vector::push_back(&mut amounts, 1803767432); - - Vector::push_back
(&mut payees, @0x1e069560db9a03ee802ab712313f43d4); - Vector::push_back(&mut amounts, 1827871725); - - Vector::push_back
(&mut payees, @0xee5cc2fb7392bc82ed11bb464eb2726a); - Vector::push_back(&mut amounts, 1771256771); - - Vector::push_back
(&mut payees, @0x772afce4cd2254ad07c022303c1e7623); - Vector::push_back(&mut amounts, 1733891293); - - Vector::push_back
(&mut payees, @0x3f3fa98d4aede7719097d95870189834); - Vector::push_back(&mut amounts, 1795793165); - - Vector::push_back
(&mut payees, @0xa912beae04db774df58af0defdeb1fe6); - Vector::push_back(&mut amounts, 1785879441); - - Vector::push_back
(&mut payees, @0xab9baaf1bd5f8b26f0beeb4138c2321a); - Vector::push_back(&mut amounts, 1356792658); - - Vector::push_back
(&mut payees, @0x5579e00dd85886a7dbc714104bd685a3); - Vector::push_back(&mut amounts, 2371136880); - - Vector::push_back
(&mut payees, @0x86ea91e266287d11011f5c0b3963d2ea); - Vector::push_back(&mut amounts, 1190501514); - - Vector::push_back
(&mut payees, @0x3047f2504d9564f2a510a242313d5030); - Vector::push_back(&mut amounts, 898761627); - - Vector::push_back
(&mut payees, @0x05b4f2851ee79affadd7be9a84d17c38); - Vector::push_back(&mut amounts, 259415072); - - Vector::push_back
(&mut payees, @0x7fb18bdae9df23b2f51d85b1d27428a2); - Vector::push_back(&mut amounts, 1599431284); - - Vector::push_back
(&mut payees, @0x322e6fbd4f5241ef40ad022d90fd22bb); - Vector::push_back(&mut amounts, 2172491064); - - Vector::push_back
(&mut payees, @0x50466f7a4b17752c68ee300d3d5836b8); - Vector::push_back(&mut amounts, 1555117724); - - Vector::push_back
(&mut payees, @0x5f733353bee56f9474e633d7c9e9d1ae); - Vector::push_back(&mut amounts, 3966444802); - - Vector::push_back
(&mut payees, @0xcb4a7682cdc9b0e119f655b396117428); - Vector::push_back(&mut amounts, 1655881636); - - Vector::push_back
(&mut payees, @0x62050c41cabc6ef0134c7e743db5b759); - Vector::push_back(&mut amounts, 1526733650); - - Vector::push_back
(&mut payees, @0xcdfdb9ab370d6394433f68e7e0456811); - Vector::push_back(&mut amounts, 1625862546); - - Vector::push_back
(&mut payees, @0x41e65a6be60cc04a6d5e29621ab7f656); - Vector::push_back(&mut amounts, 1610613215); - - Vector::push_back
(&mut payees, @0x2bbbbb0d7a96d33e377f92cf1204d769); - Vector::push_back(&mut amounts, 1593664988); - - Vector::push_back
(&mut payees, @0xbb3efc310cf88a5fea5158b5a0ad08d6); - Vector::push_back(&mut amounts, 2059326118); - - Vector::push_back
(&mut payees, @0xa2fc4a246a73db4d5fed58f127fddfa1); - Vector::push_back(&mut amounts, 1669994277); - - Vector::push_back
(&mut payees, @0x08834e3e901cd0031171ba4c11d844cb); - Vector::push_back(&mut amounts, 1577315730); - - Vector::push_back
(&mut payees, @0x124a91e5782cf40a1376faf84bd65c44); - Vector::push_back(&mut amounts, 1552861434); - - Vector::push_back
(&mut payees, @0x2da26cdf7425bdbc48b62ebfde875d1c); - Vector::push_back(&mut amounts, 1678413310); - - Vector::push_back
(&mut payees, @0x7ca19673009dfcd330e211b869e94fcb); - Vector::push_back(&mut amounts, 3715538735); - - Vector::push_back
(&mut payees, @0x3b5e203a65ed0b4a0aec2ef9aaf8c75c); - Vector::push_back(&mut amounts, 1637577704); - - Vector::push_back
(&mut payees, @0xc9298bb80b6fb3fa37add402bd238d88); - Vector::push_back(&mut amounts, 1545357799); - - Vector::push_back
(&mut payees, @0x60ec45a6bac1629b62104708a877defe); - Vector::push_back(&mut amounts, 1609236565); - - Vector::push_back
(&mut payees, @0xa22924e1406b191d99faf7b0f41e3775); - Vector::push_back(&mut amounts, 1439577407); - - Vector::push_back
(&mut payees, @0xaf0ab505c21cd483e8c901ba62d27e0e); - Vector::push_back(&mut amounts, 4245456020); - - Vector::push_back
(&mut payees, @0x5219f9db22242e66492118b6ee2ccb7d); - Vector::push_back(&mut amounts, 1670096457); - - Vector::push_back
(&mut payees, @0x36f80e4e750caf30d2cf7a54888c7ba9); - Vector::push_back(&mut amounts, 1630163694); - - Vector::push_back
(&mut payees, @0xc0fc6b93612ada367c0b1240afd4d8a8); - Vector::push_back(&mut amounts, 1660602909); - - Vector::push_back
(&mut payees, @0xb8db505a67af28b0c095d2b85cc5828a); - Vector::push_back(&mut amounts, 1675115569); - - Vector::push_back
(&mut payees, @0x87382b8180ec748babfecd1b66527c7c); - Vector::push_back(&mut amounts, 1650933781); - - Vector::push_back
(&mut payees, @0xa5cfdc2e4d661e403f4183b01c13e82f); - Vector::push_back(&mut amounts, 1506707236); - - Vector::push_back
(&mut payees, @0x8f9f792f069d4d55b160f640cede0ed9); - Vector::push_back(&mut amounts, 1696165039); - - Vector::push_back
(&mut payees, @0xa86a98c1e0961f26cd3d882a6e11d853); - Vector::push_back(&mut amounts, 1358886852); - - Vector::push_back
(&mut payees, @0xdefb8c06ba7b9ed58a108fed3d4f4422); - Vector::push_back(&mut amounts, 1436195261); - - Vector::push_back
(&mut payees, @0x3875f46b96f3a044e1b88945ebfe9c94); - Vector::push_back(&mut amounts, 931882690); - - Vector::push_back
(&mut payees, @0x05dd4b69a541ba7231d77248a29ad99d); - Vector::push_back(&mut amounts, 1436183271); - - Vector::push_back
(&mut payees, @0xa442b36e25691fc3d3d96cbf91686e98); - Vector::push_back(&mut amounts, 632909149); - - Vector::push_back
(&mut payees, @0x49ac56edff9423691c774b3e8f797ef2); - Vector::push_back(&mut amounts, 1981676487); - - Vector::push_back
(&mut payees, @0x5e8b9eb9fb5b807c4d2148f7fa3a0c67); - Vector::push_back(&mut amounts, 802025956); - - Vector::push_back
(&mut payees, @0x1a17c34bb0aac74c0589d0b68347e56f); - Vector::push_back(&mut amounts, 1276800491); - - Vector::push_back
(&mut payees, @0x588a30ab42221065c513b48c01e9e1c5); - Vector::push_back(&mut amounts, 586200428); - - Vector::push_back
(&mut payees, @0xe2ffff37e1e882905f6f6380b21b6ad7); - Vector::push_back(&mut amounts, 590098170); - - Vector::push_back
(&mut payees, @0x9783ea34cde3dc682cfca4b11b6b4dae); - Vector::push_back(&mut amounts, 596006320); - - Vector::push_back
(&mut payees, @0xeb3bbc48f62eb771be12396da12a65ef); - Vector::push_back(&mut amounts, 604407150); - - Vector::push_back
(&mut payees, @0x0909d78b0d3beb0d6458b81d405fb56a); - Vector::push_back(&mut amounts, 590323109); - - Vector::push_back
(&mut payees, @0x1ad3b45cd2176a3aaca9e52fe90e1114); - Vector::push_back(&mut amounts, 588208899); - - Vector::push_back
(&mut payees, @0xdf72c26c56fa4b619be87dbdd24e29e3); - Vector::push_back(&mut amounts, 590245690); - - Vector::push_back
(&mut payees, @0x2c4f3ef8cba6c8a3aa3ea5d310bfc67b); - Vector::push_back(&mut amounts, 459167406); - - Vector::push_back
(&mut payees, @0x81bb33a08011fe4d11c35d661d3b27ab); - Vector::push_back(&mut amounts, 471235805); - - Vector::push_back
(&mut payees, @0xbdea0dd65034916e446c41f65fe9456e); - Vector::push_back(&mut amounts, 648825948); - - Vector::push_back
(&mut payees, @0xae92c3d30a13b32c19ae109a9ef45de3); - Vector::push_back(&mut amounts, 1355320411); - - Vector::push_back
(&mut payees, @0xdd1fa1797cb5835bd8614d6cd1bb5da8); - Vector::push_back(&mut amounts, 294711730); - - Vector::push_back
(&mut payees, @0xc191aa38030faa7aee9815c6595ef8cc); - Vector::push_back(&mut amounts, 1368325740); - - Vector::push_back
(&mut payees, @0xb774e9979a218125b32f48e1842e80d2); - Vector::push_back(&mut amounts, 333554863); - - Vector::push_back
(&mut payees, @0x3b32f656aeef1c076097a3042b90385b); - Vector::push_back(&mut amounts, 882517968); - - Vector::push_back
(&mut payees, @0xa32ff04bc85df3abe72c5bffc12156f7); - Vector::push_back(&mut amounts, 503158134); - - Vector::push_back
(&mut payees, @0x6592b386d8c8475d741e666a363721e0); - Vector::push_back(&mut amounts, 329841592); - - Vector::push_back
(&mut payees, @0xbf5b14d29c9b52260ea3290c9510685f); - Vector::push_back(&mut amounts, 2635190256); - - Vector::push_back
(&mut payees, @0xa5057841ebc5c2f9d76481d50745efd5); - Vector::push_back(&mut amounts, 2453568873); - - Vector::push_back
(&mut payees, @0xaeeec279b8f7be8bfd75e7afb06f3849); - Vector::push_back(&mut amounts, 2711000382); - - Vector::push_back
(&mut payees, @0x46c72fedb2b6735a6617c2632f8ace3b); - Vector::push_back(&mut amounts, 3218240991); - - Vector::push_back
(&mut payees, @0x983efe00d7f1b5ed3095d6376e93b9de); - Vector::push_back(&mut amounts, 2177843604); - - Vector::push_back
(&mut payees, @0x7597ca5392c2bec4843a37eaed689288); - Vector::push_back(&mut amounts, 5008428197); - - Vector::push_back
(&mut payees, @0xd42d0aeac06a7477b7a68346136a12c8); - Vector::push_back(&mut amounts, 6578753494); - - Vector::push_back
(&mut payees, @0x8421cb22e56f687395f5973bbf0cbdfb); - Vector::push_back(&mut amounts, 1978653652); - - Vector::push_back
(&mut payees, @0xe8ae01541078d83b713f0782628650ee); - Vector::push_back(&mut amounts, 2564889449); - - Vector::push_back
(&mut payees, @0xfe5e9be5950a2baf19804478ac054c4b); - Vector::push_back(&mut amounts, 784438254); - - Vector::push_back
(&mut payees, @0xc3b87fda83b5bd65ce8afa0a62fedded); - Vector::push_back(&mut amounts, 2247377152); - - Vector::push_back
(&mut payees, @0xa1fbce9eb29d0b9e67cbe69abe975cd1); - Vector::push_back(&mut amounts, 2684244548); - - Vector::push_back
(&mut payees, @0x9bbf2287831ab440f331bc94de1b616a); - Vector::push_back(&mut amounts, 2929572880); - - Vector::push_back
(&mut payees, @0x57e870b95be77187ec9f80afac8df761); - Vector::push_back(&mut amounts, 3423844476); - - Vector::push_back
(&mut payees, @0x48a15ad2caad3daefe92988b8c099abb); - Vector::push_back(&mut amounts, 4858869210); - - Vector::push_back
(&mut payees, @0x79e798987f62bc88eca07b58b3351824); - Vector::push_back(&mut amounts, 4418380409); - - Vector::push_back
(&mut payees, @0xa7f32b2a5a8a73f08a6742b616e3ce4b); - Vector::push_back(&mut amounts, 2346192888); - - Vector::push_back
(&mut payees, @0x00104782518b8368f963d550b7c94209); - Vector::push_back(&mut amounts, 2188465088); - - Vector::push_back
(&mut payees, @0xe59e3d102ad890cabda449092bfd9e69); - Vector::push_back(&mut amounts, 147017804); - - Vector::push_back
(&mut payees, @0x8d2af531022d6fd76f98661b95da3cf6); - Vector::push_back(&mut amounts, 689575204); - - Vector::push_back
(&mut payees, @0xdcf8fd880e9b155104a8d40e7edbc3a7); - Vector::push_back(&mut amounts, 486911190); - - Vector::push_back
(&mut payees, @0xc0099ab5aec4849f2c4ecbcd7af4ac32); - Vector::push_back(&mut amounts, 464524498); - - Vector::push_back
(&mut payees, @0xeb0d6ebbc1ece305682312dd1b706407); - Vector::push_back(&mut amounts, 985944073); - - Vector::push_back
(&mut payees, @0x3497dcd64b13e3d3c42634ca7ce2153c); - Vector::push_back(&mut amounts, 433778604); - - Vector::push_back
(&mut payees, @0xab6da4854443c0093290e04da814c48f); - Vector::push_back(&mut amounts, 356407076); - - Vector::push_back
(&mut payees, @0x9279ee513c9afefe0e7ddf2f3c7abb88); - Vector::push_back(&mut amounts, 5263793373); - - Vector::push_back
(&mut payees, @0x754ebf04a9478c549c6c8ca5d29cbd0d); - Vector::push_back(&mut amounts, 1415920995); - - Vector::push_back
(&mut payees, @0x4a922b47c180a59383fa435b8923b52c); - Vector::push_back(&mut amounts, 427646242); - - Vector::push_back
(&mut payees, @0x6acbc3b1ec4ddf7bf85801e32aec3c45); - Vector::push_back(&mut amounts, 5176263868); - - Vector::push_back
(&mut payees, @0xf250b723e488fe6f32a8f512b6379ecb); - Vector::push_back(&mut amounts, 2749772298); - - Vector::push_back
(&mut payees, @0x7efc95a19e1c8d7e38e730ddb7b34332); - Vector::push_back(&mut amounts, 2165291178); - - Vector::push_back
(&mut payees, @0x5d2015186dbc5727d4ff45528d169f0d); - Vector::push_back(&mut amounts, 5615499835); - - Vector::push_back
(&mut payees, @0x5479ce9086e36d5d540eb35ea34fb291); - Vector::push_back(&mut amounts, 4294788294); - - Vector::push_back
(&mut payees, @0x6498aee4af012802362721361210484a); - Vector::push_back(&mut amounts, 3006021775); - - Vector::push_back
(&mut payees, @0x6179b9e8d844c0906fa5cb70b807c295); - Vector::push_back(&mut amounts, 5788959097); - - Vector::push_back
(&mut payees, @0x68b6d5503a5a0ce2a6f8027ec481ec7c); - Vector::push_back(&mut amounts, 5202609247); - - Vector::push_back
(&mut payees, @0xf5c74530fbdb8e4fb9a11df0c98e553e); - Vector::push_back(&mut amounts, 5189753280); - - Vector::push_back
(&mut payees, @0x779fd01dfe608a4288b4b514d17da48b); - Vector::push_back(&mut amounts, 839274092); - - Vector::push_back
(&mut payees, @0x7a85639ce8923ecebac4d89ff968df12); - Vector::push_back(&mut amounts, 5567039320); - - Vector::push_back
(&mut payees, @0x47bcde97da006d467fcb4ce25f7e96e4); - Vector::push_back(&mut amounts, 5022606631); - - Vector::push_back
(&mut payees, @0x1c03e956dd7afc612e4efe240c23365d); - Vector::push_back(&mut amounts, 1208933830); - - Vector::push_back
(&mut payees, @0x0329f10f139c2b58cf7195c3e560f751); - Vector::push_back(&mut amounts, 5299125406); - - Vector::push_back
(&mut payees, @0x06b8a51ea859408a82b93388eeb877c3); - Vector::push_back(&mut amounts, 5386655559); - - Vector::push_back
(&mut payees, @0x5846a6af218acc6d99bc7a54d2649e5d); - Vector::push_back(&mut amounts, 4346294222); - - Vector::push_back
(&mut payees, @0xe985cbb111a6e7210f1f07aa1f8a75dd); - Vector::push_back(&mut amounts, 3864626698); - - Vector::push_back
(&mut payees, @0x0a5dec37f0fbb014b1071d224660a260); - Vector::push_back(&mut amounts, 5390988868); - - Vector::push_back
(&mut payees, @0x66b628974b5b5d59b28416276cf3434b); - Vector::push_back(&mut amounts, 3566384565); - - Vector::push_back
(&mut payees, @0x52ef98ab89717b958b84ffa8619d5eec); - Vector::push_back(&mut amounts, 4756582963); - - Vector::push_back
(&mut payees, @0x3ae58c7d166b385954b5d7dd12e28e65); - Vector::push_back(&mut amounts, 4445333909); - - Vector::push_back
(&mut payees, @0xeee71da3d631e81ac8a804b629c3d8f9); - Vector::push_back(&mut amounts, 5294872886); - - Vector::push_back
(&mut payees, @0x5c0f70485dcd1f3084affc9b50847f92); - Vector::push_back(&mut amounts, 5399584113); - - Vector::push_back
(&mut payees, @0x00717c6028cfe2338a644fa5011c5941); - Vector::push_back(&mut amounts, 6137383097); - - Vector::push_back
(&mut payees, @0x17d277fe88c4a4d22f29553b70def4c0); - Vector::push_back(&mut amounts, 2113754464); - - Vector::push_back
(&mut payees, @0xe264023342b41accdbb61a190b6cb2a7); - Vector::push_back(&mut amounts, 4889845350); - - Vector::push_back
(&mut payees, @0xbba20d1e57dc0ee0ef56a2dc3a058ca4); - Vector::push_back(&mut amounts, 746891082); - - Vector::push_back
(&mut payees, @0x3d9dfecece643c772810161af84c89f7); - Vector::push_back(&mut amounts, 3003295481); - - Vector::push_back
(&mut payees, @0x0ef85e1723530edd76f2bb13614ac5c5); - Vector::push_back(&mut amounts, 926335622); - - Vector::push_back
(&mut payees, @0xd03a4bd3d92a8a9aec44a5d83c41674b); - Vector::push_back(&mut amounts, 4238422765); - - Vector::push_back
(&mut payees, @0xa4987f392e32442229f15fb73dac5e50); - Vector::push_back(&mut amounts, 3492957553); - - Vector::push_back
(&mut payees, @0x21cd09faf46f73533e58e11ee1f4fe62); - Vector::push_back(&mut amounts, 2577668491); - - Vector::push_back
(&mut payees, @0x0a5ebedef02da43222b82fe419c97a40); - Vector::push_back(&mut amounts, 1272424330); - - Vector::push_back
(&mut payees, @0x756d518db499a22c1dad0e2ee353c21d); - Vector::push_back(&mut amounts, 4190181052); - - Vector::push_back
(&mut payees, @0xac1de724c0cea61b55c29394b595f95b); - Vector::push_back(&mut amounts, 4153926652); - - Vector::push_back
(&mut payees, @0x199c55469075a3f96880d4a63e74dcf4); - Vector::push_back(&mut amounts, 1589763717); - - Vector::push_back
(&mut payees, @0xe77ddb76c9afcb3d5511e46cbc89023d); - Vector::push_back(&mut amounts, 2034701714); - - Vector::push_back
(&mut payees, @0xf90d6e620b0f53df1675d6c15a3a2b7c); - Vector::push_back(&mut amounts, 1912843841); - - Vector::push_back
(&mut payees, @0x749b9d353724b2844d4aae34125ce1d0); - Vector::push_back(&mut amounts, 5591197992); - - Vector::push_back
(&mut payees, @0x8a446db47cfb62ba00e6111a3cdefd04); - Vector::push_back(&mut amounts, 5020095272); - - Vector::push_back
(&mut payees, @0xb3d680cd888d0d067af852caf7512a23); - Vector::push_back(&mut amounts, 5434146816); - - Vector::push_back
(&mut payees, @0x3ff4882ed2a2c894443701bdf7506d3f); - Vector::push_back(&mut amounts, 4328522059); - - Vector::push_back
(&mut payees, @0xde3ee4da7b1779a78fef729bf88fd465); - Vector::push_back(&mut amounts, 3514145979); - - Vector::push_back
(&mut payees, @0x382f1d6be4aad83ab646ee123d60be60); - Vector::push_back(&mut amounts, 2941782286); - - Vector::push_back
(&mut payees, @0x83504d7263dca66fe97109233cf1eb12); - Vector::push_back(&mut amounts, 2600369094); - - Vector::push_back
(&mut payees, @0x22f09282869112d71d5d8196c6178c7c); - Vector::push_back(&mut amounts, 4845833768); - - Vector::push_back
(&mut payees, @0x9eac9413282071760fd94e84faee931b); - Vector::push_back(&mut amounts, 4084713078); - - Vector::push_back
(&mut payees, @0x4be425e5306776a0bd9e2db152b856e6); - Vector::push_back(&mut amounts, 6710604885); - - Vector::push_back
(&mut payees, @0x733c4caa99f3fa11dddc80f27d014344); - Vector::push_back(&mut amounts, 747547121); - - Vector::push_back
(&mut payees, @0xee221338e87976c3d18c6673735aa4ce); - Vector::push_back(&mut amounts, 174828006); - - Vector::push_back
(&mut payees, @0xbca52657ab18aadee8a66becc82a4031); - Vector::push_back(&mut amounts, 6944333375); - - Vector::push_back
(&mut payees, @0x71628c08dddd6926d933d6ee57d2cfb9); - Vector::push_back(&mut amounts, 3490662668); - - Vector::push_back
(&mut payees, @0x2c3d4d3278cc74f346e7283a7f89383e); - Vector::push_back(&mut amounts, 2201468635); - - Vector::push_back
(&mut payees, @0x7385899948ad7463007d3b90786c391a); - Vector::push_back(&mut amounts, 4422603514); - - Vector::push_back
(&mut payees, @0xff15a52fecefed9e4476477a1a119767); - Vector::push_back(&mut amounts, 3429494588); - - Vector::push_back
(&mut payees, @0xa117aa80ce9add73e443791c17232448); - Vector::push_back(&mut amounts, 5386511623); - - Vector::push_back
(&mut payees, @0x562c6735970b233cd8032ecf718421f9); - Vector::push_back(&mut amounts, 1156523125); - - Vector::push_back
(&mut payees, @0xa654aab809f6562c3ee62c5a6ef43eb7); - Vector::push_back(&mut amounts, 3891541528); - - Vector::push_back
(&mut payees, @0xe2cfdbfc970da38c1f11bb2bf939fb2a); - Vector::push_back(&mut amounts, 4294165785); - - Vector::push_back
(&mut payees, @0x720d3107684174cf114904c7aafed6c6); - Vector::push_back(&mut amounts, 3099924901); - - Vector::push_back
(&mut payees, @0xd460f367df5e03ed05c87c4a54902915); - Vector::push_back(&mut amounts, 3318709800); - - Vector::push_back
(&mut payees, @0xeb61a0036cbecd183b5eb9fc03f597b5); - Vector::push_back(&mut amounts, 3865444201); - - Vector::push_back
(&mut payees, @0x23a14159ad0de5f4c6a4c3856736a060); - Vector::push_back(&mut amounts, 3920406911); - - Vector::push_back
(&mut payees, @0x562945a0318e392740f25e9630f10ea9); - Vector::push_back(&mut amounts, 7294763560); - - Vector::push_back
(&mut payees, @0xa3656a653f356002d16457353a3e97bb); - Vector::push_back(&mut amounts, 4312987200); - - Vector::push_back
(&mut payees, @0xded5ab32af77723987af26413b112862); - Vector::push_back(&mut amounts, 5456780100); - - Vector::push_back
(&mut payees, @0x40ed7061ce593a448fec341041209955); - Vector::push_back(&mut amounts, 6213775503); - - Vector::push_back
(&mut payees, @0xc8221126329265df7494eb4ef72f42df); - Vector::push_back(&mut amounts, 7049113672); - - Vector::push_back
(&mut payees, @0x4e8ae80fb0a869c52c9644297afea09b); - Vector::push_back(&mut amounts, 1037051028); - - Vector::push_back
(&mut payees, @0x409ab37d13b0099f5b209f0568d95a23); - Vector::push_back(&mut amounts, 6812828822); - - Vector::push_back
(&mut payees, @0x3c41e3a59d75a505f9b0416512d0d6b7); - Vector::push_back(&mut amounts, 938866965); - - Vector::push_back
(&mut payees, @0xd0ccf388975f81b387a0b0bf931900c7); - Vector::push_back(&mut amounts, 384932503); - - Vector::push_back
(&mut payees, @0xc9236c9fbe8f79aef0fbf666aad22a21); - Vector::push_back(&mut amounts, 131136949); - - Vector::push_back
(&mut payees, @0x608e87e275c94ffc69dca73726d7f446); - Vector::push_back(&mut amounts, 131136949); - - Vector::push_back
(&mut payees, @0xe94cfd3e87ebc254e78e32db6cd873b5); - Vector::push_back(&mut amounts, 941548980); - - Vector::push_back
(&mut payees, @0x374af873fb04f4c4d679e8894360c256); - Vector::push_back(&mut amounts, 2778660605); - - Vector::push_back
(&mut payees, @0xea7782a50dabc1a18d2c6d06819bffcb); - Vector::push_back(&mut amounts, 5259395536); - - Vector::push_back
(&mut payees, @0x29dc2d569a6489376b56521e18a0ab3d); - Vector::push_back(&mut amounts, 4677670142); - - Vector::push_back
(&mut payees, @0xbae47d4a4f4a3ffc21ac5bfe1d782e08); - Vector::push_back(&mut amounts, 1838446869); - - Vector::push_back
(&mut payees, @0xa38e7b75d69dbf478cceb9df06190b4c); - Vector::push_back(&mut amounts, 4524433345); - - Vector::push_back
(&mut payees, @0x8e45677162e4fbfe7252e3c96eee3e06); - Vector::push_back(&mut amounts, 5797227581); - - Vector::push_back
(&mut payees, @0xa65ca0b697c91efdc8521b4e751d391a); - Vector::push_back(&mut amounts, 6465441781); - - Vector::push_back
(&mut payees, @0x0285159467a10a77a50dfa40ddda5ff1); - Vector::push_back(&mut amounts, 4181267529); - - Vector::push_back
(&mut payees, @0xd8f82ce59686dd9f11e53ac3372e39d6); - Vector::push_back(&mut amounts, 3662222258); - - Vector::push_back
(&mut payees, @0x4b6a22131b71adb1d14dc74c191e78bc); - Vector::push_back(&mut amounts, 2883829806); - - Vector::push_back
(&mut payees, @0x08b5d088d55667b2b44ba8171d8515f9); - Vector::push_back(&mut amounts, 4599077628); - - Vector::push_back
(&mut payees, @0xd7aa7ee6e574a7263713dd1ec2fde155); - Vector::push_back(&mut amounts, 5158135890); - - Vector::push_back
(&mut payees, @0x35b6a7ed524874ceee7a6d8dc00a9693); - Vector::push_back(&mut amounts, 1895249905); - - Vector::push_back
(&mut payees, @0xf622ff0432f9c477d7f32645eb791d2a); - Vector::push_back(&mut amounts, 4633782244); - - Vector::push_back
(&mut payees, @0x7bfb6890025f47a7812714cd60710849); - Vector::push_back(&mut amounts, 3162911133); - - Vector::push_back
(&mut payees, @0x2000146c871fc552339f9b1718c0b975); - Vector::push_back(&mut amounts, 5542409685); - - Vector::push_back
(&mut payees, @0x54be57c4ccdbdcc56dd4ce115cf774f1); - Vector::push_back(&mut amounts, 3134479170); - - Vector::push_back
(&mut payees, @0x003a47a42fa29a9f63c0f80c431e6964); - Vector::push_back(&mut amounts, 7552385684); - - Vector::push_back
(&mut payees, @0xf448b74936c38b47b22aeb2381272d68); - Vector::push_back(&mut amounts, 85794438); - - Vector::push_back
(&mut payees, @0x51f32b3c6c3e20eb6ea25874ab737f27); - Vector::push_back(&mut amounts, 3150945677); - - Vector::push_back
(&mut payees, @0x7025d084887b0688fc8e324ad1391479); - Vector::push_back(&mut amounts, 2113597099); - - Vector::push_back
(&mut payees, @0xcd888a3da562fc5d0d7a31d609b52eb1); - Vector::push_back(&mut amounts, 1114833587); - - Vector::push_back
(&mut payees, @0x77e8601adf1fed32dfe09ea7c938b2f9); - Vector::push_back(&mut amounts, 3063459668); - - Vector::push_back
(&mut payees, @0xc10328ecdea3c0c8da49c79e96d809c0); - Vector::push_back(&mut amounts, 2824423475); - - Vector::push_back
(&mut payees, @0x66ff206ad30daeebff8b55fca2241a4a); - Vector::push_back(&mut amounts, 7273102837); - - Vector::push_back
(&mut payees, @0x4cb136b1ff72bc1e83ab468739219be0); - Vector::push_back(&mut amounts, 2858032528); - - Vector::push_back
(&mut payees, @0xdc297119242aace22ab6b5e1e4372e59); - Vector::push_back(&mut amounts, 2816997238); - - Vector::push_back
(&mut payees, @0x129f3cdcc32b119628177f56b9a65dff); - Vector::push_back(&mut amounts, 2839466399); - - Vector::push_back
(&mut payees, @0x1555565d02f38a0f01033c519e21a6e6); - Vector::push_back(&mut amounts, 2821145932); - - Vector::push_back
(&mut payees, @0xa4295b144805abfcf755fd2eb3683110); - Vector::push_back(&mut amounts, 2816608529); - - Vector::push_back
(&mut payees, @0x5edd1d187b4fca5325ecff4ac8a42023); - Vector::push_back(&mut amounts, 8016270758); - - Vector::push_back
(&mut payees, @0xb3279314fe85282d2f50a0c290ca83c0); - Vector::push_back(&mut amounts, 2830042333); - - Vector::push_back
(&mut payees, @0x933e6fd4c2e5896d065cd916d8ac65a5); - Vector::push_back(&mut amounts, 2854168236); - - Vector::push_back
(&mut payees, @0x88d2ed4905f65b8b841e1707069126e2); - Vector::push_back(&mut amounts, 5466316703); - - Vector::push_back
(&mut payees, @0xdee1a11c0a2f1cee7c1409d606d94501); - Vector::push_back(&mut amounts, 3973667204); - - Vector::push_back
(&mut payees, @0x443898ef3b16239e6c1921b1b5f585aa); - Vector::push_back(&mut amounts, 4327697151); - - Vector::push_back
(&mut payees, @0x1910ca1429ac0e71cf8a7ab7cc546ff6); - Vector::push_back(&mut amounts, 1490445161); - - Vector::push_back
(&mut payees, @0x102f5f8fb243ecf41d98f49f98712fff); - Vector::push_back(&mut amounts, 1882588156); - - Vector::push_back
(&mut payees, @0xefff3721c356f7d95f08aa780a447df9); - Vector::push_back(&mut amounts, 9144471649); - - Vector::push_back
(&mut payees, @0x2d7cee663acd936d98c03ec00b787cd6); - Vector::push_back(&mut amounts, 4957936148); - - Vector::push_back
(&mut payees, @0x33eb7e29634cf801aed532526db80830); - Vector::push_back(&mut amounts, 1891033053); - - Vector::push_back
(&mut payees, @0x85eae0bda113df19d7db8f20899bbf84); - Vector::push_back(&mut amounts, 1917532941); - - Vector::push_back
(&mut payees, @0x78db4ef8299e06a99abd7b47c51310f0); - Vector::push_back(&mut amounts, 1912369803); - - Vector::push_back
(&mut payees, @0xfdb3872d5906e756083e830483745b89); - Vector::push_back(&mut amounts, 5091490990); - - Vector::push_back
(&mut payees, @0xf07d8be3d6042a9830f6c9765112adb9); - Vector::push_back(&mut amounts, 1907580480); - - Vector::push_back
(&mut payees, @0x9e13fe49c6fe6855aa68c891bcb17354); - Vector::push_back(&mut amounts, 1911703016); - - Vector::push_back
(&mut payees, @0x202d50484348b63f616012b28a3b98ff); - Vector::push_back(&mut amounts, 1904752550); - - Vector::push_back
(&mut payees, @0xcd0002f20fac0735ea3ee2ee6383687e); - Vector::push_back(&mut amounts, 1920371020); - - Vector::push_back
(&mut payees, @0x6e873a65739c9e54ebd4f7983a7a303b); - Vector::push_back(&mut amounts, 1916632522); - - Vector::push_back
(&mut payees, @0x84ebcb26903f9cc52627ec8b7d4a3784); - Vector::push_back(&mut amounts, 1912369803); - - Vector::push_back
(&mut payees, @0x7798f4b9e9c35c35e8cfe7375985cbb0); - Vector::push_back(&mut amounts, 1909672898); - - Vector::push_back
(&mut payees, @0x567036ac9543976069504c8f92d3850d); - Vector::push_back(&mut amounts, 1911795718); - - Vector::push_back
(&mut payees, @0x3e123b5ca7845bb656047fba812560cf); - Vector::push_back(&mut amounts, 1914673427); - - Vector::push_back
(&mut payees, @0xec9e0eac9aeffa9c47db0db9f4e72e57); - Vector::push_back(&mut amounts, 1912635714); - - Vector::push_back
(&mut payees, @0xda26a623fcf0a7fb067c482a50c86ea3); - Vector::push_back(&mut amounts, 1917070742); - - Vector::push_back
(&mut payees, @0xd31acbfd47fc0e8cf5602f15fc103308); - Vector::push_back(&mut amounts, 1914444803); - - Vector::push_back
(&mut payees, @0x4d63b923ad8241249865555ccd2c93f9); - Vector::push_back(&mut amounts, 1923002459); - - Vector::push_back
(&mut payees, @0x32d0db65b80c6ba5ff38c602c015402e); - Vector::push_back(&mut amounts, 1894127859); - - Vector::push_back
(&mut payees, @0xf4a0ccfe1529502ce3e43fbd3faae8e7); - Vector::push_back(&mut amounts, 1911992209); - - Vector::push_back
(&mut payees, @0xeaf56c57ad1f005a50cb75def55f4ef6); - Vector::push_back(&mut amounts, 1925962200); - - Vector::push_back
(&mut payees, @0x66e64650e22ed0d05d063f640aa51550); - Vector::push_back(&mut amounts, 5684377142); - - Vector::push_back
(&mut payees, @0xaa508e69ed22a31324cb0f3c49ca5be3); - Vector::push_back(&mut amounts, 1914537619); - - Vector::push_back
(&mut payees, @0xf225ca53e2c65b254f1a5adba9916b36); - Vector::push_back(&mut amounts, 1918006195); - - Vector::push_back
(&mut payees, @0x4a68912ceca2e164bea24a2b7903ccc4); - Vector::push_back(&mut amounts, 1888412140); - - Vector::push_back
(&mut payees, @0xab6baf752a60f937974df5d4a3fd202c); - Vector::push_back(&mut amounts, 1918258313); - - Vector::push_back
(&mut payees, @0x28419fa12866530ed702c0623756fc74); - Vector::push_back(&mut amounts, 1573718075); - - Vector::push_back
(&mut payees, @0xe48e99008c10c061b4bc22f156d169e4); - Vector::push_back(&mut amounts, 1922888431); - - Vector::push_back
(&mut payees, @0xf6ba89a0598c308be9477eb173bbbef6); - Vector::push_back(&mut amounts, 1917913379); - - Vector::push_back
(&mut payees, @0xc4a6a95be863945ed9c86f935f950c71); - Vector::push_back(&mut amounts, 3638323665); - - Vector::push_back
(&mut payees, @0xfc9f48473f30dcdf102ec0c521c4a3d8); - Vector::push_back(&mut amounts, 1904617664); - - Vector::push_back
(&mut payees, @0x587847de32d7cc2ee597e0998a1f3072); - Vector::push_back(&mut amounts, 1904938279); - - Vector::push_back
(&mut payees, @0x2548fb5c2191b420c98bb3a71bde148d); - Vector::push_back(&mut amounts, 79822375); - - Vector::push_back
(&mut payees, @0x81ba66ce38960d9a7404b32e02936c3a); - Vector::push_back(&mut amounts, 1914524985); - - Vector::push_back
(&mut payees, @0xb3d831278cfc7f0b8aaa60e9df06c2fd); - Vector::push_back(&mut amounts, 1896343336); - - Vector::push_back
(&mut payees, @0xf85ee438b0c107826682f55e370ebabb); - Vector::push_back(&mut amounts, 1912635714); - - Vector::push_back
(&mut payees, @0x0ed2db8d46a607908bfe7219dcb6182b); - Vector::push_back(&mut amounts, 1138034643); - - Vector::push_back
(&mut payees, @0xaadfde6a31290a6ef869a0ed4994fc62); - Vector::push_back(&mut amounts, 1134888651); - - Vector::push_back
(&mut payees, @0x8e69a089cdfb1842b57c7e6e79f8a4bb); - Vector::push_back(&mut amounts, 1142902441); - - Vector::push_back
(&mut payees, @0x4ec9e979cfc61f64ced3c23d6d6afa27); - Vector::push_back(&mut amounts, 3356632605); - - Vector::push_back
(&mut payees, @0x93558b1572e0a45197ac30b267058491); - Vector::push_back(&mut amounts, 1152177273); - - Vector::push_back
(&mut payees, @0x2e01b76969c3a751f7ad27449c59cc96); - Vector::push_back(&mut amounts, 1153514005); - - Vector::push_back
(&mut payees, @0x240640b0c169ebf6b02c2707050c2fcf); - Vector::push_back(&mut amounts, 1144653961); - - Vector::push_back
(&mut payees, @0x089d8383e672237a35460b6439b75597); - Vector::push_back(&mut amounts, 7284132093); - - Vector::push_back
(&mut payees, @0xcb8239273bdf82f2b865b931b274d97c); - Vector::push_back(&mut amounts, 4666861840); - - Vector::push_back
(&mut payees, @0xc550b974588aecc33fa98a8730278fe2); - Vector::push_back(&mut amounts, 1134657270); - - Vector::push_back
(&mut payees, @0x53d2186c762d0945281f8cb1753fa55a); - Vector::push_back(&mut amounts, 1153561922); - - Vector::push_back
(&mut payees, @0x69ff159519274d828793563b14056e4c); - Vector::push_back(&mut amounts, 2153997745); - - Vector::push_back
(&mut payees, @0x30ea471095b6abbd86e484c6e1d9a523); - Vector::push_back(&mut amounts, 1130953661); - - Vector::push_back
(&mut payees, @0xab510b4c6616778c3c3dd56c6d714699); - Vector::push_back(&mut amounts, 1151075620); - - Vector::push_back
(&mut payees, @0xd3020d4924a33a14ddc4614f0b016552); - Vector::push_back(&mut amounts, 1155528612); - - Vector::push_back
(&mut payees, @0xcff6f1a8eac1cf0be9d7db872e82a533); - Vector::push_back(&mut amounts, 2931093081); - - Vector::push_back
(&mut payees, @0x5d6fe45fe8dd4c030b7fbd7523c48ac4); - Vector::push_back(&mut amounts, 1141104570); - - Vector::push_back
(&mut payees, @0x6c15758d25ea2d1bb9f8fead6e083ad0); - Vector::push_back(&mut amounts, 2505487203); - - Vector::push_back
(&mut payees, @0x8fcdd5aa1bd386c4739c5f7d9687c531); - Vector::push_back(&mut amounts, 1142304765); - - Vector::push_back
(&mut payees, @0xfc68faba26f67e7bb07b6d594023c0ec); - Vector::push_back(&mut amounts, 1349155961); - - Vector::push_back
(&mut payees, @0xedc623def41d26f61f0bf915791a9b47); - Vector::push_back(&mut amounts, 1150518925); - - Vector::push_back
(&mut payees, @0x172f67fa898ceab7d5dbac8a48f5e542); - Vector::push_back(&mut amounts, 1127776688); - - Vector::push_back
(&mut payees, @0xcb8efc6b670e227ec5434f0f6f4ed100); - Vector::push_back(&mut amounts, 1152784340); - - Vector::push_back
(&mut payees, @0xc9ecb4f084a85fee7e5c19875cc491b0); - Vector::push_back(&mut amounts, 1149218780); - - Vector::push_back
(&mut payees, @0x81aedab86d78d4eba48e0a166076dba8); - Vector::push_back(&mut amounts, 1155429981); - - Vector::push_back
(&mut payees, @0xefa89bd641e532be111a9e1ebfa3a515); - Vector::push_back(&mut amounts, 2829845321); - - Vector::push_back
(&mut payees, @0x4498b2490b70b8ace45eb75b6152c41d); - Vector::push_back(&mut amounts, 1130061928); - - Vector::push_back
(&mut payees, @0x2b3c6f99b9838fd5dfda2d85adf7f93e); - Vector::push_back(&mut amounts, 1149356815); - - Vector::push_back
(&mut payees, @0x59e17aec701997b095e9e76de9b842da); - Vector::push_back(&mut amounts, 1141176914); - - Vector::push_back
(&mut payees, @0x64e82f1bf6cdc0e241bad5468a82cbb0); - Vector::push_back(&mut amounts, 7212620471); - - Vector::push_back
(&mut payees, @0x0d22db425dce9e10803da05395fc0110); - Vector::push_back(&mut amounts, 1487493744); - - Vector::push_back
(&mut payees, @0x2d7c776596e1ba2cf7890dc90a7f928b); - Vector::push_back(&mut amounts, 3955146746); - - Vector::push_back
(&mut payees, @0x2403c0ab0a3a0e6864c166ee91462cf0); - Vector::push_back(&mut amounts, 1484716657); - - Vector::push_back
(&mut payees, @0x8e18af0a3668d0c9629eb62aa60a7937); - Vector::push_back(&mut amounts, 1483012157); - - Vector::push_back
(&mut payees, @0x3e12bf7221f6d2a74f9e861cf040b6c4); - Vector::push_back(&mut amounts, 1490421722); - - Vector::push_back
(&mut payees, @0x2fa12852e87dacac8da59b56f781d90f); - Vector::push_back(&mut amounts, 1495140135); - - Vector::push_back
(&mut payees, @0x07b467f6cdb969dd949dc8a30c770261); - Vector::push_back(&mut amounts, 1490421722); - - Vector::push_back
(&mut payees, @0xb7c0294fa353c029f7ccc1540725011d); - Vector::push_back(&mut amounts, 1487493744); - - Vector::push_back
(&mut payees, @0x3f5898c4ae87881bf584e02f814de491); - Vector::push_back(&mut amounts, 1487662476); - - Vector::push_back
(&mut payees, @0x9c5a42f60f309a4db101dceab8c1fb3c); - Vector::push_back(&mut amounts, 1490406438); - - Vector::push_back
(&mut payees, @0xbd47ce7975af0fdcc4e1eccde85aff16); - Vector::push_back(&mut amounts, 1490406438); - - Vector::push_back
(&mut payees, @0x91f13415f3f190553a9c6555ac491163); - Vector::push_back(&mut amounts, 1461904112); - - Vector::push_back
(&mut payees, @0x3a44c98b358f7924307e5bab342bb3b9); - Vector::push_back(&mut amounts, 1469806825); - - Vector::push_back
(&mut payees, @0xff3d756a300638f835b3c38ef64eeeb3); - Vector::push_back(&mut amounts, 1454345760); - - Vector::push_back
(&mut payees, @0x60426552926a2570770b7f28d2a87713); - Vector::push_back(&mut amounts, 1449973240); - - Vector::push_back
(&mut payees, @0xaf7384e8cc2ac670e18c9558aa5bc797); - Vector::push_back(&mut amounts, 1449895822); - - Vector::push_back
(&mut payees, @0x198805eb5587118a81cf67448d2564bd); - Vector::push_back(&mut amounts, 1445294248); - - Vector::push_back
(&mut payees, @0xf83e50b50124b47c48a6e25e6a8065f6); - Vector::push_back(&mut amounts, 1444451611); - - Vector::push_back
(&mut payees, @0x178a850a05167bf8b145f13384f248fa); - Vector::push_back(&mut amounts, 3967448025); - - Vector::push_back
(&mut payees, @0xdc86560326f5010a4cd992575ead4985); - Vector::push_back(&mut amounts, 1454570699); - - Vector::push_back
(&mut payees, @0x9b160f03bd71dfdd44559d679b457a52); - Vector::push_back(&mut amounts, 1452204371); - - Vector::push_back
(&mut payees, @0x29df831c9884ee7311c23c8a722a82fd); - Vector::push_back(&mut amounts, 1454458867); - - Vector::push_back
(&mut payees, @0xc38dde755a65e90e5ecd642ee0119a94); - Vector::push_back(&mut amounts, 1454477883); - - Vector::push_back
(&mut payees, @0x1ad28489b468e8b3a5e02c433b9b2cc8); - Vector::push_back(&mut amounts, 1457101761); - - Vector::push_back
(&mut payees, @0x939d39662c04615657fdf167ad735889); - Vector::push_back(&mut amounts, 3643189770); - - Vector::push_back
(&mut payees, @0x49c053815089b65a6eda76bf546b2541); - Vector::push_back(&mut amounts, 1451145488); - - Vector::push_back
(&mut payees, @0xf95c922f5d8d1bd63c0aa7423c96858b); - Vector::push_back(&mut amounts, 1451244233); - - Vector::push_back
(&mut payees, @0xb7aaa47b4e665b1b26e17a66f375d314); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0x3f5aaa374a1a0e40b91b1dab1981892b); - Vector::push_back(&mut amounts, 1030468407); - - Vector::push_back
(&mut payees, @0x89577b9c44fe0cb7d3fda7a39c5fc737); - Vector::push_back(&mut amounts, 1024522145); - - Vector::push_back
(&mut payees, @0x24d4444b83e1bc574a1ca2943cca64e9); - Vector::push_back(&mut amounts, 1030468407); - - Vector::push_back
(&mut payees, @0xf918dcc4262c8cb5b6afb9bae686e75b); - Vector::push_back(&mut amounts, 5907020310); - - Vector::push_back
(&mut payees, @0x7d1c160e08b666d3a47e9812924f323b); - Vector::push_back(&mut amounts, 1026511828); - - Vector::push_back
(&mut payees, @0x7e8eed9edc268e3bd2b5645f9156d892); - Vector::push_back(&mut amounts, 1032490723); - - Vector::push_back
(&mut payees, @0xfc4d78eba7c8ddc74a177828591cd06b); - Vector::push_back(&mut amounts, 1028493915); - - Vector::push_back
(&mut payees, @0xb01d6811ed92cefc9cc7007a45cb303e); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0x15c59ea366bab3e965e3ed5f82b460f4); - Vector::push_back(&mut amounts, 1028241798); - - Vector::push_back
(&mut payees, @0x8afed6b30c15b38c346f15393f01a054); - Vector::push_back(&mut amounts, 5288133103); - - Vector::push_back
(&mut payees, @0x2d4767b70a876b75521682f79cb3ebdd); - Vector::push_back(&mut amounts, 1032582037); - - Vector::push_back
(&mut payees, @0xcc82f03654535c0b19a184769ad7942e); - Vector::push_back(&mut amounts, 1028493915); - - Vector::push_back
(&mut payees, @0xfdc33edf325b9bee82c675de892bd9b6); - Vector::push_back(&mut amounts, 1032582037); - - Vector::push_back
(&mut payees, @0x7b031749465e73fd986470f163eb6d18); - Vector::push_back(&mut amounts, 1028297423); - - Vector::push_back
(&mut payees, @0x8c5707c094bb08b0ac2afb71fed2109b); - Vector::push_back(&mut amounts, 1030468407); - - Vector::push_back
(&mut payees, @0x2d9dbcbaaedde0f2c6c8fcc951eb84fc); - Vector::push_back(&mut amounts, 1028148982); - - Vector::push_back
(&mut payees, @0x16fffcce80dc40bf7b7d3cca89435849); - Vector::push_back(&mut amounts, 1026167008); - - Vector::push_back
(&mut payees, @0xf0b4469a00615b3a0ce3138ac3629311); - Vector::push_back(&mut amounts, 1030468407); - - Vector::push_back
(&mut payees, @0x7b537399ee7859120d250c09b28c32e1); - Vector::push_back(&mut amounts, 1030468407); - - Vector::push_back
(&mut payees, @0x84a5c4dddc27dc498deef21e61d5eff6); - Vector::push_back(&mut amounts, 1028297423); - - Vector::push_back
(&mut payees, @0x628178e7d108cf9f658343d7f7d34287); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0x3a0be21dcc53695d9ea1ad804b7a015c); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0x45da249c90a4a77804d2644a3cffc7d1); - Vector::push_back(&mut amounts, 1026244427); - - Vector::push_back
(&mut payees, @0x56a7094213d3d0415ecb21a7a3817f5e); - Vector::push_back(&mut amounts, 3478322672); - - Vector::push_back
(&mut payees, @0x93743a2755b1be13c817fc4c22245708); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0x5a4cf01c911d3b2bb840ce613e62a1a4); - Vector::push_back(&mut amounts, 1728121077); - - Vector::push_back
(&mut payees, @0xe866cfda544b394d78b5fa986e73c3db); - Vector::push_back(&mut amounts, 1028133698); - - Vector::push_back
(&mut payees, @0x745c9dc4a51062b928d42a2fa7e29757); - Vector::push_back(&mut amounts, 1041116050); - - Vector::push_back
(&mut payees, @0x455c3e2c7c6d5dd7d456d50d976f34d6); - Vector::push_back(&mut amounts, 1039141558); - - Vector::push_back
(&mut payees, @0x81f29b02799a6748a434b47fe6665075); - Vector::push_back(&mut amounts, 1041116050); - - Vector::push_back
(&mut payees, @0x4cad9cc00c4d0215eaa16038958aaace); - Vector::push_back(&mut amounts, 1041264492); - - Vector::push_back
(&mut payees, @0x79fbd7993869339a7e8597cd05af1d5c); - Vector::push_back(&mut amounts, 1041264492); - - Vector::push_back
(&mut payees, @0x337f71b187bd1dc42fab032f95471473); - Vector::push_back(&mut amounts, 1041095760); - - Vector::push_back
(&mut payees, @0x20acec5bd452ab73ccdf4653d200a14e); - Vector::push_back(&mut amounts, 1041171676); - - Vector::push_back
(&mut payees, @0x4a500ccd9026feb7900460a04fcb2b47); - Vector::push_back(&mut amounts, 1041264492); - - Vector::push_back
(&mut payees, @0xf7c540fd70d8ddc754733e15c44e8592); - Vector::push_back(&mut amounts, 5022028637); - - Vector::push_back
(&mut payees, @0xd1c796b9b5e91c088ab41d358c7a9c06); - Vector::push_back(&mut amounts, 1039234374); - - Vector::push_back
(&mut payees, @0x88a7fbfee20ed0054ae14df747970aaa); - Vector::push_back(&mut amounts, 1041116050); - - Vector::push_back
(&mut payees, @0xf344c21223f38119721bc3b60e169549); - Vector::push_back(&mut amounts, 3476131467); - - Vector::push_back
(&mut payees, @0x95fb69352570f66255e27ade3bf6985c); - Vector::push_back(&mut amounts, 1039003342); - - Vector::push_back
(&mut payees, @0xe8e37d2e49738a58a4a4d3714d34c374); - Vector::push_back(&mut amounts, 1041116050); - - Vector::push_back
(&mut payees, @0x905dba2cee3093577896fdca6cf7af37); - Vector::push_back(&mut amounts, 1015350759); - - Vector::push_back
(&mut payees, @0x30d2561019ac9b58e57ab2e961c10ddd); - Vector::push_back(&mut amounts, 1017805372); - - Vector::push_back
(&mut payees, @0xfd25243a6501cc431be66567257271ef); - Vector::push_back(&mut amounts, 1017805372); - - Vector::push_back
(&mut payees, @0x871ea5492cceeda0f5d81fcd1ae350cb); - Vector::push_back(&mut amounts, 1009073946); - - Vector::push_back
(&mut payees, @0x3eeb485e63f4a152395523b52fe09dc7); - Vector::push_back(&mut amounts, 1017898188); - - Vector::push_back
(&mut payees, @0x11036637df53818456e1e68cd5b57e56); - Vector::push_back(&mut amounts, 1017805372); - - Vector::push_back
(&mut payees, @0xf37b58c86ca58d07d51e847ddb196d31); - Vector::push_back(&mut amounts, 1017898188); - - Vector::push_back
(&mut payees, @0xcfbe506a9010c2a6664c5e1b4c36be48); - Vector::push_back(&mut amounts, 1017667157); - - Vector::push_back
(&mut payees, @0x48e24dd5aca63f73e48d0588ea491a91); - Vector::push_back(&mut amounts, 1017667157); - - Vector::push_back
(&mut payees, @0x8b6beee603e319b19a28d69a8c575bc0); - Vector::push_back(&mut amounts, 1019835491); - - Vector::push_back
(&mut payees, @0xc577c0922106b5077aaebbd16a2677c5); - Vector::push_back(&mut amounts, 4350597603); - - Vector::push_back
(&mut payees, @0xc338cc68464493d992f8e46adff61c1b); - Vector::push_back(&mut amounts, 1019779865); - - Vector::push_back
(&mut payees, @0x85eba38fe6d46e6530301b813d71ef3f); - Vector::push_back(&mut amounts, 1017667157); - - Vector::push_back
(&mut payees, @0x682ca25f4bdf0299a922e93cfd6cc652); - Vector::push_back(&mut amounts, 4139438371); - - Vector::push_back
(&mut payees, @0x768d425c64e9a812ced31258260fc4f0); - Vector::push_back(&mut amounts, 1017898188); - - Vector::push_back
(&mut payees, @0xb7b5a20f2b0c5b3143a477e7e7162dc8); - Vector::push_back(&mut amounts, 2915174162); - - Vector::push_back
(&mut payees, @0x2c099722f267b86012b05b27777c1c0b); - Vector::push_back(&mut amounts, 1026026161); - - Vector::push_back
(&mut payees, @0x4b43f8d1566cd0b65ee38bebf91b659e); - Vector::push_back(&mut amounts, 1024136890); - - Vector::push_back
(&mut payees, @0x04b7716d23ee196dc611ed655e457d80); - Vector::push_back(&mut amounts, 912289240); - - Vector::push_back
(&mut payees, @0x10444e9a399edc4bb325dcffd2ca1105); - Vector::push_back(&mut amounts, 1028225012); - - Vector::push_back
(&mut payees, @0x601f9be73b18603d557498ae88ec5067); - Vector::push_back(&mut amounts, 1030410131); - - Vector::push_back
(&mut payees, @0x415cedefd055c5dde8348a4294f60a37); - Vector::push_back(&mut amounts, 1014542092); - - Vector::push_back
(&mut payees, @0x574f849a238b3de204fe3d1e92aecc6a); - Vector::push_back(&mut amounts, 1026174603); - - Vector::push_back
(&mut payees, @0xd264040737746b6d8687953681a835ef); - Vector::push_back(&mut amounts, 1030355427); - - Vector::push_back
(&mut payees, @0x73fa972a52a458589317ed535d4cb82f); - Vector::push_back(&mut amounts, 1007644976); - - Vector::push_back
(&mut payees, @0xfe4ee66f80b56c88285e1e9c093f75ac); - Vector::push_back(&mut amounts, 1030334215); - - Vector::push_back
(&mut payees, @0x70c0258ceaf0790a1b4a1e7e75028134); - Vector::push_back(&mut amounts, 1026229307); - - Vector::push_back
(&mut payees, @0xb6bb45be857bf886fac7a5533f264f13); - Vector::push_back(&mut amounts, 247068025); - - Vector::push_back
(&mut payees, @0x3afb4a06c280b5900d7511a8a53f4e83); - Vector::push_back(&mut amounts, 1026229307); - - Vector::push_back
(&mut payees, @0xc24653bca41878c2816d5e62428a3203); - Vector::push_back(&mut amounts, 1036572916); - - Vector::push_back
(&mut payees, @0xba6f51b998f344950c8c5247d3f145fb); - Vector::push_back(&mut amounts, 1034696247); - - Vector::push_back
(&mut payees, @0x56a8447044bdbc1a973118451ef43edd); - Vector::push_back(&mut amounts, 1036741649); - - Vector::push_back
(&mut payees, @0x8ac0b6c15fe9031bc476c2d42da8878f); - Vector::push_back(&mut amounts, 1036594128); - - Vector::push_back
(&mut payees, @0x7c2c06ff0794a7b59bb39f3d691fa0eb); - Vector::push_back(&mut amounts, 4179484413); - - Vector::push_back
(&mut payees, @0xeecf63897b8646377780117841ba563c); - Vector::push_back(&mut amounts, 1036686944); - - Vector::push_back
(&mut payees, @0x31d0f05a5805d4d1d889c6b229efa05d); - Vector::push_back(&mut amounts, 1036741649); - - Vector::push_back
(&mut payees, @0x129107530df589347d5dd92da18801e4); - Vector::push_back(&mut amounts, 1036572916); - - Vector::push_back
(&mut payees, @0x8c83aa0585def60bbd3d6a104d3a4a36); - Vector::push_back(&mut amounts, 1036741649); - - Vector::push_back
(&mut payees, @0x89178d8919cc3608eaf05b6755c96f59); - Vector::push_back(&mut amounts, 1034696247); - - Vector::push_back
(&mut payees, @0xab405d616150994b7c372e418d9271ba); - Vector::push_back(&mut amounts, 1032490723); - - Vector::push_back
(&mut payees, @0xb3ad9d3c8d03d97327cbb9719731bda4); - Vector::push_back(&mut amounts, 1030437890); - - Vector::push_back
(&mut payees, @0xdb53e79d846fc9b82641218966295ffc); - Vector::push_back(&mut amounts, 3228918828); - - Vector::push_back
(&mut payees, @0x4f7f35f0673fb2ea3f076858a7d0e1ce); - Vector::push_back(&mut amounts, 1036686944); - - Vector::push_back
(&mut payees, @0xe480db3fe69e2277837e435aebe1e703); - Vector::push_back(&mut amounts, 3121268702); - - Vector::push_back
(&mut payees, @0x386fe7e1dda88f8bc8174f8eab13a66b); - Vector::push_back(&mut amounts, 3036408514); - - Vector::push_back
(&mut payees, @0x52c041e794b9f0eb3b0e02c865f67d29); - Vector::push_back(&mut amounts, 2820870586); - - Vector::push_back
(&mut payees, @0x45e51e7159a7125b50f0abc18e07e6b7); - Vector::push_back(&mut amounts, 2368450803); - - Vector::push_back
(&mut payees, @0x43d978eac357ae1eca1f6eceb2dfe85f); - Vector::push_back(&mut amounts, 4248052552); - - Vector::push_back
(&mut payees, @0x80fd39527d6f18ea594372c2077f7ea3); - Vector::push_back(&mut amounts, 2328956398); - - Vector::push_back
(&mut payees, @0xe0dee4287c94dc78964d02cd1c2aa69a); - Vector::push_back(&mut amounts, 4882337810); - - Vector::push_back
(&mut payees, @0xdd54531f39a5582a263e849b482b1c77); - Vector::push_back(&mut amounts, 196476587); - - Vector::push_back
(&mut payees, @0x5cfa5ac6b228987c6a212966a2d1cec7); - Vector::push_back(&mut amounts, 287828256); - - Vector::push_back
(&mut payees, @0xd6fa7c9790e3de5d0b631fd2094c6096); - Vector::push_back(&mut amounts, 619882471); - - Vector::push_back
(&mut payees, @0xd73ae54e74f81bca6ce90e1b0b72d39c); - Vector::push_back(&mut amounts, 497593844); - - Vector::push_back
(&mut payees, @0x1fa3103eb6103ae794792af5c4c023a7); - Vector::push_back(&mut amounts, 3783366684); - - Vector::push_back
(&mut payees, @0x085144acdcfc33d9e9095420b24d0aee); - Vector::push_back(&mut amounts, 720698756); - - Vector::push_back
(&mut payees, @0x8b7ade2879be9cc839af34b56f3f9aaa); - Vector::push_back(&mut amounts, 1324713198); - - Vector::push_back
(&mut payees, @0xfa7848c002783ab0c872efd30fbbeae2); - Vector::push_back(&mut amounts, 1182231010); - - Vector::push_back
(&mut payees, @0x08a80a2ea14315a3880e38ff3d455e4d); - Vector::push_back(&mut amounts, 3728977719); - - Vector::push_back
(&mut payees, @0x5c96b89ed7b87445f427c5a3bd64318c); - Vector::push_back(&mut amounts, 2317666507); - - Vector::push_back
(&mut payees, @0xadc65909c96ba2b4bb86a95a2e11c597); - Vector::push_back(&mut amounts, 5338593603); - - Vector::push_back
(&mut payees, @0x5c2bb72eda587773c618ac787e3b6f00); - Vector::push_back(&mut amounts, 3845580470); - - Vector::push_back
(&mut payees, @0xca9f59f1667dc637b3fb776e871f04c8); - Vector::push_back(&mut amounts, 1603221117); - - Vector::push_back
(&mut payees, @0x8b13ae50576f167125b10aae3570e8a4); - Vector::push_back(&mut amounts, 1650702732); - - Vector::push_back
(&mut payees, @0x2b9a4bbb08ef0ab260e12b0edf30f825); - Vector::push_back(&mut amounts, 4386608062); - - Vector::push_back
(&mut payees, @0xa3b9dd207432ef1a82029cca0ae4c2ed); - Vector::push_back(&mut amounts, 1770326287); - - Vector::push_back
(&mut payees, @0x71588c735a0081c62b4ef91be0b2ccd2); - Vector::push_back(&mut amounts, 2488549828); - - Vector::push_back
(&mut payees, @0x98eb646414e3b42980e56ac536b51979); - Vector::push_back(&mut amounts, 2153782986); - - Vector::push_back
(&mut payees, @0x595bd5ff9ef6919d4c454a45671c0519); - Vector::push_back(&mut amounts, 1986290538); - - Vector::push_back
(&mut payees, @0x979ca6900e0fc4c1367d6c3505453c78); - Vector::push_back(&mut amounts, 5062396633); - - Vector::push_back
(&mut payees, @0xbbb791ef00892309bff01a898ad005c2); - Vector::push_back(&mut amounts, 3951225697); - - Vector::push_back
(&mut payees, @0x0aa58392d4277bda5f70f2f9e0f4d69e); - Vector::push_back(&mut amounts, 1733380987); - - Vector::push_back
(&mut payees, @0xd5cf704b4cab391e6154b3a7e860838d); - Vector::push_back(&mut amounts, 4910984018); - - Vector::push_back
(&mut payees, @0x05a5016099ab9ab588f006f283e9c133); - Vector::push_back(&mut amounts, 1573966791); - - Vector::push_back
(&mut payees, @0xf19878c18ef0494ff8c70e8621904c44); - Vector::push_back(&mut amounts, 3934997703); - - Vector::push_back
(&mut payees, @0x3f8ef5abbd0f43f61b2d742218675f9b); - Vector::push_back(&mut amounts, 3944720662); - - Vector::push_back
(&mut payees, @0x2b5f14b5b7445b54a8628e1f1cf1abf4); - Vector::push_back(&mut amounts, 3862885165); - - Vector::push_back
(&mut payees, @0xf22dc1b46f750c906cf1dfebd58fae0a); - Vector::push_back(&mut amounts, 4641044114); - - Vector::push_back
(&mut payees, @0x525093982c54c10ca912408365628bf9); - Vector::push_back(&mut amounts, 2540347453); - - Vector::push_back
(&mut payees, @0xd8cf2a43feeb8b3e6b3186cc7c420fa3); - Vector::push_back(&mut amounts, 1781285657); - - Vector::push_back
(&mut payees, @0x496b62e7dd5b4c4d2f35d2ada6db57a5); - Vector::push_back(&mut amounts, 2774055631); - - Vector::push_back
(&mut payees, @0x96e865befc44731176d8ef60235959e0); - Vector::push_back(&mut amounts, 2115122812); - - Vector::push_back
(&mut payees, @0x3076794c34ea390026aef4b01a083e75); - Vector::push_back(&mut amounts, 1972594282); - - Vector::push_back
(&mut payees, @0x32c9c4ccd21b0d163a6f336431584527); - Vector::push_back(&mut amounts, 1717804243); - - Vector::push_back
(&mut payees, @0xcb2457a49bebff00eb6d12a4fc39d662); - Vector::push_back(&mut amounts, 2729106379); - - Vector::push_back
(&mut payees, @0x10242359b4cb88815f0c2326059e491d); - Vector::push_back(&mut amounts, 1482672811); - - Vector::push_back
(&mut payees, @0xbfc9b12182329e55055f82b5a7784bb8); - Vector::push_back(&mut amounts, 2201186131); - - Vector::push_back
(&mut payees, @0x54c2ea476466320e12fc3b152b56ab00); - Vector::push_back(&mut amounts, 2649769556); - - Vector::push_back
(&mut payees, @0x0a1b788638b6824e62661c2067ae70ef); - Vector::push_back(&mut amounts, 2280406698); - - Vector::push_back
(&mut payees, @0x7a4018c192ff3b045744858202d9dbbd); - Vector::push_back(&mut amounts, 2547237595); - - Vector::push_back
(&mut payees, @0x5ccc45fd380c6a21b4da01aadf914874); - Vector::push_back(&mut amounts, 2447517411); - - Vector::push_back
(&mut payees, @0xa17170adc206f8992b25b8362165a777); - Vector::push_back(&mut amounts, 2277042278); - - Vector::push_back
(&mut payees, @0xdf928d70b711312926973169a0621888); - Vector::push_back(&mut amounts, 2332077734); - - Vector::push_back
(&mut payees, @0x2b4d0e46befded3acc339901f6610266); - Vector::push_back(&mut amounts, 2238218890); - - Vector::push_back
(&mut payees, @0xed325cdc1ce8a648ab4d0ca191de5115); - Vector::push_back(&mut amounts, 2151526827); - - Vector::push_back
(&mut payees, @0xabef570181d1282ed41dfd93f7550de0); - Vector::push_back(&mut amounts, 1286594134); - - Vector::push_back
(&mut payees, @0xf57e7b10407cfe44bc021b259f855511); - Vector::push_back(&mut amounts, 1974177404); - - Vector::push_back
(&mut payees, @0xe18a3f3db265ce264559fd638ffd6c2e); - Vector::push_back(&mut amounts, 1149973937); - - Vector::push_back
(&mut payees, @0x338cb6fff868fa0f94f5ce4210f9b666); - Vector::push_back(&mut amounts, 1988096371); - - Vector::push_back
(&mut payees, @0xd0547008058a5e45ab9b93cfa77a754f); - Vector::push_back(&mut amounts, 1875841026); - - Vector::push_back
(&mut payees, @0xcca859b8f11d60e16d3c5c85684be7ac); - Vector::push_back(&mut amounts, 1518422057); - - Vector::push_back
(&mut payees, @0xfb31fff6414a7bc48d97cdb4899faf6d); - Vector::push_back(&mut amounts, 2010387222); - - Vector::push_back
(&mut payees, @0x401a9629c18beee8ceca48cd23c70333); - Vector::push_back(&mut amounts, 2412516657); - - Vector::push_back
(&mut payees, @0x28a80ecacb79e0f6853fe266464d298f); - Vector::push_back(&mut amounts, 262203974); - - Vector::push_back
(&mut payees, @0xb3125c49b173c7a437cf7cef06550f66); - Vector::push_back(&mut amounts, 4786405932); - - Vector::push_back
(&mut payees, @0x344e8da65e124c02fd7416278ed0d2da); - Vector::push_back(&mut amounts, 3508800170); - - Vector::push_back
(&mut payees, @0xb3b77d203bf13c97626137b2ca9d981d); - Vector::push_back(&mut amounts, 6459133125); - - Vector::push_back
(&mut payees, @0xe2e626d231bd870e09df5eab95eac67b); - Vector::push_back(&mut amounts, 1619309203); - - Vector::push_back
(&mut payees, @0x28d09829a777722cd932f821385d0ab8); - Vector::push_back(&mut amounts, 6453328693); - - Vector::push_back
(&mut payees, @0xb27a2e8f37241d589a8678c3a776b013); - Vector::push_back(&mut amounts, 6163074073); - - Vector::push_back
(&mut payees, @0x52532933d816416e2599d7ca3b52dd05); - Vector::push_back(&mut amounts, 6062787851); - - Vector::push_back
(&mut payees, @0x9f48e3897a7cc657f689ea00769928e0); - Vector::push_back(&mut amounts, 6006534664); - - Vector::push_back
(&mut payees, @0x551bc125a630cdfe50bd18b47d5f57fe); - Vector::push_back(&mut amounts, 5652503167); - - Vector::push_back
(&mut payees, @0x65f8367cf3f1f8b95e59ec247ba428cd); - Vector::push_back(&mut amounts, 3051220668); - - Vector::push_back
(&mut payees, @0xdb595dbb4332432672cc9c1f4a7645d7); - Vector::push_back(&mut amounts, 5925161141); - - Vector::push_back
(&mut payees, @0x77e636ca4692414373511f133d5a7f6c); - Vector::push_back(&mut amounts, 6108942674); - - Vector::push_back
(&mut payees, @0x05599bf662059185634c7418747fe883); - Vector::push_back(&mut amounts, 5686335874); - - Vector::push_back
(&mut payees, @0xea791158c3052450ec4b864829f64d77); - Vector::push_back(&mut amounts, 2941496050); - - Vector::push_back
(&mut payees, @0xa36e0699476d5e5808540a4e96ccd0db); - Vector::push_back(&mut amounts, 5427959455); - - Vector::push_back
(&mut payees, @0xebad35513e82a383dcc64c585582871f); - Vector::push_back(&mut amounts, 4818271728); - - Vector::push_back
(&mut payees, @0x3d9dcc78689238baa4e4f7e859372188); - Vector::push_back(&mut amounts, 113701230); - - Vector::push_back
(&mut payees, @0x3cc938e874f5cdac4e075306ba7fbb7f); - Vector::push_back(&mut amounts, 5523869300); - - Vector::push_back
(&mut payees, @0xdeb286b844f9572bd0741c6672fd0d61); - Vector::push_back(&mut amounts, 4408045929); - - Vector::push_back
(&mut payees, @0xebc8c86331b4f7726db504c1aa3c8f28); - Vector::push_back(&mut amounts, 819896251); - - Vector::push_back
(&mut payees, @0x2afecdf5366b010d92701bc65e268bce); - Vector::push_back(&mut amounts, 4765635478); - - Vector::push_back
(&mut payees, @0x8e9258291161d846459584b4814d15ba); - Vector::push_back(&mut amounts, 4619319918); - - Vector::push_back
(&mut payees, @0xc510f0c11cc0443d029d423b58e84f8f); - Vector::push_back(&mut amounts, 2957304798); - - Vector::push_back
(&mut payees, @0xf98d4875e499bb37377365f954e8769c); - Vector::push_back(&mut amounts, 7161947021); - - Vector::push_back
(&mut payees, @0x8c7a03307f35ebea04a9e4ecf5131a66); - Vector::push_back(&mut amounts, 3056599763); - - Vector::push_back
(&mut payees, @0xafb7dbdbe67d9b21d0f48035b6cae9be); - Vector::push_back(&mut amounts, 4423596256); - - Vector::push_back
(&mut payees, @0xcc3317639e4210a557428fe0085b943a); - Vector::push_back(&mut amounts, 85963170); - - Vector::push_back
(&mut payees, @0x547c27ce25c3ef365ff3ba1f9a2c296a); - Vector::push_back(&mut amounts, 240985717); - - Vector::push_back
(&mut payees, @0xd9e75f5b8b9e17e31b4f0d0ad3a08d1c); - Vector::push_back(&mut amounts, 243043721); - - Vector::push_back
(&mut payees, @0x336ae39a9ba20b6b586914f1004afe0b); - Vector::push_back(&mut amounts, 5657917214); - - Vector::push_back
(&mut payees, @0x7cd2d92326dd19c563e2d596813772f8); - Vector::push_back(&mut amounts, 6062677271); - - Vector::push_back
(&mut payees, @0x7f88d645a234aa1adb624363e522e902); - Vector::push_back(&mut amounts, 4766838098); - - Vector::push_back
(&mut payees, @0x2c9faf418e2df5878f2778d63ff0b56c); - Vector::push_back(&mut amounts, 2657868505); - - Vector::push_back
(&mut payees, @0x4f116dc5bfd8a04c55c40c32b9e4a05b); - Vector::push_back(&mut amounts, 3740196565); - - Vector::push_back
(&mut payees, @0x77d2b491246bf31a370fdf47dab960ab); - Vector::push_back(&mut amounts, 3502226103); - - Vector::push_back
(&mut payees, @0xc0e65392a20b66b1a1d2b89ad10ffe64); - Vector::push_back(&mut amounts, 1823263931); - - Vector::push_back
(&mut payees, @0x52255058328649cbcbf6853acb3c0706); - Vector::push_back(&mut amounts, 662675652); - - Vector::push_back
(&mut payees, @0x1b2d7b44668eb195f4e7c5fd1472adcf); - Vector::push_back(&mut amounts, 2280119544); - - Vector::push_back
(&mut payees, @0x2d38e605d8c1ba7706ff91df282eedf8); - Vector::push_back(&mut amounts, 780501441); - - Vector::push_back
(&mut payees, @0x47be2d9926b940fb6906a7a141872cd0); - Vector::push_back(&mut amounts, 680747081); - - Vector::push_back
(&mut payees, @0x2e09737501753c3e5d924155a64a2bbe); - Vector::push_back(&mut amounts, 412985798); - - Vector::push_back
(&mut payees, @0x5c595178ad2ba3f0e2e2694f4d9c6389); - Vector::push_back(&mut amounts, 4476563285); - - Vector::push_back
(&mut payees, @0x9a0d2f907cf354b108364b3a8fe66807); - Vector::push_back(&mut amounts, 419347212); - - Vector::push_back
(&mut payees, @0x3f3dda0044267aff410515d973ecf8b8); - Vector::push_back(&mut amounts, 399121945); - - Vector::push_back
(&mut payees, @0x9abec4f7206075c036d412368c562a68); - Vector::push_back(&mut amounts, 2840208285); - - Vector::push_back
(&mut payees, @0xd508a165f0bde1eb6e14f9aca097045d); - Vector::push_back(&mut amounts, 392415767); - - Vector::push_back
(&mut payees, @0x0c22c23e8c836160ce887a742f77ff00); - Vector::push_back(&mut amounts, 142870612); - - Vector::push_back
(&mut payees, @0x83f26b31cfef3aa89c58049edefaec85); - Vector::push_back(&mut amounts, 374413549); - - Vector::push_back
(&mut payees, @0x4874602aa6c9e5197d910b6f659bc454); - Vector::push_back(&mut amounts, 5397618588); - - Vector::push_back
(&mut payees, @0x36617fa26586cd6309b6baa2244b5214); - Vector::push_back(&mut amounts, 376365119); - - Vector::push_back
(&mut payees, @0xb19e353f64f951b0dffeee396d506b48); - Vector::push_back(&mut amounts, 388175668); - - Vector::push_back
(&mut payees, @0x53df84e66a768ad6f89b3d3d3ee0aa14); - Vector::push_back(&mut amounts, 388833138); - - Vector::push_back
(&mut payees, @0x6a7ef912c475c06a16d9a65670c5f0eb); - Vector::push_back(&mut amounts, 347659853); - - Vector::push_back
(&mut payees, @0x31b3ef9468670ce3284b36cebc82e769); - Vector::push_back(&mut amounts, 351917213); - - Vector::push_back
(&mut payees, @0xd07745d1287b3a26cc820f12185199cd); - Vector::push_back(&mut amounts, 485861408); - - Vector::push_back
(&mut payees, @0xa3adc9fd642d49b84f7f294320e1c9c1); - Vector::push_back(&mut amounts, 4292270077); - - Vector::push_back
(&mut payees, @0x11677af57c7fb37df0da64dcea38500c); - Vector::push_back(&mut amounts, 2668506903); - - Vector::push_back
(&mut payees, @0x156ea56b1911a5eb31af6466307d7d4b); - Vector::push_back(&mut amounts, 4173112450); - - Vector::push_back
(&mut payees, @0xb1577d678f22a9c095d1d1f44fa77cf0); - Vector::push_back(&mut amounts, 4693051331); - - Vector::push_back
(&mut payees, @0x837ee2c454b400c56fc2ccafdfcb0b96); - Vector::push_back(&mut amounts, 1753845678); - - Vector::push_back
(&mut payees, @0x07c50e671cb97d80e4b6176821735d82); - Vector::push_back(&mut amounts, 2142345170); - - Vector::push_back
(&mut payees, @0x03a2a1f289fbafcbae7dd632bc90f188); - Vector::push_back(&mut amounts, 3705637418); - - Vector::push_back
(&mut payees, @0x3827c8738d5e9158e5c4f900e03b6ac4); - Vector::push_back(&mut amounts, 2091516117); - - Vector::push_back
(&mut payees, @0x9bf4ef736b815a62eef490d987bc3506); - Vector::push_back(&mut amounts, 2012940447); - - Vector::push_back
(&mut payees, @0x79c07e19410374ab815d14ad1e5fa05f); - Vector::push_back(&mut amounts, 4116376557); - - Vector::push_back
(&mut payees, @0xa2b2671686f08ac2b8abc4015624f4b7); - Vector::push_back(&mut amounts, 3531962638); - - Vector::push_back
(&mut payees, @0x7f284ee971d4723c43e2b17e4a42085e); - Vector::push_back(&mut amounts, 688382384); - - Vector::push_back
(&mut payees, @0xa122ff535a5cb32c640d350bebe0f847); - Vector::push_back(&mut amounts, 160234127); - - Vector::push_back
(&mut payees, @0xc6c1432795ac91164445cc35007aa169); - Vector::push_back(&mut amounts, 2906197992); - - Vector::push_back
(&mut payees, @0x5f428943f611aff097445a20e6d5e951); - Vector::push_back(&mut amounts, 5844168812); - - Vector::push_back
(&mut payees, @0x34bf279712a61f82742b81ede1eceeef); - Vector::push_back(&mut amounts, 3930909955); - - Vector::push_back
(&mut payees, @0x7a9b0cfcb73253578928980eee71ec21); - Vector::push_back(&mut amounts, 1119015713); - - Vector::push_back
(&mut payees, @0x0b2d8ecd9ca97ec9a62f1ac546e9b576); - Vector::push_back(&mut amounts, 1989539869); - - Vector::push_back
(&mut payees, @0x64d54a14ba2f83c14de003fac6e8f6ad); - Vector::push_back(&mut amounts, 5608264036); - - Vector::push_back
(&mut payees, @0x0ef6e80eb8005dcc917232d1207b71d7); - Vector::push_back(&mut amounts, 4760697869); - - Vector::push_back
(&mut payees, @0x2103ffd555b7208b7daad311e11c114c); - Vector::push_back(&mut amounts, 4835648957); - - Vector::push_back
(&mut payees, @0xe22f996510d837959432fc588eff2a51); - Vector::push_back(&mut amounts, 2824153439); - - Vector::push_back
(&mut payees, @0x9a7a608240eb0a77b511f646f65c5ac2); - Vector::push_back(&mut amounts, 3497115720); - - Vector::push_back
(&mut payees, @0x476a779f4cf14c9f07c40c50420720cf); - Vector::push_back(&mut amounts, 2084406849); - - Vector::push_back
(&mut payees, @0xf8f4c67720890bbbf4ba714d05cd57c2); - Vector::push_back(&mut amounts, 2910005275); - - Vector::push_back
(&mut payees, @0x0edb70ee769863be5677ea87710795fa); - Vector::push_back(&mut amounts, 1502791840); - - Vector::push_back
(&mut payees, @0x4c29ad1d3df4d1d0c97f4062ba65d10b); - Vector::push_back(&mut amounts, 2484811996); - - Vector::push_back
(&mut payees, @0xc09a90f416a1d0690a829eb569cf4c5a); - Vector::push_back(&mut amounts, 7195841366); - - Vector::push_back
(&mut payees, @0x01d2c531008d5b01f42cf8ad9fe8a001); - Vector::push_back(&mut amounts, 3096931172); - - Vector::push_back
(&mut payees, @0x72be90b02744d7fac856dffc3b106d9d); - Vector::push_back(&mut amounts, 1440378633); - - Vector::push_back
(&mut payees, @0xd305f66badf80de970b013e3c0d08e3d); - Vector::push_back(&mut amounts, 3673566772); - - Vector::push_back
(&mut payees, @0xdaf9856e82887a123af4833d582fa200); - Vector::push_back(&mut amounts, 2845378371); - - Vector::push_back
(&mut payees, @0xfeb7eb135a089ad62b75cb9de2854ff1); - Vector::push_back(&mut amounts, 3527645614); - - Vector::push_back
(&mut payees, @0x442e1516622f8ac512218c21c2495764); - Vector::push_back(&mut amounts, 2443454188); - - Vector::push_back
(&mut payees, @0x430f0c735925e6cc6e84cf451bbab016); - Vector::push_back(&mut amounts, 2133480288); - - Vector::push_back
(&mut payees, @0xa16077772837e47b720f708659f8181d); - Vector::push_back(&mut amounts, 3653948958); - - Vector::push_back
(&mut payees, @0x4c8d163116b65b27b2b0a3deb1bed3da); - Vector::push_back(&mut amounts, 1012484172); - - Vector::push_back
(&mut payees, @0x3837ffd2400354bbf969859211d82bd6); - Vector::push_back(&mut amounts, 462920037); - - Vector::push_back
(&mut payees, @0x85b857bbc58652702ae4a5000405372d); - Vector::push_back(&mut amounts, 3724379981); - - Vector::push_back
(&mut payees, @0xdc9982fcc069a667430a3b1e0a3ee5e9); - Vector::push_back(&mut amounts, 6592961287); - - Vector::push_back
(&mut payees, @0x851a3baf866951b36a3fe0da92ba38fc); - Vector::push_back(&mut amounts, 3137363056); - - Vector::push_back
(&mut payees, @0x088c88cb98a44bd389764a7089b895ac); - Vector::push_back(&mut amounts, 588893780); - - Vector::push_back
(&mut payees, @0x3ea61239a0045dbc301dc350be1f0a89); - Vector::push_back(&mut amounts, 705414690); - - Vector::push_back
(&mut payees, @0xf4956624f4c00ccb674e806f473bf2e4); - Vector::push_back(&mut amounts, 2481566228); - - Vector::push_back
(&mut payees, @0x536bd36e9b85db441427a2d2a951e6e0); - Vector::push_back(&mut amounts, 2344905358); - - Vector::push_back
(&mut payees, @0xf85bb8a1c58ef920864a9bf555700bfc); - Vector::push_back(&mut amounts, 4416853890); - - Vector::push_back
(&mut payees, @0x65a26fd8f380e3a978d7ec53aa16591b); - Vector::push_back(&mut amounts, 792425888); - - Vector::push_back
(&mut payees, @0xf85f7ce992e9bdd7da31db20687a58af); - Vector::push_back(&mut amounts, 3937705107); - - Vector::push_back
(&mut payees, @0x90be96494587ef009960fa6997757be7); - Vector::push_back(&mut amounts, 3945607785); - - Vector::push_back
(&mut payees, @0xb81bd2ab415f9457b5631b2603dcc356); - Vector::push_back(&mut amounts, 1345690505); - - Vector::push_back
(&mut payees, @0x865f6842dbbd425684761fbd3583624b); - Vector::push_back(&mut amounts, 5640560787); - - Vector::push_back
(&mut payees, @0x40b23269c1c77aea129d251f9b891b85); - Vector::push_back(&mut amounts, 1840372510); - - Vector::push_back
(&mut payees, @0x79c0f4bf7ce3ad9d6f6408b9e196e5ed); - Vector::push_back(&mut amounts, 4227424955); - - Vector::push_back
(&mut payees, @0x22f878237369df0034f3158461086a6c); - Vector::push_back(&mut amounts, 1162335720); - - Vector::push_back
(&mut payees, @0x98047df2062912ebbc138fd3cb3e8c1d); - Vector::push_back(&mut amounts, 1325314546); - - Vector::push_back
(&mut payees, @0xdb3489c4674251fb7c8da7f3b9d2c33c); - Vector::push_back(&mut amounts, 3984637699); - - Vector::push_back
(&mut payees, @0x29b875c576895f8bc5989553f1784b42); - Vector::push_back(&mut amounts, 4758686283); - - Vector::push_back
(&mut payees, @0x3814d57cafddccf7bc28a8737fd89a09); - Vector::push_back(&mut amounts, 3894503241); - - Vector::push_back
(&mut payees, @0xaa067cad39f6aa148255c5828dd73e1e); - Vector::push_back(&mut amounts, 3797988599); - - Vector::push_back
(&mut payees, @0xf02f6547d21688f96e0faeb72e026301); - Vector::push_back(&mut amounts, 2111718391); - - Vector::push_back
(&mut payees, @0x22e0707127066f9a91b22dbefa58936b); - Vector::push_back(&mut amounts, 1446981877); - - Vector::push_back
(&mut payees, @0x9ef30bedf54a855144b9a591e0d81113); - Vector::push_back(&mut amounts, 5029087638); - - Vector::push_back
(&mut payees, @0xfc342a7c18719cc7c81353bfeb1fee1d); - Vector::push_back(&mut amounts, 4859719687); - - Vector::push_back
(&mut payees, @0x68e08a837f8e8ee356ada4b5f2cc6f5b); - Vector::push_back(&mut amounts, 4607152846); - - Vector::push_back
(&mut payees, @0x8e23f25bc0df35142b6b6cb34d63a9f1); - Vector::push_back(&mut amounts, 5685272736); - - Vector::push_back
(&mut payees, @0xe1c91d948ff7051b2bb608cdc6a20df2); - Vector::push_back(&mut amounts, 4928380037); - - Vector::push_back
(&mut payees, @0xba9cb35fb754442af0e5c81b6560b44d); - Vector::push_back(&mut amounts, 4655887136); - - Vector::push_back
(&mut payees, @0xf284e1d3a3dc46d07f5c66f83d23b381); - Vector::push_back(&mut amounts, 6957038914); - - Vector::push_back
(&mut payees, @0x6ff9743408436b4ad0568d17392e8b9f); - Vector::push_back(&mut amounts, 4435789875); - - Vector::push_back
(&mut payees, @0xec3e4e4f3c29e363d097e1843cb3a6c8); - Vector::push_back(&mut amounts, 3021513805); - - Vector::push_back
(&mut payees, @0x82eb2e85a1c3c8cfe3d97b1933623894); - Vector::push_back(&mut amounts, 5788679049); - - Vector::push_back
(&mut payees, @0xe5159363d9d5e558725e56156751d70e); - Vector::push_back(&mut amounts, 1541211213); - - Vector::push_back
(&mut payees, @0x19d9139d91b13e7cd9323f7ada7fcb16); - Vector::push_back(&mut amounts, 4688647823); - - Vector::push_back
(&mut payees, @0xbe089210512b41d2d0b1c41b810d2c3c); - Vector::push_back(&mut amounts, 504397489); - - Vector::push_back
(&mut payees, @0xc033247d0f88c4cc796b0ebd09210ff4); - Vector::push_back(&mut amounts, 429565736); - - Vector::push_back
(&mut payees, @0xb84f911ea210d23130ef68e222d5dca7); - Vector::push_back(&mut amounts, 3873242321); - - Vector::push_back
(&mut payees, @0xda03aa486b8e5ff85be073484712bcfb); - Vector::push_back(&mut amounts, 412692995); - - Vector::push_back
(&mut payees, @0xeb54c76c6e3e6c3cca4b83e8f61112ad); - Vector::push_back(&mut amounts, 395081575); - - Vector::push_back
(&mut payees, @0x1e8f905234261dd575462f8facd5dc2b); - Vector::push_back(&mut amounts, 3227123577); - - Vector::push_back
(&mut payees, @0x8211f452baa248cbab103474f6f47a43); - Vector::push_back(&mut amounts, 1671453455); - - Vector::push_back
(&mut payees, @0xabcbe68e1cafd1d4b5d31337a5a48782); - Vector::push_back(&mut amounts, 995389837); - - Vector::push_back
(&mut payees, @0x709eedcac3ff9a8c1a956e6f069effd4); - Vector::push_back(&mut amounts, 477098692); - - Vector::push_back
(&mut payees, @0x3c81639f06cce18391a53180a515a961); - Vector::push_back(&mut amounts, 294081195); - - Vector::push_back
(&mut payees, @0xa2c6015b69fcb867d9e1410d737ea7f1); - Vector::push_back(&mut amounts, 494066945); - - Vector::push_back
(&mut payees, @0x6c2edd399bd29dddffe79fa7efd8d978); - Vector::push_back(&mut amounts, 607207041); - - Vector::push_back
(&mut payees, @0x87797cf31cf451d4735bd66600860e12); - Vector::push_back(&mut amounts, 475904661); - - Vector::push_back
(&mut payees, @0xd13b85884c472b33775120039e5dde61); - Vector::push_back(&mut amounts, 130378369); - - Vector::push_back
(&mut payees, @0xda825df005e2cf9766da80d932328a6b); - Vector::push_back(&mut amounts, 132267641); - - Vector::push_back
(&mut payees, @0x4eca94bd48f536ff9a16d5a95552a999); - Vector::push_back(&mut amounts, 132267641); - - Vector::push_back
(&mut payees, @0xf6aa1d7acce548546fcf513c88ffb40c); - Vector::push_back(&mut amounts, 1416361713); - - Vector::push_back
(&mut payees, @0xe2b3406d4847de1cbda0bc76c9358a20); - Vector::push_back(&mut amounts, 426964629); - - Vector::push_back
(&mut payees, @0x3e88f3c81563a9db32b7629b4ee9bd77); - Vector::push_back(&mut amounts, 425888109); - - Vector::push_back
(&mut payees, @0x7209c13e1253ad8fb2d96a30552052aa); - Vector::push_back(&mut amounts, 916648616); - - Vector::push_back
(&mut payees, @0x0161ede19a4ccfeb63a02ad2f98a537c); - Vector::push_back(&mut amounts, 2304225684); - - Vector::push_back
(&mut payees, @0xa8e9cd790bc2c385b36fee66a428a8f9); - Vector::push_back(&mut amounts, 2559128339); - - Vector::push_back
(&mut payees, @0x8d96559733778274793f59a1438b32bd); - Vector::push_back(&mut amounts, 726719979); - - Vector::push_back
(&mut payees, @0xb5678055f9598c602dabe84ba3b04593); - Vector::push_back(&mut amounts, 882638966); - - Vector::push_back
(&mut payees, @0xd20cc2989a2fb029d90f4ac2ab058fd9); - Vector::push_back(&mut amounts, 188962998); - - Vector::push_back
(&mut payees, @0x49f83959925bde908d684e63d9cfcc95); - Vector::push_back(&mut amounts, 3733006445); - - Vector::push_back
(&mut payees, @0x5d06cbeae9e2dc589c6e396e65a5c3b7); - Vector::push_back(&mut amounts, 863954205); - - Vector::push_back
(&mut payees, @0xdc8d2a2c8eb3711b52cb9572356267d0); - Vector::push_back(&mut amounts, 834267034); - - Vector::push_back
(&mut payees, @0x82952c9802d5a9eda4d08cd919cde08f); - Vector::push_back(&mut amounts, 830199203); - - Vector::push_back
(&mut payees, @0x31f9556705fb0ff226e80aea7f2295ea); - Vector::push_back(&mut amounts, 713993463); - - Vector::push_back
(&mut payees, @0xdb5ade4a07d0ff7567ec05231049e5cf); - Vector::push_back(&mut amounts, 713993463); - - Vector::push_back
(&mut payees, @0x2e90d84e4203c18d3bdf831d4f1e2854); - Vector::push_back(&mut amounts, 218521565); - - Vector::push_back
(&mut payees, @0x43f0f9ad642063f66c52bebd055f02f2); - Vector::push_back(&mut amounts, 2891016724); - - Vector::push_back
(&mut payees, @0xd883ea4f4209410c1b9ff9d4cc5c173a); - Vector::push_back(&mut amounts, 220373032); - - Vector::push_back
(&mut payees, @0x65c57ae3c8cf8670e054dd5cf76aa5f2); - Vector::push_back(&mut amounts, 218614381); - - Vector::push_back
(&mut payees, @0xedccbef0ddbc3d111e82908569b3fc7f); - Vector::push_back(&mut amounts, 224712476); - - Vector::push_back
(&mut payees, @0xdbb08a7c8fd5f3ebf31c344e650aa842); - Vector::push_back(&mut amounts, 216576668); - - Vector::push_back
(&mut payees, @0x40ed902d91912049f35f565159a24738); - Vector::push_back(&mut amounts, 2416640223); - - Vector::push_back
(&mut payees, @0x3e4d4488b8c8c9d33869388045abf540); - Vector::push_back(&mut amounts, 224543743); - - Vector::push_back
(&mut payees, @0xaa31765524619f8b5b42ed32df33ad3d); - Vector::push_back(&mut amounts, 159361797); - - Vector::push_back
(&mut payees, @0xb0392177b8c1d4e9d456f18e14819b2f); - Vector::push_back(&mut amounts, 176136472); - - Vector::push_back
(&mut payees, @0x7c265bb2bdbe586e8507fb11ff3350ed); - Vector::push_back(&mut amounts, 2731489612); - - Vector::push_back
(&mut payees, @0x83ff4547172ed294a5b36f846fcd57b2); - Vector::push_back(&mut amounts, 161303304); - - Vector::push_back
(&mut payees, @0x0f5c96256fcf97a34a0b95d17a720dc4); - Vector::push_back(&mut amounts, 176060556); - - Vector::push_back
(&mut payees, @0xfb27eb4f07cefb49fecccecb7841ac9e); - Vector::push_back(&mut amounts, 176101137); - - Vector::push_back
(&mut payees, @0xca659c2d5f30573a521b6d10cb241d43); - Vector::push_back(&mut amounts, 2743306051); - - Vector::push_back
(&mut payees, @0xd9c136ed4feb78902b665f132a9c3847); - Vector::push_back(&mut amounts, 180120937); - - Vector::push_back
(&mut payees, @0xd46c480b39e552f7c7931e6a0c9bf591); - Vector::push_back(&mut amounts, 182413724); - - Vector::push_back
(&mut payees, @0xfe9f0dc203321ff0f0a24ca484e90823); - Vector::push_back(&mut amounts, 3115798863); - - Vector::push_back
(&mut payees, @0xeec046693470e8ecac6ca94e0e3b34db); - Vector::push_back(&mut amounts, 1535257492); - - Vector::push_back
(&mut payees, @0xb40fd0520f0689f9fbf724371fe149a3); - Vector::push_back(&mut amounts, 4150311743); - - Vector::push_back
(&mut payees, @0x1a6f29d250c3daa9b505623c0e047f2c); - Vector::push_back(&mut amounts, 3873953587); - - Vector::push_back
(&mut payees, @0x1b3c71beb96d597c1f24a4b3586cdee3); - Vector::push_back(&mut amounts, 4493901313); - - Vector::push_back
(&mut payees, @0x7cd465e3c047471cb81e750638149bd3); - Vector::push_back(&mut amounts, 3080570528); - - Vector::push_back
(&mut payees, @0x37b96f5a653632b9ab07e4a439b23000); - Vector::push_back(&mut amounts, 809304803); - - Vector::push_back
(&mut payees, @0x1d5b4ed7e7d8b81d65779fdb39c09379); - Vector::push_back(&mut amounts, 1537913723); - - Vector::push_back
(&mut payees, @0x4588d649f8ac4ce6989cbfdd15d87b2a); - Vector::push_back(&mut amounts, 1729551615); - - Vector::push_back
(&mut payees, @0x5964fc4d3bbee909bf0e3f93a5d88059); - Vector::push_back(&mut amounts, 4430691672); - - Vector::push_back
(&mut payees, @0x908e0a73a8314708d902c0e7c381f49c); - Vector::push_back(&mut amounts, 1390058571); - - Vector::push_back
(&mut payees, @0xd8f264d8c48b43969821cfca5a7e67a6); - Vector::push_back(&mut amounts, 1668466933); - - Vector::push_back
(&mut payees, @0x6d9ba5db2988e18346581699bf2f553c); - Vector::push_back(&mut amounts, 1801623991); - - Vector::push_back
(&mut payees, @0xf430898f869584eea7f4ad7ea9978ef3); - Vector::push_back(&mut amounts, 2069965868); - - Vector::push_back
(&mut payees, @0xa26b65be2eae2538fb680d29d17267dc); - Vector::push_back(&mut amounts, 2289223194); - - Vector::push_back
(&mut payees, @0xed0a8b35ceb981b643ef73a1ee321f24); - Vector::push_back(&mut amounts, 3016734105); - - Vector::push_back
(&mut payees, @0x20067f3a9101eecb2f9368b93ebf8b36); - Vector::push_back(&mut amounts, 253014286); - - Vector::push_back
(&mut payees, @0xff8002816bbb0ba5836c7b3ec7f8312a); - Vector::push_back(&mut amounts, 4497010310); - - Vector::push_back
(&mut payees, @0x5096c87ccaae9e22bbb0afa407df7bbe); - Vector::push_back(&mut amounts, 1191725962); - - Vector::push_back
(&mut payees, @0xd2aa4935b02afc713465ae2521db1a60); - Vector::push_back(&mut amounts, 2892881148); - - Vector::push_back
(&mut payees, @0x8389fb3d6337b7feb7e53f82d8ad6920); - Vector::push_back(&mut amounts, 2913188925); - - Vector::push_back
(&mut payees, @0x9e2298855cf84174878eb8a2354b1b4c); - Vector::push_back(&mut amounts, 3411810258); - - Vector::push_back
(&mut payees, @0xbe6ea727168b3d77a2a13065c0470855); - Vector::push_back(&mut amounts, 147930044); - - Vector::push_back
(&mut payees, @0xea604cab2122da760b0a6281f5fa0fb8); - Vector::push_back(&mut amounts, 2842056410); - - Vector::push_back
(&mut payees, @0x2146347c273e74c7f34f292ce6cc5d21); - Vector::push_back(&mut amounts, 2707991065); - - Vector::push_back
(&mut payees, @0x8bb678d503167f49adf7e1270233c4fc); - Vector::push_back(&mut amounts, 2045268105); - - Vector::push_back
(&mut payees, @0xe0da2a11481cc043bfa219972ff007ed); - Vector::push_back(&mut amounts, 2677695988); - - Vector::push_back
(&mut payees, @0xba587434a45dd0fbc228753da045a568); - Vector::push_back(&mut amounts, 2660431419); - - Vector::push_back
(&mut payees, @0xdafd3d41474e1b39768c6dbc86627661); - Vector::push_back(&mut amounts, 2679196339); - - Vector::push_back
(&mut payees, @0x4fc61312f63c01604f50f30cd45d3a47); - Vector::push_back(&mut amounts, 2538468356); - - Vector::push_back
(&mut payees, @0xc6f34ed02f86e8120bbba6537800e246); - Vector::push_back(&mut amounts, 2651716767); - - Vector::push_back
(&mut payees, @0x21d801e001079b9fa172c7f5decbeeea); - Vector::push_back(&mut amounts, 2617293900); - - Vector::push_back
(&mut payees, @0x427db65905b2a98e3d2d96a6c34de858); - Vector::push_back(&mut amounts, 3989768923); - - Vector::push_back
(&mut payees, @0x1fd2e081f6f67d9ea7f1e0c491211e7f); - Vector::push_back(&mut amounts, 2607476814); - - Vector::push_back
(&mut payees, @0x6845705d1f88dd69f7b5ee36cf00627e); - Vector::push_back(&mut amounts, 2693258974); - - Vector::push_back
(&mut payees, @0x29b895ff3f046cb6a41c95940c6b9d25); - Vector::push_back(&mut amounts, 2680581008); - - Vector::push_back
(&mut payees, @0x605c0fff52eb6b99613d5818b8e23ce0); - Vector::push_back(&mut amounts, 4322135461); - - Vector::push_back
(&mut payees, @0x3479513e8439cd605a29b34e447d0015); - Vector::push_back(&mut amounts, 2573868833); - - Vector::push_back
(&mut payees, @0xb1d0171fe29e27347882b02d30d94917); - Vector::push_back(&mut amounts, 4122534757); - - Vector::push_back
(&mut payees, @0x4f2b12f18d31c681a0f2e722484a6615); - Vector::push_back(&mut amounts, 2493196993); - - Vector::push_back
(&mut payees, @0x20fbc1a3be8a4784049a37d1477ce735); - Vector::push_back(&mut amounts, 2442450119); - - Vector::push_back
(&mut payees, @0xa3f865bc8935eea1deb6bc35597fb1ef); - Vector::push_back(&mut amounts, 2421960992); - - Vector::push_back
(&mut payees, @0x3d4216833e2f4f2278eb6c2faa41ba47); - Vector::push_back(&mut amounts, 2452038844); - - Vector::push_back
(&mut payees, @0xa206bec6891ad961c8532f2acdd70e5a); - Vector::push_back(&mut amounts, 2445676321); - - Vector::push_back
(&mut payees, @0x6fcfd01ce948c4bb46e4c255c610e12d); - Vector::push_back(&mut amounts, 2455622933); - - Vector::push_back
(&mut payees, @0xdf68346495fc8517d231d1eba7ab28d2); - Vector::push_back(&mut amounts, 3771408292); - - Vector::push_back
(&mut payees, @0x351eaf2d51366e57e68b7d027766d6d0); - Vector::push_back(&mut amounts, 2488990454); - - Vector::push_back
(&mut payees, @0x404266076249c6f483f42c94cdb7faf7); - Vector::push_back(&mut amounts, 2521368400); - - Vector::push_back
(&mut payees, @0x870f7f81b57daf2880c03ba287f269b3); - Vector::push_back(&mut amounts, 2566793169); - - Vector::push_back
(&mut payees, @0x7355e047e103e2bb5f31137d068ad68d); - Vector::push_back(&mut amounts, 2605989940); - - Vector::push_back
(&mut payees, @0x5b26e6e485b66f5dad35cafce4fddbd6); - Vector::push_back(&mut amounts, 2481668377); - - Vector::push_back
(&mut payees, @0xfe319051cab95208dd0ea7afd403f33a); - Vector::push_back(&mut amounts, 2436203337); - - Vector::push_back
(&mut payees, @0x1033bd8739089336f8d4e1d66995ba9f); - Vector::push_back(&mut amounts, 2430425225); - - Vector::push_back
(&mut payees, @0x0ad0cee657ea90f6523056bf06ed99b4); - Vector::push_back(&mut amounts, 2032537426); - - Vector::push_back
(&mut payees, @0xfca7250767e0acbd4840b56155d08558); - Vector::push_back(&mut amounts, 2071055423); - - Vector::push_back
(&mut payees, @0xf87a7d18ad956f230b85fbc5d7c76096); - Vector::push_back(&mut amounts, 3185904042); - - Vector::push_back
(&mut payees, @0xe3b8db1d66797a99863ed1ad88b64e81); - Vector::push_back(&mut amounts, 1604893268); - - Vector::push_back
(&mut payees, @0xc5dcffbf39c1357daa7ddb79e8f5bf85); - Vector::push_back(&mut amounts, 2104722139); - - Vector::push_back
(&mut payees, @0xa51a24ef73f93badd0c0ad6dd75d3946); - Vector::push_back(&mut amounts, 2178852940); - - Vector::push_back
(&mut payees, @0x862e8c86626a55f5480ec6e006ca69a4); - Vector::push_back(&mut amounts, 1968400040); - - Vector::push_back
(&mut payees, @0xb39f87734cf1b2560d4012bd7a5f9b47); - Vector::push_back(&mut amounts, 2011537111); - - Vector::push_back
(&mut payees, @0xc3ea931b0a4133e59e8d921f542f437e); - Vector::push_back(&mut amounts, 2104295899); - - Vector::push_back
(&mut payees, @0x32129f6d8c240f0135cdd965987ee7e2); - Vector::push_back(&mut amounts, 1931621251); - - Vector::push_back
(&mut payees, @0x85602cc707fa670160029d1f482fe198); - Vector::push_back(&mut amounts, 2263990195); - - Vector::push_back
(&mut payees, @0x1b639139aeada87fb044fdd6a52f2ef0); - Vector::push_back(&mut amounts, 766909896); - - Vector::push_back
(&mut payees, @0xb2ff477bef2084fcae76ac8a77ff8eb7); - Vector::push_back(&mut amounts, 1972051842); - - Vector::push_back
(&mut payees, @0x18b85913df83c8fc24717b06baaa20eb); - Vector::push_back(&mut amounts, 2135050351); - - Vector::push_back
(&mut payees, @0xbd2350b9a864862fde0cc35d6fa81115); - Vector::push_back(&mut amounts, 2370198033); - - Vector::push_back
(&mut payees, @0x582f31b27debbbb4969067544d2606fe); - Vector::push_back(&mut amounts, 2114794470); - - Vector::push_back
(&mut payees, @0xb8eaa669103f7c65bc232ffd0df08885); - Vector::push_back(&mut amounts, 2211755660); - - Vector::push_back
(&mut payees, @0x6b45c9f9d67d66f7f50c84869e559a91); - Vector::push_back(&mut amounts, 2049885843); - - Vector::push_back
(&mut payees, @0x33b17e77c80bb760540e63528aef76a6); - Vector::push_back(&mut amounts, 772464092); - - Vector::push_back
(&mut payees, @0x1dff026af05d93d566d2887bae1b4baa); - Vector::push_back(&mut amounts, 2073060480); - - Vector::push_back
(&mut payees, @0x52572c2227d9aad3384d4bbac0047761); - Vector::push_back(&mut amounts, 2121871333); - - Vector::push_back
(&mut payees, @0x85ce186d86fe4e9cf5fdebde17117a28); - Vector::push_back(&mut amounts, 3874323071); - - Vector::push_back
(&mut payees, @0x3a65e03286106abe55fcff848380befa); - Vector::push_back(&mut amounts, 2064976315); - - Vector::push_back
(&mut payees, @0xa7b983d569bfaff0a3e6a685fd7da166); - Vector::push_back(&mut amounts, 2132309694); - - Vector::push_back
(&mut payees, @0xffd7104d222373b7275aa67c9304b4a7); - Vector::push_back(&mut amounts, 2121966946); - - Vector::push_back
(&mut payees, @0xe0c5b5eabfd88fc407ef430f79acf414); - Vector::push_back(&mut amounts, 2220034664); - - Vector::push_back
(&mut payees, @0x4387ba840ee2197ac5149ea1d85d638f); - Vector::push_back(&mut amounts, 4631193560); - - Vector::push_back
(&mut payees, @0xb3f17df88cafc977c02775ba611bf922); - Vector::push_back(&mut amounts, 3716569144); - - Vector::push_back
(&mut payees, @0xd44cc4a5f9b8074d7cb64e6aaa46b8a7); - Vector::push_back(&mut amounts, 4467554201); - - Vector::push_back
(&mut payees, @0x88b324eb7356d9bdfaa5c5c0da777a7e); - Vector::push_back(&mut amounts, 3981622413); - - Vector::push_back
(&mut payees, @0x1b79fc53c6358093bf9ed5487e5d1804); - Vector::push_back(&mut amounts, 2630606005); - - Vector::push_back
(&mut payees, @0x2ea8bfb57da5e5535f2d6ae47f6ba5fb); - Vector::push_back(&mut amounts, 1249802907); - - Vector::push_back
(&mut payees, @0x9de40b3ebd3d12fb2883cc12977ed5f5); - Vector::push_back(&mut amounts, 6649831630); - - Vector::push_back
(&mut payees, @0xdaa5914fbb196a15ead501a7d22049b3); - Vector::push_back(&mut amounts, 2890183942); - - Vector::push_back
(&mut payees, @0xdef1058fc8ebd90656a9f62ffe9c5252); - Vector::push_back(&mut amounts, 356311979); - - Vector::push_back
(&mut payees, @0x2c27cf859a7919b1ed0a8f2aac006f68); - Vector::push_back(&mut amounts, 1093593147); - - Vector::push_back
(&mut payees, @0x80cc5384359bdbc6add6329831daacce); - Vector::push_back(&mut amounts, 1200095233); - - Vector::push_back
(&mut payees, @0xe42d13064128989229ec02e252fc8dd3); - Vector::push_back(&mut amounts, 1045704513); - - Vector::push_back
(&mut payees, @0x043ad3ab1868e162fa5ef59deadf6139); - Vector::push_back(&mut amounts, 283278484); - - Vector::push_back
(&mut payees, @0x1f627c1d2568f548d9f2be5b7ba52b17); - Vector::push_back(&mut amounts, 4082574047); - - Vector::push_back
(&mut payees, @0x623222c248a69ca58970b0c53256091c); - Vector::push_back(&mut amounts, 1764796245); - - Vector::push_back
(&mut payees, @0x622c22ad4a9c83a4c082ac16d8f8fe0d); - Vector::push_back(&mut amounts, 1533564061); - - Vector::push_back
(&mut payees, @0x5b36e8e7bae69c32a7c7e5532768842d); - Vector::push_back(&mut amounts, 2623142764); - - Vector::push_back
(&mut payees, @0xcdaedae0eedbcaa532ee4ac090333334); - Vector::push_back(&mut amounts, 486452372); - - Vector::push_back
(&mut payees, @0xe9bd97ea6d9d9d4d7463f0f72a619bc3); - Vector::push_back(&mut amounts, 1857754745); - - Vector::push_back
(&mut payees, @0x4a0078fe4425dae4d6bee31dd4e63fcd); - Vector::push_back(&mut amounts, 2146145577); - - Vector::push_back
(&mut payees, @0xca6726044c1318dabdedbd88d0801f88); - Vector::push_back(&mut amounts, 4293345915); - - Vector::push_back
(&mut payees, @0xa280fa1f3cde95fe968137644270ef69); - Vector::push_back(&mut amounts, 2726739113); - - Vector::push_back
(&mut payees, @0xe3c36f789c17dce96ad5a9521bcfd55f); - Vector::push_back(&mut amounts, 2329968491); - - Vector::push_back
(&mut payees, @0xb3d5a6da7a5bd6be9b810fe13524e4f7); - Vector::push_back(&mut amounts, 3630218327); - - Vector::push_back
(&mut payees, @0x6e708cb801c22d14e54f764013553797); - Vector::push_back(&mut amounts, 3404678271); - - Vector::push_back
(&mut payees, @0x069007bb7ab2d0f0631eb01b42438b0e); - Vector::push_back(&mut amounts, 4408815959); - - Vector::push_back
(&mut payees, @0xbed293808df535747361540d6f1addbb); - Vector::push_back(&mut amounts, 3191928403); - - Vector::push_back
(&mut payees, @0xf6b097cbeb02df717e7c6dbf471646fc); - Vector::push_back(&mut amounts, 4375691765); - - Vector::push_back
(&mut payees, @0x92e0f5949e9946a1ebf318c112f28ca4); - Vector::push_back(&mut amounts, 2123330931); - - Vector::push_back
(&mut payees, @0x55eb0ce2b80ec1b66152bc19a44f9eb6); - Vector::push_back(&mut amounts, 5158373676); - - Vector::push_back
(&mut payees, @0xa164ca45b99603970c5e7fcc23609317); - Vector::push_back(&mut amounts, 67914119); - - Vector::push_back
(&mut payees, @0x50c399340efa7393c2c95ce1e9954254); - Vector::push_back(&mut amounts, 85794438); - - Vector::push_back
(&mut payees, @0x66a0c9899e1986d1c36bec897959ed4f); - Vector::push_back(&mut amounts, 2415038825); - - Vector::push_back
(&mut payees, @0xe076ab3f2f35ec51c0dd5021d2eadb38); - Vector::push_back(&mut amounts, 2417922680); - - Vector::push_back
(&mut payees, @0xd74f75285231012593cee01161d8b1ac); - Vector::push_back(&mut amounts, 347089425); - - Vector::push_back
(&mut payees, @0x74f21e48d5396d50403ee0c284ec5b1c); - Vector::push_back(&mut amounts, 2377980748); - - Vector::push_back
(&mut payees, @0x16ed7128b19179a8c30f9103f9c64da2); - Vector::push_back(&mut amounts, 311891881); - - Vector::push_back
(&mut payees, @0x7c6966817e21bfc8e3ec3c37d064e58f); - Vector::push_back(&mut amounts, 2385908092); - - Vector::push_back
(&mut payees, @0x8b1db5524b3d07133ce83f230352869a); - Vector::push_back(&mut amounts, 227529774); - - Vector::push_back
(&mut payees, @0xa42c8859da0c0f9120976c36b4b84091); - Vector::push_back(&mut amounts, 181006486); - - Vector::push_back
(&mut payees, @0x711ee4ea20d15d64567cf5e93ef6e0f8); - Vector::push_back(&mut amounts, 2396183297); - - Vector::push_back
(&mut payees, @0xd139069cd6a8d67d6477f41f14f5eff2); - Vector::push_back(&mut amounts, 81859980); - - Vector::push_back
(&mut payees, @0x3c0af0e90031c2d3fedd27f5ad4f1b5e); - Vector::push_back(&mut amounts, 244136929); - - Vector::push_back
(&mut payees, @0xeb5eef52aa7786d75f8d63816c030c12); - Vector::push_back(&mut amounts, 2417878293); - - Vector::push_back
(&mut payees, @0x45bda98321118bbd7a4e9c0cda951e4b); - Vector::push_back(&mut amounts, 218463163); - - Vector::push_back
(&mut payees, @0xd13e66f7bc5549ab6eea61ea862b5b99); - Vector::push_back(&mut amounts, 2374767345); - - Vector::push_back
(&mut payees, @0x6718daef7f1c730621c7927d55810ec4); - Vector::push_back(&mut amounts, 144202281); - - Vector::push_back
(&mut payees, @0xadb1d3d1cc6c6a20095d471d5477e1f8); - Vector::push_back(&mut amounts, 2405694643); - - Vector::push_back
(&mut payees, @0xd372dcb7e4319508cc470ac09bca5a42); - Vector::push_back(&mut amounts, 1335794336); - - Vector::push_back
(&mut payees, @0x431c17c5a7eba324605a2ad7c2adab73); - Vector::push_back(&mut amounts, 2374707703); - - Vector::push_back
(&mut payees, @0xf1dbfb2b922850dd06ae8077630d68e8); - Vector::push_back(&mut amounts, 2409924764); - - Vector::push_back
(&mut payees, @0x6a8ac18d0fa03ac324ae9b9cbc96e723); - Vector::push_back(&mut amounts, 2249283235); - - Vector::push_back
(&mut payees, @0xdd2fdcffd05cad686fb3116e4877a0b7); - Vector::push_back(&mut amounts, 1625766505); - - Vector::push_back
(&mut payees, @0xd62d5a56291dab1edc81744271b059d2); - Vector::push_back(&mut amounts, 2302161346); - - Vector::push_back
(&mut payees, @0xf671e6d79b71ee3f2b02d3f52c7ec6b5); - Vector::push_back(&mut amounts, 1670342279); - - Vector::push_back
(&mut payees, @0x1765d8b59157af3d3ef5bce9bd14fd79); - Vector::push_back(&mut amounts, 2267047211); - - Vector::push_back
(&mut payees, @0x822676ce88bc33b90c0de6547698278f); - Vector::push_back(&mut amounts, 1628639436); - - Vector::push_back
(&mut payees, @0x515de306486e262d7b40449e8b405167); - Vector::push_back(&mut amounts, 2293701071); - - Vector::push_back
(&mut payees, @0xc253ea74278c89584a027e258ea4ca51); - Vector::push_back(&mut amounts, 2309031546); - - Vector::push_back
(&mut payees, @0xa3d9dd7d57356be3831aac9f91c0cfb6); - Vector::push_back(&mut amounts, 1636230369); - - Vector::push_back
(&mut payees, @0x3a84bfdd7994e1ccf536d521a1434805); - Vector::push_back(&mut amounts, 2310884626); - - Vector::push_back
(&mut payees, @0xc8ccf1f79b8809da5c651daf38dd89fb); - Vector::push_back(&mut amounts, 2265174570); - - Vector::push_back
(&mut payees, @0x1c9d5ef94c7c7794368008e0a217d993); - Vector::push_back(&mut amounts, 1622222416); - - Vector::push_back
(&mut payees, @0x6782248feb1ce3d4a90d2257fb477cd9); - Vector::push_back(&mut amounts, 2295842105); - - Vector::push_back
(&mut payees, @0x2dbf3505fcca59f161335fc74d755906); - Vector::push_back(&mut amounts, 1648651608); - - Vector::push_back
(&mut payees, @0xd616b63b57a3223958a52dbb10889e04); - Vector::push_back(&mut amounts, 2289512319); - - Vector::push_back
(&mut payees, @0x391fa64aaeb77146902273bee811b6e0); - Vector::push_back(&mut amounts, 2292589885); - - Vector::push_back
(&mut payees, @0x5887ab2b8f8ba5dc16274fddd44cb3d0); - Vector::push_back(&mut amounts, 1667890368); - - Vector::push_back
(&mut payees, @0x8184465d83c2b48192c117609a6dd590); - Vector::push_back(&mut amounts, 2275012363); - - Vector::push_back
(&mut payees, @0x2df4a71aed114444544e57a7690a6ce1); - Vector::push_back(&mut amounts, 2308530941); - - Vector::push_back
(&mut payees, @0xaef0b75a511a81695064af49002e38ea); - Vector::push_back(&mut amounts, 2301086238); - - Vector::push_back
(&mut payees, @0xe1daff5b32fe72f04eddb4b6072ab73a); - Vector::push_back(&mut amounts, 2292312385); - - Vector::push_back
(&mut payees, @0xa81b9e4937e34627d530a278af2a621f); - Vector::push_back(&mut amounts, 1625766561); - - Vector::push_back
(&mut payees, @0xd1bd324825f062065935d278c0aea4c9); - Vector::push_back(&mut amounts, 2271875635); - - Vector::push_back
(&mut payees, @0xa9d2dfc33d8fc9b009de0caed6c339c2); - Vector::push_back(&mut amounts, 2302983376); - - Vector::push_back
(&mut payees, @0x913f9866834dfff8bb6018134fa6a8d6); - Vector::push_back(&mut amounts, 2040852562); - - Vector::push_back
(&mut payees, @0x0ca761af163c38550604ace27add1901); - Vector::push_back(&mut amounts, 2045281520); - - Vector::push_back
(&mut payees, @0x365b72e7c1ffefc701d328b24bf9ea7f); - Vector::push_back(&mut amounts, 2047780497); - - Vector::push_back
(&mut payees, @0x40db723477ad162d1882ffeeaf6620b3); - Vector::push_back(&mut amounts, 2034549999); - - Vector::push_back
(&mut payees, @0x5ded979ac62316433e0e4ef183db79e9); - Vector::push_back(&mut amounts, 2063775348); - - Vector::push_back
(&mut payees, @0x5ec1c8f5bc8f73225a535d9798fa1251); - Vector::push_back(&mut amounts, 1627824508); - - Vector::push_back
(&mut payees, @0x6ce8516136b10aff02b63a223eec150f); - Vector::push_back(&mut amounts, 2063476686); - - Vector::push_back
(&mut payees, @0xeed80844497b781281292439d62ebb7e); - Vector::push_back(&mut amounts, 2034762151); - - Vector::push_back
(&mut payees, @0xa282970fa0e104651b540fdc294cd12f); - Vector::push_back(&mut amounts, 2062944988); - - Vector::push_back
(&mut payees, @0x29cd44921748384657449c0efaeb031c); - Vector::push_back(&mut amounts, 2023171729); - - Vector::push_back
(&mut payees, @0x64e31246c7ed2e486b064fbb9615d19b); - Vector::push_back(&mut amounts, 2071316566); - - Vector::push_back
(&mut payees, @0x8aa9e5f9ef062815bb036c5e79efa866); - Vector::push_back(&mut amounts, 2030651790); - - Vector::push_back
(&mut payees, @0xc926928e68157da331be406d41eb61f1); - Vector::push_back(&mut amounts, 2067275776); - - Vector::push_back
(&mut payees, @0x7a6155e6fb52cb3814ac2e9ca2d100e6); - Vector::push_back(&mut amounts, 2056304025); - - Vector::push_back
(&mut payees, @0x32e31d566ad9c152345d538ba17fb6c2); - Vector::push_back(&mut amounts, 1616644051); - - Vector::push_back
(&mut payees, @0x010f56cc16f28f4b868145a4f4df7871); - Vector::push_back(&mut amounts, 2048895235); - - Vector::push_back
(&mut payees, @0x2fcab14988361b66179ac04e15a34d81); - Vector::push_back(&mut amounts, 1649391614); - - Vector::push_back
(&mut payees, @0xcf4e4665eb6a5c1cffcf115c17175fb3); - Vector::push_back(&mut amounts, 2069124955); - - Vector::push_back
(&mut payees, @0xa11b635d863eede6fd7a4a8ae0c14679); - Vector::push_back(&mut amounts, 1614820813); - - Vector::push_back
(&mut payees, @0x5c40351b488ab441f79525f4909e28d5); - Vector::push_back(&mut amounts, 1984425614); - - Vector::push_back
(&mut payees, @0x3ef220e67cad08148906d03bcc5179e0); - Vector::push_back(&mut amounts, 1682918851); - - Vector::push_back
(&mut payees, @0xba69ca326ae5ee7241daa3d1cf8ca723); - Vector::push_back(&mut amounts, 1627315336); - - Vector::push_back
(&mut payees, @0xcca95e6accb8d7d1eb9a9cc019bb62b3); - Vector::push_back(&mut amounts, 1676281436); - - Vector::push_back
(&mut payees, @0x152be19617f1772be12cd1cd5c472826); - Vector::push_back(&mut amounts, 1592331585); - - Vector::push_back
(&mut payees, @0xe4d80fd7d4ba3c41259dacf6e6902d0e); - Vector::push_back(&mut amounts, 1642804134); - - Vector::push_back
(&mut payees, @0x93f86799148b03f09ca1fe6b7a8f2d6e); - Vector::push_back(&mut amounts, 1344288578); - - Vector::push_back
(&mut payees, @0x7292544bbf4e6dd2381645176f02d3d9); - Vector::push_back(&mut amounts, 1355749430); - - Vector::push_back
(&mut payees, @0xfb5aac3e555d096e392ace7b3e630b2a); - Vector::push_back(&mut amounts, 1352891886); - - Vector::push_back
(&mut payees, @0x529db97c5a2bb703b68334ff1bef46b4); - Vector::push_back(&mut amounts, 4794980578); - - Vector::push_back
(&mut payees, @0xd203bebf240f93dace0cc6857879610e); - Vector::push_back(&mut amounts, 1436244313); - - Vector::push_back
(&mut payees, @0xe210b35e264c527d1b5c647b382808ed); - Vector::push_back(&mut amounts, 1525572876); - - Vector::push_back
(&mut payees, @0xe2f5f40560e8993ef96c55698c1671f4); - Vector::push_back(&mut amounts, 1631022095); - - Vector::push_back
(&mut payees, @0x874304e5578964aea4423539946109c9); - Vector::push_back(&mut amounts, 1529444935); - - Vector::push_back
(&mut payees, @0xc6c88d0ae669ad52b254ac07c4189c2e); - Vector::push_back(&mut amounts, 3105921661); - - Vector::push_back
(&mut payees, @0x4e53e94644860c4203d5068387363e34); - Vector::push_back(&mut amounts, 1498804631); - - Vector::push_back
(&mut payees, @0x06619b491d539c27c5a51842f3d52362); - Vector::push_back(&mut amounts, 2382082030); - - Vector::push_back
(&mut payees, @0x92d0d4198561211d0c1e3d063822980c); - Vector::push_back(&mut amounts, 1822271657); - - Vector::push_back
(&mut payees, @0x6fac39c71f8755410ddcc903e453056a); - Vector::push_back(&mut amounts, 2895608989); - - Vector::push_back
(&mut payees, @0x2ac339f1da56f2f10a149d0faa1f45b5); - Vector::push_back(&mut amounts, 2904711954); - - Vector::push_back
(&mut payees, @0x82205ff77291b357bb12b147be2479eb); - Vector::push_back(&mut amounts, 4280945257); - - Vector::push_back
(&mut payees, @0x7d6eafdd9c8f2d4f451bded5374af0e3); - Vector::push_back(&mut amounts, 3022052747); - - Vector::push_back
(&mut payees, @0x6152db215858d3bfdbc82a0c0138170b); - Vector::push_back(&mut amounts, 7462330956); - - Vector::push_back
(&mut payees, @0xcbaeb56e891ed0292f0cbb10ec78b133); - Vector::push_back(&mut amounts, 2974936859); - - Vector::push_back
(&mut payees, @0xda10b8dd4ea38af165b563a958ce908a); - Vector::push_back(&mut amounts, 8722761619); - - Vector::push_back
(&mut payees, @0xd794fc787036a61da611aa9afe6495db); - Vector::push_back(&mut amounts, 2926845621); - - Vector::push_back
(&mut payees, @0xf289071ed2c77b7eeb77a80e2b3d18c0); - Vector::push_back(&mut amounts, 2382140295); - - Vector::push_back
(&mut payees, @0x356e58619def49e8456caed45d30bd12); - Vector::push_back(&mut amounts, 2445828303); - - Vector::push_back
(&mut payees, @0xa895a36571cf9ed5618e394f801c86aa); - Vector::push_back(&mut amounts, 4902719713); - - Vector::push_back
(&mut payees, @0x9282ff7f6421a9f454b5664b19d3f3f1); - Vector::push_back(&mut amounts, 2449377721); - - Vector::push_back
(&mut payees, @0xfc66b9e5d1497918c4f405c98b20bcd6); - Vector::push_back(&mut amounts, 2422993724); - - Vector::push_back
(&mut payees, @0x7e3224f5216749a6b221856c5e75225d); - Vector::push_back(&mut amounts, 2417956185); - - Vector::push_back
(&mut payees, @0x501d71a70b291c8beeec4a4ed1c04561); - Vector::push_back(&mut amounts, 2430890984); - - Vector::push_back
(&mut payees, @0x1d03a4db2370e8d2536f682d3864f020); - Vector::push_back(&mut amounts, 1367412073); - - Vector::push_back
(&mut payees, @0xb3afbdab4bb65f7f4b279d17b2f2e428); - Vector::push_back(&mut amounts, 489269437); - - Vector::push_back
(&mut payees, @0x4e36f70696b235f8b88d2698bfbb2f13); - Vector::push_back(&mut amounts, 493072248); - - Vector::push_back
(&mut payees, @0xdca0da4546228b03d19037d5daa9d732); - Vector::push_back(&mut amounts, 1377020850); - - Vector::push_back
(&mut payees, @0xe12e1cec5ea73bb34c1c717af67e7a58); - Vector::push_back(&mut amounts, 475310636); - - Vector::push_back
(&mut payees, @0x4fb0873635fc370d52faa75bdeaa0a6d); - Vector::push_back(&mut amounts, 1371095218); - - Vector::push_back
(&mut payees, @0x1f1df4f8b0d7cbd006fce445fb6ca329); - Vector::push_back(&mut amounts, 2953925850); - - Vector::push_back
(&mut payees, @0x3ef6a66e588e03368d8e4cd5d4f11f10); - Vector::push_back(&mut amounts, 3036310527); - - Vector::push_back
(&mut payees, @0xad04cfff6701525ab6ed551618e39187); - Vector::push_back(&mut amounts, 2622018966); - - Vector::push_back
(&mut payees, @0xf08c00a694433d494e6ff57051f7ead1); - Vector::push_back(&mut amounts, 2467619772); - - Vector::push_back
(&mut payees, @0x4cdbb44165e74a9f90fe98040eb79909); - Vector::push_back(&mut amounts, 2569560378); - - Vector::push_back
(&mut payees, @0x29e37d58e98f8b449e42c0a95f640961); - Vector::push_back(&mut amounts, 2437944778); - - Vector::push_back
(&mut payees, @0x55fe47b618b57cc5b5fdc08971ac6ec7); - Vector::push_back(&mut amounts, 2490805239); - - Vector::push_back
(&mut payees, @0x0c565d67373b09873f2db9d1a04a953a); - Vector::push_back(&mut amounts, 2395758496); - - Vector::push_back
(&mut payees, @0x8b6f7a351edefa220e93b359815c5d99); - Vector::push_back(&mut amounts, 2086988358); - - Vector::push_back
(&mut payees, @0xa8e727297ae14a5c5597fccc6b32fd73); - Vector::push_back(&mut amounts, 2341186693); - - Vector::push_back
(&mut payees, @0x84076cb12e5758e18c87be4628379e77); - Vector::push_back(&mut amounts, 2237782280); - - Vector::push_back
(&mut payees, @0xd991184ee47db6b2c40aec9d66a8ef88); - Vector::push_back(&mut amounts, 2316016517); - - Vector::push_back
(&mut payees, @0xba39e4955eacfae29fce4b30e35abd5f); - Vector::push_back(&mut amounts, 2264469540); - - Vector::push_back
(&mut payees, @0xa36b477046420db5fc5713a3870cf2a6); - Vector::push_back(&mut amounts, 2272141760); - - Vector::push_back
(&mut payees, @0x73fcaefc65d0da68c4ff05b3991cad9c); - Vector::push_back(&mut amounts, 2279233216); - - Vector::push_back
(&mut payees, @0x26e6e154c49e4121e3f2366038e0ad4e); - Vector::push_back(&mut amounts, 2342826388); - - Vector::push_back
(&mut payees, @0x834feceb7366679877dde7e50ebc5675); - Vector::push_back(&mut amounts, 2387718594); - - Vector::push_back
(&mut payees, @0x6d7651e498f4c7dee97480a4002737e1); - Vector::push_back(&mut amounts, 2219183805); - - Vector::push_back
(&mut payees, @0x49f250f03065c630879889f7c0e6077b); - Vector::push_back(&mut amounts, 2131668108); - - Vector::push_back
(&mut payees, @0xe300f69d62f2fb58b4c2a1403614cc82); - Vector::push_back(&mut amounts, 2185603513); - - Vector::push_back
(&mut payees, @0xcc6e37a390e83ae53710938599990765); - Vector::push_back(&mut amounts, 2103311197); - - Vector::push_back
(&mut payees, @0x17cae8af525724f50475c4203f8255f9); - Vector::push_back(&mut amounts, 7544031721); - - Vector::push_back
(&mut payees, @0xf1a04e85a0190e1a17426c1b6c49b71f); - Vector::push_back(&mut amounts, 2002391536); - - Vector::push_back
(&mut payees, @0xd7bb5dea8b3f1df93b547763982e26c2); - Vector::push_back(&mut amounts, 2058483319); - - Vector::push_back
(&mut payees, @0x6704b5dad254640134381ba3a236ee0d); - Vector::push_back(&mut amounts, 483343805); - - Vector::push_back
(&mut payees, @0x864a42ffb0d1261519c8aa9942d1bc98); - Vector::push_back(&mut amounts, 481220984); - - Vector::push_back
(&mut payees, @0x2756641d5bd5f7cb3c5d4482eb26eb74); - Vector::push_back(&mut amounts, 484199084); - - Vector::push_back
(&mut payees, @0x73b04426a7122c9a801a3f47f8d875bd); - Vector::push_back(&mut amounts, 489269437); - - Vector::push_back
(&mut payees, @0xfe1792fc7f2a6e69614ce5ca15912f3a); - Vector::push_back(&mut amounts, 1355505184); - - Vector::push_back
(&mut payees, @0x62c74bd1d53aca936e00ebb720e8bb94); - Vector::push_back(&mut amounts, 489269437); - - Vector::push_back
(&mut payees, @0x0e2f026d1656779b15f3ab7f18edca8a); - Vector::push_back(&mut amounts, 492232252); - - Vector::push_back
(&mut payees, @0x32d90a5e9ff569d29f8c241801c86b17); - Vector::push_back(&mut amounts, 483343805); - - Vector::push_back
(&mut payees, @0x764e48425fb308f356509962e7687f37); - Vector::push_back(&mut amounts, 486306621); - - Vector::push_back
(&mut payees, @0x3f6bf524b7fa0ba42c9391ffb74ff78a); - Vector::push_back(&mut amounts, 486306621); - - Vector::push_back
(&mut payees, @0x84d27cd9a8ac878f4a3b764a275b1b63); - Vector::push_back(&mut amounts, 2404863492); - - Vector::push_back
(&mut payees, @0x1cc621b0cd06bda4dbddb7158361aea2); - Vector::push_back(&mut amounts, 837812345); - - Vector::push_back
(&mut payees, @0x29a166acc2372470366efe7b4b06829b); - Vector::push_back(&mut amounts, 3423534625); - - Vector::push_back
(&mut payees, @0x30c51b7dd430a1680c8d667cbad866c0); - Vector::push_back(&mut amounts, 1792235510); - - Vector::push_back
(&mut payees, @0xf720648bd133b258722aa598f19d8868); - Vector::push_back(&mut amounts, 3238247682); - - Vector::push_back
(&mut payees, @0x04d97f7c236ea7f1ab46578e814f63b9); - Vector::push_back(&mut amounts, 950436408); - - Vector::push_back
(&mut payees, @0x724ad9262acaace659a084e860dfb93b); - Vector::push_back(&mut amounts, 1621379280); - - Vector::push_back
(&mut payees, @0x1166c966da6c555a24dcae060585384e); - Vector::push_back(&mut amounts, 2065011320); - - Vector::push_back
(&mut payees, @0x13a6a04766338b05577346ba170845ed); - Vector::push_back(&mut amounts, 2510047575); - - Vector::push_back
(&mut payees, @0x1c4d7dd851618f49be418ccd2b9e12d4); - Vector::push_back(&mut amounts, 2206002665); - - Vector::push_back
(&mut payees, @0x72249a63279e034db4d6ef4bc0677bf5); - Vector::push_back(&mut amounts, 3682590295); - - Vector::push_back
(&mut payees, @0xef6b96f79f159bc0db9bf79d6a3f8c9b); - Vector::push_back(&mut amounts, 2226999760); - - Vector::push_back
(&mut payees, @0x6ee1a76d0a856148d854d42f704c7755); - Vector::push_back(&mut amounts, 2181576621); - - Vector::push_back
(&mut payees, @0xb093ded7d475bb2236c1e972f1e20fd7); - Vector::push_back(&mut amounts, 2166210069); - - Vector::push_back
(&mut payees, @0xb496f1c0464c187d7be522bcf7a4bcbf); - Vector::push_back(&mut amounts, 2230418656); - - Vector::push_back
(&mut payees, @0x150beefdfc88a82e85d8d786a09edada); - Vector::push_back(&mut amounts, 2159641372); - - Vector::push_back
(&mut payees, @0x821a75fb241fc503b0ec187561d555b3); - Vector::push_back(&mut amounts, 2840820648); - - Vector::push_back
(&mut payees, @0xb316ed1021ef3a3f1702570b563d3bcf); - Vector::push_back(&mut amounts, 2173366888); - - Vector::push_back
(&mut payees, @0xe9be0838e6f93f5eb8de94dd817a98a2); - Vector::push_back(&mut amounts, 2212633645); - - Vector::push_back
(&mut payees, @0x84b3368bf8e26366dd3cfe504621331a); - Vector::push_back(&mut amounts, 4921628115); - - Vector::push_back
(&mut payees, @0xea60b3f6e32e2a7a94da8e7ad4981b9c); - Vector::push_back(&mut amounts, 3249244610); - - Vector::push_back
(&mut payees, @0xb61cbb044d17b0e193a839a1582ebfae); - Vector::push_back(&mut amounts, 3160228751); - - Vector::push_back
(&mut payees, @0xc99b151767d15227af0c4107751dea1c); - Vector::push_back(&mut amounts, 1639885186); - - Vector::push_back
(&mut payees, @0xe61d8d6cdbc4ae6f197fb544f5c3d9f7); - Vector::push_back(&mut amounts, 1752154621); - - Vector::push_back
(&mut payees, @0x8bfd2ae715c96585a8bb05436d08963e); - Vector::push_back(&mut amounts, 1647148908); - - Vector::push_back
(&mut payees, @0xb9a8bda59c571e7a52678347c5719e82); - Vector::push_back(&mut amounts, 1492852707); - - Vector::push_back
(&mut payees, @0x606275c64a0eb463184fd8f0fdbeb583); - Vector::push_back(&mut amounts, 4929983196); - - Vector::push_back
(&mut payees, @0xf150d045476a4677bb039b3e99540243); - Vector::push_back(&mut amounts, 1411649712); - - Vector::push_back
(&mut payees, @0xc65c9b9d5f874234ff5a58bd7eced911); - Vector::push_back(&mut amounts, 1607285011); - - Vector::push_back
(&mut payees, @0xb19b0697e5383fbcd7997422063a0ac0); - Vector::push_back(&mut amounts, 1674529795); - - Vector::push_back
(&mut payees, @0x1b5a5fbf2ba8ca86d5ec87984704cbd8); - Vector::push_back(&mut amounts, 1661547053); - - Vector::push_back
(&mut payees, @0xc6026e40216b24a2dc37e4a9ead37f1b); - Vector::push_back(&mut amounts, 1694193197); - - Vector::push_back
(&mut payees, @0xaee944efa3ecdee245a326db1fa6ddc3); - Vector::push_back(&mut amounts, 416997197); - - Vector::push_back
(&mut payees, @0x28c52a20dafbb4b3f1e1aaa472482f5b); - Vector::push_back(&mut amounts, 1657046371); - - Vector::push_back
(&mut payees, @0xca0195fd38751944838e16d5129eab8f); - Vector::push_back(&mut amounts, 2987352925); - - Vector::push_back
(&mut payees, @0x31e71e15171d04d2b85f01d46ecbd4e9); - Vector::push_back(&mut amounts, 6071464093); - - Vector::push_back
(&mut payees, @0x9b89d344c2d8b28b5bdfc12ac2553bba); - Vector::push_back(&mut amounts, 1709431500); - - Vector::push_back
(&mut payees, @0x9ff2e5e0cc7412bd34999b75eabd131c); - Vector::push_back(&mut amounts, 1675734292); - - Vector::push_back
(&mut payees, @0x7bfaede4daf4e032913c443916e61446); - Vector::push_back(&mut amounts, 5724623126); - - Vector::push_back
(&mut payees, @0x600e4d33f52dc0dd88d0f30087b545a0); - Vector::push_back(&mut amounts, 1656748109); - - Vector::push_back
(&mut payees, @0x11da81e22f7d7acdf2b2e9abfb82f3a4); - Vector::push_back(&mut amounts, 5653902019); - - Vector::push_back
(&mut payees, @0xe15e2cdfac79ee2ebecb3d648f508af8); - Vector::push_back(&mut amounts, 1713820767); - - Vector::push_back
(&mut payees, @0xa6c5334f6d967c555dccc92e0b964064); - Vector::push_back(&mut amounts, 5630611995); - - Vector::push_back
(&mut payees, @0xb87f8c8f780ff7a3213065cd282f120a); - Vector::push_back(&mut amounts, 1701693477); - - Vector::push_back
(&mut payees, @0xe8b24de4742ec6abf55c5185c46aa539); - Vector::push_back(&mut amounts, 2239633262); - - Vector::push_back
(&mut payees, @0x1dd19535d112ff10c74badccac4d9ec0); - Vector::push_back(&mut amounts, 1438950562); - - Vector::push_back
(&mut payees, @0x76b07ab111149b8dda681f07b367a823); - Vector::push_back(&mut amounts, 1649312670); - - Vector::push_back
(&mut payees, @0x4f87433e644f64f0f71ee6f8b5cc0360); - Vector::push_back(&mut amounts, 3323422274); - - Vector::push_back
(&mut payees, @0x9843bd907316f13f7a246587fca41ed7); - Vector::push_back(&mut amounts, 1635963204); - - Vector::push_back
(&mut payees, @0x278e6635b5a4968613187550c751334b); - Vector::push_back(&mut amounts, 3912712321); - - Vector::push_back
(&mut payees, @0x299226308e9dbabaab1096ebd9c941ab); - Vector::push_back(&mut amounts, 1559528439); - - Vector::push_back
(&mut payees, @0x8b2f6eaaac2c94b6542213011e766d8f); - Vector::push_back(&mut amounts, 1547536450); - - Vector::push_back
(&mut payees, @0xd9135aca3599956487184f5924e92db7); - Vector::push_back(&mut amounts, 1577854862); - - Vector::push_back
(&mut payees, @0x442a2fd2d63f9b552bca3c71fb46b933); - Vector::push_back(&mut amounts, 6325468701); - - Vector::push_back
(&mut payees, @0xa8c2e5f5c08a9de060bcdce5d9135da8); - Vector::push_back(&mut amounts, 3561989138); - - Vector::push_back
(&mut payees, @0xf1d843265c43bcc253c28a13e7432839); - Vector::push_back(&mut amounts, 1663784251); - - Vector::push_back
(&mut payees, @0x07a4ec1654ceff7cf2f07aa8d9c309f6); - Vector::push_back(&mut amounts, 3886065803); - - Vector::push_back
(&mut payees, @0x0fdd689802883ef0c5e3703a05d4fd71); - Vector::push_back(&mut amounts, 1642112704); - - Vector::push_back
(&mut payees, @0x9c94a01529ff99a32ed7148f2a7614a3); - Vector::push_back(&mut amounts, 1607900495); - - Vector::push_back
(&mut payees, @0xfc2bf6efe64efc7703a635fd7afff5db); - Vector::push_back(&mut amounts, 1638254883); - - Vector::push_back
(&mut payees, @0x52634610095b2e05ee10424506c9fea0); - Vector::push_back(&mut amounts, 4100203420); - - Vector::push_back
(&mut payees, @0x58f973fbefd87c773d31965a885e3a85); - Vector::push_back(&mut amounts, 1672608160); - - Vector::push_back
(&mut payees, @0x2fc061e0206808add9bfcf96ebe59a16); - Vector::push_back(&mut amounts, 1681300528); - - Vector::push_back
(&mut payees, @0xdfffa896b1d49819cbe0b2234efbb37d); - Vector::push_back(&mut amounts, 4849784921); - - Vector::push_back
(&mut payees, @0xf6032e2007f31b86c2122f707906ebe0); - Vector::push_back(&mut amounts, 478273452); - - Vector::push_back
(&mut payees, @0x342da19e72d0cdee8780a00f6673ad91); - Vector::push_back(&mut amounts, 2522107199); - - Vector::push_back
(&mut payees, @0xc4c8dbaee47a737d6f74b10cac060a49); - Vector::push_back(&mut amounts, 3419389249); - - Vector::push_back
(&mut payees, @0x80d00d1ffa61fa3946fd56136130691b); - Vector::push_back(&mut amounts, 2089067905); - - Vector::push_back
(&mut payees, @0x15bbd12c822d89ba9b3c03985a7f6f88); - Vector::push_back(&mut amounts, 2122737806); - - Vector::push_back
(&mut payees, @0x5ff1512db526fc9f95e37eacfae2f548); - Vector::push_back(&mut amounts, 4218875050); - - Vector::push_back
(&mut payees, @0x911c054a121ecbb1fab52eba16d5bc83); - Vector::push_back(&mut amounts, 3152815744); - - Vector::push_back
(&mut payees, @0xea6334be2415e5a9904337e69a02aa74); - Vector::push_back(&mut amounts, 1744840069); - - Vector::push_back
(&mut payees, @0x74ace8d647cdf55b49ed25cd4efa40ad); - Vector::push_back(&mut amounts, 2044820520); - - Vector::push_back
(&mut payees, @0xc0859fb4c5099a8f90b5f67cb1cfbaab); - Vector::push_back(&mut amounts, 1369040617); - - Vector::push_back
(&mut payees, @0x771fdac3a588d84adea7c50728f8b933); - Vector::push_back(&mut amounts, 2101786453); - - Vector::push_back
(&mut payees, @0x1f2e588e2c9fd0544807641b33102643); - Vector::push_back(&mut amounts, 3294166290); - - Vector::push_back
(&mut payees, @0x59d1fdd6d05491efe85f22d5684abbd9); - Vector::push_back(&mut amounts, 2035339154); - - Vector::push_back
(&mut payees, @0xaf0618bb1220b9f03b0044293db7a9b9); - Vector::push_back(&mut amounts, 2228277905); - - Vector::push_back
(&mut payees, @0x80bb684c90cc4ca342b3e4b071ed8325); - Vector::push_back(&mut amounts, 2111519769); - - Vector::push_back
(&mut payees, @0x695c91b6c5c1bc97abc1646db944dcfc); - Vector::push_back(&mut amounts, 2070242624); - - Vector::push_back
(&mut payees, @0xee7374e30e652049f2840d3909b68ddf); - Vector::push_back(&mut amounts, 5178812901); - - Vector::push_back
(&mut payees, @0xd0688adc09d064b624903b3928a6ded5); - Vector::push_back(&mut amounts, 2145818089); - - Vector::push_back
(&mut payees, @0x211ecb11596400df2ac5aec396b488ad); - Vector::push_back(&mut amounts, 2117540252); - - Vector::push_back
(&mut payees, @0xc7e61f9678371fab1d70e6a872050d94); - Vector::push_back(&mut amounts, 2177550351); - - Vector::push_back
(&mut payees, @0x85c8891c8b8f395df4d407963338dffa); - Vector::push_back(&mut amounts, 2153112779); - - Vector::push_back
(&mut payees, @0xdb95bd7aa383d093ef105c20814070cd); - Vector::push_back(&mut amounts, 1796009697); - - Vector::push_back
(&mut payees, @0x2e32ecdf161aeba14e0dbe6be06349bc); - Vector::push_back(&mut amounts, 1781630891); - - Vector::push_back
(&mut payees, @0x80303e502a035d8b79bc742c2da06694); - Vector::push_back(&mut amounts, 1801324471); - - Vector::push_back
(&mut payees, @0x439bf8ced8971b04bdb30ee15820d8c1); - Vector::push_back(&mut amounts, 1797258655); - - Vector::push_back
(&mut payees, @0x22d4d6e266a861ade8e3c415deed617b); - Vector::push_back(&mut amounts, 2959812606); - - Vector::push_back
(&mut payees, @0x048ccb33bf48a0f333023e0e8ecce568); - Vector::push_back(&mut amounts, 138146304); - - Vector::push_back
(&mut payees, @0xbe9cd7860812dc1b7aa1f782597d0427); - Vector::push_back(&mut amounts, 1769073532); - - Vector::push_back
(&mut payees, @0xadcb1d42a46292ae89e938bd982f2867); - Vector::push_back(&mut amounts, 140718822); - - Vector::push_back
(&mut payees, @0x8cafd3ad53953417d66dfb8eecb3404c); - Vector::push_back(&mut amounts, 99356801); - - Vector::push_back
(&mut payees, @0xbf38a08c1c7f2e862f27d59ba9af9da7); - Vector::push_back(&mut amounts, 1773736281); - - Vector::push_back
(&mut payees, @0x4bf2ef7a3cfc82412aaf23ccbdc8b0c9); - Vector::push_back(&mut amounts, 399191122); - - Vector::push_back
(&mut payees, @0x26fba9c1a270054c2a8b4a9df49f702a); - Vector::push_back(&mut amounts, 1566784438); - - Vector::push_back
(&mut payees, @0x6cd27cf11d30918b6a21fa8a42a57a05); - Vector::push_back(&mut amounts, 1551888568); - - Vector::push_back
(&mut payees, @0xb87f919b420a70ff1e971fe713dc9ba3); - Vector::push_back(&mut amounts, 1430371415); - - Vector::push_back
(&mut payees, @0xd21c73fd773cd60b43c51029e2fb36b5); - Vector::push_back(&mut amounts, 2229117881); - - Vector::push_back
(&mut payees, @0xa0bf75d3343d4f39d08a210b49d93ac5); - Vector::push_back(&mut amounts, 1689219537); - - Vector::push_back
(&mut payees, @0x425ddbc8efc8ffe71172ad1527541682); - Vector::push_back(&mut amounts, 1876249354); - - Vector::push_back
(&mut payees, @0x200b528d82041167b6ef268357e61f13); - Vector::push_back(&mut amounts, 1616414625); - - Vector::push_back
(&mut payees, @0x7db3171a208bd8d3f0a552580c12be16); - Vector::push_back(&mut amounts, 1658579022); - - Vector::push_back
(&mut payees, @0x8433758ea90ba3eb1cd22dba5ccaacba); - Vector::push_back(&mut amounts, 1503619924); - - Vector::push_back
(&mut payees, @0x51edc65c94fbb959d51d5113a5598912); - Vector::push_back(&mut amounts, 2781541196); - - Vector::push_back
(&mut payees, @0xfe052954c6cab2c33235656256075161); - Vector::push_back(&mut amounts, 1627010946); - - Vector::push_back
(&mut payees, @0x0907232efd8542be7052aaa602879ebc); - Vector::push_back(&mut amounts, 1576180270); - - Vector::push_back
(&mut payees, @0x96df3c1519f2cd117c1a208d563dbdd0); - Vector::push_back(&mut amounts, 1524402857); - - Vector::push_back
(&mut payees, @0xd4f886b30f613cabd515bb8155d76f33); - Vector::push_back(&mut amounts, 1599673920); - - Vector::push_back
(&mut payees, @0xacf6412c705cc35d1e2594d023779266); - Vector::push_back(&mut amounts, 1621397330); - - Vector::push_back
(&mut payees, @0x63d372b0ea77fbc0dcbb29988fe8dffb); - Vector::push_back(&mut amounts, 4118220237); - - Vector::push_back
(&mut payees, @0x42858255ca593fa982563337401c0743); - Vector::push_back(&mut amounts, 1585373553); - - Vector::push_back
(&mut payees, @0x7904943ab941e967a5a57c2e508a2fbf); - Vector::push_back(&mut amounts, 1577691883); - - Vector::push_back
(&mut payees, @0x02ac22550cd38db602ea2d1a1bb8ab0b); - Vector::push_back(&mut amounts, 1656657808); - - Vector::push_back
(&mut payees, @0xfa6012837fba68f6d663c1c60be9ee77); - Vector::push_back(&mut amounts, 1424430988); - - Vector::push_back
(&mut payees, @0x3db2b238068612f575cdcf66a7989b0f); - Vector::push_back(&mut amounts, 1557337600); - - Vector::push_back
(&mut payees, @0x61b2e63aaf073a7b798fad2f008380e2); - Vector::push_back(&mut amounts, 1524819119); - - Vector::push_back
(&mut payees, @0x35d1362139ed7dc3931327f4d217761b); - Vector::push_back(&mut amounts, 1672539635); - - Vector::push_back
(&mut payees, @0x3183353e06b1817c3a8c56eba12c7b0a); - Vector::push_back(&mut amounts, 1406291188); - - Vector::push_back
(&mut payees, @0x94bd433c114d9d33060c60fa66bffbfe); - Vector::push_back(&mut amounts, 1482844045); - - Vector::push_back
(&mut payees, @0x835588cf1a0a2288f123c590d3be009f); - Vector::push_back(&mut amounts, 1644153330); - - Vector::push_back
(&mut payees, @0x50e05842af5192ba048be3115c10371a); - Vector::push_back(&mut amounts, 2033974761); - - Vector::push_back
(&mut payees, @0x83cddc7ede143841599360efd237a3c4); - Vector::push_back(&mut amounts, 617881998); - - Vector::push_back
(&mut payees, @0xde3c2ae40c9bfdd86e8f3ac1f370f0b3); - Vector::push_back(&mut amounts, 598262299); - - Vector::push_back
(&mut payees, @0xf72c1f1b6926fdb63cfba2d434e8d764); - Vector::push_back(&mut amounts, 594249027); - - Vector::push_back
(&mut payees, @0x612dfe4a5e82810aa6c29d7504879f7b); - Vector::push_back(&mut amounts, 590071787); - - Vector::push_back
(&mut payees, @0xa3ff725159cbe61631bf32e958b7a17a); - Vector::push_back(&mut amounts, 584037266); - - Vector::push_back
(&mut payees, @0xd667034d24422f74a83792a67e2858d2); - Vector::push_back(&mut amounts, 590076958); - - Vector::push_back
(&mut payees, @0x30a335d5f4a30548875226689625bcd5); - Vector::push_back(&mut amounts, 1362398751); - - Vector::push_back
(&mut payees, @0x8d0c80c550658874fa3dd2b68e18c622); - Vector::push_back(&mut amounts, 1667904372); - - Vector::push_back
(&mut payees, @0xeda42cb83eaab53dee1b037e4ad21af6); - Vector::push_back(&mut amounts, 502404655); - - Vector::push_back
(&mut payees, @0x8f809aac78f9d13aad385aa104c52572); - Vector::push_back(&mut amounts, 606252528); - - Vector::push_back
(&mut payees, @0xb8c8fa437a050fdc505f6ef016fefb74); - Vector::push_back(&mut amounts, 263215311); - - Vector::push_back
(&mut payees, @0xdf9af8814624a12d9bbbdf6105fb8ac3); - Vector::push_back(&mut amounts, 310623546); - - Vector::push_back
(&mut payees, @0xf8a560beddf73dd07751f33f8dc397df); - Vector::push_back(&mut amounts, 218214932); - - Vector::push_back
(&mut payees, @0x09e9bb473e6fbc0c02df3b27fc61e205); - Vector::push_back(&mut amounts, 128898715); - - Vector::push_back
(&mut payees, @0x1dd0c0c980bfd33dc9b3fe56e49aeb0c); - Vector::push_back(&mut amounts, 211035608); - - Vector::push_back
(&mut payees, @0x277303d9c17985a6eae7ffcb0a92abe7); - Vector::push_back(&mut amounts, 93756586); - - Vector::push_back
(&mut payees, @0x53a4ca2b5867c037866ac67e220daee5); - Vector::push_back(&mut amounts, 2695467379); - - Vector::push_back
(&mut payees, @0xaaa64537848b83a34635d5cd294e51b4); - Vector::push_back(&mut amounts, 2867790229); - - Vector::push_back
(&mut payees, @0x6ad479c68a49a17bfb44346a3f6720a8); - Vector::push_back(&mut amounts, 2725994983); - - Vector::push_back
(&mut payees, @0xa704611ebd0f23b3ceed95ec140198ff); - Vector::push_back(&mut amounts, 2570900384); - - Vector::push_back
(&mut payees, @0xc51d33af1e159fbc7b05845de392036f); - Vector::push_back(&mut amounts, 2306730373); - - Vector::push_back
(&mut payees, @0x0c05ba3aea36beeedf56ccece5e4a91e); - Vector::push_back(&mut amounts, 1910750660); - - Vector::push_back
(&mut payees, @0x668190d5dc15b5a395bb2f4754c1c007); - Vector::push_back(&mut amounts, 1193025220); - - Vector::push_back
(&mut payees, @0x3997aa9f058f1154aa042dd41db76bc5); - Vector::push_back(&mut amounts, 1360512747); - - Vector::push_back
(&mut payees, @0x33a91fb6b7284ab5fee6046b7416be25); - Vector::push_back(&mut amounts, 837970108); - - Vector::push_back
(&mut payees, @0x7abbfc1036a9e7a7caa8b45aa0adb491); - Vector::push_back(&mut amounts, 4454196271); - - Vector::push_back
(&mut payees, @0xf2ab0b61499122392cae0277f096ffa2); - Vector::push_back(&mut amounts, 5068583684); - - Vector::push_back
(&mut payees, @0x9a81275cbad2fcc6f3809367af8907fb); - Vector::push_back(&mut amounts, 4429426772); - - Vector::push_back
(&mut payees, @0x5cb05098bcca54e15bd51977743a82bb); - Vector::push_back(&mut amounts, 1678826217); - - Vector::push_back
(&mut payees, @0xcaabf6591358b6968fbc4d6be062c4e8); - Vector::push_back(&mut amounts, 2944373400); - - Vector::push_back
(&mut payees, @0x3104a9c3a84b03dababae3704db7ca0a); - Vector::push_back(&mut amounts, 1834207023); - - Vector::push_back
(&mut payees, @0x4cad63c16adc604d774f719250a63fe5); - Vector::push_back(&mut amounts, 287953817); - - Vector::push_back
(&mut payees, @0xc990ecb24c5362c0cfdb8c646a85f602); - Vector::push_back(&mut amounts, 1621901103); - - Vector::push_back
(&mut payees, @0xa959fa2fa2f9fdf9b7c0d2f692de7e1e); - Vector::push_back(&mut amounts, 181333171); - - Vector::push_back
(&mut payees, @0xe05c57655cc851bc4bcbfeeb4ada8b75); - Vector::push_back(&mut amounts, 247677073); - - Vector::push_back
(&mut payees, @0xfa6f7ec7bb58b1d7c5d266cd96d5f78e); - Vector::push_back(&mut amounts, 3650876623); - - Vector::push_back
(&mut payees, @0x83735fd7058c6bfb13987cb5f99e97da); - Vector::push_back(&mut amounts, 1966597448); - - Vector::push_back
(&mut payees, @0x9401af0f29d2afd49b8e48a0c361f661); - Vector::push_back(&mut amounts, 1334471079); - - Vector::push_back
(&mut payees, @0x5790d2075ea54c3ee4ac67f281ef38a1); - Vector::push_back(&mut amounts, 3324671838); - - Vector::push_back
(&mut payees, @0x192c29ed42d6c3f761491cafcce69ed1); - Vector::push_back(&mut amounts, 3691429124); - - Vector::push_back
(&mut payees, @0x89953d4db946ab82be4c996d97fa5023); - Vector::push_back(&mut amounts, 1116641067); - - Vector::push_back
(&mut payees, @0xa7c9151ad7c846fcd576932d1d97a737); - Vector::push_back(&mut amounts, 2314002402); - - Vector::push_back
(&mut payees, @0x4e4e14eb9b9f0f8252ecf4137d25499a); - Vector::push_back(&mut amounts, 4094807654); - - Vector::push_back
(&mut payees, @0x7e2a48c54258e052cd30295bb082dbea); - Vector::push_back(&mut amounts, 447595966); - - Vector::push_back
(&mut payees, @0x0528d2246894d91298206414178a66fa); - Vector::push_back(&mut amounts, 1512247703); - - Vector::push_back
(&mut payees, @0xf6a8a417a2efe3afce59fcea5b54b130); - Vector::push_back(&mut amounts, 114187663); - - Vector::push_back
(&mut payees, @0x9b29465a7bb3cf90f312f0233abaf77f); - Vector::push_back(&mut amounts, 129078945); - - Vector::push_back
(&mut payees, @0xadf111bd541290b34f8ae39ac4317208); - Vector::push_back(&mut amounts, 391041564); - - Vector::push_back
(&mut payees, @0x790ee459417abc79aec5055f6966ed9f); - Vector::push_back(&mut amounts, 2000682741); - - Vector::push_back
(&mut payees, @0xdcfccf8e24d43affaabe19177e742b5b); - Vector::push_back(&mut amounts, 2197830497); - - Vector::push_back
(&mut payees, @0xd59761d906dd1365d3c759e036547c49); - Vector::push_back(&mut amounts, 2636519934); - - Vector::push_back
(&mut payees, @0x6e601f3bdcc7b2118ef656fd20c842fb); - Vector::push_back(&mut amounts, 1979172938); - - Vector::push_back
(&mut payees, @0x6e518e456df8e23393cd1860db864c38); - Vector::push_back(&mut amounts, 753105179); - - Vector::push_back
(&mut payees, @0x9c283c053c99f0e062cd9575086c5718); - Vector::push_back(&mut amounts, 2792289955); - - Vector::push_back
(&mut payees, @0x69bf0a1c4bbc00beb0d1f289fad7d0ca); - Vector::push_back(&mut amounts, 2877377029); - - Vector::push_back
(&mut payees, @0xd99fefe5a936c799dfa0a8418523ff77); - Vector::push_back(&mut amounts, 611671340); - - Vector::push_back
(&mut payees, @0x85f92663dec4037affd7404f52de3cb0); - Vector::push_back(&mut amounts, 3653049829); - - Vector::push_back
(&mut payees, @0xd25b39d425f467c532ca8fb7e8205a80); - Vector::push_back(&mut amounts, 1683641802); - - Vector::push_back
(&mut payees, @0x9925084bd621fc4666a21928acecc504); - Vector::push_back(&mut amounts, 2522134183); - - Vector::push_back
(&mut payees, @0x79575894c66a53aab6814cce6d2bb26e); - Vector::push_back(&mut amounts, 1147062002); - - Vector::push_back
(&mut payees, @0x71703cbe443cd4ff87e000ccf038a31c); - Vector::push_back(&mut amounts, 2136698291); - - Vector::push_back
(&mut payees, @0xedae61ae30053b90cd04860cb3c39c51); - Vector::push_back(&mut amounts, 2136677187); - - Vector::push_back
(&mut payees, @0x908a421f51eacfcb723ab09b2d1265a3); - Vector::push_back(&mut amounts, 1046176752); - - Vector::push_back
(&mut payees, @0x09e245015c921645907db2dec7633295); - Vector::push_back(&mut amounts, 1442637795); - - Vector::push_back
(&mut payees, @0xe46b86c249f17d5dd87657e1d8f6a106); - Vector::push_back(&mut amounts, 1383665124); - - Vector::push_back
(&mut payees, @0x9740f06ade1d8001b3b78e71f38e870c); - Vector::push_back(&mut amounts, 2026378871); - - Vector::push_back
(&mut payees, @0xf26402cfa9cce8a0a9a3aafce1eb5c0c); - Vector::push_back(&mut amounts, 188396087); - - Vector::push_back
(&mut payees, @0x6f6a4d9d6ebcf871b2b7ee1def1e23fc); - Vector::push_back(&mut amounts, 421388136); - - Vector::push_back
(&mut payees, @0x29d411ae89f163fe2eb89278e0445084); - Vector::push_back(&mut amounts, 769011030); - - Vector::push_back
(&mut payees, @0x948322d7a366dbbd4ce493b5573a16e4); - Vector::push_back(&mut amounts, 1923344218); - - Vector::push_back
(&mut payees, @0x3810a26803ebf48dbc58fc2c19ea003d); - Vector::push_back(&mut amounts, 2162287348); - - Vector::push_back
(&mut payees, @0x7b1216f97731f9f3d9c15bd84c4b1e7f); - Vector::push_back(&mut amounts, 30870054); - - Vector::push_back
(&mut payees, @0x4c058c6b815dd43e4a638a16781ad2db); - Vector::push_back(&mut amounts, 30870054); - - Vector::push_back
(&mut payees, @0x03e6bfbc2687742c4a3291b1ef84305d); - Vector::push_back(&mut amounts, 1927153613); - - Vector::push_back
(&mut payees, @0x81c9de2cc006e5d2b76b968f9803eb3e); - Vector::push_back(&mut amounts, 91492288); - - Vector::push_back
(&mut payees, @0x0a7802c5ce3bdcffb918c680825756aa); - Vector::push_back(&mut amounts, 1326806609); - - Vector::push_back
(&mut payees, @0x57682e2c99cf0cd1c650807547f64069); - Vector::push_back(&mut amounts, 341287309); - - Vector::push_back
(&mut payees, @0xf8289be2785a74ef3e812d0c7287f2c3); - Vector::push_back(&mut amounts, 1894622554); - - Vector::push_back
(&mut payees, @0x2c3b38887f4ea4dac7dca10db503535d); - Vector::push_back(&mut amounts, 841536707); - - Vector::push_back
(&mut payees, @0x3240f6b2e1e9941cf781ef46762f4d71); - Vector::push_back(&mut amounts, 1062975867); - - Vector::push_back
(&mut payees, @0x1f63384afabeb097b3e4046c82f7cd15); - Vector::push_back(&mut amounts, 133858663); - - Vector::push_back
(&mut payees, @0x3068924fdfe8d1a5df9639d8a266ec95); - Vector::push_back(&mut amounts, 489269437); - - Vector::push_back
(&mut payees, @0x75db05a3b1365eb0796cf5f4e7ea87a7); - Vector::push_back(&mut amounts, 484248617); - - Vector::push_back
(&mut payees, @0xcfffceaf82372896f936effa5473cc8f); - Vector::push_back(&mut amounts, 5609645771); - - Vector::push_back
(&mut payees, @0x55c48a89a4840c417e3ca4681b01ebe7); - Vector::push_back(&mut amounts, 481285801); - - Vector::push_back
(&mut payees, @0x034491ea00dc69bd94cf0ee6c13f6f90); - Vector::push_back(&mut amounts, 609978457); - - Vector::push_back
(&mut payees, @0xb9f569261d3cd154fba45a37b866eb60); - Vector::push_back(&mut amounts, 3222979044); - - Vector::push_back
(&mut payees, @0x4fa5eaeab22f6b3222cec64f296c9906); - Vector::push_back(&mut amounts, 1413544534); - - Vector::push_back
(&mut payees, @0xe60e810e5bd44b74a68a261d5958a5ab); - Vector::push_back(&mut amounts, 699026554); - - Vector::push_back
(&mut payees, @0x998990c7aae3d4128c4e310b3a919717); - Vector::push_back(&mut amounts, 1593258793); - - Vector::push_back
(&mut payees, @0xe7f8917937b884b50683f4ba378567d9); - Vector::push_back(&mut amounts, 2104515633); - - Vector::push_back
(&mut payees, @0x556274c9f8c5fb0345a134a987323cf6); - Vector::push_back(&mut amounts, 3958518203); - - Vector::push_back
(&mut payees, @0x3866cd99f1b2e64cb681185074bd83ae); - Vector::push_back(&mut amounts, 5472730630); - - Vector::push_back
(&mut payees, @0xd821630b82b467f7102b70b65c1e71b4); - Vector::push_back(&mut amounts, 1239524927); - - Vector::push_back
(&mut payees, @0x328919637b1da0e39a352acde9d10a61); - Vector::push_back(&mut amounts, 6393061810); - - Vector::push_back
(&mut payees, @0x66da47aadfddf6bd95920740fdd71fdb); - Vector::push_back(&mut amounts, 3613206610); - - Vector::push_back
(&mut payees, @0xdbaac29cb72befc6591e2795c6181202); - Vector::push_back(&mut amounts, 4913855017); - - Vector::push_back
(&mut payees, @0x870d1297e1f8a15dbe522913ea0d3c4f); - Vector::push_back(&mut amounts, 4331206793); - - Vector::push_back
(&mut payees, @0x8a8178ca0a71060d385fa685d8c0e54e); - Vector::push_back(&mut amounts, 95820888); - - Vector::push_back
(&mut payees, @0x76e2b0f7cfe21f8d4d83cd6a7ac33914); - Vector::push_back(&mut amounts, 4811948062); - - Vector::push_back
(&mut payees, @0x5a079bdf5a2013e4795f6ad95f88ee61); - Vector::push_back(&mut amounts, 3633993886); - - Vector::push_back
(&mut payees, @0xb676a9c17e62435578388db440b3c2aa); - Vector::push_back(&mut amounts, 3097726233); - - Vector::push_back
(&mut payees, @0x2806b827b41a7d9b3cf3e34cf28b1a6e); - Vector::push_back(&mut amounts, 128636196); - - Vector::push_back
(&mut payees, @0xa02327c54c3a2fac07996eafb23d2ddd); - Vector::push_back(&mut amounts, 118291896); - - Vector::push_back
(&mut payees, @0xc24649d6bc33f82097234741312b47d5); - Vector::push_back(&mut amounts, 536785236); - - Vector::push_back
(&mut payees, @0xd26aaf7a2e6b70bdaf9be974af9fe906); - Vector::push_back(&mut amounts, 3533408185); - - Vector::push_back
(&mut payees, @0x5745a603f45639dccb8648c907074237); - Vector::push_back(&mut amounts, 2925159667); - - Vector::push_back
(&mut payees, @0x2050fe396a97e7a4292941cd51b45631); - Vector::push_back(&mut amounts, 1905369501); - - Vector::push_back
(&mut payees, @0x36e234e00d6f76f395537980e12e02fb); - Vector::push_back(&mut amounts, 2783030696); - - Vector::push_back
(&mut payees, @0x6e7e787a2e949f0de4cd35e54ab29dea); - Vector::push_back(&mut amounts, 2777785471); - - Vector::push_back
(&mut payees, @0x7058356473f3d6a0c1a35405e885e3eb); - Vector::push_back(&mut amounts, 2682158068); - - Vector::push_back
(&mut payees, @0x2bd35273198dec19c1cd9f3052970b08); - Vector::push_back(&mut amounts, 1046786770); - - Vector::push_back
(&mut payees, @0x21e80848bac1b31042d61df354712e90); - Vector::push_back(&mut amounts, 287867932); - - Vector::push_back
(&mut payees, @0x85c2bbf237dd5ebba359e84b894d7602); - Vector::push_back(&mut amounts, 5065258202); - - Vector::push_back
(&mut payees, @0x41ae7cc1d9841551d90b60d40cdc59de); - Vector::push_back(&mut amounts, 2695274192); - - Vector::push_back
(&mut payees, @0x98923467797b4c73a8f1fe79c050117d); - Vector::push_back(&mut amounts, 2743567405); - - Vector::push_back
(&mut payees, @0x6186379b19c3b73d41fb6653e5e2bfad); - Vector::push_back(&mut amounts, 573199450); - - Vector::push_back
(&mut payees, @0xf4cd516e6f20224e81284bcbcbc33c51); - Vector::push_back(&mut amounts, 824762312); - - Vector::push_back
(&mut payees, @0x106cd364782eee36a61493198b40d7bb); - Vector::push_back(&mut amounts, 3352490123); - - Vector::push_back
(&mut payees, @0x17926018486b4e4d0e8dce5b406f380c); - Vector::push_back(&mut amounts, 816422660); - - Vector::push_back
(&mut payees, @0xd3eff8e107d4a29360ff8dc7e75f173e); - Vector::push_back(&mut amounts, 8087844898); - - Vector::push_back
(&mut payees, @0x20d544a5823b0278510d1027df242299); - Vector::push_back(&mut amounts, 5692216201); - - Vector::push_back
(&mut payees, @0xdcb2875af620121dbae7c7e0f62c90fd); - Vector::push_back(&mut amounts, 582013211); - - Vector::push_back
(&mut payees, @0xc4e2b15611cbfcaf40065aef52f79676); - Vector::push_back(&mut amounts, 5624002180); - - Vector::push_back
(&mut payees, @0x757d13ba3fb14d7ef1c3836a08cd8445); - Vector::push_back(&mut amounts, 4006242878); - - Vector::push_back
(&mut payees, @0xe6cd8e067269afbe7aee18bfa54c84ae); - Vector::push_back(&mut amounts, 870452002); - - Vector::push_back
(&mut payees, @0x33ec9e23fbee6bb2c080855e0f9c828c); - Vector::push_back(&mut amounts, 1856642380); - - Vector::push_back
(&mut payees, @0xe5a068a10b3938ab956b9eb4667c3e13); - Vector::push_back(&mut amounts, 59682104); - - Vector::push_back
(&mut payees, @0x2199d92000794e392c21951c00b6b28d); - Vector::push_back(&mut amounts, 1854793048); - - Vector::push_back
(&mut payees, @0xa2101a927f34bcb6ca3403893d468648); - Vector::push_back(&mut amounts, 2567988200); - - Vector::push_back
(&mut payees, @0x61ee63c6f0ba4015a74af73358d8091e); - Vector::push_back(&mut amounts, 5585761417); - - Vector::push_back
(&mut payees, @0xcc2bfd28db98636083fc43567fc19de3); - Vector::push_back(&mut amounts, 613307332); - - Vector::push_back
(&mut payees, @0x7e6da2c64e0ce4355b26308ab386b9e3); - Vector::push_back(&mut amounts, 1578526872); - - Vector::push_back
(&mut payees, @0x42e97304f4ab329724166712dd7e8674); - Vector::push_back(&mut amounts, 261352140); - - Vector::push_back
(&mut payees, @0x466709a59ad3a65fda5377385d2d864f); - Vector::push_back(&mut amounts, 602499311); - - Vector::push_back
(&mut payees, @0x41bf28e948204b84daddb73bf1a4e700); - Vector::push_back(&mut amounts, 588599043); - - Vector::push_back
(&mut payees, @0x3be519c0ee0e9443076a694bface0a9f); - Vector::push_back(&mut amounts, 2288563495); - - Vector::push_back
(&mut payees, @0xc0938078187acf5a25645650a2e8b38a); - Vector::push_back(&mut amounts, 3714181069); - - Vector::push_back
(&mut payees, @0x1171311a7f22d38efac19f32f4a699e3); - Vector::push_back(&mut amounts, 1119643921); - - Vector::push_back
(&mut payees, @0xd61694e0cc7e3fdaeb6f3ed9abca7166); - Vector::push_back(&mut amounts, 2228049096); - - Vector::push_back
(&mut payees, @0xe60ba6299e6f6673901dc382a66adc38); - Vector::push_back(&mut amounts, 103553959); - - Vector::push_back
(&mut payees, @0x1ce42867d4ca1c1e79a94e9263c70bdc); - Vector::push_back(&mut amounts, 228500004); - - Vector::push_back
(&mut payees, @0x1a7c1171f59338d5833e63602044571d); - Vector::push_back(&mut amounts, 259349763); - - Vector::push_back
(&mut payees, @0x25a866e998dd477910449ce35d9ca7a6); - Vector::push_back(&mut amounts, 259349763); - - Vector::push_back
(&mut payees, @0x16b5cb68b85aad3d5c762ece2e0119ee); - Vector::push_back(&mut amounts, 259349763); - - Vector::push_back
(&mut payees, @0x21f2f82fea3276fdff10cab485061719); - Vector::push_back(&mut amounts, 1874573662); - - Vector::push_back
(&mut payees, @0x5b55c39410a1ff794fb24ebd54b64952); - Vector::push_back(&mut amounts, 5590491962); - - Vector::push_back
(&mut payees, @0x2f012014d1854855af76c61aa47f8d0f); - Vector::push_back(&mut amounts, 3515187066); - - Vector::push_back
(&mut payees, @0xa544cf4a2af91d9e1c6a660bb65be124); - Vector::push_back(&mut amounts, 1984808418); - - Vector::push_back
(&mut payees, @0xcbd3d460188289ce7bf3d4471c77f106); - Vector::push_back(&mut amounts, 1087619200); - - Vector::push_back
(&mut payees, @0x0dd3a2ad8b9169ba798447631e3767fc); - Vector::push_back(&mut amounts, 2703883559); - - Vector::push_back
(&mut payees, @0x5d7e363cb6533a84359f7933c895b0cb); - Vector::push_back(&mut amounts, 5005380236); - - Vector::push_back
(&mut payees, @0x27d8f405c054ba2dbf9532439761e79b); - Vector::push_back(&mut amounts, 43218075); - - Vector::push_back
(&mut payees, @0xd6b02f26dd90f897ddcda8ef276030e9); - Vector::push_back(&mut amounts, 1223359134); - - Vector::push_back
(&mut payees, @0x65c28aba0a926125619ae5068332cb53); - Vector::push_back(&mut amounts, 198747433); - - Vector::push_back
(&mut payees, @0x7d1d8d234fd6381d184e43b3a3441e1b); - Vector::push_back(&mut amounts, 536070049); - - Vector::push_back
(&mut payees, @0x257753d5e701b37c44af22532acc3d24); - Vector::push_back(&mut amounts, 2465973996); - - Vector::push_back
(&mut payees, @0xd1e1e72af62e262803fee98a4d95570b); - Vector::push_back(&mut amounts, 1710095335); - - Vector::push_back
(&mut payees, @0xc7c84637b817e589214a36553934481d); - Vector::push_back(&mut amounts, 239118752); - - Vector::push_back
(&mut payees, @0xf1a850c372375aa67e39f872dfecf233); - Vector::push_back(&mut amounts, 30870054); - - Vector::push_back
(&mut payees, @0xfb67479809701ed695942d3d6c278946); - Vector::push_back(&mut amounts, 5610353675); - - Vector::push_back
(&mut payees, @0xf25776320b905b93d2c09916b34cd789); - Vector::push_back(&mut amounts, 2430086154); - - Vector::push_back
(&mut payees, @0x7c8e80f66d3ce519da6ca3168e838026); - Vector::push_back(&mut amounts, 743614556); - - Vector::push_back
(&mut payees, @0xb168a9a049af64a79ca397c77e8b6e78); - Vector::push_back(&mut amounts, 24696043); - - Vector::push_back
(&mut payees, @0x504281452ff6cf349d86f7d17dc6e3e7); - Vector::push_back(&mut amounts, 24696043); - - Vector::push_back
(&mut payees, @0xcdb6e7f505f274e2325cda2f8708e939); - Vector::push_back(&mut amounts, 24696043); - - Vector::push_back
(&mut payees, @0xd7ba5a9393ce5e29d3c46ecfb406e056); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0x5b68985a3683d34bc6383812dfba4a60); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0x0c619736d9848aa8057456f2a1bf7395); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0xf9e6f0446dbb0b321ff5130d2afe05d7); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0x6368d1680fdb922bd39de0f5344cb606); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0xdba936a3034a380d26fc230efb2cdf05); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0x2f874d436152f00d23b4edc32ac1cd18); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0xeb20fead1eb7ff16800ba7ae296e23b2); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0x0e80617b67db60c301ec1ccdb9f74d6f); - Vector::push_back(&mut amounts, 1108651240); - - Vector::push_back
(&mut payees, @0xbf492fc9de0b617f948459234941dd70); - Vector::push_back(&mut amounts, 1398909742); - - Vector::push_back
(&mut payees, @0xb1042c8906aa384b59be2e9ee1ab8ef8); - Vector::push_back(&mut amounts, 1271689804); - - Vector::push_back
(&mut payees, @0x576006dcb54a7f543a9520a3ac7e6bfe); - Vector::push_back(&mut amounts, 452288533); - - Vector::push_back
(&mut payees, @0xbf28fba661a7a021adf1e33508ff51fb); - Vector::push_back(&mut amounts, 3273523466); - - Vector::push_back
(&mut payees, @0x605aabc4541db8732e481eddf4e113c9); - Vector::push_back(&mut amounts, 3251184830); - - Vector::push_back
(&mut payees, @0x0f076d5074e1cac1362530eaf55a1f6f); - Vector::push_back(&mut amounts, 1754035414); - - Vector::push_back
(&mut payees, @0x84b4478243273853b000f91b62d9b4e2); - Vector::push_back(&mut amounts, 104096769); - - Vector::push_back
(&mut payees, @0x0ff10a9e1bccb9645d79faf8ba9bef87); - Vector::push_back(&mut amounts, 2960513559); - - Vector::push_back
(&mut payees, @0xb121667a1ef32145de671cb2307c3c0f); - Vector::push_back(&mut amounts, 2013109573); - - Vector::push_back
(&mut payees, @0x8d851706799579c36f8588a27ed9b014); - Vector::push_back(&mut amounts, 3079528356); - - Vector::push_back
(&mut payees, @0xba01aee87b5091d9a4a17a31f697aae1); - Vector::push_back(&mut amounts, 4388196523); - - Vector::push_back
(&mut payees, @0xbe40451e0231ec2fe53548e2b411e9d1); - Vector::push_back(&mut amounts, 22638039); - - Vector::push_back
(&mut payees, @0xe2a379a0337f2c40e1c8cc77e8121e7a); - Vector::push_back(&mut amounts, 2474322704); - - Vector::push_back
(&mut payees, @0xe3d2f3a375fa9ba45ef978c0648fa837); - Vector::push_back(&mut amounts, 2407842997); - - Vector::push_back
(&mut payees, @0x78e8d5c1f27bfb25c1fd8d717e4f40bb); - Vector::push_back(&mut amounts, 2463117123); - - Vector::push_back
(&mut payees, @0x6e37edbfc6a9347bf9783206016ccbf7); - Vector::push_back(&mut amounts, 674467791); - - Vector::push_back
(&mut payees, @0x3b3ca7f2e753afb49090c55b6e9cf419); - Vector::push_back(&mut amounts, 5242736477); - - Vector::push_back
(&mut payees, @0x23fcd025802ae067ab05678f87aa74ab); - Vector::push_back(&mut amounts, 6582877826); - - Vector::push_back
(&mut payees, @0x304ca993b446d14c1efb9f41ee570fc1); - Vector::push_back(&mut amounts, 6522457590); - - Vector::push_back
(&mut payees, @0x3dd1fa792fa8cda6e0f046bff8113f0a); - Vector::push_back(&mut amounts, 3182760783); - - Vector::push_back
(&mut payees, @0x4af1ed85e71329bb2fd23bad022746d1); - Vector::push_back(&mut amounts, 1967938080); - - Vector::push_back
(&mut payees, @0x7615774eec788389a882910a27bf3d97); - Vector::push_back(&mut amounts, 5196767126); - - Vector::push_back
(&mut payees, @0xfa92f4a0d24e25b7e3ca9c20fa501a39); - Vector::push_back(&mut amounts, 2178370069); - - Vector::push_back
(&mut payees, @0x9414b4501417e6d7f9577f42cb2a8a36); - Vector::push_back(&mut amounts, 1186428566); - - Vector::push_back
(&mut payees, @0xcc53e9414dba5c89bfb0b47fd509079a); - Vector::push_back(&mut amounts, 3345454290); - - Vector::push_back
(&mut payees, @0x5cc6e588602a6a6875fdb8f0f498f4c9); - Vector::push_back(&mut amounts, 2586369131); - - Vector::push_back
(&mut payees, @0x5b3cf30f155563577f5c4035411eb511); - Vector::push_back(&mut amounts, 1651291696); - - Vector::push_back
(&mut payees, @0x2d447b865bed06a945728dfc98c46971); - Vector::push_back(&mut amounts, 2127132943); - - Vector::push_back
(&mut payees, @0xe4330484e9eae480fb048291f03691aa); - Vector::push_back(&mut amounts, 513313192); - - Vector::push_back
(&mut payees, @0x9baf20d9b9f960453df8957067e35b7a); - Vector::push_back(&mut amounts, 3066042871); - - Vector::push_back
(&mut payees, @0x547522405101b51b2625c6b15f89b56f); - Vector::push_back(&mut amounts, 1214252993); - - Vector::push_back
(&mut payees, @0x93a91b21218aff3ceb211eb02b27cbe0); - Vector::push_back(&mut amounts, 894285040); - - Vector::push_back
(&mut payees, @0xe31b668f0d80dc4650e2dd8f4d6ee726); - Vector::push_back(&mut amounts, 1092776638); - - Vector::push_back
(&mut payees, @0xbe35ad8127f57849e97a3ffb81e5854d); - Vector::push_back(&mut amounts, 1391186413); - - Vector::push_back
(&mut payees, @0x26bab9c03ad5e805557069c17460abdd); - Vector::push_back(&mut amounts, 2312089912); - - Vector::push_back
(&mut payees, @0x706a13b19fdaf01d59532d49e85d780d); - Vector::push_back(&mut amounts, 2041247842); - - Vector::push_back
(&mut payees, @0x4a4ce9c0efea2c2b4eb7df0b08096e64); - Vector::push_back(&mut amounts, 3461924093); - - Vector::push_back
(&mut payees, @0xd1bf50005c88dbed661ab87e59102373); - Vector::push_back(&mut amounts, 583854513); - - Vector::push_back
(&mut payees, @0xf76d700abedc96f8392b6a3005351b56); - Vector::push_back(&mut amounts, 4116982866); - - Vector::push_back
(&mut payees, @0x114f535804adfe8bc4548a118acbb743); - Vector::push_back(&mut amounts, 637780207); - - Vector::push_back
(&mut payees, @0x55537937a062c642a07ad1d949d10eed); - Vector::push_back(&mut amounts, 615404422); - - Vector::push_back
(&mut payees, @0x556931d8542fe0cbe0860bc3240fef88); - Vector::push_back(&mut amounts, 3062496500); - - Vector::push_back
(&mut payees, @0xeaf6023c40749bd0b59a678fa2ec48a2); - Vector::push_back(&mut amounts, 2706610587); - - Vector::push_back
(&mut payees, @0xe06e198d3f74bf2ca103fee27567675d); - Vector::push_back(&mut amounts, 4382645655); - - Vector::push_back
(&mut payees, @0xc3c697d8adbb6d51daddd4e3935152f0); - Vector::push_back(&mut amounts, 2032653807); - - Vector::push_back
(&mut payees, @0x4c1cc3361fac05e6abee719e526ae75f); - Vector::push_back(&mut amounts, 4343825938); - - Vector::push_back
(&mut payees, @0xd3810bce0b331d61ab4cb8c3b5cfbb84); - Vector::push_back(&mut amounts, 4416291811); - - Vector::push_back
(&mut payees, @0x7845ead53ab3104ee04fbbcdc7b8aefe); - Vector::push_back(&mut amounts, 4297572975); - - Vector::push_back
(&mut payees, @0x05ab8a4108a6281619c480ebc02d9099); - Vector::push_back(&mut amounts, 6126215975); - - Vector::push_back
(&mut payees, @0x6c694f6c18a0df408f84c1f3f6409257); - Vector::push_back(&mut amounts, 657089143); - - Vector::push_back
(&mut payees, @0x98dc767dbb40c5be4e9d2758eabdc6e2); - Vector::push_back(&mut amounts, 1615571023); - - Vector::push_back
(&mut payees, @0x44d5d1702ad8550467d5a81a46c72eea); - Vector::push_back(&mut amounts, 6094572300); - - Vector::push_back
(&mut payees, @0x513a6800ffdaecb823333bfc4ab3466e); - Vector::push_back(&mut amounts, 105197794); - - Vector::push_back
(&mut payees, @0x3f1eb4254be5eedc821a83a7de0b836c); - Vector::push_back(&mut amounts, 90062223); - - Vector::push_back
(&mut payees, @0xf9e32b2fc53c12b6447d6ffd70e2cac0); - Vector::push_back(&mut amounts, 169608924); - - Vector::push_back
(&mut payees, @0xce6de36f34b62ccfccf894c026180fcb); - Vector::push_back(&mut amounts, 2223079115); - - Vector::push_back
(&mut payees, @0xea2cb3a83631b60138757582706ecd77); - Vector::push_back(&mut amounts, 2642408388); - - Vector::push_back
(&mut payees, @0xc31b2b7349a0ad66fe7f92cd0cbb76cc); - Vector::push_back(&mut amounts, 1447887430); - - Vector::push_back
(&mut payees, @0x3f6e965b9f3ce1928fc6b8731fc87dfa); - Vector::push_back(&mut amounts, 619689155); - - Vector::push_back
(&mut payees, @0xeea8a87eca6cbcaecc61ac6e191db91a); - Vector::push_back(&mut amounts, 370651555); - - Vector::push_back
(&mut payees, @0x4674ef85f1cc174650b87a9e4ff63afa); - Vector::push_back(&mut amounts, 1616408224); - - Vector::push_back
(&mut payees, @0xce1f84b07c1d4cda6ef3d60d7ee52e0f); - Vector::push_back(&mut amounts, 1894489318); - - Vector::push_back
(&mut payees, @0x1ef72b5ee941ee24e748ba90cdc25fd1); - Vector::push_back(&mut amounts, 4590436143); - - Vector::push_back
(&mut payees, @0x74d262a16b5bf51999c156985852d055); - Vector::push_back(&mut amounts, 993407647); - - Vector::push_back
(&mut payees, @0xc3228b9d8ede16f9579c0846d9da0463); - Vector::push_back(&mut amounts, 2192859673); - - Vector::push_back
(&mut payees, @0xcbed86a741f1a29ccce2021dac5aba9f); - Vector::push_back(&mut amounts, 242725014); - - Vector::push_back
(&mut payees, @0xec3288545aa9f3fb1295a9567f3eab56); - Vector::push_back(&mut amounts, 556704639); - - Vector::push_back
(&mut payees, @0x3d14d4474764c511aa980db37a8d1a7f); - Vector::push_back(&mut amounts, 4102190738); - - Vector::push_back
(&mut payees, @0xdcdb1805e14de71f42ddd7c425c93138); - Vector::push_back(&mut amounts, 1228621038); - - Vector::push_back
(&mut payees, @0xfe4e85b8a8e87d34b0e84ecb2826c307); - Vector::push_back(&mut amounts, 1154729398); - - Vector::push_back
(&mut payees, @0x53c53ce9194e6e04119b80008f934500); - Vector::push_back(&mut amounts, 495132723); - - Vector::push_back
(&mut payees, @0xf5f57116313476016ae95e46a7e1c992); - Vector::push_back(&mut amounts, 249111158); - - Vector::push_back
(&mut payees, @0xef56d232749a41dd47e62b8753fd0b2f); - Vector::push_back(&mut amounts, 3692383964); - - Vector::push_back
(&mut payees, @0xd615e9e7feaeb331dcac05e64715e51f); - Vector::push_back(&mut amounts, 258559428); - - Vector::push_back
(&mut payees, @0x221d701e92d2a3040ca23e78a9dc4c43); - Vector::push_back(&mut amounts, 4593529922); - - Vector::push_back
(&mut payees, @0x500401f16609ed869ccbcb792b747ab5); - Vector::push_back(&mut amounts, 2807733411); - - Vector::push_back
(&mut payees, @0x6b412fd95a7ac0f9119cd1ab38029a4c); - Vector::push_back(&mut amounts, 508834807); - - Vector::push_back
(&mut payees, @0x2ce05e7ca2c8e006f97582938506ecaf); - Vector::push_back(&mut amounts, 111467006); - - Vector::push_back
(&mut payees, @0xe4a211a2d0b72a16aa1c9fa28f8a50b2); - Vector::push_back(&mut amounts, 111467006); - - Vector::push_back
(&mut payees, @0xa87f7aca8726827fd0044c9eba32a099); - Vector::push_back(&mut amounts, 1645529404); - - Vector::push_back
(&mut payees, @0xb09a425b45f8bd38b3273c8ff9d1705d); - Vector::push_back(&mut amounts, 1913694784); - - Vector::push_back
(&mut payees, @0xf1ff4e5f5857abd647ce766957776786); - Vector::push_back(&mut amounts, 3938550050); - - Vector::push_back
(&mut payees, @0xb3fcdbde54b33d45bcd2557be6b89f97); - Vector::push_back(&mut amounts, 3134390948); - - Vector::push_back
(&mut payees, @0x1daa340d1ee608db6436838a79502551); - Vector::push_back(&mut amounts, 3159363155); - - Vector::push_back
(&mut payees, @0x8d63698033602c1be764322b28603506); - Vector::push_back(&mut amounts, 3779404292); - - Vector::push_back
(&mut payees, @0x5b741cfb9ed80c0cadd56fb450890b55); - Vector::push_back(&mut amounts, 1177479622); - - Vector::push_back
(&mut payees, @0xc44a50622c2d465e6c15982b8e127349); - Vector::push_back(&mut amounts, 699642324); - - Vector::push_back
(&mut payees, @0xfe635aa67d111bf2a394ea1df721cd9e); - Vector::push_back(&mut amounts, 2134974332); - - Vector::push_back
(&mut payees, @0xe981c3fb2844d1e969aba763cd5a0f45); - Vector::push_back(&mut amounts, 4354128270); - - Vector::push_back
(&mut payees, @0x880187f5c1b9c74187b3a4839d6b99c5); - Vector::push_back(&mut amounts, 1734912741); - - Vector::push_back
(&mut payees, @0x27de1f87599fd1f8ae5bd1101511d546); - Vector::push_back(&mut amounts, 4829017215); - - Vector::push_back
(&mut payees, @0x578b1574528dac007009621673f6608c); - Vector::push_back(&mut amounts, 2375548125); - - Vector::push_back
(&mut payees, @0x314932578c2dd1067c4e52411d4b4491); - Vector::push_back(&mut amounts, 2621812628); - - Vector::push_back
(&mut payees, @0x8a997bf27a21edd9c0c84ba962b951c5); - Vector::push_back(&mut amounts, 3602017964); - - Vector::push_back
(&mut payees, @0x18478aacefe3e9b8e78b03e74220a3b6); - Vector::push_back(&mut amounts, 2740342920); - - Vector::push_back
(&mut payees, @0xb8d7038be29dade325b9a62095035ac4); - Vector::push_back(&mut amounts, 2877634456); - - Vector::push_back
(&mut payees, @0x9cbda8ef3082bce3989969d5fe29eb7f); - Vector::push_back(&mut amounts, 2382031640); - - Vector::push_back
(&mut payees, @0xdf2ab02c5e14aa1c385b48c4873d12a1); - Vector::push_back(&mut amounts, 1643941807); - - Vector::push_back
(&mut payees, @0x98fd8b5ae6140ef444d803d97d2e570f); - Vector::push_back(&mut amounts, 103822095); - - Vector::push_back
(&mut payees, @0xc3f25f140697f44f8c393fb72e471f54); - Vector::push_back(&mut amounts, 1285914201); - - Vector::push_back
(&mut payees, @0x431b79f419e82d6f28fa8379a11ab408); - Vector::push_back(&mut amounts, 4640682228); - - Vector::push_back
(&mut payees, @0x1dfdb1aeceaa462e76774cf90464fd9c); - Vector::push_back(&mut amounts, 4009215035); - - Vector::push_back
(&mut payees, @0xb411a80b55433bf4145046b84350c5aa); - Vector::push_back(&mut amounts, 4200161653); - - Vector::push_back
(&mut payees, @0xdc52ffcd70d6aa855c301e1876f0c263); - Vector::push_back(&mut amounts, 629744578); - - Vector::push_back
(&mut payees, @0xe3724b35042a75f4e20a68d2a2912709); - Vector::push_back(&mut amounts, 161387588); - - Vector::push_back
(&mut payees, @0x8a3a2856555f8f86af802b1a2f13f628); - Vector::push_back(&mut amounts, 1739924534); - - Vector::push_back
(&mut payees, @0x1dd5077cd9bf8892d97cdacaf2e4c270); - Vector::push_back(&mut amounts, 1825899784); - - Vector::push_back
(&mut payees, @0xc7bef02a3060a643f1ae42704f5eed4c); - Vector::push_back(&mut amounts, 1426280905); - - Vector::push_back
(&mut payees, @0xf73b01ec759ad6b262c5004cd8b71854); - Vector::push_back(&mut amounts, 3287578166); - - Vector::push_back
(&mut payees, @0xab301354ca5780b72f40c57cb3047375); - Vector::push_back(&mut amounts, 1713662026); - - Vector::push_back
(&mut payees, @0x6a14cd7e48865178b634514e6e81cf6a); - Vector::push_back(&mut amounts, 260390378); - - Vector::push_back
(&mut payees, @0x74da285a66c05620cdf1d4d22ebcb5f6); - Vector::push_back(&mut amounts, 1352320157); - - Vector::push_back
(&mut payees, @0xb8151649575106e9a42ba57852a05995); - Vector::push_back(&mut amounts, 148668571); - - Vector::push_back
(&mut payees, @0x5d8ecc43e091b2b36efb63363c83fbea); - Vector::push_back(&mut amounts, 59462618); - - Vector::push_back
(&mut payees, @0xc3d7a43785a648ef143e12bd1ba4bc32); - Vector::push_back(&mut amounts, 514550974); - - Vector::push_back
(&mut payees, @0x2fc363791c4e496f4480e7b4f3627584); - Vector::push_back(&mut amounts, 40253630); - - Vector::push_back
(&mut payees, @0x58065c1f96b85432f1fbea848cb411e5); - Vector::push_back(&mut amounts, 21802960); - - Vector::push_back
(&mut payees, @0x349a64a657ceb0ed8f465fd2ed4acef1); - Vector::push_back(&mut amounts, 3053002832); - - Vector::push_back
(&mut payees, @0x3fc0977c33cb16cb99e35f404cf9339a); - Vector::push_back(&mut amounts, 43605920); - - Vector::push_back
(&mut payees, @0xc576158fd3abbe0901c0938e42dd767a); - Vector::push_back(&mut amounts, 1443305369); - - Vector::push_back
(&mut payees, @0xbc6cb5fca62491a2426d58bf9a9cd3c5); - Vector::push_back(&mut amounts, 2415133708); - - Vector::push_back
(&mut payees, @0x1d84840eb18f5090b196e20fc609028e); - Vector::push_back(&mut amounts, 336118853); - - Vector::push_back
(&mut payees, @0x6a12f82bca06086d28928b841f1457e8); - Vector::push_back(&mut amounts, 7146718478); - - Vector::push_back
(&mut payees, @0xa66a7cf7a55fa6266f40b6afc4f48d5e); - Vector::push_back(&mut amounts, 310139026); - - Vector::push_back
(&mut payees, @0x8b7d62d5dbad53f2c2260cb9344f64d1); - Vector::push_back(&mut amounts, 392294271); - - Vector::push_back
(&mut payees, @0x31a82811b292fcbc835e2ef147cef58b); - Vector::push_back(&mut amounts, 3606825804); - - Vector::push_back
(&mut payees, @0x9e97ecf1e84c04780e83c518cc4f86d0); - Vector::push_back(&mut amounts, 4984080671); - - Vector::push_back
(&mut payees, @0x3cbc8ef7c2cb04c598115142bc482fd4); - Vector::push_back(&mut amounts, 636851042); - - Vector::push_back
(&mut payees, @0x84417cef5647097127e1bc24fd1002c6); - Vector::push_back(&mut amounts, 5962683074); - - Vector::push_back
(&mut payees, @0xb8bfc260f380ffed1e4351515673812c); - Vector::push_back(&mut amounts, 3206526910); - - Vector::push_back
(&mut payees, @0x5fa758980a5e7d97938ffbb880604bad); - Vector::push_back(&mut amounts, 2327930968); - - Vector::push_back
(&mut payees, @0x1100c3367127b5b1fc258600e54d74bf); - Vector::push_back(&mut amounts, 5966653733); - - Vector::push_back
(&mut payees, @0x1d0d9cc0deec7c0371bcc83044f9342b); - Vector::push_back(&mut amounts, 4560211992); - - Vector::push_back
(&mut payees, @0xc2eacebac1689652318a3d2bf00ec2b4); - Vector::push_back(&mut amounts, 4589242390); - - Vector::push_back
(&mut payees, @0x1159e2e59e6ec971a98c2eeb73b8f753); - Vector::push_back(&mut amounts, 409664426); - - Vector::push_back
(&mut payees, @0xba28f081de02fc6cc3bf9879d6033911); - Vector::push_back(&mut amounts, 1009232030); - - Vector::push_back
(&mut payees, @0xbcd90d2bbdd465d0f72bce62179a58cd); - Vector::push_back(&mut amounts, 339495807); - - Vector::push_back
(&mut payees, @0x818b962262805176ffcd683f08224919); - Vector::push_back(&mut amounts, 73766469); - - Vector::push_back
(&mut payees, @0x44e4a7c94ce32233e45fbcb007ffcefe); - Vector::push_back(&mut amounts, 2095240393); - - Vector::push_back
(&mut payees, @0xfa46a780ad2006f8c83e7058877be8fa); - Vector::push_back(&mut amounts, 2070277740); - - Vector::push_back
(&mut payees, @0x39f4b34103dd1478e231e6f34c896885); - Vector::push_back(&mut amounts, 581262656); - - Vector::push_back
(&mut payees, @0x54599601117b1a60ef49cb23b0c229ae); - Vector::push_back(&mut amounts, 3258562529); - - Vector::push_back
(&mut payees, @0x885308c0c59d6c157cffa3473cb467fa); - Vector::push_back(&mut amounts, 1212369421); - - Vector::push_back
(&mut payees, @0xd6310ac7a81caf781f03fbbb5ffb5a47); - Vector::push_back(&mut amounts, 1457960460); - - Vector::push_back
(&mut payees, @0xe190296e057bf341a093967987543981); - Vector::push_back(&mut amounts, 636613540); - - Vector::push_back
(&mut payees, @0xc770734f927858ac3a9cc28b6d87682e); - Vector::push_back(&mut amounts, 197500480); - - Vector::push_back
(&mut payees, @0x527ba6f888b32bb55d153fbce9219cc7); - Vector::push_back(&mut amounts, 2829377821); - - Vector::push_back
(&mut payees, @0xacc9f631c71890661cf11dfd62449cca); - Vector::push_back(&mut amounts, 1304666369); - - Vector::push_back
(&mut payees, @0xdba7f0b89931e9c46b847b98fd45c7da); - Vector::push_back(&mut amounts, 735036727); - - Vector::push_back
(&mut payees, @0xfdfb22de22c76017f928a2509ffff997); - Vector::push_back(&mut amounts, 285904018); - - Vector::push_back
(&mut payees, @0x2fc3b035a080aeb04bb4f588b1963859); - Vector::push_back(&mut amounts, 2515238049); - - Vector::push_back
(&mut payees, @0x8526df272d5a9531cd0fbbe34acef178); - Vector::push_back(&mut amounts, 1914513319); - - Vector::push_back
(&mut payees, @0x4f939df9f71a4b607b91f37d0a78215f); - Vector::push_back(&mut amounts, 988615950); - - Vector::push_back
(&mut payees, @0x0338178092889170d69a585306efeda1); - Vector::push_back(&mut amounts, 1116360860); - - Vector::push_back
(&mut payees, @0x11084e359da58996a4238282187ed5e5); - Vector::push_back(&mut amounts, 2461652904); - - Vector::push_back
(&mut payees, @0x525d26b7ba3d0ec784ce1bdfc8682ee9); - Vector::push_back(&mut amounts, 1833113655); - - Vector::push_back
(&mut payees, @0x8d7fb8362c2f2800b9503806c88bcec9); - Vector::push_back(&mut amounts, 1840727009); - - Vector::push_back
(&mut payees, @0x9e66ca133bfe63a24ab05951c1d58912); - Vector::push_back(&mut amounts, 1697181188); - - Vector::push_back
(&mut payees, @0xf6ca47b9d2935aa2a00484ff143c3e20); - Vector::push_back(&mut amounts, 42791976); - - Vector::push_back
(&mut payees, @0xd1cc781c4f3fd2aaf60a2d96a941a8c7); - Vector::push_back(&mut amounts, 42791976); - - Vector::push_back
(&mut payees, @0x32c01832d093b2f5877b85ec1cfcaaca); - Vector::push_back(&mut amounts, 3045042810); - - Vector::push_back
(&mut payees, @0xb61b1dc15fc2f21fbced860b07c7c4d9); - Vector::push_back(&mut amounts, 1340541062); - - Vector::push_back
(&mut payees, @0x6457f568df4b8c3ba3856b617d8d872d); - Vector::push_back(&mut amounts, 484640682); - - Vector::push_back
(&mut payees, @0xc69f7437b646aa7982b99f77f62e4e8a); - Vector::push_back(&mut amounts, 20924174); - - Vector::push_back
(&mut payees, @0x889fa141154b8c3c8fc305a7cd136f38); - Vector::push_back(&mut amounts, 937728133); - - Vector::push_back
(&mut payees, @0x0d6aad51c881bb086f691f5a94393af7); - Vector::push_back(&mut amounts, 1810307312); - - Vector::push_back
(&mut payees, @0xdc87166fc316cab745c0ede13005e017); - Vector::push_back(&mut amounts, 63432061); - - Vector::push_back
(&mut payees, @0x5802d0942e78c5cb0c02bcdc44a02045); - Vector::push_back(&mut amounts, 4558162780); - - Vector::push_back
(&mut payees, @0xe9253af5c8e979e023a2fb79d021b445); - Vector::push_back(&mut amounts, 1117977462); - - Vector::push_back
(&mut payees, @0xeb791a2e8c6777c33e2af1ca418956df); - Vector::push_back(&mut amounts, 1133139292); - - Vector::push_back
(&mut payees, @0x51835d0993d566f477bda3e4561b426d); - Vector::push_back(&mut amounts, 780692825); - - Vector::push_back
(&mut payees, @0xa64374b74ef6de25ce2c27f29fad105b); - Vector::push_back(&mut amounts, 844435419); - - Vector::push_back
(&mut payees, @0xce95cf6edd87f504a9c94f1b84a7ac4b); - Vector::push_back(&mut amounts, 1639950912); - - Vector::push_back
(&mut payees, @0x9da1899e71f7225c6fcbaa44f8a8f813); - Vector::push_back(&mut amounts, 1645245020); - - Vector::push_back
(&mut payees, @0x8b773cb5a3cf231e89dc5cac53c525f6); - Vector::push_back(&mut amounts, 1645853686); - - Vector::push_back
(&mut payees, @0x3152fe3dbfe611b9f2355a2c0cf10f48); - Vector::push_back(&mut amounts, 1646725690); - - Vector::push_back
(&mut payees, @0x572c8eb56867276481bb3b228c7ebb45); - Vector::push_back(&mut amounts, 439859088); - - Vector::push_back
(&mut payees, @0x52d958f00023ad8d03a2efb5aac28811); - Vector::push_back(&mut amounts, 439859088); - - Vector::push_back
(&mut payees, @0x1d4c12f15d72000a6150c3e9e281d2f0); - Vector::push_back(&mut amounts, 237885568); - - Vector::push_back
(&mut payees, @0x5e7d1a45cdb7930c0b612208ea9ad67e); - Vector::push_back(&mut amounts, 2642278852); - - Vector::push_back
(&mut payees, @0x5c2cd8f69b2ad319ed8d603cc29ed6db); - Vector::push_back(&mut amounts, 2153149672); - - Vector::push_back
(&mut payees, @0x62c9204878770b7bea487ae3fc0ba611); - Vector::push_back(&mut amounts, 657837121); - - Vector::push_back
(&mut payees, @0xd6689e360beb9018bdc06feb2c08c98c); - Vector::push_back(&mut amounts, 3305985669); - - Vector::push_back
(&mut payees, @0x3d4c22881359530c8ade3dad0d87e05f); - Vector::push_back(&mut amounts, 1666483298); - - Vector::push_back
(&mut payees, @0xfa3d8aaf3bff1cda1e9ebb1dc9679370); - Vector::push_back(&mut amounts, 332824452); - - Vector::push_back
(&mut payees, @0x7aaf5748d813a2c0571e8f4e60261156); - Vector::push_back(&mut amounts, 883554249); - - Vector::push_back
(&mut payees, @0xc8f7974c311ba35dfa8580db6600ff13); - Vector::push_back(&mut amounts, 37799587); - - Vector::push_back
(&mut payees, @0x0e67d7ecb17fe99d330d29b0703f09e0); - Vector::push_back(&mut amounts, 256028391); - - Vector::push_back
(&mut payees, @0x386d3547693fb5cb68e94194f406dcb3); - Vector::push_back(&mut amounts, 5770329645); - - Vector::push_back
(&mut payees, @0xadf9327eedad93aacdaf3e9d50b9fa2b); - Vector::push_back(&mut amounts, 1008082073); - - Vector::push_back
(&mut payees, @0x6a3715815327f8ee768b8cd8537d11e0); - Vector::push_back(&mut amounts, 2290409712); - - Vector::push_back
(&mut payees, @0x83d52be0cbb5f94686521575b4ebaa40); - Vector::push_back(&mut amounts, 4185761387); - - Vector::push_back
(&mut payees, @0x4caaf67568d37c01ba05f374b738ca73); - Vector::push_back(&mut amounts, 194784102); - - Vector::push_back
(&mut payees, @0x813ebdaae9f3a6e796138f4585ee4fbb); - Vector::push_back(&mut amounts, 3489106923); - - Vector::push_back
(&mut payees, @0x9ff4851d3318425b4d748ccd14c01152); - Vector::push_back(&mut amounts, 3776734849); - - Vector::push_back
(&mut payees, @0xb723027e0ea21587933aa68437dd8a93); - Vector::push_back(&mut amounts, 1775835802); - - Vector::push_back
(&mut payees, @0xbf18b79cfa3037fd153a14ef89bb26ac); - Vector::push_back(&mut amounts, 2964116728); - - Vector::push_back
(&mut payees, @0xd04b586c54afc649cbd5a0df06edf8a5); - Vector::push_back(&mut amounts, 62999312); - - Vector::push_back
(&mut payees, @0x0db83e8af0e164db8d28817f00c67474); - Vector::push_back(&mut amounts, 766882961); - - Vector::push_back
(&mut payees, @0x2fdf675b2c182ec4034b504a0166910c); - Vector::push_back(&mut amounts, 717903381); - - Vector::push_back
(&mut payees, @0x62816ff5196f8e4849d5f889d95a3a9d); - Vector::push_back(&mut amounts, 779876342); - - Vector::push_back
(&mut payees, @0x93c18c849d6717d051d97983b6ca5aef); - Vector::push_back(&mut amounts, 439404076); - - Vector::push_back
(&mut payees, @0x434437ac984b03a456a9f8bc42b1e52d); - Vector::push_back(&mut amounts, 433460862); - - Vector::push_back
(&mut payees, @0xa7a7b61ba5c90502d1e9adf84be77239); - Vector::push_back(&mut amounts, 309599762); - - Vector::push_back
(&mut payees, @0x365e3c3a93594e0cdb08114ff608e29f); - Vector::push_back(&mut amounts, 309599762); - - Vector::push_back
(&mut payees, @0x80185b99c2e16023b53bbed14e2c0c9c); - Vector::push_back(&mut amounts, 309599762); - - Vector::push_back
(&mut payees, @0x73e969461a255a398c3ae59d3c3c71c8); - Vector::push_back(&mut amounts, 309599762); - - Vector::push_back
(&mut payees, @0xc900811d8b1f9f68ce1fc48425620c06); - Vector::push_back(&mut amounts, 1049619833); - - Vector::push_back
(&mut payees, @0xb64f29882abc22724e5f64b227f64e2a); - Vector::push_back(&mut amounts, 349947076); - - Vector::push_back
(&mut payees, @0x6ef1333099d5d3e0f0cde618056b3125); - Vector::push_back(&mut amounts, 710289520); - - Vector::push_back
(&mut payees, @0x6154e17d746e41da224215863c9840ce); - Vector::push_back(&mut amounts, 599980977); - - Vector::push_back
(&mut payees, @0x194b8c1c944c12ef43fe3e333c418455); - Vector::push_back(&mut amounts, 337417754); - - Vector::push_back
(&mut payees, @0x90db26f427971dc997921a14f1430a0b); - Vector::push_back(&mut amounts, 3684084901); - - Vector::push_back
(&mut payees, @0x009b95f55c62c24df4fa19643ed68cd1); - Vector::push_back(&mut amounts, 197432664); - - Vector::push_back
(&mut payees, @0x7a978d1816c13cd8b75fa8fff1644c41); - Vector::push_back(&mut amounts, 2645672881); - - Vector::push_back
(&mut payees, @0x1c468ef2a0d3f1998fd40bb6dce9c1b8); - Vector::push_back(&mut amounts, 179570520); - - Vector::push_back
(&mut payees, @0x6b9e7666bc4dcf28f47379ad0398644a); - Vector::push_back(&mut amounts, 3176590129); - - Vector::push_back
(&mut payees, @0xbc975564f7535b8ab5d2b4d0ad8342bd); - Vector::push_back(&mut amounts, 3146244538); - - Vector::push_back
(&mut payees, @0x2ac70f135c350c232a3f295b0a5d458a); - Vector::push_back(&mut amounts, 2941191408); - - Vector::push_back
(&mut payees, @0x00a3144a8662e59756d8f17afbd7484f); - Vector::push_back(&mut amounts, 3163346031); - - Vector::push_back
(&mut payees, @0xd4da8072f31f9e2e730212abe6e17e91); - Vector::push_back(&mut amounts, 3152394285); - - Vector::push_back
(&mut payees, @0x3f9ec17209c1602e898bacdcd3df1296); - Vector::push_back(&mut amounts, 3131466277); - - Vector::push_back
(&mut payees, @0xf6e7d9aa99482b3944c5ebac807a7531); - Vector::push_back(&mut amounts, 3141589728); - - Vector::push_back
(&mut payees, @0x367aa8bea039328f0a67edf9c5391e39); - Vector::push_back(&mut amounts, 3127212706); - - Vector::push_back
(&mut payees, @0x6c586e2269134fee794bfa64ea32691c); - Vector::push_back(&mut amounts, 3063576722); - - Vector::push_back
(&mut payees, @0xe17e6b2ccde1a814d42ff8758c910d2c); - Vector::push_back(&mut amounts, 2089196109); - - Vector::push_back
(&mut payees, @0x3fe4cc042db50b1bd3cd8a6075fa2a42); - Vector::push_back(&mut amounts, 3050259243); - - Vector::push_back
(&mut payees, @0xe1f96aab14d2915f45e6ac8c03502f8c); - Vector::push_back(&mut amounts, 3113907451); - - Vector::push_back
(&mut payees, @0x88aba97fd094b1c61b89af23765f8ca5); - Vector::push_back(&mut amounts, 2058513904); - - Vector::push_back
(&mut payees, @0x81444074318f422aba6316e112f86504); - Vector::push_back(&mut amounts, 2811577976); - - Vector::push_back
(&mut payees, @0x3904fe2bb6c23659df22660b471b0eaa); - Vector::push_back(&mut amounts, 2709522199); - - Vector::push_back
(&mut payees, @0x161d6a154d0401757542ec09fab50f31); - Vector::push_back(&mut amounts, 2838310052); - - Vector::push_back
(&mut payees, @0x0199d4576f756d0b74575a506b2182f3); - Vector::push_back(&mut amounts, 2825432384); - - Vector::push_back
(&mut payees, @0xadaa9bcd705768bb5e7d5236b488c5ac); - Vector::push_back(&mut amounts, 2723271017); - - Vector::push_back
(&mut payees, @0xde3ce31607ff6d34954609bab7dca990); - Vector::push_back(&mut amounts, 2819439799); - - Vector::push_back
(&mut payees, @0x3c7ae08b5961871d215f3216f441c32a); - Vector::push_back(&mut amounts, 1224673793); - - Vector::push_back
(&mut payees, @0x4cca57b8d09993a3b524223dedf2bcf7); - Vector::push_back(&mut amounts, 1133759197); - - Vector::push_back
(&mut payees, @0xa7bf8b47ac90631fcf25c9115a6a4685); - Vector::push_back(&mut amounts, 171209467); - - Vector::push_back
(&mut payees, @0xab2ee4c15b4860547f05c15cc5b4b879); - Vector::push_back(&mut amounts, 3286142885); - - Vector::push_back
(&mut payees, @0xae9458aacf60f02622ed944460e8d495); - Vector::push_back(&mut amounts, 3891692724); - - Vector::push_back
(&mut payees, @0xc82956aea02e2dca188eb1da7de83d59); - Vector::push_back(&mut amounts, 110460753); - - Vector::push_back
(&mut payees, @0x5bb567133846213d8bcee4e8acec9d81); - Vector::push_back(&mut amounts, 2122226084); - - Vector::push_back
(&mut payees, @0x5ff1988f042a2a65c592d35b4759ef5f); - Vector::push_back(&mut amounts, 1681097976); - - Vector::push_back
(&mut payees, @0xd1bcd47691fbc7f8e7d527b961eb1c48); - Vector::push_back(&mut amounts, 1073012831); - - Vector::push_back
(&mut payees, @0xa660b0d87df63af8e30c437e275a49e0); - Vector::push_back(&mut amounts, 2121814022); - - Vector::push_back
(&mut payees, @0x8222c710267a00cdb021b847d60591ca); - Vector::push_back(&mut amounts, 7157991068); - - Vector::push_back
(&mut payees, @0x9b443b667d3dc0ec10da6d7284ac571c); - Vector::push_back(&mut amounts, 6513342245); - - Vector::push_back
(&mut payees, @0xdb3e53cc224714124bace1381ac23d94); - Vector::push_back(&mut amounts, 1109009844); - - Vector::push_back
(&mut payees, @0x9cd15e61ed5c2ebf9364c68c123b582f); - Vector::push_back(&mut amounts, 972519443); - - Vector::push_back
(&mut payees, @0xadda96997467640dadba51aa0616be72); - Vector::push_back(&mut amounts, 2879873338); - - Vector::push_back
(&mut payees, @0xc3186803b5a56a32c47c713f617adacf); - Vector::push_back(&mut amounts, 3000809797); - - Vector::push_back
(&mut payees, @0x335f2c900c9f62bb0d29d1c6017eaa72); - Vector::push_back(&mut amounts, 3133920420); - - Vector::push_back
(&mut payees, @0xf2b3ff3ffd4c7ee3d122bf2cb2e43ac6); - Vector::push_back(&mut amounts, 3114060004); - - Vector::push_back
(&mut payees, @0x9bdf68331f3bff61e63ae10b7990aa9b); - Vector::push_back(&mut amounts, 3125868260); - - Vector::push_back
(&mut payees, @0x62922e76b6a7d6568a745020c6bfbb81); - Vector::push_back(&mut amounts, 3058778837); - - Vector::push_back
(&mut payees, @0xa1130ac378d408c18d3e9e44e510c698); - Vector::push_back(&mut amounts, 3116286878); - - Vector::push_back
(&mut payees, @0xfaede4336aca8eea226922c1aaed6ce1); - Vector::push_back(&mut amounts, 3059805417); - - Vector::push_back
(&mut payees, @0x9f9be04e6c2a52337011386bb3674366); - Vector::push_back(&mut amounts, 3118339635); - - Vector::push_back
(&mut payees, @0xe2bddd3fb3fa6b309e0270f62abada75); - Vector::push_back(&mut amounts, 2829413209); - - Vector::push_back
(&mut payees, @0xd896e040cc3f187f17a734413e4b114c); - Vector::push_back(&mut amounts, 2830436985); - - Vector::push_back
(&mut payees, @0x94ff3338c8e5be7f27d7ff567b18f5c5); - Vector::push_back(&mut amounts, 2831062925); - - Vector::push_back
(&mut payees, @0x9114a5b1146ea1d2d0075a5a84a0373a); - Vector::push_back(&mut amounts, 2750609907); - - Vector::push_back
(&mut payees, @0x80c13ab1b9d0d2de7a2c14a43378125d); - Vector::push_back(&mut amounts, 2350439488); - - Vector::push_back
(&mut payees, @0x8e8647738d1eb7d79b11a0433edbe56e); - Vector::push_back(&mut amounts, 2751522206); - - Vector::push_back
(&mut payees, @0xc6d16f319f06d80609ba90fc88a9d13b); - Vector::push_back(&mut amounts, 2753618928); - - Vector::push_back
(&mut payees, @0x2dd3dffba117efc4691a8ba07e0ba39c); - Vector::push_back(&mut amounts, 1193608301); - - Vector::push_back
(&mut payees, @0x5d6d5ef685c9bb1667687c3af71c7868); - Vector::push_back(&mut amounts, 747735052); - - Vector::push_back
(&mut payees, @0xadb95606eb6b06e44d271e0b07918e08); - Vector::push_back(&mut amounts, 341837055); - - Vector::push_back
(&mut payees, @0xb464b4d3672e602cbb76481d73fd6561); - Vector::push_back(&mut amounts, 1837927831); - - Vector::push_back
(&mut payees, @0xfbbf05f537d5d5103200317cdd961cde); - Vector::push_back(&mut amounts, 1936965972); - - Vector::push_back
(&mut payees, @0x9a3cd442f4fd62dc66a7bb87f522fec6); - Vector::push_back(&mut amounts, 60903550); - - Vector::push_back
(&mut payees, @0xfa4b2bb18573562ea91c33d90c533f62); - Vector::push_back(&mut amounts, 2141519727); - - Vector::push_back
(&mut payees, @0xd9859ac77fe37821ee0193b9b70dc1d1); - Vector::push_back(&mut amounts, 2519693646); - - Vector::push_back
(&mut payees, @0x42776812493f91e519ff574f3da91aa6); - Vector::push_back(&mut amounts, 153310501); - - Vector::push_back
(&mut payees, @0x25f1c9cf1f1a2e8473549848c1518567); - Vector::push_back(&mut amounts, 290023395); - - Vector::push_back
(&mut payees, @0xbeed26a4db938dedea423cea750a74e4); - Vector::push_back(&mut amounts, 1687391596); - - Vector::push_back
(&mut payees, @0x9cb373fe0196e214e116468e01ad0a08); - Vector::push_back(&mut amounts, 179540746); - - Vector::push_back
(&mut payees, @0x0cc691f811cb4e21635a2fd17b29fbae); - Vector::push_back(&mut amounts, 143832141); - - Vector::push_back
(&mut payees, @0x00522e0cacdeb4f0c371cb907776af10); - Vector::push_back(&mut amounts, 667310330); - - Vector::push_back
(&mut payees, @0x56c94bab068a76c339b47dda8f2c5f4c); - Vector::push_back(&mut amounts, 263534753); - - Vector::push_back
(&mut payees, @0xde32472c7fcdd2724a2dea35bd303272); - Vector::push_back(&mut amounts, 3716821115); - - Vector::push_back
(&mut payees, @0x69841820f6dde82e26dce33b179f7a96); - Vector::push_back(&mut amounts, 256279366); - - Vector::push_back
(&mut payees, @0x3b4dc78449e32295852885b9a06f0c3f); - Vector::push_back(&mut amounts, 156992169); - - Vector::push_back
(&mut payees, @0xd4a310da2be0b6002b63353e270539bf); - Vector::push_back(&mut amounts, 3964214411); - - Vector::push_back
(&mut payees, @0xa07366ddd6a0adea00dbe3c534a32c60); - Vector::push_back(&mut amounts, 802802030); - - Vector::push_back
(&mut payees, @0xb7c3fc9376d5fb871ad75ccc7c018c69); - Vector::push_back(&mut amounts, 187148184); - - Vector::push_back
(&mut payees, @0x47329e629d8c6743a3d5495b75c116f5); - Vector::push_back(&mut amounts, 1924205151); - - Vector::push_back
(&mut payees, @0xca1f11937872850bf14c55a48de55afe); - Vector::push_back(&mut amounts, 2512804505); - - Vector::push_back
(&mut payees, @0x7709ee30fc79b1184de74249eaa4194a); - Vector::push_back(&mut amounts, 945692812); - - Vector::push_back
(&mut payees, @0xa9f56e630f220cf6d7edc9e69d47aee4); - Vector::push_back(&mut amounts, 913440087); - - Vector::push_back
(&mut payees, @0xc59ffe0d970a16a5fdb8e31074f00493); - Vector::push_back(&mut amounts, 673064086); - - Vector::push_back
(&mut payees, @0xb06cb86f58b0739475f619d182ea8409); - Vector::push_back(&mut amounts, 1785072305); - - Vector::push_back
(&mut payees, @0x261a7078a7ee87b134af61529c904344); - Vector::push_back(&mut amounts, 1111758910); - - Vector::push_back
(&mut payees, @0xa9f21da0117d66a89c4d2e6a4962b17b); - Vector::push_back(&mut amounts, 1601467898); - - Vector::push_back
(&mut payees, @0xeb44e19243500ddfc6b549bbda68247c); - Vector::push_back(&mut amounts, 3455157852); - - Vector::push_back
(&mut payees, @0xc79233026df3ce484900758906eed2d3); - Vector::push_back(&mut amounts, 1791315891); - - Vector::push_back
(&mut payees, @0x005c829605d2bafbbe0743efaa2acf7d); - Vector::push_back(&mut amounts, 23182904); - - Vector::push_back
(&mut payees, @0xb8ccb263d42ebcba5c56764ea1003d58); - Vector::push_back(&mut amounts, 1565628103); - - Vector::push_back
(&mut payees, @0x9fa98bba5fbadf868f4a6c370cb22cfb); - Vector::push_back(&mut amounts, 1814878136); - - Vector::push_back
(&mut payees, @0xda1c384aca711ae1238c1824e8d565d8); - Vector::push_back(&mut amounts, 1563533743); - - Vector::push_back
(&mut payees, @0x88d1c07460dd34d6ae568c5d9ed06d73); - Vector::push_back(&mut amounts, 3120664984); - - Vector::push_back
(&mut payees, @0x38ab3c72a07553ede6261af2eb3d9bd3); - Vector::push_back(&mut amounts, 3190683753); - - Vector::push_back
(&mut payees, @0x218d6b103233ade416d2fff019f22b06); - Vector::push_back(&mut amounts, 2034539401); - - Vector::push_back
(&mut payees, @0x53273963c0861d7878b2e6e59e6c55fc); - Vector::push_back(&mut amounts, 3831785371); - - Vector::push_back
(&mut payees, @0xb4dc0e05154670c37f2a45250e5d3a9c); - Vector::push_back(&mut amounts, 2797901289); - - Vector::push_back
(&mut payees, @0x297d84be6e56d5174ded356fafdeba13); - Vector::push_back(&mut amounts, 2755103759); - - Vector::push_back
(&mut payees, @0xbd1cbd8e8e5a481cba0d625b1f8bd899); - Vector::push_back(&mut amounts, 322119817); - - Vector::push_back
(&mut payees, @0x9d0a8f2f51a2cb0d4eceeb1fd269431d); - Vector::push_back(&mut amounts, 1141885934); - - Vector::push_back
(&mut payees, @0xf4313c355d005f50ceb413e91bfa21e9); - Vector::push_back(&mut amounts, 2738668555); - - Vector::push_back
(&mut payees, @0x364ed6e2dd9be051be236395e166eecc); - Vector::push_back(&mut amounts, 1029606691); - - Vector::push_back
(&mut payees, @0x87dc2e497ac6edab21511333a421e5a5); - Vector::push_back(&mut amounts, 42102009); - - Vector::push_back
(&mut payees, @0xa32a51de1f2e0700acd6f0850d242287); - Vector::push_back(&mut amounts, 436998870); - - Vector::push_back
(&mut payees, @0x99bb774f34f40117c04e4082ae330d3b); - Vector::push_back(&mut amounts, 3482208140); - - Vector::push_back
(&mut payees, @0x76045e6d442182a3f2467cc81e497241); - Vector::push_back(&mut amounts, 1960735493); - - Vector::push_back
(&mut payees, @0x12d786ecd55e453993cf3303ea9f5384); - Vector::push_back(&mut amounts, 1528901301); - - Vector::push_back
(&mut payees, @0xbf6a52bf5f5c27fd45daa932d41caa26); - Vector::push_back(&mut amounts, 2908991072); - - Vector::push_back
(&mut payees, @0x4e6468d95d07552e8804f637c13e1d0b); - Vector::push_back(&mut amounts, 4585821803); - - Vector::push_back
(&mut payees, @0x4749f425b3cb3ed43df1387a1ffa7756); - Vector::push_back(&mut amounts, 3877578131); - - Vector::push_back
(&mut payees, @0x974f510b4634961c3ec3ada8297593d8); - Vector::push_back(&mut amounts, 2538460610); - - Vector::push_back
(&mut payees, @0x7db383b9ee673cdf8c3e597b1977599d); - Vector::push_back(&mut amounts, 2251291963); - - Vector::push_back
(&mut payees, @0xb89c3643458200ae7295e1b1b56ad2c1); - Vector::push_back(&mut amounts, 205945403); - - Vector::push_back
(&mut payees, @0xd7db70ee8eafed7f60ece38196a127a1); - Vector::push_back(&mut amounts, 29719484); - - Vector::push_back
(&mut payees, @0x45b63b79a7369a4acfb4547367bf637f); - Vector::push_back(&mut amounts, 2790265555); - - Vector::push_back
(&mut payees, @0x50a39238a5e0f9b7eced55564d059cf0); - Vector::push_back(&mut amounts, 4308637695); - - Vector::push_back
(&mut payees, @0x1d83cf6f445a56fe9308a8b063491c99); - Vector::push_back(&mut amounts, 2824776644); - - Vector::push_back
(&mut payees, @0xba28e97a4bc3f7f1366c0b059e0c0d79); - Vector::push_back(&mut amounts, 344417539); - - Vector::push_back
(&mut payees, @0x548bdbe7dad3e52de6b9886b1db3fc56); - Vector::push_back(&mut amounts, 369511013); - - Vector::push_back
(&mut payees, @0xda1a414269835e44f8cdc4077c560658); - Vector::push_back(&mut amounts, 2388662012); - - Vector::push_back
(&mut payees, @0x0f82c1b607a1a5a5c837664c02486b15); - Vector::push_back(&mut amounts, 3228935612); - - Vector::push_back
(&mut payees, @0x3c18813e433511af9102f80018a7b86e); - Vector::push_back(&mut amounts, 1417073007); - - Vector::push_back
(&mut payees, @0x73538d1f243b78b7f70f789b345ca83d); - Vector::push_back(&mut amounts, 599767197); - - Vector::push_back
(&mut payees, @0xec5d40999adb39ac8f2acd47e117355e); - Vector::push_back(&mut amounts, 338066329); - - Vector::push_back
(&mut payees, @0x52a00d214d47a274c2ad619bc365584b); - Vector::push_back(&mut amounts, 1776688515); - - Vector::push_back
(&mut payees, @0x06dd3a0917561c14fdb72024a2f5e7e7); - Vector::push_back(&mut amounts, 33965125); - - Vector::push_back
(&mut payees, @0x4ad0bb6a770ab3eef540af82f88a549a); - Vector::push_back(&mut amounts, 1207975418); - - Vector::push_back
(&mut payees, @0x1d73cf6020f95cbebf1426e8d68ba080); - Vector::push_back(&mut amounts, 40333586); - - Vector::push_back
(&mut payees, @0x497036c16cea6ff43ca84fe0cb345e17); - Vector::push_back(&mut amounts, 445881082); - - Vector::push_back
(&mut payees, @0x5f89cc01b25f70aff2f1afedcb8ffa03); - Vector::push_back(&mut amounts, 1252138929); - - Vector::push_back
(&mut payees, @0xf435de1fee7e4a483b36b49660d6dcce); - Vector::push_back(&mut amounts, 182068762); - - Vector::push_back
(&mut payees, @0x5955d5315da4fe62db245822a4810f79); - Vector::push_back(&mut amounts, 20873806); - - Vector::push_back
(&mut payees, @0xf30e1daa832e396af53326aab3e8abfa); - Vector::push_back(&mut amounts, 274413958); - - Vector::push_back
(&mut payees, @0x86579c13f612d8114bb2ebdc67fac1de); - Vector::push_back(&mut amounts, 2830310431); - - Vector::push_back
(&mut payees, @0x8ad3ceec091b360597af8b78354064c5); - Vector::push_back(&mut amounts, 924309761); - - Vector::push_back
(&mut payees, @0xfd92fa4207b69c5ff64b86f3961bf65d); - Vector::push_back(&mut amounts, 1310775518); - - Vector::push_back
(&mut payees, @0x9007c8001e032212fb138bf3de1b01a4); - Vector::push_back(&mut amounts, 125944139); - - Vector::push_back
(&mut payees, @0x5d4731430563120519e95aceb9f98170); - Vector::push_back(&mut amounts, 75914013); - - Vector::push_back
(&mut payees, @0x6bba2f30f8c2991a3daa7619ba466917); - Vector::push_back(&mut amounts, 224805655); - - Vector::push_back
(&mut payees, @0x3b676d4bc51fe730c31ed88e967f9b78); - Vector::push_back(&mut amounts, 25512430); - - Vector::push_back
(&mut payees, @0xd1a8e905f8860a708f25a017a040840e); - Vector::push_back(&mut amounts, 18554494); - - Vector::push_back
(&mut payees, @0x8b7be5c6248260c417d9e7329be1a6ab); - Vector::push_back(&mut amounts, 4071822083); - - Vector::push_back
(&mut payees, @0x45f6bcf1f27256b1618ae50ecf2905c5); - Vector::push_back(&mut amounts, 924596871); - - Vector::push_back
(&mut payees, @0x7fc2bf150a18f79cb33b277aa9c2cf49); - Vector::push_back(&mut amounts, 869905978); - - Vector::push_back
(&mut payees, @0xadfb7bcbcfe4e466256464d3853b08b1); - Vector::push_back(&mut amounts, 2198334396); - - Vector::push_back
(&mut payees, @0xd8ff6bbf6616266e97c31656ff506d47); - Vector::push_back(&mut amounts, 1357795483); - - Vector::push_back
(&mut payees, @0xb337b2dc21383d5960524543d94be7ba); - Vector::push_back(&mut amounts, 253640763); - - Vector::push_back
(&mut payees, @0xe4240cda2bcba4f42f8612458774e140); - Vector::push_back(&mut amounts, 407108329); - - Vector::push_back
(&mut payees, @0x122ef7372f302a43d2ae74b21e48a59e); - Vector::push_back(&mut amounts, 155915599); - - Vector::push_back
(&mut payees, @0x260afccc3e3b4f523dd5654084c76d84); - Vector::push_back(&mut amounts, 434495172); - - Vector::push_back
(&mut payees, @0x140f35c2910b4e13743037650a309b30); - Vector::push_back(&mut amounts, 5566543756); - - Vector::push_back
(&mut payees, @0xd4f360b8952a5a8f07e7e016ca8c9edd); - Vector::push_back(&mut amounts, 1051865983); - - Vector::push_back
(&mut payees, @0xcd7c59c9d7ca50fe417e3083771fa7e8); - Vector::push_back(&mut amounts, 2052816228); - - Vector::push_back
(&mut payees, @0xbd4bbe6233887004d246753d73416e7e); - Vector::push_back(&mut amounts, 3777302163); - - Vector::push_back
(&mut payees, @0x59c6262930e3ebb3398d5b88790c090c); - Vector::push_back(&mut amounts, 2357260247); - - Vector::push_back
(&mut payees, @0x1db7dc95663ea9d2ffc123373a2ccf62); - Vector::push_back(&mut amounts, 1991799066); - - Vector::push_back
(&mut payees, @0x8fa38ec2df1f2f5c80bfe4b081262c1f); - Vector::push_back(&mut amounts, 681658002); - - Vector::push_back
(&mut payees, @0x9124f77818589270f78ff2d8cdd3118a); - Vector::push_back(&mut amounts, 40453577); - - Vector::push_back
(&mut payees, @0x086b0286a641e816808709d643259110); - Vector::push_back(&mut amounts, 3662834658); - - Vector::push_back
(&mut payees, @0x87373c052426e1d13e65bd9e2925749d); - Vector::push_back(&mut amounts, 3899265563); - - Vector::push_back
(&mut payees, @0x40ee749a693339174a71147c221ee573); - Vector::push_back(&mut amounts, 169672668); - - Vector::push_back
(&mut payees, @0x6254999609e729e92dbf9ce6fa8279c6); - Vector::push_back(&mut amounts, 583573975); - - Vector::push_back
(&mut payees, @0x7608e98a2a9f9ac37d4d917d63722353); - Vector::push_back(&mut amounts, 2745084714); - - Vector::push_back
(&mut payees, @0x8329d0d6c6e5568e9f812d2b4a2a5482); - Vector::push_back(&mut amounts, 240540868); - - Vector::push_back
(&mut payees, @0x11ffba2ddc612ed1d90d3e25f1bbf014); - Vector::push_back(&mut amounts, 80907154); - - Vector::push_back
(&mut payees, @0x88cb6f24d7e5dd3401e7f2287c88f461); - Vector::push_back(&mut amounts, 4049805891); - - Vector::push_back
(&mut payees, @0x2eaae391c493e55d2c0c1ad997ba1b06); - Vector::push_back(&mut amounts, 253862116); - - Vector::push_back
(&mut payees, @0x01eaee9924e46666710628779d8d66c0); - Vector::push_back(&mut amounts, 2058232607); - - Vector::push_back
(&mut payees, @0x2cce6a2177165025d1276db763cee74a); - Vector::push_back(&mut amounts, 40453577); - - Vector::push_back
(&mut payees, @0x6e603be730bf47f21566a4e05adc64b4); - Vector::push_back(&mut amounts, 1613305441); - - Vector::push_back
(&mut payees, @0x1cc0ea0f60ab8ab158ff3dd91aea2874); - Vector::push_back(&mut amounts, 2429741854); - - Vector::push_back
(&mut payees, @0x1ad5b76c6a147a1ae3bc3e1ffb15cc74); - Vector::push_back(&mut amounts, 26969051); - - Vector::push_back
(&mut payees, @0xffdbac37b409f9ec3efd2fd9f53f068b); - Vector::push_back(&mut amounts, 1502595937); - - Vector::push_back
(&mut payees, @0x896faefdef01f0ece3f960a7d3b84d86); - Vector::push_back(&mut amounts, 75513344); - - Vector::push_back
(&mut payees, @0x2787d9ecc01eab17ee824d417f780fbe); - Vector::push_back(&mut amounts, 298875784); - - Vector::push_back
(&mut payees, @0xf75094c2e04b2cd28f3a5e034498fb23); - Vector::push_back(&mut amounts, 21575241); - - Vector::push_back
(&mut payees, @0xc1625c5bab2175bebf2d028a705bb3b0); - Vector::push_back(&mut amounts, 7210390890); - - Vector::push_back
(&mut payees, @0x16b180b42275f75f3e0c4e477c3eb4db); - Vector::push_back(&mut amounts, 5882313586); - - Vector::push_back
(&mut payees, @0x00ecb4f8f19c0e10a1c061b02834b72e); - Vector::push_back(&mut amounts, 3516244719); - - Vector::push_back
(&mut payees, @0xbc65c01484943cf4e40b2fc1689d0e47); - Vector::push_back(&mut amounts, 4385673915); - - Vector::push_back
(&mut payees, @0xf1ba01485ee64e2d705d4becb55a8aaf); - Vector::push_back(&mut amounts, 305661028); - - Vector::push_back
(&mut payees, @0xbe4fcee53b5179ce85f5d4670c9b584b); - Vector::push_back(&mut amounts, 1065579518); - - Vector::push_back
(&mut payees, @0xf76c0bec2582fa779f0c2513b3ebbe5f); - Vector::push_back(&mut amounts, 3679146609); - - Vector::push_back
(&mut payees, @0x526af51e4169aa9c256be7f0b0417f88); - Vector::push_back(&mut amounts, 1533504969); - - Vector::push_back
(&mut payees, @0xac9c11f794b2d3c88859416520e18be9); - Vector::push_back(&mut amounts, 4550830392); - - Vector::push_back
(&mut payees, @0x25b8147908f7578a7e314d3d59dc70d6); - Vector::push_back(&mut amounts, 5145854260); - - Vector::push_back
(&mut payees, @0x57602fe4487fd67a5311b19e49883862); - Vector::push_back(&mut amounts, 2344412384); - - Vector::push_back
(&mut payees, @0xe40393ff95a37c139feb62894bf463a4); - Vector::push_back(&mut amounts, 2576923158); - - Vector::push_back
(&mut payees, @0x566205a9095c2eed1f3e108ca5a973bb); - Vector::push_back(&mut amounts, 1852215892); - - Vector::push_back
(&mut payees, @0x5aef99cc7bcc0ccdc26362c1a91d80a1); - Vector::push_back(&mut amounts, 100014106); - - Vector::push_back
(&mut payees, @0x701acc3fe3784deee61485164f39cbe6); - Vector::push_back(&mut amounts, 793117085); - - Vector::push_back
(&mut payees, @0xcf4a0ddb8d816fca7e080f8fdf94f0d1); - Vector::push_back(&mut amounts, 3069310453); - - Vector::push_back
(&mut payees, @0x337c08fd81eb616f6f9d206ed83c6d36); - Vector::push_back(&mut amounts, 2624424802); - - Vector::push_back
(&mut payees, @0x5e8e6985cf5181e1cc37bfa4765acb66); - Vector::push_back(&mut amounts, 169412531); - - Vector::push_back
(&mut payees, @0x78d88ef8f6495154e37e6f49a5212518); - Vector::push_back(&mut amounts, 163144144); - - Vector::push_back
(&mut payees, @0x3e1cf48283a3032e612e00e03887e70e); - Vector::push_back(&mut amounts, 163144144); - - Vector::push_back
(&mut payees, @0xa382a1ce9c36de68095e91295ac2e064); - Vector::push_back(&mut amounts, 284767582); - - Vector::push_back
(&mut payees, @0x26bebfe3c4dddada3de38184e1699a4b); - Vector::push_back(&mut amounts, 40356879); - - Vector::push_back
(&mut payees, @0x863d4e76d1a0c4b4c54417fda716c1e5); - Vector::push_back(&mut amounts, 28826342); - - Vector::push_back
(&mut payees, @0xa69eb81fc7f3c1f3bb08a7fed0cb282e); - Vector::push_back(&mut amounts, 72065856); - - Vector::push_back
(&mut payees, @0x356253dddaf8e591b450e45842f065b9); - Vector::push_back(&mut amounts, 8369408123); - - Vector::push_back
(&mut payees, @0x8c780583bbdbcb799965f3eb066c6599); - Vector::push_back(&mut amounts, 2334264989); - - Vector::push_back
(&mut payees, @0xfc15d2ef11a36a46d8c752358abdc5e8); - Vector::push_back(&mut amounts, 320942156); - - Vector::push_back
(&mut payees, @0x745ed219affdabb64fbd933f95f13bb3); - Vector::push_back(&mut amounts, 2085058832); - - Vector::push_back
(&mut payees, @0x0335a07f574336f7fee792dbab5390f0); - Vector::push_back(&mut amounts, 2837594876); - - Vector::push_back
(&mut payees, @0x4c70f4abb5410dc91c08380a13102c8b); - Vector::push_back(&mut amounts, 636818268); - - Vector::push_back
(&mut payees, @0x1a88e2bf00882194ce06925770595156); - Vector::push_back(&mut amounts, 1304165927); - - Vector::push_back
(&mut payees, @0x0971a136e483f5d9a7d4dbf9b20792c8); - Vector::push_back(&mut amounts, 1175088336); - - Vector::push_back
(&mut payees, @0x3ebb82eff28b51ef1a7230d49ed2636e); - Vector::push_back(&mut amounts, 4650943795); - - Vector::push_back
(&mut payees, @0x609ecce530ea3f138b7ab9355133b003); - Vector::push_back(&mut amounts, 661375597); - - Vector::push_back
(&mut payees, @0x8c5381a2e4c6dbf06860c9e945446318); - Vector::push_back(&mut amounts, 1406810399); - - Vector::push_back
(&mut payees, @0x87e5a9f29f82fc56ef1bca0f7376bae3); - Vector::push_back(&mut amounts, 2280974209); - - Vector::push_back
(&mut payees, @0xc9f603b9a89feac61ce14d63c9889b3e); - Vector::push_back(&mut amounts, 3263111116); - - Vector::push_back
(&mut payees, @0x0305316734355823cf430cc9e4ebd6b1); - Vector::push_back(&mut amounts, 2791546483); - - Vector::push_back
(&mut payees, @0x381eb3cc143bb03a1344e0caea86389d); - Vector::push_back(&mut amounts, 861186987); - - Vector::push_back
(&mut payees, @0xf5ba04dd4f51668382a69af48971db35); - Vector::push_back(&mut amounts, 3746070009); - - Vector::push_back
(&mut payees, @0x37b712c4791592b667435dd76d51ff3f); - Vector::push_back(&mut amounts, 1489082985); - - Vector::push_back
(&mut payees, @0x76a5088ef45546b6cb50e4b6c1080d2c); - Vector::push_back(&mut amounts, 44442238); - - Vector::push_back
(&mut payees, @0xe4c2304f4304c54a4af8c42b4363decc); - Vector::push_back(&mut amounts, 1156672930); - - Vector::push_back
(&mut payees, @0x936815a4dbe47f45092590c596dbd0d1); - Vector::push_back(&mut amounts, 5775263409); - - Vector::push_back
(&mut payees, @0x496d983b8bc7ce68a837a015715b465e); - Vector::push_back(&mut amounts, 1147123296); - - Vector::push_back
(&mut payees, @0x1ee5432bd3c6374e33798c4c9edcd0cf); - Vector::push_back(&mut amounts, 1038481378); - - Vector::push_back
(&mut payees, @0x651d1e5c589c2731f19b0efe626f365c); - Vector::push_back(&mut amounts, 320493009); - - Vector::push_back
(&mut payees, @0x9d3db73983b9af098d7e45d6604e74da); - Vector::push_back(&mut amounts, 2850215872); - - Vector::push_back
(&mut payees, @0x3dd86c00c6a25cb669ae75339a6fe049); - Vector::push_back(&mut amounts, 2170893339); - - Vector::push_back
(&mut payees, @0xc55fd00fc859ba7bcc97622172d14122); - Vector::push_back(&mut amounts, 3497575253); - - Vector::push_back
(&mut payees, @0xc20b24247559ac4c89b0f2f7f4e56bad); - Vector::push_back(&mut amounts, 3137855523); - - Vector::push_back
(&mut payees, @0xfb15ffd78f064b2bdcd85027ee44ecd5); - Vector::push_back(&mut amounts, 2852176364); - - Vector::push_back
(&mut payees, @0x1a3f3a4be5b5cff0a1215f220056e4a9); - Vector::push_back(&mut amounts, 2584807216); - - Vector::push_back
(&mut payees, @0x9841bdfdd149fe1f239a380f5362ea77); - Vector::push_back(&mut amounts, 864914792); - - Vector::push_back
(&mut payees, @0x7d17191642de3886b926b46b7059af62); - Vector::push_back(&mut amounts, 1255698616); - - Vector::push_back
(&mut payees, @0x2586b278375bc9ca7b9ec9d5173a4215); - Vector::push_back(&mut amounts, 50786293); - - Vector::push_back
(&mut payees, @0xd103284d9ce3a9f45334da55a83c2f65); - Vector::push_back(&mut amounts, 398374748); - - Vector::push_back
(&mut payees, @0xba2604ca9f85a994786156a49485fec7); - Vector::push_back(&mut amounts, 1246483786); - - Vector::push_back
(&mut payees, @0x23bda1e1df1828f620351cec374e39b9); - Vector::push_back(&mut amounts, 1573200673); - - Vector::push_back
(&mut payees, @0xc43403bb1fc120a5c06adf4b134c016e); - Vector::push_back(&mut amounts, 3293806936); - - Vector::push_back
(&mut payees, @0xa53f2079388fdbac833b9888ea9c5147); - Vector::push_back(&mut amounts, 2400127882); - - Vector::push_back
(&mut payees, @0xde3c462f7a5e0b84bccd44189f0e9f4e); - Vector::push_back(&mut amounts, 104958339); - - Vector::push_back
(&mut payees, @0xbb102597338d8ecd1e8c5958eeeb9d80); - Vector::push_back(&mut amounts, 252470155); - - Vector::push_back
(&mut payees, @0xf8133e9d223b275a655dcd1f33935969); - Vector::push_back(&mut amounts, 141298165); - - Vector::push_back
(&mut payees, @0x1198cc0a920d3cf950de882a86055f99); - Vector::push_back(&mut amounts, 3091356070); - - Vector::push_back
(&mut payees, @0x79c98bf94a010c423769a7e8e6c5fca3); - Vector::push_back(&mut amounts, 1425026280); - - Vector::push_back
(&mut payees, @0x3580be96574497fcdfb8f5f37ebcea3a); - Vector::push_back(&mut amounts, 44014787); - - Vector::push_back
(&mut payees, @0x69b25c69a437549afc3f3141933db622); - Vector::push_back(&mut amounts, 27086023); - - Vector::push_back
(&mut payees, @0xcd78d4d4e8e6953e8ac09e16bed23884); - Vector::push_back(&mut amounts, 50786293); - - Vector::push_back
(&mut payees, @0x3e6bd0ccfa50ffc99844af6d3203c758); - Vector::push_back(&mut amounts, 27086023); - - Vector::push_back
(&mut payees, @0xd847876200e3d1e2af4210223478b1ba); - Vector::push_back(&mut amounts, 107109531); - - Vector::push_back
(&mut payees, @0xb005b9a80f38596e2d25e5fa383a13d9); - Vector::push_back(&mut amounts, 442714040); - - Vector::push_back
(&mut payees, @0xddfc4425e807e39b4a35c5712240622d); - Vector::push_back(&mut amounts, 2093055627); - - Vector::push_back
(&mut payees, @0xc7a07ec703ab189e4cad2bb98edd75e0); - Vector::push_back(&mut amounts, 6201117461); - - Vector::push_back
(&mut payees, @0xfff5ba0ef3aecf4ee08d43c64fe78cad); - Vector::push_back(&mut amounts, 458142821); - - Vector::push_back
(&mut payees, @0xc515dd5d6a89564e1dd12f3164c8e5f0); - Vector::push_back(&mut amounts, 768188523); - - Vector::push_back
(&mut payees, @0xe05f539c1ce78920916eb0f47efff3f8); - Vector::push_back(&mut amounts, 1167541927); - - Vector::push_back
(&mut payees, @0x85fb1068528090d91993e48ff536041e); - Vector::push_back(&mut amounts, 74585911); - - Vector::push_back
(&mut payees, @0xbdee80105673b0f60fa42b242ab83e80); - Vector::push_back(&mut amounts, 1358451328); - - Vector::push_back
(&mut payees, @0x69ae8f3ee6e00b95b2159cdaf1d77174); - Vector::push_back(&mut amounts, 2391821859); - - Vector::push_back
(&mut payees, @0x06afe592acc5bdb600c7a2da10ad32bf); - Vector::push_back(&mut amounts, 896264101); - - Vector::push_back
(&mut payees, @0xd0d78ba195d72cea5b2b47276e4ac3c4); - Vector::push_back(&mut amounts, 2087923731); - - Vector::push_back
(&mut payees, @0x2fdadcaf46532dfb8da1f6bb97a096c6); - Vector::push_back(&mut amounts, 1657251041); - - Vector::push_back
(&mut payees, @0x2862bbd41cacd57be59ae4a6e8538e2f); - Vector::push_back(&mut amounts, 1795705632); - - Vector::push_back
(&mut payees, @0xdefd1c2a93de6ea77f68629c9ae5edae); - Vector::push_back(&mut amounts, 3883577187); - - Vector::push_back
(&mut payees, @0x2d8a54adfe928343dd4b45b737331a2d); - Vector::push_back(&mut amounts, 304885770); - - Vector::push_back
(&mut payees, @0xf4535ec1bcf2bf32359d87be2e2692b3); - Vector::push_back(&mut amounts, 630693551); - - Vector::push_back
(&mut payees, @0x6944f2635a3e8b711828ecf0b00327f1); - Vector::push_back(&mut amounts, 1471640332); - - Vector::push_back
(&mut payees, @0x2bd8e0da4a77aebb45224de9262bcc8e); - Vector::push_back(&mut amounts, 2115883503); - - Vector::push_back
(&mut payees, @0x19b0abd3d2c954c07a391be6ed93d96e); - Vector::push_back(&mut amounts, 385785884); - - Vector::push_back
(&mut payees, @0x39c91a8b46f70723c4822784c7dc25b9); - Vector::push_back(&mut amounts, 1420705851); - - Vector::push_back
(&mut payees, @0x6c515401980356781f0dbcb143fc9678); - Vector::push_back(&mut amounts, 1070370943); - - Vector::push_back
(&mut payees, @0xdd81d333de6d2486bf22d4c045afbbf0); - Vector::push_back(&mut amounts, 2204628487); - - Vector::push_back
(&mut payees, @0xc9ea481973882b05990ba5ca131b9abf); - Vector::push_back(&mut amounts, 92202955); - - Vector::push_back
(&mut payees, @0xc06db6aff14277ffa00262b7c3d70300); - Vector::push_back(&mut amounts, 925611893); - - Vector::push_back
(&mut payees, @0xe1db17a42a142c693ba4c182a1524ae0); - Vector::push_back(&mut amounts, 1228722042); - - Vector::push_back
(&mut payees, @0x6a7872ee8e13916dc48273b110a09c6f); - Vector::push_back(&mut amounts, 114166528); - - Vector::push_back
(&mut payees, @0x670c87a649d065fd7e6dd6d55ece5bef); - Vector::push_back(&mut amounts, 872348807); - - Vector::push_back
(&mut payees, @0xa7c07a0d72c5237850d1c9270acc2b93); - Vector::push_back(&mut amounts, 318850177); - - Vector::push_back
(&mut payees, @0x467c1be36b3e8560b42e97e51bfd1ad2); - Vector::push_back(&mut amounts, 323822831); - - Vector::push_back
(&mut payees, @0x8b0f9aeb59e263168d2823262fb59ff9); - Vector::push_back(&mut amounts, 578184855); - - Vector::push_back
(&mut payees, @0x54e716e58162eec975dcb0a6dc9d0827); - Vector::push_back(&mut amounts, 5516456549); - - Vector::push_back
(&mut payees, @0x7dab3e6cee6b6ba33c3a13f70f7b6a6a); - Vector::push_back(&mut amounts, 1297514984); - - Vector::push_back
(&mut payees, @0x0696df4c183dc15bdf1d197f0d34130a); - Vector::push_back(&mut amounts, 803348090); - - Vector::push_back
(&mut payees, @0x0c40862363b87f4d62b36f49e007809a); - Vector::push_back(&mut amounts, 71882629); - - Vector::push_back
(&mut payees, @0x66146304f5d1fd84a92322c648769041); - Vector::push_back(&mut amounts, 282314299); - - Vector::push_back
(&mut payees, @0x5322609dde43e08ad6da6964574941fd); - Vector::push_back(&mut amounts, 742800168); - - Vector::push_back
(&mut payees, @0xd1281de242839fc939745996882c5fc2); - Vector::push_back(&mut amounts, 3143861183); - - Vector::push_back
(&mut payees, @0xe486fc16d1a4d308cebd4844d5610421); - Vector::push_back(&mut amounts, 468777252); - - Vector::push_back
(&mut payees, @0xf2e4e4bbfd6eaa2659cd2783483ee968); - Vector::push_back(&mut amounts, 2683412451); - - Vector::push_back
(&mut payees, @0x74c5ee8633848c45fec005daabc5dd69); - Vector::push_back(&mut amounts, 2841244785); - - Vector::push_back
(&mut payees, @0xa22ab6e8b3432c84c9583b4ce5f43ca4); - Vector::push_back(&mut amounts, 1936593424); - - Vector::push_back
(&mut payees, @0x4fdf365bd3758f65208392d4da9505a5); - Vector::push_back(&mut amounts, 375468347); - - Vector::push_back
(&mut payees, @0xf665db732c3c48b533df1c7907c3a235); - Vector::push_back(&mut amounts, 2544487334); - - Vector::push_back
(&mut payees, @0x443059c81a0c95795adc6028d5c8f4c2); - Vector::push_back(&mut amounts, 2664395856); - - Vector::push_back
(&mut payees, @0xa407e821f2cf7ef8172530334a8436df); - Vector::push_back(&mut amounts, 953970177); - - Vector::push_back
(&mut payees, @0x183bce2aa2d5f9bc4db2d22dc8e9848c); - Vector::push_back(&mut amounts, 2369022170); - - Vector::push_back
(&mut payees, @0xee3d5047ac1466cc5726b3eea3165d57); - Vector::push_back(&mut amounts, 2914344538); - - Vector::push_back
(&mut payees, @0x5a39ea5b1677a283c337bd72aef8037b); - Vector::push_back(&mut amounts, 1747933401); - - Vector::push_back
(&mut payees, @0xa5a5c040dc2cd58a9b106c4c1bf27311); - Vector::push_back(&mut amounts, 368403997); - - Vector::push_back
(&mut payees, @0x09c1759c8a95b93aafa0637f4666c3e6); - Vector::push_back(&mut amounts, 3518392176); - - Vector::push_back
(&mut payees, @0xfa4a9d8207cecc8058f219eeddc0b08b); - Vector::push_back(&mut amounts, 2588197081); - - Vector::push_back
(&mut payees, @0xbf9874aa2127732d09445159473aa885); - Vector::push_back(&mut amounts, 2108687268); - - Vector::push_back
(&mut payees, @0x8566dcda547dd9cdd7429dc3f6b5abba); - Vector::push_back(&mut amounts, 194346349); - - Vector::push_back
(&mut payees, @0x80e91030c286aecff5fe7b10d5cb823f); - Vector::push_back(&mut amounts, 49726535); - - Vector::push_back
(&mut payees, @0x0b65e6335d5d43ff49f3c07b67c4eb82); - Vector::push_back(&mut amounts, 1725023964); - - Vector::push_back
(&mut payees, @0x5fe62d5e83bdc8adb8431f8024ce47cf); - Vector::push_back(&mut amounts, 455912628); - - Vector::push_back
(&mut payees, @0xec319e54d882df127d469e471a890c5e); - Vector::push_back(&mut amounts, 651512387); - - Vector::push_back
(&mut payees, @0x7e86731d1fab8c00b4e483fc4abea0cd); - Vector::push_back(&mut amounts, 204641375); - - Vector::push_back
(&mut payees, @0xab9afcf95d49c9a0e5bcd8ed63f4e7e0); - Vector::push_back(&mut amounts, 1996173845); - - Vector::push_back
(&mut payees, @0x6bcf631a547f45f03a97cae784bdd7ad); - Vector::push_back(&mut amounts, 1957133911); - - Vector::push_back
(&mut payees, @0x7a90fb0f2fe2efc7e278559343c798fe); - Vector::push_back(&mut amounts, 638640470); - - Vector::push_back
(&mut payees, @0xde4067743e3df467a0c652e446ef667f); - Vector::push_back(&mut amounts, 139234299); - - Vector::push_back
(&mut payees, @0x6fe668b6e8563fd1898c41f8778618a6); - Vector::push_back(&mut amounts, 124316338); - - Vector::push_back
(&mut payees, @0xba94d3a4dc7e3239b5b216d552319312); - Vector::push_back(&mut amounts, 3047417714); - - Vector::push_back
(&mut payees, @0x39dd94372b6dd96e6a6e93f20ea0ca71); - Vector::push_back(&mut amounts, 4376595876); - - Vector::push_back
(&mut payees, @0x97b30b99bfeb8abb2b732fb6160bffa8); - Vector::push_back(&mut amounts, 5336630407); - - Vector::push_back
(&mut payees, @0xc28ebc733f8656871f37991f17202a08); - Vector::push_back(&mut amounts, 3429797950); - - Vector::push_back
(&mut payees, @0x3ab7ea7fe8924b6c7fcea1b6f32dc915); - Vector::push_back(&mut amounts, 4082225806); - - Vector::push_back
(&mut payees, @0x832604cc4c99a11e5d4b53f1ec5ab1b9); - Vector::push_back(&mut amounts, 884259426); - - Vector::push_back
(&mut payees, @0x7da0f75c03c29b87e5020726fa87799b); - Vector::push_back(&mut amounts, 1377842718); - - Vector::push_back
(&mut payees, @0xe2cbfef1291d2b4ba4bcd885aa5d0ea2); - Vector::push_back(&mut amounts, 1490091322); - - Vector::push_back
(&mut payees, @0x8c384a0e13ae0146b7523e0d3f61aade); - Vector::push_back(&mut amounts, 3261046862); - - Vector::push_back
(&mut payees, @0x18f68861b5135f9403697f38b071a224); - Vector::push_back(&mut amounts, 374591006); - - Vector::push_back
(&mut payees, @0x0be09c08e90ef1f16f47c260361c4083); - Vector::push_back(&mut amounts, 1835807923); - - Vector::push_back
(&mut payees, @0x3b0756f858acbac83e93ec547662f212); - Vector::push_back(&mut amounts, 2709812695); - - Vector::push_back
(&mut payees, @0x564efb7f46385bb208dcb1a1fa35af50); - Vector::push_back(&mut amounts, 2049360032); - - Vector::push_back
(&mut payees, @0xc6b2f8f04e93ed57d79bfe25ed5d4679); - Vector::push_back(&mut amounts, 375060327); - - Vector::push_back
(&mut payees, @0x3da8baa9781ac7c81141086328a18e6d); - Vector::push_back(&mut amounts, 2193088054); - - Vector::push_back
(&mut payees, @0x309dd5625ca4919040b19e855dcb1830); - Vector::push_back(&mut amounts, 322148673); - - Vector::push_back
(&mut payees, @0xd8c92ba28f2b666e65b6d84b49e0687c); - Vector::push_back(&mut amounts, 3017438030); - - Vector::push_back
(&mut payees, @0xa94b0d050931d3266958b01fdcdb9a5f); - Vector::push_back(&mut amounts, 2731117650); - - Vector::push_back
(&mut payees, @0xf7e52a701b995ed934f90aec5f0445b2); - Vector::push_back(&mut amounts, 116725529); - - Vector::push_back
(&mut payees, @0x8561ac55040290230eade692b27cebb6); - Vector::push_back(&mut amounts, 334683959); - - Vector::push_back
(&mut payees, @0x74ffec7f2075c9499ea8ece51e61a2fa); - Vector::push_back(&mut amounts, 2471118823); - - Vector::push_back
(&mut payees, @0xd48ab09f3b76199d08763ade68a20f2a); - Vector::push_back(&mut amounts, 1365631963); - - Vector::push_back
(&mut payees, @0xe367a0b3cf8b289021e971801595b8d0); - Vector::push_back(&mut amounts, 998459149); - - Vector::push_back
(&mut payees, @0x33ffe6dbba1ec1ea29441c04acabeeaa); - Vector::push_back(&mut amounts, 688248751); - - Vector::push_back
(&mut payees, @0x2942480bec5e3e7acfb23f3d8c556759); - Vector::push_back(&mut amounts, 1529846707); - - Vector::push_back
(&mut payees, @0x4f00d1aea3cb34dcc7712d8076f49c72); - Vector::push_back(&mut amounts, 526206338); - - Vector::push_back
(&mut payees, @0x8c75af87eef71efd3931a490128fbae8); - Vector::push_back(&mut amounts, 2360343146); - - Vector::push_back
(&mut payees, @0xe897ce8edecc42472de53ed91bc40d2d); - Vector::push_back(&mut amounts, 194801366); - - Vector::push_back
(&mut payees, @0x03ce125aa323e54d84c98f9267e19ba1); - Vector::push_back(&mut amounts, 194801366); - - Vector::push_back
(&mut payees, @0xba0a294a1f1783664870f59759b8196c); - Vector::push_back(&mut amounts, 826317254); - - Vector::push_back
(&mut payees, @0x5bc976e3de1e06981f1650f2e55b2fdc); - Vector::push_back(&mut amounts, 5507762688); - - Vector::push_back
(&mut payees, @0x3b46aae6af492da480b54f3291f1f615); - Vector::push_back(&mut amounts, 708855890); - - Vector::push_back
(&mut payees, @0x79d43b848bf53c5667320bfdc35b5e97); - Vector::push_back(&mut amounts, 106300509); - - Vector::push_back
(&mut payees, @0xb0d946069e0aa6a04b7f9ba1459f014a); - Vector::push_back(&mut amounts, 147087585); - - Vector::push_back
(&mut payees, @0x212d2a49cc77e85c6cf55cba69019330); - Vector::push_back(&mut amounts, 2948442749); - - Vector::push_back
(&mut payees, @0x21a6c8382e1aa25acceb73828b5aaeb7); - Vector::push_back(&mut amounts, 3141174271); - - Vector::push_back
(&mut payees, @0x18be19b27fd89449f7e2fa8ecc3e9072); - Vector::push_back(&mut amounts, 606664882); - - Vector::push_back
(&mut payees, @0xbc6f878c1ee0ca73c76983a2848c55ef); - Vector::push_back(&mut amounts, 2733451317); - - Vector::push_back
(&mut payees, @0x45a517866fea45155306ef9ca27c3d18); - Vector::push_back(&mut amounts, 2324958040); - - Vector::push_back
(&mut payees, @0x66a7a4d0a8436ec6c5c0028171ea36f8); - Vector::push_back(&mut amounts, 3385327895); - - Vector::push_back
(&mut payees, @0x6970ab659da3b07904faceefa990c3ee); - Vector::push_back(&mut amounts, 2299704276); - - Vector::push_back
(&mut payees, @0x1dc00ba10fe062f5eb942681dc51b8a4); - Vector::push_back(&mut amounts, 1199672033); - - Vector::push_back
(&mut payees, @0x624228cd0e7accb1c881d7f5c1de2f99); - Vector::push_back(&mut amounts, 166553605); - - Vector::push_back
(&mut payees, @0x3a44a04b10ecac2c153cdd4471f5ed84); - Vector::push_back(&mut amounts, 132094238); - - Vector::push_back
(&mut payees, @0x70e5e93a5dfa51a485061bb4d920345c); - Vector::push_back(&mut amounts, 953166083); - - Vector::push_back
(&mut payees, @0x87a3f098b430c9f7945b170c1329cd3a); - Vector::push_back(&mut amounts, 1198354036); - - Vector::push_back
(&mut payees, @0xaf0af133760e7004c9c6709f28e33123); - Vector::push_back(&mut amounts, 1403341696); - - Vector::push_back
(&mut payees, @0x838783b4c7eb4e5774581ccf17fb520f); - Vector::push_back(&mut amounts, 628952269); - - Vector::push_back
(&mut payees, @0x3bc8f03ab6281ad21ffb837d6a7087a5); - Vector::push_back(&mut amounts, 2378519182); - - Vector::push_back
(&mut payees, @0x420a7f71a4d32e12a4afcc78b2187932); - Vector::push_back(&mut amounts, 1839205303); - - Vector::push_back
(&mut payees, @0x7e92808e93a8712eb42169cce1d05165); - Vector::push_back(&mut amounts, 2066182681); - - Vector::push_back
(&mut payees, @0xf8486337d6daaee4f9447ab5bbbeeaa9); - Vector::push_back(&mut amounts, 453595145); - - Vector::push_back
(&mut payees, @0xb92065dee2fd3fc8aab0b09a02eccc0e); - Vector::push_back(&mut amounts, 425519212); - - Vector::push_back
(&mut payees, @0xa8083c27206027b91e44e87960cf29cd); - Vector::push_back(&mut amounts, 80405188); - - Vector::push_back
(&mut payees, @0x012338b54ba4625adcc313394d87819c); - Vector::push_back(&mut amounts, 1552066524); - - Vector::push_back
(&mut payees, @0x1b374b6a02c7756ecca208882ab595f6); - Vector::push_back(&mut amounts, 2173432837); - - Vector::push_back
(&mut payees, @0xfde0d9f17aac89025128bf93d63eb24e); - Vector::push_back(&mut amounts, 1594428929); - - Vector::push_back
(&mut payees, @0x190a4da3806aa068a2800b55202610b0); - Vector::push_back(&mut amounts, 569842298); - - Vector::push_back
(&mut payees, @0xbea003633af9b78435bc0b3fe126cc34); - Vector::push_back(&mut amounts, 200406190); - - Vector::push_back
(&mut payees, @0xd88b85766c5ae80b8df9142c4c60ec93); - Vector::push_back(&mut amounts, 44045984); - - Vector::push_back
(&mut payees, @0xdee8b784c09c92477d1ded97828f0a3a); - Vector::push_back(&mut amounts, 704425144); - - Vector::push_back
(&mut payees, @0xfb8911465fd98d696d071222e108b4ae); - Vector::push_back(&mut amounts, 293400794); - - Vector::push_back
(&mut payees, @0x6d9fa1f3ad5254a131f0979dbf3536bf); - Vector::push_back(&mut amounts, 1445397586); - - Vector::push_back
(&mut payees, @0x4fd92b5f6f162ae75e313c79b543569b); - Vector::push_back(&mut amounts, 2315024521); - - Vector::push_back
(&mut payees, @0x707f6a3ec98665e0fa1b8fa4fccfe43e); - Vector::push_back(&mut amounts, 874985369); - - Vector::push_back
(&mut payees, @0x8c199eb0864f1816c51efdfe4e0735a1); - Vector::push_back(&mut amounts, 677622668); - - Vector::push_back
(&mut payees, @0x007c78cbc00cb5072a18468f456cf37c); - Vector::push_back(&mut amounts, 226013317); - - Vector::push_back
(&mut payees, @0x64cc45cc5eb3a442a7e827aaf3be1bd2); - Vector::push_back(&mut amounts, 156619868); - - Vector::push_back
(&mut payees, @0xa5b889e73517feb6ad838b8f3dda3a53); - Vector::push_back(&mut amounts, 735083130); - - Vector::push_back
(&mut payees, @0xbb5df71f7b3f210fe65d1544011d8256); - Vector::push_back(&mut amounts, 789932303); - - Vector::push_back
(&mut payees, @0xc0a164a9b35e28fdeb8cf5716617aded); - Vector::push_back(&mut amounts, 735066789); - - Vector::push_back
(&mut payees, @0x8e5d31869951193c7eff55646b5e6275); - Vector::push_back(&mut amounts, 1254453160); - - Vector::push_back
(&mut payees, @0x5f5d7a667a32d2b222abec582b0a4b71); - Vector::push_back(&mut amounts, 769427815); - - Vector::push_back
(&mut payees, @0x26a02e71afa943b38feb4505e044d3db); - Vector::push_back(&mut amounts, 701112219); - - Vector::push_back
(&mut payees, @0x21b48df727add6d7eb6535a6a1d798ed); - Vector::push_back(&mut amounts, 458565489); - - Vector::push_back
(&mut payees, @0x5362e7dfa82f40e95979b1434839fb06); - Vector::push_back(&mut amounts, 135322310); - - Vector::push_back
(&mut payees, @0xc2f8d9e6f56c90c0d84add716bda419c); - Vector::push_back(&mut amounts, 185164216); - - Vector::push_back
(&mut payees, @0x94e394fc39c32e2fe3b860be1909adb3); - Vector::push_back(&mut amounts, 594001600); - - Vector::push_back
(&mut payees, @0x2ba33df6aff43bf1657ed6c62456d738); - Vector::push_back(&mut amounts, 1135336088); - - Vector::push_back
(&mut payees, @0xcf979e2f500957f6f65c44fc7c895fd3); - Vector::push_back(&mut amounts, 1139818421); - - Vector::push_back
(&mut payees, @0x6775f83c3221e1828664d9f9f72ec299); - Vector::push_back(&mut amounts, 915219094); - - Vector::push_back
(&mut payees, @0x3e9ba68d01ea00973de1e13786b15b8d); - Vector::push_back(&mut amounts, 1220946355); - - Vector::push_back
(&mut payees, @0x2f935200e3ae7af3cd26622914a3e6b8); - Vector::push_back(&mut amounts, 1329690197); - - Vector::push_back
(&mut payees, @0x19c63156ed98c4c2d811640ca26c7168); - Vector::push_back(&mut amounts, 1540915912); - - Vector::push_back
(&mut payees, @0xc989d6aff63238aff15d7e0f85fb649c); - Vector::push_back(&mut amounts, 66068976); - - Vector::push_back
(&mut payees, @0x7d235226b3be86534cc0dc22f07057b3); - Vector::push_back(&mut amounts, 110114960); - - Vector::push_back
(&mut payees, @0xbe0ed478a4c8b2a251c9e9b3a7f6cecd); - Vector::push_back(&mut amounts, 2184610744); - - Vector::push_back
(&mut payees, @0x0dc4c653af0cf3d0cf6a362875e08560); - Vector::push_back(&mut amounts, 824679029); - - Vector::push_back
(&mut payees, @0xcad8ecf44f7ab46269cbe65c380dcd7a); - Vector::push_back(&mut amounts, 115620708); - - Vector::push_back
(&mut payees, @0x1aecc6c0a4fcb6b60cbb0451cf7e9189); - Vector::push_back(&mut amounts, 745621082); - - Vector::push_back
(&mut payees, @0xa5b75480d3684aaf25eafcc27b4e14ac); - Vector::push_back(&mut amounts, 567599815); - - Vector::push_back
(&mut payees, @0x991cd317a3377fa503d015daabebb222); - Vector::push_back(&mut amounts, 177274243); - - Vector::push_back
(&mut payees, @0xbe2a79018cb8ba8cd00a76f57acfb8eb); - Vector::push_back(&mut amounts, 177274243); - - Vector::push_back
(&mut payees, @0x0965e50fc1a4595a1943d04c1cf80d1e); - Vector::push_back(&mut amounts, 119675588); - - Vector::push_back
(&mut payees, @0xa8a0f3d2a1300dd76ada5897690f2f44); - Vector::push_back(&mut amounts, 2721224108); - - Vector::push_back
(&mut payees, @0x15afa8ecd28e0aceb5aae4fcf2d875a5); - Vector::push_back(&mut amounts, 276005282); - - Vector::push_back
(&mut payees, @0x0cd95aaf74ad2d64863955e313d7e0b5); - Vector::push_back(&mut amounts, 315837281); - - Vector::push_back
(&mut payees, @0x36844de45800c6b74759641f8bdc5c06); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x5f83259b09309cc5fd8f1255ace9acb0); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x572180fc136c8d6894663bdaa8692b5e); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x78e0a5c5528cf0435b8da6a734f04740); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0xf77098d9ad27a2b1dd0e5af1fdd39686); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x60624e9f5540f8f3b87a17cadda97a60); - Vector::push_back(&mut amounts, 343815301); - - Vector::push_back
(&mut payees, @0x14e74a5ab5d18d754645bcccffa1549e); - Vector::push_back(&mut amounts, 343815301); - - Vector::push_back
(&mut payees, @0x31f9fa057cfdbc9c74ff5148215b8ee8); - Vector::push_back(&mut amounts, 245727445); - - Vector::push_back
(&mut payees, @0xe593f97c954e3b171dfe806047525212); - Vector::push_back(&mut amounts, 256448767); - - Vector::push_back
(&mut payees, @0x7633613f7dbcb48cd059a28d1d204bed); - Vector::push_back(&mut amounts, 311361161); - - Vector::push_back
(&mut payees, @0xa2cf4447a0366e3e759941372bd58254); - Vector::push_back(&mut amounts, 251088106); - - Vector::push_back
(&mut payees, @0xc28e0d23f558443f857639ab5f0400d3); - Vector::push_back(&mut amounts, 343960388); - - Vector::push_back
(&mut payees, @0x412cb2c20862cf52ca6f0ec10c41fb46); - Vector::push_back(&mut amounts, 251088106); - - Vector::push_back
(&mut payees, @0xe001da67b36ed1f0bb9fb9136d4d3d27); - Vector::push_back(&mut amounts, 316721822); - - Vector::push_back
(&mut payees, @0x063e3e8591d629e5ec3b0c8ee38b18ee); - Vector::push_back(&mut amounts, 311216074); - - Vector::push_back
(&mut payees, @0xd93363d4327c6a5e31460e7e08f28b30); - Vector::push_back(&mut amounts, 115620708); - - Vector::push_back
(&mut payees, @0xf7628effd01ed47257bc2ae511156376); - Vector::push_back(&mut amounts, 110114960); - - Vector::push_back
(&mut payees, @0x6530d26b82e956e2223592f8fcab6773); - Vector::push_back(&mut amounts, 137643701); - - Vector::push_back
(&mut payees, @0x1477143c64fcacfe202b3ce54ce3d1f0); - Vector::push_back(&mut amounts, 126632205); - - Vector::push_back
(&mut payees, @0x79140ee9da907d996970512083f7b754); - Vector::push_back(&mut amounts, 126632205); - - Vector::push_back
(&mut payees, @0x81508f1da5725acb6a9543b079fdff22); - Vector::push_back(&mut amounts, 137643701); - - Vector::push_back
(&mut payees, @0xe3b25060c607f3860cfc5f9f439ddbab); - Vector::push_back(&mut amounts, 137643701); - - Vector::push_back
(&mut payees, @0xac8c15091ef74c88b21f1ed100b0c41e); - Vector::push_back(&mut amounts, 126632205); - - Vector::push_back
(&mut payees, @0xb1d65558c142476aa662ded0e558dd28); - Vector::push_back(&mut amounts, 82586220); - - Vector::push_back
(&mut payees, @0x2f708bb40e873b800a8baa37fbd9dec3); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x5dbdce4469734d7e4c493f82c697b65e); - Vector::push_back(&mut amounts, 82586220); - - Vector::push_back
(&mut payees, @0x398aca6d1776d9198aacb58a3e54739b); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0xa916bd714d340580454f1402f6331998); - Vector::push_back(&mut amounts, 99103464); - - Vector::push_back
(&mut payees, @0x85739d6e8311282c1311066d0ddedb49); - Vector::push_back(&mut amounts, 82586220); - - Vector::push_back
(&mut payees, @0x5561386d49c0fb0cc02677f7eef9e5d0); - Vector::push_back(&mut amounts, 581678628); - - Vector::push_back
(&mut payees, @0xe1c6a5305b14303f6e0ec944abde98e1); - Vector::push_back(&mut amounts, 1135203811); - - Vector::push_back
(&mut payees, @0x26409326e1c1dc3e9ea7e05830011732); - Vector::push_back(&mut amounts, 1438529543); - - Vector::push_back
(&mut payees, @0xb4e86dc0bf0826d5e1688c4f33bddbe8); - Vector::push_back(&mut amounts, 3976697920); - - Vector::push_back
(&mut payees, @0x2d22e43c133e7c7bb591b8969eac9773); - Vector::push_back(&mut amounts, 853728767); - - Vector::push_back
(&mut payees, @0x710fadc7f76f5d8b03a13a0652d32067); - Vector::push_back(&mut amounts, 1303592572); - - Vector::push_back
(&mut payees, @0x955b4bc0d3d9bb0c828ed5159153a2d5); - Vector::push_back(&mut amounts, 771932809); - - Vector::push_back
(&mut payees, @0xb893c75d9bd71fa4c3d8db80733982f7); - Vector::push_back(&mut amounts, 2155567005); - - Vector::push_back
(&mut payees, @0x2993bb2aba2df994dfeae947dcbb093c); - Vector::push_back(&mut amounts, 618467716); - - Vector::push_back
(&mut payees, @0x75f96fdf941c32b0885df7cf4045694d); - Vector::push_back(&mut amounts, 2015627604); - - Vector::push_back
(&mut payees, @0x745c23c306e8389bc5b9903b57534c62); - Vector::push_back(&mut amounts, 2336362544); - - Vector::push_back
(&mut payees, @0xa6e49b895161b694055c4f606a7b76ef); - Vector::push_back(&mut amounts, 1200100231); - - Vector::push_back
(&mut payees, @0xf93810ede1d786ae616045980cb3593c); - Vector::push_back(&mut amounts, 222842116); - - Vector::push_back
(&mut payees, @0x836f25d105ac03cd45344ce4fa08c506); - Vector::push_back(&mut amounts, 779313347); - - Vector::push_back
(&mut payees, @0x8a123eff5292e53a48307d6d9b61598a); - Vector::push_back(&mut amounts, 42885289); - - Vector::push_back
(&mut payees, @0x519b2f57991329298ce3747ca5fff38b); - Vector::push_back(&mut amounts, 1997820781); - - Vector::push_back
(&mut payees, @0xaa78c3bc1b11b4e594e60c8a79211b6c); - Vector::push_back(&mut amounts, 714165614); - - Vector::push_back
(&mut payees, @0x723d686c39f140725029998909d28a87); - Vector::push_back(&mut amounts, 3318418771); - - Vector::push_back
(&mut payees, @0x46eab336f65114d9eef10c6df0bf1580); - Vector::push_back(&mut amounts, 3692478223); - - Vector::push_back
(&mut payees, @0xbade1d1dbd56280fd7e6e3497e99bd81); - Vector::push_back(&mut amounts, 2376989374); - - Vector::push_back
(&mut payees, @0xa8eec46c77c57afa2e15de7ca24b684b); - Vector::push_back(&mut amounts, 165587499); - - Vector::push_back
(&mut payees, @0x58275e8a2f12ed4f7a97780b73a0e1c5); - Vector::push_back(&mut amounts, 1290297642); - - Vector::push_back
(&mut payees, @0x649ab0c973c91499d6d9af73e9dc7717); - Vector::push_back(&mut amounts, 1322282726); - - Vector::push_back
(&mut payees, @0x2784171e14d5862750e0e32c2164d23e); - Vector::push_back(&mut amounts, 1480744339); - - Vector::push_back
(&mut payees, @0xe7ad4b7bb92f5298f89d7326717250ea); - Vector::push_back(&mut amounts, 345884684); - - Vector::push_back
(&mut payees, @0x831c7329a926754730580c665e7825df); - Vector::push_back(&mut amounts, 977938226); - - Vector::push_back
(&mut payees, @0x48ad6e428e2029946fc71a23a5180b42); - Vector::push_back(&mut amounts, 361797575); - - Vector::push_back
(&mut payees, @0xdb3729f10e7da352755b48ae26bd2a7c); - Vector::push_back(&mut amounts, 53606611); - - Vector::push_back
(&mut payees, @0xd62bee0189da956e197008a20a7b446c); - Vector::push_back(&mut amounts, 96978651); - - Vector::push_back
(&mut payees, @0x8c8d5795fee9e58d73da6c5b546b0ffa); - Vector::push_back(&mut amounts, 875215510); - - Vector::push_back
(&mut payees, @0x50eb8c8512279f645ef6fb16ba30a4f0); - Vector::push_back(&mut amounts, 483158182); - - Vector::push_back
(&mut payees, @0xc0511e6352cb85e58ce7452906cbc668); - Vector::push_back(&mut amounts, 237768941); - - Vector::push_back
(&mut payees, @0x4c5320d476cecebd453f8385c3333b97); - Vector::push_back(&mut amounts, 490344940); - - Vector::push_back
(&mut payees, @0x83f52e3a0b3e4cc7086a3b00c26df82f); - Vector::push_back(&mut amounts, 970267611); - - Vector::push_back
(&mut payees, @0xec658df70a5c05bf814bf26556048e31); - Vector::push_back(&mut amounts, 1536812874); - - Vector::push_back
(&mut payees, @0xb4f885cff35a888d321e5c60881d6092); - Vector::push_back(&mut amounts, 1932513481); - - Vector::push_back
(&mut payees, @0xd64cd8d9b7c7a0e9ee65a4bb6ed61208); - Vector::push_back(&mut amounts, 1704068819); - - Vector::push_back
(&mut payees, @0x1da515dbfc4fc04da1af3926530c1c7d); - Vector::push_back(&mut amounts, 357043838); - - Vector::push_back
(&mut payees, @0x78aa01e6f203faa97977ea2054c8488c); - Vector::push_back(&mut amounts, 2125221328); - - Vector::push_back
(&mut payees, @0x80283ec400d6d4aa9f5fc9c51f993093); - Vector::push_back(&mut amounts, 2080869919); - - Vector::push_back
(&mut payees, @0x27da50221a08d567719c8bb9e412f124); - Vector::push_back(&mut amounts, 943693646); - - Vector::push_back
(&mut payees, @0x6a5422ccbb07f7e967a452e7d9e8cc5d); - Vector::push_back(&mut amounts, 283080277); - - Vector::push_back
(&mut payees, @0xfe8d9265c0b49dd6c613fa06630a66b7); - Vector::push_back(&mut amounts, 90241399); - - Vector::push_back
(&mut payees, @0xba43db6e18804e26c835371d55fce7a6); - Vector::push_back(&mut amounts, 48245950); - - Vector::push_back
(&mut payees, @0xc0e3de592e1a61500b167578a8438d27); - Vector::push_back(&mut amounts, 58967272); - - Vector::push_back
(&mut payees, @0x538b13be8a2775cef9366245c2cc47af); - Vector::push_back(&mut amounts, 53606611); - - Vector::push_back
(&mut payees, @0xacc1e92a7b9039884e8987aef7bb7e31); - Vector::push_back(&mut amounts, 91131239); - - Vector::push_back
(&mut payees, @0xa2d42a5997f3b24780519f7c28ac95ac); - Vector::push_back(&mut amounts, 503122161); - - Vector::push_back
(&mut payees, @0x2642852d93480f477c437eee0f50f7a2); - Vector::push_back(&mut amounts, 154722394); - - Vector::push_back
(&mut payees, @0xdbd26955f8261dc3cfc03b30d2bf307e); - Vector::push_back(&mut amounts, 952681053); - - Vector::push_back
(&mut payees, @0xd775495887169e998c3e33ca5c7e684c); - Vector::push_back(&mut amounts, 48245950); - - Vector::push_back
(&mut payees, @0x5f93da3538ea70372f9daaa867708408); - Vector::push_back(&mut amounts, 1934797130); - - Vector::push_back
(&mut payees, @0x83a1bc40a9cede48422ae0572f634981); - Vector::push_back(&mut amounts, 2024422103); - - Vector::push_back
(&mut payees, @0x19ea51bfcc62d946adf8ef78b40a4c47); - Vector::push_back(&mut amounts, 755025253); - - Vector::push_back
(&mut payees, @0x6118b429b463553991671852c65512be); - Vector::push_back(&mut amounts, 1911931870); - - Vector::push_back
(&mut payees, @0xdb1c9d02beea49f1738a04fa40671050); - Vector::push_back(&mut amounts, 1765438399); - - Vector::push_back
(&mut payees, @0x956c5f53631d26def8b906adcd993abe); - Vector::push_back(&mut amounts, 1586452032); - - Vector::push_back
(&mut payees, @0x2e8da900c9367947037d749ca9617b42); - Vector::push_back(&mut amounts, 1829481458); - - Vector::push_back
(&mut payees, @0xf5db9b8eabb03a649b24acca54715485); - Vector::push_back(&mut amounts, 1635516975); - - Vector::push_back
(&mut payees, @0x0709c82fd51c53c3c61d4608c39cd7e6); - Vector::push_back(&mut amounts, 1706413209); - - Vector::push_back
(&mut payees, @0xff0eff19212725acf514405f85a0f18c); - Vector::push_back(&mut amounts, 1593507914); - - Vector::push_back
(&mut payees, @0xbeb649e0e66aeb73525ec8e9f096e380); - Vector::push_back(&mut amounts, 1746822473); - - Vector::push_back
(&mut payees, @0x2eec9d2d76b1fe2f2303fadd2547fdda); - Vector::push_back(&mut amounts, 1704129737); - - Vector::push_back
(&mut payees, @0x5677d9940f731b76cfdeb0e9b5ec1c8f); - Vector::push_back(&mut amounts, 1558614488); - - Vector::push_back
(&mut payees, @0x7ca0528017da53eb1b4805c89cbe23ad); - Vector::push_back(&mut amounts, 1584123934); - - Vector::push_back
(&mut payees, @0xbf000ae19aca68a99a0df18023bdfd22); - Vector::push_back(&mut amounts, 495459530); - - Vector::push_back
(&mut payees, @0xd7ee8ab8ab084aa216b2ebf68f6d4dda); - Vector::push_back(&mut amounts, 1329921396); - - Vector::push_back
(&mut payees, @0x07bdb49e5d74ff6572df53fab90c3ff9); - Vector::push_back(&mut amounts, 1688139418); - - Vector::push_back
(&mut payees, @0xe4ac4864b0010b1487bed46bebd50bda); - Vector::push_back(&mut amounts, 625909478); - - Vector::push_back
(&mut payees, @0x54613a145a86ce469cb7b378b872ece9); - Vector::push_back(&mut amounts, 2627325038); - - Vector::push_back
(&mut payees, @0x3bc00dd091f45914b2443f16e05f9cdc); - Vector::push_back(&mut amounts, 573711411); - - Vector::push_back
(&mut payees, @0xf64a082292a3f8550a2af2af9ee85024); - Vector::push_back(&mut amounts, 751023404); - - Vector::push_back
(&mut payees, @0xec9c969fed0a6db49335b1dd12bf5888); - Vector::push_back(&mut amounts, 867098173); - - Vector::push_back
(&mut payees, @0x8480b037ad6a589323e5eaebccdb59a6); - Vector::push_back(&mut amounts, 1859487682); - - Vector::push_back
(&mut payees, @0x95f0842cb15e6295cd98cf5e00afc52f); - Vector::push_back(&mut amounts, 656306884); - - Vector::push_back
(&mut payees, @0x716085770aed571d00191494e932cac5); - Vector::push_back(&mut amounts, 914582202); - - Vector::push_back
(&mut payees, @0x2000075f5ed34e0eb33894c670159f51); - Vector::push_back(&mut amounts, 191346035); - - Vector::push_back
(&mut payees, @0x3ab513ce463edc6a1bf56a562b86de60); - Vector::push_back(&mut amounts, 1912695164); - - Vector::push_back
(&mut payees, @0x17550894edcfcbae27d75baa740953e3); - Vector::push_back(&mut amounts, 1702915061); - - Vector::push_back
(&mut payees, @0xe39de4e9449160791bf607ee8146efa0); - Vector::push_back(&mut amounts, 231473199); - - Vector::push_back
(&mut payees, @0x6b8856cd55814941ac486cd0f296ceb6); - Vector::push_back(&mut amounts, 788640638); - - Vector::push_back
(&mut payees, @0x030ff379751eb2ae44f39024cdb3b3f6); - Vector::push_back(&mut amounts, 147929537); - - Vector::push_back
(&mut payees, @0x2fea4857cc15a9f0c7d93dbf2f1ec059); - Vector::push_back(&mut amounts, 2642609444); - - Vector::push_back
(&mut payees, @0x535495dcf82a8b82747ecaeec8e1358d); - Vector::push_back(&mut amounts, 320672718); - - Vector::push_back
(&mut payees, @0x54d5d5dd28c358060e7600191ec8f515); - Vector::push_back(&mut amounts, 164831138); - - Vector::push_back
(&mut payees, @0xda966e67f444ad8ab33a5deb6a944f5d); - Vector::push_back(&mut amounts, 513494639); - - Vector::push_back
(&mut payees, @0x5a9457ab699ff3fc93ba872dd3364fbd); - Vector::push_back(&mut amounts, 287767432); - - Vector::push_back
(&mut payees, @0x434f84cb777c9d1a5e6bba62cfec9582); - Vector::push_back(&mut amounts, 110238054); - - Vector::push_back
(&mut payees, @0x7a3126cb658f1edbbc80118d2fd5e64e); - Vector::push_back(&mut amounts, 1489959229); - - Vector::push_back
(&mut payees, @0xc300c43254c50f0a32e2979091be1a6f); - Vector::push_back(&mut amounts, 1056640618); - - Vector::push_back
(&mut payees, @0xac05b9222b0de585fcf26368e3885b0a); - Vector::push_back(&mut amounts, 1500267493); - - Vector::push_back
(&mut payees, @0x6f4328ef1f4bb770cdfa38069f47b44e); - Vector::push_back(&mut amounts, 41995449); - - Vector::push_back
(&mut payees, @0x8f4b25b5a78bc35ccbca053cbbb84181); - Vector::push_back(&mut amounts, 1025265870); - - Vector::push_back
(&mut payees, @0x28ebd03c039943b2051beffd0a7b2e99); - Vector::push_back(&mut amounts, 264505550); - - Vector::push_back
(&mut payees, @0x8af37485acffe60786e689fb71ab80a7); - Vector::push_back(&mut amounts, 3008128532); - - Vector::push_back
(&mut payees, @0x3cab9d404eea12cd123affc451fd053c); - Vector::push_back(&mut amounts, 1668540362); - - Vector::push_back
(&mut payees, @0x85998e81c8f5aadd3104b4997449948c); - Vector::push_back(&mut amounts, 1665462216); - - Vector::push_back
(&mut payees, @0x06432c22c1c8ad9c5b1062dbe4a2fb5c); - Vector::push_back(&mut amounts, 849269543); - - Vector::push_back
(&mut payees, @0x5d34710942722a0435f4385bf56dff4f); - Vector::push_back(&mut amounts, 1277503669); - - Vector::push_back
(&mut payees, @0x051617d6d35bcc844efde8ae75ccb39a); - Vector::push_back(&mut amounts, 1023200932); - - Vector::push_back
(&mut payees, @0x46d29312267e26f421d4d2e0fe51a424); - Vector::push_back(&mut amounts, 1423521729); - - Vector::push_back
(&mut payees, @0x19e647dff35e75aff667dd586b3376f0); - Vector::push_back(&mut amounts, 47244880); - - Vector::push_back
(&mut payees, @0x0d3abf0a018d5e68cb0985a48e84c0bd); - Vector::push_back(&mut amounts, 473315970); - - Vector::push_back
(&mut payees, @0x728aeaaa2f6450f9d9b8d0264765bb41); - Vector::push_back(&mut amounts, 2066156630); - - Vector::push_back
(&mut payees, @0xaae11ab13e30621769686ab9dccb20f7); - Vector::push_back(&mut amounts, 346668369); - - Vector::push_back
(&mut payees, @0xd83a2272671364eb1a64bfca1877120b); - Vector::push_back(&mut amounts, 166038634); - - Vector::push_back
(&mut payees, @0xcb8e458af457b658af11ac39daa5504f); - Vector::push_back(&mut amounts, 272349765); - - Vector::push_back
(&mut payees, @0x67daf9339d4af96868702cc5005c1fef); - Vector::push_back(&mut amounts, 191955163); - - Vector::push_back
(&mut payees, @0x75b4caed3ab3520a04359349a653642f); - Vector::push_back(&mut amounts, 99739192); - - Vector::push_back
(&mut payees, @0xb580cdc740297610a16d0614b151ab3c); - Vector::push_back(&mut amounts, 774913811); - - Vector::push_back
(&mut payees, @0xf2a447b06d46e956c36f5898520b5080); - Vector::push_back(&mut amounts, 1159851156); - - Vector::push_back
(&mut payees, @0xdcd9b6cd17645561d0d5187bac6907ca); - Vector::push_back(&mut amounts, 1819879739); - - Vector::push_back
(&mut payees, @0x9cde64546440800c8eee94cde1f77e91); - Vector::push_back(&mut amounts, 975516088); - - Vector::push_back
(&mut payees, @0xe7c33ccf4ffa35bdd5e99daf38d79d08); - Vector::push_back(&mut amounts, 54147446); - - Vector::push_back
(&mut payees, @0x6f77f46e3c36e688865cdf5944801179); - Vector::push_back(&mut amounts, 214578232); - - Vector::push_back
(&mut payees, @0x8cf072085457f10f046935312bb7c976); - Vector::push_back(&mut amounts, 681045535); - - Vector::push_back
(&mut payees, @0xe057f02fbb1ba40ac6b04d65ca528765); - Vector::push_back(&mut amounts, 1287682282); - - Vector::push_back
(&mut payees, @0x8cbe324c7c2789e597dc1187633c3416); - Vector::push_back(&mut amounts, 1235407543); - - Vector::push_back
(&mut payees, @0xc45ab39876cbe1abdf79f68381224c7d); - Vector::push_back(&mut amounts, 508281871); - - Vector::push_back
(&mut payees, @0xa5140b763cb22aa488898dbea4b223fe); - Vector::push_back(&mut amounts, 2480089112); - - Vector::push_back
(&mut payees, @0x399b11e89d48b1befdb0e21bf0ed941e); - Vector::push_back(&mut amounts, 761417976); - - Vector::push_back
(&mut payees, @0xd628ec522f2a6c1f03ef5ebfdd572117); - Vector::push_back(&mut amounts, 208660612); - - Vector::push_back
(&mut payees, @0xc49137de0b4edaf38a0080d61c958f29); - Vector::push_back(&mut amounts, 235818029); - - Vector::push_back
(&mut payees, @0x0721c94cd361ed5adf494112b829f8d6); - Vector::push_back(&mut amounts, 348351118); - - Vector::push_back
(&mut payees, @0x4de146cb54b98d98524f16f74b8f3839); - Vector::push_back(&mut amounts, 518676129); - - Vector::push_back
(&mut payees, @0x532e99cc0607c6af3782a63a123ea838); - Vector::push_back(&mut amounts, 247852854); - - Vector::push_back
(&mut payees, @0xf6415fd06977f07a3b9b83e87ce955b2); - Vector::push_back(&mut amounts, 2076654046); - - Vector::push_back
(&mut payees, @0xde29e94fa347311a6f4934166154b96d); - Vector::push_back(&mut amounts, 1081551943); - - Vector::push_back
(&mut payees, @0xfd73bdd87e2e6a402c83f2a995129509); - Vector::push_back(&mut amounts, 730372509); - - Vector::push_back
(&mut payees, @0x8ba989a1682b6ce65f735fd38622d307); - Vector::push_back(&mut amounts, 1093684233); - - Vector::push_back
(&mut payees, @0x290c3ec6f47e4c5777aa9e11ecfb430a); - Vector::push_back(&mut amounts, 1119523009); - - Vector::push_back
(&mut payees, @0x453a846b8d60714c658da8f9a7f7d7ea); - Vector::push_back(&mut amounts, 1336698691); - - Vector::push_back
(&mut payees, @0xa30b8cafcd41e4d2a971866f27b8342a); - Vector::push_back(&mut amounts, 1337536757); - - Vector::push_back
(&mut payees, @0xa0d6eab8e5732282566e799d65dd3fbe); - Vector::push_back(&mut amounts, 948947206); - - Vector::push_back
(&mut payees, @0xa68c92651fda52506a2edb9ee88cf785); - Vector::push_back(&mut amounts, 43317956); - - Vector::push_back
(&mut payees, @0xdc5ccdbff611d7b4604907298ac19f36); - Vector::push_back(&mut amounts, 1555978237); - - Vector::push_back
(&mut payees, @0xf540a42f8cefe9ada28ebdbff7e56766); - Vector::push_back(&mut amounts, 742696113); - - Vector::push_back
(&mut payees, @0xf01c1dcf1c2cbed2dbe743e371c488b0); - Vector::push_back(&mut amounts, 948093310); - - Vector::push_back
(&mut payees, @0xc058820ea38dfb802e4f07d87044050c); - Vector::push_back(&mut amounts, 1365011876); - - Vector::push_back
(&mut payees, @0x9b572b1a420fa30ab57913e1af63ba95); - Vector::push_back(&mut amounts, 1207363559); - - Vector::push_back
(&mut payees, @0xb1100c048fd0d300e8682cab7659bff4); - Vector::push_back(&mut amounts, 1126405419); - - Vector::push_back
(&mut payees, @0xfd36e77bd7a945fe7e105c2c2ed58806); - Vector::push_back(&mut amounts, 240152366); - - Vector::push_back
(&mut payees, @0x787c725c8812f38f406b7ee9e5b855c2); - Vector::push_back(&mut amounts, 760596555); - - Vector::push_back
(&mut payees, @0x7f12ddb267e84a3cca69ea85c82603cf); - Vector::push_back(&mut amounts, 611695189); - - Vector::push_back
(&mut payees, @0x1ae86b633961b008b6cb3bd8c6791a4c); - Vector::push_back(&mut amounts, 2480071524); - - Vector::push_back
(&mut payees, @0x886403cfd4c591583a0b4e2522880444); - Vector::push_back(&mut amounts, 414872997); - - Vector::push_back
(&mut payees, @0xb860cb66c2a1e1489f2ba4bd48ede333); - Vector::push_back(&mut amounts, 1047346857); - - Vector::push_back
(&mut payees, @0xf08ce5c69f4db0e4f17489c7050a1a5c); - Vector::push_back(&mut amounts, 605098273); - - Vector::push_back
(&mut payees, @0x3eb544fccdf90e7ce227dae23acda703); - Vector::push_back(&mut amounts, 780627174); - - Vector::push_back
(&mut payees, @0xad4fd0fb234a90475701840300809cb9); - Vector::push_back(&mut amounts, 684452885); - - Vector::push_back
(&mut payees, @0x18c19018f3f1f1df1e1d1422927cdaa4); - Vector::push_back(&mut amounts, 168945826); - - Vector::push_back
(&mut payees, @0x4b6e51650b6f4d442abd2add499dda54); - Vector::push_back(&mut amounts, 113709636); - - Vector::push_back
(&mut payees, @0x7ec6f4d40a4e14ab983bc80888ca6275); - Vector::push_back(&mut amounts, 212464069); - - Vector::push_back
(&mut payees, @0x80f46c1062e5b6bc192981da00987d7c); - Vector::push_back(&mut amounts, 425451615); - - Vector::push_back
(&mut payees, @0x8db7ecf1e459f8664d38d4628cbf8917); - Vector::push_back(&mut amounts, 1229114849); - - Vector::push_back
(&mut payees, @0x1fc759bceb1584bcd9c397e6e26fbbe2); - Vector::push_back(&mut amounts, 1003489895); - - Vector::push_back
(&mut payees, @0xaa7b724a51a8bd8e55208fef969209b3); - Vector::push_back(&mut amounts, 1105859302); - - Vector::push_back
(&mut payees, @0x7091d550b8a20a2e74d4a3b6125c66a9); - Vector::push_back(&mut amounts, 1131717013); - - Vector::push_back
(&mut payees, @0x9966b3e24a6aebc0233d9888d07f40aa); - Vector::push_back(&mut amounts, 2104364121); - - Vector::push_back
(&mut payees, @0xd948a4d5eb9b1ef59c0b3c6422fab977); - Vector::push_back(&mut amounts, 1644257794); - - Vector::push_back
(&mut payees, @0xbfcec8ce6325bbf2a101a426fca68dab); - Vector::push_back(&mut amounts, 906818187); - - Vector::push_back
(&mut payees, @0x0e22b7e222c97cb3e1b91399ab12132a); - Vector::push_back(&mut amounts, 2335756540); - - Vector::push_back
(&mut payees, @0x43154bd76f5fc25d24d5e65de4c22792); - Vector::push_back(&mut amounts, 4252930119); - - Vector::push_back
(&mut payees, @0x66ab79de2b4b09ecf9db143cf1e4ac33); - Vector::push_back(&mut amounts, 238156240); - - Vector::push_back
(&mut payees, @0xa52ae72d3c444fd3691bc8bd25e38b97); - Vector::push_back(&mut amounts, 55758733); - - Vector::push_back
(&mut payees, @0xb7521a5178eafcca928164a895f8d09d); - Vector::push_back(&mut amounts, 401841491); - - Vector::push_back
(&mut payees, @0x93f44067d8fca01a2fd7c6ec3e40e0a4); - Vector::push_back(&mut amounts, 72486353); - - Vector::push_back
(&mut payees, @0x97d94167eb035720531530314ebe107b); - Vector::push_back(&mut amounts, 405815471); - - Vector::push_back
(&mut payees, @0x631fb10a92479db4736eaaf01918c2da); - Vector::push_back(&mut amounts, 523587685); - - Vector::push_back
(&mut payees, @0x09a638835af960e5ddeed681b7d33ea1); - Vector::push_back(&mut amounts, 2658566872); - - Vector::push_back
(&mut payees, @0xada1ef616c0ea3b5860bf9c6c5e444c5); - Vector::push_back(&mut amounts, 1131888705); - - Vector::push_back
(&mut payees, @0x7677bc51b9a1691366067575ef721db3); - Vector::push_back(&mut amounts, 735038628); - - Vector::push_back
(&mut payees, @0xdb26aa9bd043fe9ac1e10c3520af0aaf); - Vector::push_back(&mut amounts, 1130301136); - - Vector::push_back
(&mut payees, @0xb83856d2e52bc3604799327264f4f66c); - Vector::push_back(&mut amounts, 751074110); - - Vector::push_back
(&mut payees, @0x95a0af6f256494f29ea278daec0307ad); - Vector::push_back(&mut amounts, 509308498); - - Vector::push_back
(&mut payees, @0x2866b28dbdef5c67704b2e8698304d95); - Vector::push_back(&mut amounts, 1242806309); - - Vector::push_back
(&mut payees, @0xd5cad17350a4a651385aa9eebcb47fea); - Vector::push_back(&mut amounts, 2579826445); - - Vector::push_back
(&mut payees, @0x88ef844f6a1c76c58bd28d83d2fafcc8); - Vector::push_back(&mut amounts, 1156501896); - - Vector::push_back
(&mut payees, @0x655d5c25d1dad48e4c2399c05e97fe0a); - Vector::push_back(&mut amounts, 370175412); - - Vector::push_back
(&mut payees, @0x3ef2f086541562131bfdaf2d28e081ff); - Vector::push_back(&mut amounts, 438655879); - - Vector::push_back
(&mut payees, @0xac9f9957d4fb9abc9e1deb1866f77e3b); - Vector::push_back(&mut amounts, 771194263); - - Vector::push_back
(&mut payees, @0x8b37e5bc5fa8b7f5e81a32077402ce2d); - Vector::push_back(&mut amounts, 340720972); - - Vector::push_back
(&mut payees, @0x79cbf36a9c5bf9b25db6d3c5a6561df9); - Vector::push_back(&mut amounts, 854591781); - - Vector::push_back
(&mut payees, @0x3712bfc5dfabdf476e7e588509dcc0f6); - Vector::push_back(&mut amounts, 464839048); - - Vector::push_back
(&mut payees, @0x77a20a8339e768718e481f3647bb7776); - Vector::push_back(&mut amounts, 55758733); - - Vector::push_back
(&mut payees, @0xf8251792d46856ae422670a62fda4dbb); - Vector::push_back(&mut amounts, 692718858); - - Vector::push_back
(&mut payees, @0xa822636e67354f58062f9a32460e40b6); - Vector::push_back(&mut amounts, 382180166); - - Vector::push_back
(&mut payees, @0x9d6b0a67ebaef670f8950d68e000b5c9); - Vector::push_back(&mut amounts, 329765703); - - Vector::push_back
(&mut payees, @0x85757bec5903ea4cb965724fee942c3e); - Vector::push_back(&mut amounts, 264621407); - - Vector::push_back
(&mut payees, @0x5084bd369cdc3f6343211aefe05f62bb); - Vector::push_back(&mut amounts, 147528067); - - Vector::push_back
(&mut payees, @0xa2d1f8b8b54f77315b1f1be18d662c72); - Vector::push_back(&mut amounts, 275969720); - - Vector::push_back
(&mut payees, @0x0ab2b508199b6c8892efebd1fff792b7); - Vector::push_back(&mut amounts, 492830110); - - Vector::push_back
(&mut payees, @0x46d300ba50e4e90517aafda7e57a06cb); - Vector::push_back(&mut amounts, 1059906976); - - Vector::push_back
(&mut payees, @0x0776c9866af5da3264ec911f46329c13); - Vector::push_back(&mut amounts, 844647235); - - Vector::push_back
(&mut payees, @0x5f3796c875ce6cafb1013204db71dacd); - Vector::push_back(&mut amounts, 360562448); - - Vector::push_back
(&mut payees, @0xe5c9d64c04a9b012c0bb568c015caab2); - Vector::push_back(&mut amounts, 1133470426); - - Vector::push_back
(&mut payees, @0x1b6fdac43310ea6f8fbe539f21702522); - Vector::push_back(&mut amounts, 362329912); - - Vector::push_back
(&mut payees, @0x9f4105e6ee58b733384f9ebef61a35ae); - Vector::push_back(&mut amounts, 1543752133); - - Vector::push_back
(&mut payees, @0x86c199d41855be7686e0c1d137d02af5); - Vector::push_back(&mut amounts, 1586994978); - - Vector::push_back
(&mut payees, @0xbc39137a7f7aeb370fb3a1b037385b93); - Vector::push_back(&mut amounts, 2255449340); - - Vector::push_back
(&mut payees, @0xf845508240bfd5f0babaffdbb8f24aab); - Vector::push_back(&mut amounts, 684032160); - - Vector::push_back
(&mut payees, @0x4883881c1e476ebd94919910f629888b); - Vector::push_back(&mut amounts, 1187755192); - - Vector::push_back
(&mut payees, @0xa4597bab3a398a886ecbebcc8385e06e); - Vector::push_back(&mut amounts, 298273214); - - Vector::push_back
(&mut payees, @0xea968c11e3bb5e0b2df2d03ba5ca45c5); - Vector::push_back(&mut amounts, 389143046); - - Vector::push_back
(&mut payees, @0x5d62152a629ed26c16f044991a25b49e); - Vector::push_back(&mut amounts, 1877165242); - - Vector::push_back
(&mut payees, @0xfd1a3dc1c699f873c48e42329b8dafb1); - Vector::push_back(&mut amounts, 128245086); - - Vector::push_back
(&mut payees, @0xc4e9abe0b0366861c83ecfbbd3e3a8b5); - Vector::push_back(&mut amounts, 182162705); - - Vector::push_back
(&mut payees, @0xcc6fb5e313d726f0dd804c8aeea28eef); - Vector::push_back(&mut amounts, 363539145); - - Vector::push_back
(&mut payees, @0x58585c164a9595009706f874b1933dd2); - Vector::push_back(&mut amounts, 1215962421); - - Vector::push_back
(&mut payees, @0xcd14b1aa029fc57248dd6e24d67c8bdd); - Vector::push_back(&mut amounts, 442119051); - - Vector::push_back
(&mut payees, @0x9114bcb1f3dd30ea6510c2c5dd73ad97); - Vector::push_back(&mut amounts, 1167040557); - - Vector::push_back
(&mut payees, @0xbae7fc9077c526b42252885adfd38635); - Vector::push_back(&mut amounts, 737503036); - - Vector::push_back
(&mut payees, @0xeda246f2314d89167bcbbc3e7b64c377); - Vector::push_back(&mut amounts, 1075895087); - - Vector::push_back
(&mut payees, @0xced73e78289a247eefaf466b9f97680b); - Vector::push_back(&mut amounts, 2498597210); - - Vector::push_back
(&mut payees, @0x180d81b98372ce4850742a7f344b9c86); - Vector::push_back(&mut amounts, 2715732867); - - Vector::push_back
(&mut payees, @0xae28484002dad3c5deb1e8452f3693b6); - Vector::push_back(&mut amounts, 127305209); - - Vector::push_back
(&mut payees, @0xe10c9c5d34e606131164d927126dff2a); - Vector::push_back(&mut amounts, 1623453973); - - Vector::push_back
(&mut payees, @0x0a9ab55844654ec974820fa3101348f0); - Vector::push_back(&mut amounts, 46179516); - - Vector::push_back
(&mut payees, @0x78a9edccea0e496d0f606491f40e8cf5); - Vector::push_back(&mut amounts, 374493497); - - Vector::push_back
(&mut payees, @0x49f9136d3744000348ce072f6b7183a0); - Vector::push_back(&mut amounts, 437526766); - - Vector::push_back
(&mut payees, @0x239420d342c8cfce5ad58cff2921919e); - Vector::push_back(&mut amounts, 1081425985); - - Vector::push_back
(&mut payees, @0x779cffc131c2d4209e23d73b53d22f26); - Vector::push_back(&mut amounts, 1293330811); - - Vector::push_back
(&mut payees, @0x1cfba7ab0cb0ca79f3cc6d0aca6d60fa); - Vector::push_back(&mut amounts, 1182270064); - - Vector::push_back
(&mut payees, @0xf095afad764212f5d16eaddfed0bada9); - Vector::push_back(&mut amounts, 1799598323); - - Vector::push_back
(&mut payees, @0x6f77f942ec10e916b676ecb34f5d9bf7); - Vector::push_back(&mut amounts, 1213320366); - - Vector::push_back
(&mut payees, @0x69daa80519ec5340710904c7f073226b); - Vector::push_back(&mut amounts, 795350313); - - Vector::push_back
(&mut payees, @0x9dd360c8ab4e7552bc927cc209a3db37); - Vector::push_back(&mut amounts, 338050907); - - Vector::push_back
(&mut payees, @0x209b065eda47969d367e1effb1902eaf); - Vector::push_back(&mut amounts, 355570225); - - Vector::push_back
(&mut payees, @0xe32f5f3d059f131efcc223d833ebd2c7); - Vector::push_back(&mut amounts, 956829564); - - Vector::push_back
(&mut payees, @0x06ba3c0e24b8569b0a8265e0385270bf); - Vector::push_back(&mut amounts, 172812491); - - Vector::push_back
(&mut payees, @0x3f749ccb08b2186119dd214fcb7293de); - Vector::push_back(&mut amounts, 1044341725); - - Vector::push_back
(&mut payees, @0x1a3b4b148b5e6ff2ea33fb302f09f5f0); - Vector::push_back(&mut amounts, 931493274); - - Vector::push_back
(&mut payees, @0xe451cb114db874c070b2ec519217303e); - Vector::push_back(&mut amounts, 634646279); - - Vector::push_back
(&mut payees, @0x12f2299900541b3767927cea6da239f0); - Vector::push_back(&mut amounts, 98131472); - - Vector::push_back
(&mut payees, @0x55b444afde145dcd1900f811d636c3a3); - Vector::push_back(&mut amounts, 554991411); - - Vector::push_back
(&mut payees, @0x2f232e5f21429483425e610dde60b7a6); - Vector::push_back(&mut amounts, 280023914); - - Vector::push_back
(&mut payees, @0xeb27cb61f08d684df66bd04b6cd4d338); - Vector::push_back(&mut amounts, 160853421); - - Vector::push_back
(&mut payees, @0x90ebaf8ce02020248afdb988bfba95dc); - Vector::push_back(&mut amounts, 357891252); - - Vector::push_back
(&mut payees, @0x5985c4dabf0e28f4aeffaec67d2cce64); - Vector::push_back(&mut amounts, 457653993); - - Vector::push_back
(&mut payees, @0xd3d636395f9d9d05b8fc6c339ae8af79); - Vector::push_back(&mut amounts, 454747767); - - Vector::push_back
(&mut payees, @0xf0d097311ee5c1b1a912eb2181688693); - Vector::push_back(&mut amounts, 448722677); - - Vector::push_back
(&mut payees, @0x5e3e2d2f6aed0d2f6f410c1bd3f2f5e0); - Vector::push_back(&mut amounts, 463783382); - - Vector::push_back
(&mut payees, @0x63318830c712e33075021d47c42927c4); - Vector::push_back(&mut amounts, 743406401); - - Vector::push_back
(&mut payees, @0x3b08bf965fcc28baeb13d8104fb3e6fe); - Vector::push_back(&mut amounts, 645492338); - - Vector::push_back
(&mut payees, @0x64c662a5d392a711b3c6df4c31549cdb); - Vector::push_back(&mut amounts, 661413585); - - Vector::push_back
(&mut payees, @0xa1f0831eeb8bd84ce705c349b6d6b587); - Vector::push_back(&mut amounts, 2501406827); - - Vector::push_back
(&mut payees, @0x69565c28652a2fee56e7e986a3616aa4); - Vector::push_back(&mut amounts, 517528659); - - Vector::push_back
(&mut payees, @0x63a98fce42921411420a94ad8a9a5c11); - Vector::push_back(&mut amounts, 109676351); - - Vector::push_back
(&mut payees, @0x7fc541799cb6c013668209eeccf456f1); - Vector::push_back(&mut amounts, 244468505); - - Vector::push_back
(&mut payees, @0xbb1d9d66577686d1dcaa12e8a76212e3); - Vector::push_back(&mut amounts, 761572575); - - Vector::push_back
(&mut payees, @0x5f1aa1618e239ad002cddbac80a6ed02); - Vector::push_back(&mut amounts, 1237604582); - - Vector::push_back
(&mut payees, @0xdc039766ffffad2022b86e2d35859c88); - Vector::push_back(&mut amounts, 311462908); - - Vector::push_back
(&mut payees, @0x5689f7be578feb649d525174a7ee2654); - Vector::push_back(&mut amounts, 288636179); - - Vector::push_back
(&mut payees, @0xa076822ba5f0f7000422556f1934c831); - Vector::push_back(&mut amounts, 708508846); - - Vector::push_back
(&mut payees, @0xf2dccd7072a28a30ac9c3b2ae5ff63b9); - Vector::push_back(&mut amounts, 624095519); - - Vector::push_back
(&mut payees, @0xa6b0216a6429acce52ab25bf7d1b2de9); - Vector::push_back(&mut amounts, 225125142); - - Vector::push_back
(&mut payees, @0x7945992524a089845d5f21865a11d2f5); - Vector::push_back(&mut amounts, 319185359); - - Vector::push_back
(&mut payees, @0x5745e28134b5fd97e1fd388e7d4cf778); - Vector::push_back(&mut amounts, 204928705); - - Vector::push_back
(&mut payees, @0xcbdf867ec79a7ba2c744859f98ccdd71); - Vector::push_back(&mut amounts, 983452272); - - Vector::push_back
(&mut payees, @0xaa26bf48c28b25ae248e53af41a4e014); - Vector::push_back(&mut amounts, 193008928); - - Vector::push_back
(&mut payees, @0x43db5e93ef28e3427d13fdfd5651267a); - Vector::push_back(&mut amounts, 319927402); - - Vector::push_back
(&mut payees, @0x3e87037af0626a46d29e484f5ec549a2); - Vector::push_back(&mut amounts, 902145014); - - Vector::push_back
(&mut payees, @0xf52bb52d01db98cb0f0f5f0d6946b060); - Vector::push_back(&mut amounts, 317489715); - - Vector::push_back
(&mut payees, @0x9daa50bf6329363d70f578b60f6a1045); - Vector::push_back(&mut amounts, 756515613); - - Vector::push_back
(&mut payees, @0x28bb4bc0594adf121357778f8f4ab79c); - Vector::push_back(&mut amounts, 578006714); - - Vector::push_back
(&mut payees, @0x72caff377e7aab31d4aa0bbecb57d3e9); - Vector::push_back(&mut amounts, 964822246); - - Vector::push_back
(&mut payees, @0x042b412ef4f7422dcc4efb1bb53fa96d); - Vector::push_back(&mut amounts, 1065997091); - - Vector::push_back
(&mut payees, @0xed7b50dcd1e15a259bd3d84c8f3692a8); - Vector::push_back(&mut amounts, 233299808); - - Vector::push_back
(&mut payees, @0x1351891df1b8748e83edb067840f53e1); - Vector::push_back(&mut amounts, 1187505135); - - Vector::push_back
(&mut payees, @0x6e7fe9b542c58f9e1b754b6971dfb9d7); - Vector::push_back(&mut amounts, 447061110); - - Vector::push_back
(&mut payees, @0xd49bddbf42a57ceb2cb3ac7e63a76d2e); - Vector::push_back(&mut amounts, 1305872716); - - Vector::push_back
(&mut payees, @0x61505d3bb3114b74d09d405965dea2a4); - Vector::push_back(&mut amounts, 156881505); - - Vector::push_back
(&mut payees, @0x7de738a4bff50c13b912c8e488285192); - Vector::push_back(&mut amounts, 495150073); - - Vector::push_back
(&mut payees, @0xb5f6b2b44d85223a089516c4e830b8b7); - Vector::push_back(&mut amounts, 320106367); - - Vector::push_back
(&mut payees, @0xb692f9795434fc5b6b5f40e95f8e2ff9); - Vector::push_back(&mut amounts, 1419877593); - - Vector::push_back
(&mut payees, @0xb430f992d16f808627f3ed805f8df853); - Vector::push_back(&mut amounts, 96567499); - - Vector::push_back
(&mut payees, @0x1caf2d913e086e755177c263ec485006); - Vector::push_back(&mut amounts, 1110622528); - - Vector::push_back
(&mut payees, @0x6182b927616ad6825bd55e46335e9f43); - Vector::push_back(&mut amounts, 1636770502); - - Vector::push_back
(&mut payees, @0x5c98dbca40457c5edc516e01525f83bd); - Vector::push_back(&mut amounts, 368270385); - - Vector::push_back
(&mut payees, @0xa8daa05cbb755ced963f117be6eec6c2); - Vector::push_back(&mut amounts, 283842059); - - Vector::push_back
(&mut payees, @0x5e74d94666ffe42650c26c532e231dd8); - Vector::push_back(&mut amounts, 690685204); - - Vector::push_back
(&mut payees, @0x14f5964333f39c3bd9659ed887faa99c); - Vector::push_back(&mut amounts, 838768710); - - Vector::push_back
(&mut payees, @0xed3a2ba9590c5c2f2dcf56c57a888100); - Vector::push_back(&mut amounts, 1215079415); - - Vector::push_back
(&mut payees, @0x4172d7a02674b9a0384d15ed1aa24955); - Vector::push_back(&mut amounts, 483605402); - - Vector::push_back
(&mut payees, @0x13871ca95bdeb8b174e5858b1b982cb7); - Vector::push_back(&mut amounts, 413890090); - - Vector::push_back
(&mut payees, @0xb849aef185d66fd16c27b7f3ba32f342); - Vector::push_back(&mut amounts, 1175715626); - - Vector::push_back
(&mut payees, @0x96953d7e169d703cb17bb5235abaa919); - Vector::push_back(&mut amounts, 850012573); - - Vector::push_back
(&mut payees, @0xa2962d2260da39c85d63c4816bb52a0c); - Vector::push_back(&mut amounts, 1469499214); - - Vector::push_back
(&mut payees, @0x9c923648b37a63bdcbc9eebfdcd9a2f4); - Vector::push_back(&mut amounts, 128849191); - - Vector::push_back
(&mut payees, @0x25c9e0edae5945931fbbcdcc9a1b5a8e); - Vector::push_back(&mut amounts, 60354687); - - Vector::push_back
(&mut payees, @0x89003d3c7e43cb15dfad8d37dd1d6c7c); - Vector::push_back(&mut amounts, 496695645); - - Vector::push_back
(&mut payees, @0xbb28758158928ac749e4ffbb434ccd16); - Vector::push_back(&mut amounts, 887823149); - - Vector::push_back
(&mut payees, @0xf1994142c653ac8c317598cc1ebf3a35); - Vector::push_back(&mut amounts, 78461093); - - Vector::push_back
(&mut payees, @0x14589b44ae76036098895572ace552f7); - Vector::push_back(&mut amounts, 425669961); - - Vector::push_back
(&mut payees, @0x26af5592c55af86e4bd1cccd863eaa66); - Vector::push_back(&mut amounts, 434553746); - - Vector::push_back
(&mut payees, @0x414f5d51dcfe48e2ea2d7f6b53776a1b); - Vector::push_back(&mut amounts, 327799113); - - Vector::push_back
(&mut payees, @0x9dc423520018d58c7145b5e2093de618); - Vector::push_back(&mut amounts, 461894690); - - Vector::push_back
(&mut payees, @0xadacb6c67d6a23aec326ee43d09e4bd5); - Vector::push_back(&mut amounts, 756475869); - - Vector::push_back
(&mut payees, @0xeee54bf46ea453d84770dc8a59a3faaf); - Vector::push_back(&mut amounts, 373191172); - - Vector::push_back
(&mut payees, @0x2c5da9e57a7187c7d1ab74bc119ef0bf); - Vector::push_back(&mut amounts, 1206316462); - - Vector::push_back
(&mut payees, @0x2f59fd47e78ddcf17fd63a128058daae); - Vector::push_back(&mut amounts, 617127097); - - Vector::push_back
(&mut payees, @0xeef32c503a9cc54a5eecefaa689dbef4); - Vector::push_back(&mut amounts, 915170683); - - Vector::push_back
(&mut payees, @0x12ca2d97b82ff30201c8924a6525dd7e); - Vector::push_back(&mut amounts, 983354249); - - Vector::push_back
(&mut payees, @0xa85275ef57b0007007dc078426c586b7); - Vector::push_back(&mut amounts, 153764616); - - Vector::push_back
(&mut payees, @0x502e96e3a7cba05fafd077ec0e73b005); - Vector::push_back(&mut amounts, 261618795); - - Vector::push_back
(&mut payees, @0x1209195229afc350b41f442d0e4a8b22); - Vector::push_back(&mut amounts, 95415921); - - Vector::push_back
(&mut payees, @0xac046e6706b2589acdf6626925eb829d); - Vector::push_back(&mut amounts, 385878458); - - Vector::push_back
(&mut payees, @0xcac58acf5c9743f1688911bc1ea72d5a); - Vector::push_back(&mut amounts, 114673905); - - Vector::push_back
(&mut payees, @0x4d128cf3c9e9d136aaf64c17ce0185c9); - Vector::push_back(&mut amounts, 861191818); - - Vector::push_back
(&mut payees, @0x313b70128575426ce75daf3489c1f1f5); - Vector::push_back(&mut amounts, 188582466); - - Vector::push_back
(&mut payees, @0x1d733a7cef5985ade430e03ccd2df26d); - Vector::push_back(&mut amounts, 900658108); - - Vector::push_back
(&mut payees, @0x7bc4155e087fe214a1a54c40c9c060f0); - Vector::push_back(&mut amounts, 78461093); - - Vector::push_back
(&mut payees, @0xc51e51a6a2a9bc6b7efd082eb4aa3831); - Vector::push_back(&mut amounts, 167810087); - - Vector::push_back
(&mut payees, @0xb6b01ce7ea67e825d47877e2de78424c); - Vector::push_back(&mut amounts, 388746686); - - Vector::push_back
(&mut payees, @0x13f47ab7cddd24caddf416c3e8d8f183); - Vector::push_back(&mut amounts, 108638436); - - Vector::push_back
(&mut payees, @0x8ed04c57765bcb03c48a2c9b416a3f33); - Vector::push_back(&mut amounts, 543618819); - - Vector::push_back
(&mut payees, @0x3432848e49d878f230935a8b400e8ad9); - Vector::push_back(&mut amounts, 78461093); - - Vector::push_back
(&mut payees, @0xfb3ac828711372a53e6d1c1ec212b117); - Vector::push_back(&mut amounts, 1874122865); - - Vector::push_back
(&mut payees, @0x8a33b2407542970f37c9797dd72ed35f); - Vector::push_back(&mut amounts, 205419611); - - Vector::push_back
(&mut payees, @0xc51fbe628ab645f7dcdff32be941c72d); - Vector::push_back(&mut amounts, 834835895); - - Vector::push_back
(&mut payees, @0xef28ce177757657d8ae447e6c1fedb3d); - Vector::push_back(&mut amounts, 2847221933); - - Vector::push_back
(&mut payees, @0x6c08663d8b8ce4d4db4bc5f25e39de10); - Vector::push_back(&mut amounts, 1799854321); - - Vector::push_back
(&mut payees, @0xe5767285798aee1fd8a0b6ffaa499a95); - Vector::push_back(&mut amounts, 180728457); - - Vector::push_back
(&mut payees, @0xcdeef0516e4844765b45775f9cd9fbef); - Vector::push_back(&mut amounts, 865826549); - - Vector::push_back
(&mut payees, @0xed93729fdf0e71475ef0ed2499350133); - Vector::push_back(&mut amounts, 600854685); - - Vector::push_back
(&mut payees, @0x94d87505612206bf3e3894b61452438e); - Vector::push_back(&mut amounts, 214679355); - - Vector::push_back
(&mut payees, @0x9348bf45b17be0be1035cf5764a75875); - Vector::push_back(&mut amounts, 671605199); - - Vector::push_back
(&mut payees, @0xdf7117fbd041185ef9aacc6294939616); - Vector::push_back(&mut amounts, 324780105); - - Vector::push_back
(&mut payees, @0x2cbdb1a9512c521f00aaf527c7521f0d); - Vector::push_back(&mut amounts, 332561077); - - Vector::push_back
(&mut payees, @0x332f9fe50cd11c279c1aed341867800c); - Vector::push_back(&mut amounts, 353806715); - - Vector::push_back
(&mut payees, @0x9ef284787362961d56dfa34c99a29737); - Vector::push_back(&mut amounts, 45182114); - - Vector::push_back
(&mut payees, @0x2475bdf38b2fcb32d2f10ccb1061b591); - Vector::push_back(&mut amounts, 509763331); - - Vector::push_back
(&mut payees, @0x16df20629ec629fe46e4224c4664c42f); - Vector::push_back(&mut amounts, 455014914); - - Vector::push_back
(&mut payees, @0xebaa27840b071a069ce3c780c38eb850); - Vector::push_back(&mut amounts, 331451075); - - Vector::push_back
(&mut payees, @0x5fba4ec5114d4d4abad1de98edb7d50a); - Vector::push_back(&mut amounts, 533557285); - - Vector::push_back
(&mut payees, @0xa5e56e410e9eb153cf655ce7bc3b90f5); - Vector::push_back(&mut amounts, 1183866364); - - Vector::push_back
(&mut payees, @0xe93afd0e72f1893b5bba89a98ec46474); - Vector::push_back(&mut amounts, 2147298032); - - Vector::push_back
(&mut payees, @0x96b71343e17245a11e78565cec73221a); - Vector::push_back(&mut amounts, 310093667); - - Vector::push_back
(&mut payees, @0x7ddbd68519a13761c9da7c028c9bc3ef); - Vector::push_back(&mut amounts, 40161879); - - Vector::push_back
(&mut payees, @0x18488789b0f792896481d9271b73cc12); - Vector::push_back(&mut amounts, 205172776); - - Vector::push_back
(&mut payees, @0xb269ce3ab44332289a6d360fb3e2276b); - Vector::push_back(&mut amounts, 725402738); - - Vector::push_back
(&mut payees, @0x92c24e571ceb9aa8d913859034e644e9); - Vector::push_back(&mut amounts, 323812448); - - Vector::push_back
(&mut payees, @0xc225dfb9809af82ecc62de8d4ce4d180); - Vector::push_back(&mut amounts, 398102186); - - Vector::push_back
(&mut payees, @0x7ffc32a86cd1122ace53f0be0ad18f32); - Vector::push_back(&mut amounts, 205345470); - - Vector::push_back
(&mut payees, @0x77b8d3b36ddca586f48b1e0dfe5d56d0); - Vector::push_back(&mut amounts, 326460279); - - Vector::push_back
(&mut payees, @0x41911b85b784e22f5391fd99a867aafa); - Vector::push_back(&mut amounts, 311625270); - - Vector::push_back
(&mut payees, @0xc0a1019a7539967ccd650e8d8f8d61f7); - Vector::push_back(&mut amounts, 205035226); - - Vector::push_back
(&mut payees, @0x1122480662ba914a29ddb9927611423d); - Vector::push_back(&mut amounts, 85343993); - - Vector::push_back
(&mut payees, @0x9418f1f779d3951c33f0977ae1dcb171); - Vector::push_back(&mut amounts, 180244295); - - Vector::push_back
(&mut payees, @0x89f2ffad03d813b826aa72d4353ba48d); - Vector::push_back(&mut amounts, 257468831); - - Vector::push_back
(&mut payees, @0x48fac0831f90c47c6a84cf21656d127a); - Vector::push_back(&mut amounts, 392984947); - - Vector::push_back
(&mut payees, @0x23d2aaf1400fb2b0af387b8d647f4150); - Vector::push_back(&mut amounts, 248481970); - - Vector::push_back
(&mut payees, @0x1dcd50506664a48f6bb8b77e99783a34); - Vector::push_back(&mut amounts, 234908576); - - Vector::push_back
(&mut payees, @0xc8d8fc7ad3e91e8162addfc6ce96a192); - Vector::push_back(&mut amounts, 241267840); - - Vector::push_back
(&mut payees, @0x9218128ad70bfd4e919d8f08110ef8d8); - Vector::push_back(&mut amounts, 241974425); - - Vector::push_back
(&mut payees, @0xc8bd1f77eb650a2517d4c2c8e477e39b); - Vector::push_back(&mut amounts, 256328545); - - Vector::push_back
(&mut payees, @0xa01d58b737521b98fa5e29d5cac90919); - Vector::push_back(&mut amounts, 168642373); - - Vector::push_back
(&mut payees, @0x905a284183feddd4bab3eefecfefed08); - Vector::push_back(&mut amounts, 130526107); - - Vector::push_back
(&mut payees, @0x59d4b463f2192bf070be8e55cf556cb9); - Vector::push_back(&mut amounts, 118440024); - - Vector::push_back
(&mut payees, @0x0079513a503b7f6a2ef32b59dec23822); - Vector::push_back(&mut amounts, 385419614); - - Vector::push_back
(&mut payees, @0x6ad3f14a4a0810412784e4909d80fbca); - Vector::push_back(&mut amounts, 120633920); - - Vector::push_back
(&mut payees, @0xd5f8d1e4b9b92ca20bf6030799fe27bc); - Vector::push_back(&mut amounts, 304064115); - - Vector::push_back
(&mut payees, @0x8788da5582ad281e4bdcef5927ae7cec); - Vector::push_back(&mut amounts, 1163085150); - - Vector::push_back
(&mut payees, @0xf62cc304b133b8aa22a63a5bce3250c4); - Vector::push_back(&mut amounts, 1044151076); - - Vector::push_back
(&mut payees, @0x5703d19351c589a13f92bac3c3d7e6a4); - Vector::push_back(&mut amounts, 665313199); - - Vector::push_back
(&mut payees, @0xf4a996402f81372a7dd42e07af078548); - Vector::push_back(&mut amounts, 225500550); - - Vector::push_back
(&mut payees, @0x9e37835ab111156287a987a01150536a); - Vector::push_back(&mut amounts, 377644638); - - Vector::push_back
(&mut payees, @0x93a0c11e04a0fa11e50289b84cc7d39e); - Vector::push_back(&mut amounts, 1191328970); - - Vector::push_back
(&mut payees, @0xeb50ba9e8b4e3a93466b8a4dbcb41d90); - Vector::push_back(&mut amounts, 788721764); - - Vector::push_back
(&mut payees, @0x0789913c2eba739c1e632e540ba54ee3); - Vector::push_back(&mut amounts, 485861310); - - Vector::push_back
(&mut payees, @0x05f81b522dbf9c6845da8e1a7d9f8273); - Vector::push_back(&mut amounts, 493994178); - - Vector::push_back
(&mut payees, @0x21e9d87e2351d8d6deceae185d109cd1); - Vector::push_back(&mut amounts, 257109271); - - Vector::push_back
(&mut payees, @0xe7877f5fb11f95bac7d4f81b1b2b77b3); - Vector::push_back(&mut amounts, 697291598); - - Vector::push_back
(&mut payees, @0x0fd0d1806b7c7da9993206ecf767f705); - Vector::push_back(&mut amounts, 273583145); - - Vector::push_back
(&mut payees, @0x6bbd3213c444699b5720f8ac3aa82eaf); - Vector::push_back(&mut amounts, 364728099); - - Vector::push_back
(&mut payees, @0x8d4c7ff9efdd6296b436bc4ac8cb2075); - Vector::push_back(&mut amounts, 364728099); - - Vector::push_back
(&mut payees, @0x8770cf40d8069564f29242acb88d378b); - Vector::push_back(&mut amounts, 364728099); - - Vector::push_back
(&mut payees, @0x12804d738701ba11994e53327ea2465c); - Vector::push_back(&mut amounts, 280723134); - - Vector::push_back
(&mut payees, @0xa70838286a01ea0389c4285feeb6b748); - Vector::push_back(&mut amounts, 167303345); - - Vector::push_back
(&mut payees, @0x588323dfd024baf54259497bcfb0ec32); - Vector::push_back(&mut amounts, 135694624); - - Vector::push_back
(&mut payees, @0x6e008bb4db922657e7fb8bcaae81a8c2); - Vector::push_back(&mut amounts, 141421444); - - Vector::push_back
(&mut payees, @0xdab1cf4d63c2968afc76e37fe4c09c23); - Vector::push_back(&mut amounts, 454392465); - - Vector::push_back
(&mut payees, @0x048e9c059acb335d21e866fb715f7e3b); - Vector::push_back(&mut amounts, 279285553); - - Vector::push_back
(&mut payees, @0xf961d17df00f00b808843dd50f5af53c); - Vector::push_back(&mut amounts, 320959155); - - Vector::push_back
(&mut payees, @0xef009de70c9fb1513193ae0f2b36dcbf); - Vector::push_back(&mut amounts, 286449954); - - Vector::push_back
(&mut payees, @0xf8300f316448243a0434851bfb0f7c86); - Vector::push_back(&mut amounts, 247627103); - - Vector::push_back
(&mut payees, @0x973a73b4f03f0d2fe027e7309cdc0fb7); - Vector::push_back(&mut amounts, 254919554); - - Vector::push_back
(&mut payees, @0x283d523b4d982329f56ce6c14924fc6c); - Vector::push_back(&mut amounts, 523786807); - - Vector::push_back
(&mut payees, @0x4b321a8d170f6c61ffd804ef64fd395a); - Vector::push_back(&mut amounts, 542618149); - - Vector::push_back
(&mut payees, @0xd54f4fa1c7a56c8c063c0e7e56cd2fee); - Vector::push_back(&mut amounts, 448068698); - - Vector::push_back
(&mut payees, @0x03e64a645fbbb292320ca7d0e150f6c0); - Vector::push_back(&mut amounts, 398239274); - - Vector::push_back
(&mut payees, @0x664f4ce5896b8e2290e3c1f4c7e4e499); - Vector::push_back(&mut amounts, 471354134); - - Vector::push_back
(&mut payees, @0x251e4c9c196beadc823dbeac59bcf8ef); - Vector::push_back(&mut amounts, 477899392); - - Vector::push_back
(&mut payees, @0x88ef4eec0fb6b4f7ed582b81512ef040); - Vector::push_back(&mut amounts, 209659120); - - Vector::push_back
(&mut payees, @0x0ee4903336a35c03ea1864683c6d9d3b); - Vector::push_back(&mut amounts, 178077354); - - Vector::push_back
(&mut payees, @0x59f1523658eefa6c1ce59a8ebdb3a529); - Vector::push_back(&mut amounts, 449900305); - - Vector::push_back
(&mut payees, @0x16759a3e80aeee1385b9d5a7650b82c8); - Vector::push_back(&mut amounts, 60242819); - - Vector::push_back
(&mut payees, @0xaaa30a1deee438122baddfdbd7fa2f50); - Vector::push_back(&mut amounts, 264540180); - - Vector::push_back
(&mut payees, @0xa769ba03ef50ebdb9a43da9d60fef856); - Vector::push_back(&mut amounts, 70283288); - - Vector::push_back
(&mut payees, @0xa49a07860f070fc56fb7cb3bb7c8b9d1); - Vector::push_back(&mut amounts, 323153050); - - Vector::push_back
(&mut payees, @0x02845587f4d65d1ddda394094bbfb0a1); - Vector::push_back(&mut amounts, 488948852); - - Vector::push_back
(&mut payees, @0xd808f05dfc5fd32e73e08558b6b31e78); - Vector::push_back(&mut amounts, 321591599); - - Vector::push_back
(&mut payees, @0x05429529e42e445daa9d7d194c1d177c); - Vector::push_back(&mut amounts, 163063836); - - Vector::push_back
(&mut payees, @0x54a5b9491541dbc9be7e1fe79d2a9119); - Vector::push_back(&mut amounts, 138749202); - - Vector::push_back
(&mut payees, @0x854cd49357dd07704d61e1fd8a258831); - Vector::push_back(&mut amounts, 440389548); - - Vector::push_back
(&mut payees, @0x80cc602663d6db4c5720f616a0cf05c3); - Vector::push_back(&mut amounts, 510597059); - - Vector::push_back
(&mut payees, @0x318d7a5afd151b9b4e2742b4f269659c); - Vector::push_back(&mut amounts, 184483804); - - Vector::push_back
(&mut payees, @0x325478d79dbd2e3da2c51ae3ad3a19a6); - Vector::push_back(&mut amounts, 184483804); - - Vector::push_back
(&mut payees, @0x6f09e0f9826361c812b53d4799736e88); - Vector::push_back(&mut amounts, 184483804); - - Vector::push_back
(&mut payees, @0x6c4221e9fbb2be46105cbe7f5de858cb); - Vector::push_back(&mut amounts, 255547819); - - Vector::push_back
(&mut payees, @0x02ae06901389c2c2188bad8ca4028495); - Vector::push_back(&mut amounts, 287863124); - - Vector::push_back
(&mut payees, @0x2060e42ddaf4b15ba4c05788205ab80a); - Vector::push_back(&mut amounts, 94752019); - - Vector::push_back
(&mut payees, @0x960f48a30f63fb995f17848822681263); - Vector::push_back(&mut amounts, 266369015); - - Vector::push_back
(&mut payees, @0xb080a6e0464cca28ed6c7e116fecb837); - Vector::push_back(&mut amounts, 2175853020); - - Vector::push_back
(&mut payees, @0x3b869a49d9bd3f87009e6761ba9b10fb); - Vector::push_back(&mut amounts, 374929030); - - Vector::push_back
(&mut payees, @0x1b32f894b223bb3e055ad105ce1f2fb5); - Vector::push_back(&mut amounts, 961340198); - - Vector::push_back
(&mut payees, @0xd167fcafab6df456961051e0a13a4a35); - Vector::push_back(&mut amounts, 51763801); - - Vector::push_back
(&mut payees, @0x1e43d3372b28ecff61184ab486696491); - Vector::push_back(&mut amounts, 51763801); - - Vector::push_back
(&mut payees, @0x667cd56b1ff19f17420316555c96f41b); - Vector::push_back(&mut amounts, 129896206); - - Vector::push_back
(&mut payees, @0xb41e0198dd79390b09722301e851329f); - Vector::push_back(&mut amounts, 1579283999); - - Vector::push_back
(&mut payees, @0x2a109a10fb2a2d24f94f1fcd0f29ffc0); - Vector::push_back(&mut amounts, 1255613984); - - Vector::push_back
(&mut payees, @0x8805cc5884ad0ba64eb0b2028d0d2d36); - Vector::push_back(&mut amounts, 1466823396); - - Vector::push_back
(&mut payees, @0x44cfa74929faf9ea616e9b2edea670f6); - Vector::push_back(&mut amounts, 371148409); - - Vector::push_back
(&mut payees, @0x242921fe0e1150bbcbda6e21e521bee0); - Vector::push_back(&mut amounts, 1268670442); - - Vector::push_back
(&mut payees, @0xdbf629f59745fb7c437e806cdf24b949); - Vector::push_back(&mut amounts, 89052154); - - Vector::push_back
(&mut payees, @0x3ec7fa5052f80d42a09207002ca79641); - Vector::push_back(&mut amounts, 1207816339); - - Vector::push_back
(&mut payees, @0x63a2bf5b5abf8c04054a529af3a66f9f); - Vector::push_back(&mut amounts, 884555131); - - Vector::push_back
(&mut payees, @0x60f5614cd07aacc0389053e70064c45a); - Vector::push_back(&mut amounts, 310577143); - - Vector::push_back
(&mut payees, @0xd3f709678d8faa4461673aca376dc0fd); - Vector::push_back(&mut amounts, 370684064); - - Vector::push_back
(&mut payees, @0xa2ede9ca5950f98bbd580a45aee743b2); - Vector::push_back(&mut amounts, 318207500); - - Vector::push_back
(&mut payees, @0x983026aa24a2ce1ed706caad17de909a); - Vector::push_back(&mut amounts, 1721346752); - - Vector::push_back
(&mut payees, @0x55715865f28efa0f7a2ab519552d65a6); - Vector::push_back(&mut amounts, 455224413); - - Vector::push_back
(&mut payees, @0xc86730787618521a4c0cdc49e2dd7ac7); - Vector::push_back(&mut amounts, 1434840984); - - Vector::push_back
(&mut payees, @0xb57942c3a60db1bd92aaad8576838c48); - Vector::push_back(&mut amounts, 144785539); - - Vector::push_back
(&mut payees, @0xdfc4177ef86844f75c4c3a316df0d45c); - Vector::push_back(&mut amounts, 168719057); - - Vector::push_back
(&mut payees, @0x14a2d6dc202d46c90073e1808beb0759); - Vector::push_back(&mut amounts, 994712641); - - Vector::push_back
(&mut payees, @0xba0cf946ce221399d758edafed96d53b); - Vector::push_back(&mut amounts, 452179384); - - Vector::push_back
(&mut payees, @0xf5cfb78a05cde9d6486b0520e8934235); - Vector::push_back(&mut amounts, 199216286); - - Vector::push_back
(&mut payees, @0x47377f4348bae317e9ace69895c0baf1); - Vector::push_back(&mut amounts, 687947764); - - Vector::push_back
(&mut payees, @0x7ce613bdb7e9c1fc320b2237ae4f6218); - Vector::push_back(&mut amounts, 2588860725); - - Vector::push_back
(&mut payees, @0x40dc8d8ed3ce683af7d47b8db48b0828); - Vector::push_back(&mut amounts, 1988521706); - - Vector::push_back
(&mut payees, @0xf44c1488a8606c7dc61e3f2b1b6bf3f3); - Vector::push_back(&mut amounts, 394983476); - - Vector::push_back
(&mut payees, @0xcbd48aba80345f276c3305c27758b7c7); - Vector::push_back(&mut amounts, 56077451); - - Vector::push_back
(&mut payees, @0x01b1c66980bcc25a03199058d1ba0d70); - Vector::push_back(&mut amounts, 232937104); - - Vector::push_back
(&mut payees, @0x50511e787e8c232fd2346093c3177161); - Vector::push_back(&mut amounts, 47450150); - - Vector::push_back
(&mut payees, @0x62bc6aa1742c8c5da677c90b54a15baa); - Vector::push_back(&mut amounts, 676132739); - - Vector::push_back
(&mut payees, @0x04d1f452c508d51ff44bfc9cf1c85e00); - Vector::push_back(&mut amounts, 1158989165); - - Vector::push_back
(&mut payees, @0x65c95f3c3abdb9d5ba49936814908821); - Vector::push_back(&mut amounts, 1417448114); - - Vector::push_back
(&mut payees, @0xaa24932252d99577c24c42aee0412e2d); - Vector::push_back(&mut amounts, 243567010); - - Vector::push_back
(&mut payees, @0xceb16033501acb29e1d2e6e4563ba4b5); - Vector::push_back(&mut amounts, 372872379); - - Vector::push_back
(&mut payees, @0x193faa102e2c3b3b26f4f4dfe14929fc); - Vector::push_back(&mut amounts, 296341412); - - Vector::push_back
(&mut payees, @0xce62376aa2a46de1895add6b7fa8569c); - Vector::push_back(&mut amounts, 179519151); - - Vector::push_back
(&mut payees, @0xc34a7b96a761634aee8fdf74d2c1c0f0); - Vector::push_back(&mut amounts, 336593195); - - Vector::push_back
(&mut payees, @0x66563ad813bd7dbef9e0bfd4ccad6158); - Vector::push_back(&mut amounts, 90586651); - - Vector::push_back
(&mut payees, @0xb1fd2d7ec0eea21f5bc63be63b71d04b); - Vector::push_back(&mut amounts, 406004691); - - Vector::push_back
(&mut payees, @0x2daf40bb2df764e63e35ff81600f7a18); - Vector::push_back(&mut amounts, 515564742); - - Vector::push_back
(&mut payees, @0xa14c1e2d8ee8e7e7e957499c72b7f140); - Vector::push_back(&mut amounts, 803833027); - - Vector::push_back
(&mut payees, @0xc3ee3f335c3efe63809bb64340abd20e); - Vector::push_back(&mut amounts, 101993104); - - Vector::push_back
(&mut payees, @0x090914b9867ceb27d5678cfad8b3e4f2); - Vector::push_back(&mut amounts, 518777297); - - Vector::push_back
(&mut payees, @0x530f3c9a8ea105aa6d6d59be50069d62); - Vector::push_back(&mut amounts, 47450150); - - Vector::push_back
(&mut payees, @0xa4ec10bf99cd3e7142f3c3a71073bccd); - Vector::push_back(&mut amounts, 120782202); - - Vector::push_back
(&mut payees, @0x602087b8205a0cf04d90ee094a9c792a); - Vector::push_back(&mut amounts, 38822850); - - Vector::push_back
(&mut payees, @0x4bc670554db4e8f93c6e8e228afed33f); - Vector::push_back(&mut amounts, 237250754); - - Vector::push_back
(&mut payees, @0x1998c51b52c381d33059dbc75e80d6bc); - Vector::push_back(&mut amounts, 75353253); - - Vector::push_back
(&mut payees, @0x71b17c906dc0300a0f775787c0488b55); - Vector::push_back(&mut amounts, 436883120); - - Vector::push_back
(&mut payees, @0xb7cc45181111d99906acd2f7b2d70151); - Vector::push_back(&mut amounts, 257146257); - - Vector::push_back
(&mut payees, @0x0b8d7fa2303519226ebd00424c3f13b5); - Vector::push_back(&mut amounts, 69018401); - - Vector::push_back
(&mut payees, @0x2e48d5ea80cd4f3977f7fbafb7773f52); - Vector::push_back(&mut amounts, 34509200); - - Vector::push_back
(&mut payees, @0x531c1ceef554aaf3c9e809e44a1b4ef3); - Vector::push_back(&mut amounts, 218700157); - - Vector::push_back
(&mut payees, @0x74ee26215084666368bca01456ff30ef); - Vector::push_back(&mut amounts, 86273001); - - Vector::push_back
(&mut payees, @0x4f1f6152070ac00f69b0ba692ea3013e); - Vector::push_back(&mut amounts, 38822850); - - Vector::push_back
(&mut payees, @0xf8e0338f85a77408df978e58b4c26594); - Vector::push_back(&mut amounts, 99213951); - - Vector::push_back
(&mut payees, @0x430981cc32664259d9c50d0b082e9b82); - Vector::push_back(&mut amounts, 43136500); - - Vector::push_back
(&mut payees, @0x437cee5bf4441efcb1dccf7ff8242967); - Vector::push_back(&mut amounts, 71039603); - - Vector::push_back
(&mut payees, @0xe4c07d856851c73d07e59386a2dc40a6); - Vector::push_back(&mut amounts, 720375184); - - Vector::push_back
(&mut payees, @0xeb8f8d7e915d445c968332dcb197aba6); - Vector::push_back(&mut amounts, 1684076202); - - Vector::push_back
(&mut payees, @0x0d83d94b87c0cf9121fe07e56f9aff98); - Vector::push_back(&mut amounts, 1414503935); - - Vector::push_back
(&mut payees, @0x7a2e83b67c261ce53517511743821ebe); - Vector::push_back(&mut amounts, 77627105); - - Vector::push_back
(&mut payees, @0xc5c16b398107b99526495cd202be11ec); - Vector::push_back(&mut amounts, 660321428); - - Vector::push_back
(&mut payees, @0xc25e6b80a35b9ea49c94a46d85c01b67); - Vector::push_back(&mut amounts, 50229303); - - Vector::push_back
(&mut payees, @0x8e3e95a172357166e0ac655b902f9fe4); - Vector::push_back(&mut amounts, 871673222); - - Vector::push_back
(&mut payees, @0xdf90ce3740c5ac768ce01b8e2f67928a); - Vector::push_back(&mut amounts, 82193405); - - Vector::push_back
(&mut payees, @0x1d4800ccc8e7deec450049228d353008); - Vector::push_back(&mut amounts, 828116252); - - Vector::push_back
(&mut payees, @0x449f87a065b03314edd71e83f10b7fd6); - Vector::push_back(&mut amounts, 128541539); - - Vector::push_back
(&mut payees, @0x9891554d944ff899c7bcefa2e96076dc); - Vector::push_back(&mut amounts, 242277714); - - Vector::push_back
(&mut payees, @0x66c0ede4eee373df942c139ceeddcf6a); - Vector::push_back(&mut amounts, 243067510); - - Vector::push_back
(&mut payees, @0x9eb41fd289ee49ee65e26fef77302978); - Vector::push_back(&mut amounts, 111523246); - - Vector::push_back
(&mut payees, @0xcb2d06c3a74addc0c24a260052589ac3); - Vector::push_back(&mut amounts, 54795603); - - Vector::push_back
(&mut payees, @0x1ca1dfd4fee23462d155d1909c254b9e); - Vector::push_back(&mut amounts, 45663003); - - Vector::push_back
(&mut payees, @0xdcb2fc783086c450083025c6cc8bcffa); - Vector::push_back(&mut amounts, 667563854); - - Vector::push_back
(&mut payees, @0x0369fe43ee9c7dcb20f68b83e88070e2); - Vector::push_back(&mut amounts, 63928204); - - Vector::push_back
(&mut payees, @0x2849e871d598a80efdd6cd4712175778); - Vector::push_back(&mut amounts, 668371989); - - Vector::push_back
(&mut payees, @0x857b6a96c1aa657c799a0a4795c06a27); - Vector::push_back(&mut amounts, 244882484); - - Vector::push_back
(&mut payees, @0x81985123fc08730083aeb3c43e571ea0); - Vector::push_back(&mut amounts, 513017977); - - Vector::push_back
(&mut payees, @0x483912ac6b288bfb4214196f57c42233); - Vector::push_back(&mut amounts, 747778463); - - Vector::push_back
(&mut payees, @0x5b0e8d7061420bbd34020e7cb30eee92); - Vector::push_back(&mut amounts, 526254727); - - Vector::push_back
(&mut payees, @0x7b2307665a28ddf236dc3f85d80e5bc1); - Vector::push_back(&mut amounts, 150687910); - - Vector::push_back
(&mut payees, @0x52b312ba825c0221db204d8309664ca6); - Vector::push_back(&mut amounts, 45663003); - - Vector::push_back
(&mut payees, @0xf2daf2e7bc84b73b6313372b9bf02ff6); - Vector::push_back(&mut amounts, 50229303); - - Vector::push_back
(&mut payees, @0x4f4a003fe8b120dccd6a297769a133dd); - Vector::push_back(&mut amounts, 363337805); - - Vector::push_back
(&mut payees, @0xd5c73ddb537de9cd5ffcfaf4cabe9993); - Vector::push_back(&mut amounts, 394616775); - - Vector::push_back
(&mut payees, @0x77524524e0cfb068ddf0697cf8acec1a); - Vector::push_back(&mut amounts, 285587345); - - Vector::push_back
(&mut payees, @0x35274bc348fb2bcb985ff6932d903198); - Vector::push_back(&mut amounts, 172957634); - - Vector::push_back
(&mut payees, @0xc4a69ea9145bf62dc5d4053e02f5f229); - Vector::push_back(&mut amounts, 77627105); - - Vector::push_back
(&mut payees, @0xcf4fb0ffa8183068ca26717a2abded8e); - Vector::push_back(&mut amounts, 361141966); - - Vector::push_back
(&mut payees, @0x932f81ffeab9ee8e5bd23d956d82fd5a); - Vector::push_back(&mut amounts, 41096702); - - Vector::push_back
(&mut payees, @0x339daa27676dc8cd7f8ac0e3fab8b88e); - Vector::push_back(&mut amounts, 277812606); - - Vector::push_back
(&mut payees, @0x35bf49d82b8152239e754219baef8120); - Vector::push_back(&mut amounts, 667112854); - - Vector::push_back
(&mut payees, @0xd3f9025ee648032aeb94a7050ef92905); - Vector::push_back(&mut amounts, 236604950); - - Vector::push_back
(&mut payees, @0xc6266fe18746887a8e422ab2441d1025); - Vector::push_back(&mut amounts, 194401783); - - Vector::push_back
(&mut payees, @0xce46b966b18a6e8d6b57646e62ea02e6); - Vector::push_back(&mut amounts, 246223080); - - Vector::push_back
(&mut payees, @0xe176a87c6a110b40bdfd4c2783c84acd); - Vector::push_back(&mut amounts, 422699709); - - Vector::push_back
(&mut payees, @0x074fb162a8e5be5876696d6559abe6c8); - Vector::push_back(&mut amounts, 268990385); - - Vector::push_back
(&mut payees, @0x0321c2072e99888509f940a5fd026418); - Vector::push_back(&mut amounts, 54795603); - - Vector::push_back
(&mut payees, @0xaa1da533c4429f7474c877e925e8a85b); - Vector::push_back(&mut amounts, 466571116); - - Vector::push_back
(&mut payees, @0x4139a62b6402be843e5393a8219ce025); - Vector::push_back(&mut amounts, 147913205); - - Vector::push_back
(&mut payees, @0xb3f4d38fbdc6a6f01db1dd33db29213c); - Vector::push_back(&mut amounts, 143206460); - - Vector::push_back
(&mut payees, @0x9d302bdfdc1b5d9f0a660891047586e4); - Vector::push_back(&mut amounts, 185409627); - - Vector::push_back
(&mut payees, @0xd71def4ed1a1238316ddcd48f360b52f); - Vector::push_back(&mut amounts, 86478817); - - Vector::push_back
(&mut payees, @0xbbc0496adf84d45648693c09f953436a); - Vector::push_back(&mut amounts, 36530402); - - Vector::push_back
(&mut payees, @0x0633425583169f70e9c7c39974148ff6); - Vector::push_back(&mut amounts, 45382114); - - Vector::push_back
(&mut payees, @0x5a0ce015a5918455fb3157ca5a943907); - Vector::push_back(&mut amounts, 350797163); - - Vector::push_back
(&mut payees, @0x8256b8a3f0a1ee63077e34988e02b98e); - Vector::push_back(&mut amounts, 175398581); - - Vector::push_back
(&mut payees, @0x91c339d8627e9b893267d2a7cbf1c6a1); - Vector::push_back(&mut amounts, 283455879); - - Vector::push_back
(&mut payees, @0x018bcf3a0a4e458f795db0382d057f70); - Vector::push_back(&mut amounts, 322433341); - - Vector::push_back
(&mut payees, @0xfd069c15ccde693c65205a2603bdaec0); - Vector::push_back(&mut amounts, 45382114); - - Vector::push_back
(&mut payees, @0x551b7786efe84b2a1fcc8cd372da775b); - Vector::push_back(&mut amounts, 2046959643); - - Vector::push_back
(&mut payees, @0x68c2323669472bf032afdfeb61fb5932); - Vector::push_back(&mut amounts, 448335143); - - Vector::push_back
(&mut payees, @0x2cb405636112d867507241c27d6867bc); - Vector::push_back(&mut amounts, 1487342020); - - Vector::push_back
(&mut payees, @0x76fba8257f712260110386faab9f9d2f); - Vector::push_back(&mut amounts, 1182525136); - - Vector::push_back
(&mut payees, @0x6614752bbaaad3517f5ed636b6eea3ab); - Vector::push_back(&mut amounts, 660688647); - - Vector::push_back
(&mut payees, @0xf070db69f9ecaaf29756d75f23fc7d4e); - Vector::push_back(&mut amounts, 2011995192); - - Vector::push_back
(&mut payees, @0xdd830504381c4c7882f4237a76c36ff4); - Vector::push_back(&mut amounts, 771043261); - - Vector::push_back
(&mut payees, @0x37914e504f4988ea7e49745c56ffc8b7); - Vector::push_back(&mut amounts, 549161577); - - Vector::push_back
(&mut payees, @0xe4dea8e714841d287db280e2cb392399); - Vector::push_back(&mut amounts, 73745936); - - Vector::push_back
(&mut payees, @0x0afab595fa13301fcfa0fb06f37b2458); - Vector::push_back(&mut amounts, 124800815); - - Vector::push_back
(&mut payees, @0xfc5bcd22e5af43b0277dcbf112fbaba5); - Vector::push_back(&mut amounts, 617234749); - - Vector::push_back
(&mut payees, @0xa2cf93bf41f1ef666688a13887ab31f1); - Vector::push_back(&mut amounts, 214376044); - - Vector::push_back
(&mut payees, @0x48f64166916aa9772b38d0eacc2c39fe); - Vector::push_back(&mut amounts, 408439031); - - Vector::push_back
(&mut payees, @0x59267cbf7948dc2cf9e1322e16c1a219); - Vector::push_back(&mut amounts, 291599081); - - Vector::push_back
(&mut payees, @0xf84a16c7dfecde22f1fd9f8cf98f1a83); - Vector::push_back(&mut amounts, 383369974); - - Vector::push_back
(&mut payees, @0x70e39ba71f6eae4c8e9ecc933b4966c9); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0xaef95d49722f985d1f930b997048cad0); - Vector::push_back(&mut amounts, 726755822); - - Vector::push_back
(&mut payees, @0xd05afab90fd123d1f358051fd6c6dc2c); - Vector::push_back(&mut amounts, 68073171); - - Vector::push_back
(&mut payees, @0xb4bc62a24ed73fbdf0bf14d0bbaff184); - Vector::push_back(&mut amounts, 181071346); - - Vector::push_back
(&mut payees, @0x25bc49378e02dc7479c85a58cbb32752); - Vector::push_back(&mut amounts, 505243238); - - Vector::push_back
(&mut payees, @0x518ca4a436dd1feaf5f56c56a4741b94); - Vector::push_back(&mut amounts, 167255379); - - Vector::push_back
(&mut payees, @0xf8d297536e381388447c57f620385e0b); - Vector::push_back(&mut amounts, 197357751); - - Vector::push_back
(&mut payees, @0xb684ee806a83016f359d9f8b68d18389); - Vector::push_back(&mut amounts, 102109757); - - Vector::push_back
(&mut payees, @0x47d8883569022a9aa7b84988a2b24c40); - Vector::push_back(&mut amounts, 45382114); - - Vector::push_back
(&mut payees, @0xaacc3293044ff4248ef562642dbb1487); - Vector::push_back(&mut amounts, 431222526); - - Vector::push_back
(&mut payees, @0x33ad3e30b9a00c1ba64cc5ebbfdac53f); - Vector::push_back(&mut amounts, 431222526); - - Vector::push_back
(&mut payees, @0x99210a6a80a23a2e81b9e8d43911c259); - Vector::push_back(&mut amounts, 319231015); - - Vector::push_back
(&mut payees, @0x2b7a595813956b5c8936a2df44a1c631); - Vector::push_back(&mut amounts, 324903780); - - Vector::push_back
(&mut payees, @0x590b664996b61f0ba7c04302b2ab39f8); - Vector::push_back(&mut amounts, 308617374); - - Vector::push_back
(&mut payees, @0xe25fa72ee1d49509db8046af5762a262); - Vector::push_back(&mut amounts, 586857602); - - Vector::push_back
(&mut payees, @0xa95220bb6f0754b0e16806620c2d771e); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0x35f1be92bba1cc089abfc3fee61a5fdb); - Vector::push_back(&mut amounts, 85091464); - - Vector::push_back
(&mut payees, @0x66893b28460190e89fe5b6509c029d39); - Vector::push_back(&mut amounts, 147491872); - - Vector::push_back
(&mut payees, @0x984796dbd8fddd6b99aac4dd6f9018dc); - Vector::push_back(&mut amounts, 68073171); - - Vector::push_back
(&mut payees, @0x0fa7c5fad16c80bb5cf8fd95a8a8a7b7); - Vector::push_back(&mut amounts, 68073171); - - Vector::push_back
(&mut payees, @0xcd0d8ab1c68727dea1eb6c28449b3a6a); - Vector::push_back(&mut amounts, 56727643); - - Vector::push_back
(&mut payees, @0xfad4643c1aa10c75edab560ed6b1f7f9); - Vector::push_back(&mut amounts, 79418700); - - Vector::push_back
(&mut payees, @0x0ecb2ed8d0d51c79321de458e29abdd0); - Vector::push_back(&mut amounts, 527753844); - - Vector::push_back
(&mut payees, @0x0d924ab78b2e61605daa39121a8a9904); - Vector::push_back(&mut amounts, 1339394921); - - Vector::push_back
(&mut payees, @0x9dbf6d4ff6479be200ea98e263d1c578); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0x75153ae07570b17b844fc7b48540219b); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0x46709261fe51507e6e97eda908b68984); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0x742c5b3b96936a6bfc5f710d188edab8); - Vector::push_back(&mut amounts, 68073171); - - Vector::push_back
(&mut payees, @0xec0b3a04c5d7343a0162b6f89eca724e); - Vector::push_back(&mut amounts, 45382114); - - Vector::push_back
(&mut payees, @0xdaae0a3b344ca4ea83e922de51953953); - Vector::push_back(&mut amounts, 68073171); - - Vector::push_back
(&mut payees, @0xac78e7865d767c865422e7044fe235a4); - Vector::push_back(&mut amounts, 141819108); - - Vector::push_back
(&mut payees, @0x2f573453bc94242f9d0d21cd38a8ef7a); - Vector::push_back(&mut amounts, 119128050); - - Vector::push_back
(&mut payees, @0xa23967b5fb94827b3171d9fef56495fa); - Vector::push_back(&mut amounts, 446777044); - - Vector::push_back
(&mut payees, @0x06216d3d28ec5d40e15d2a712ff36df2); - Vector::push_back(&mut amounts, 291599081); - - Vector::push_back
(&mut payees, @0x0c2229175d585ec3e039e390248bd74b); - Vector::push_back(&mut amounts, 113455286); - - Vector::push_back
(&mut payees, @0x5ac9e7d76dd6b4e1d8e6c4911ba31162); - Vector::push_back(&mut amounts, 79418700); - - Vector::push_back
(&mut payees, @0xed695d235cca78408e994cef9679b4dc); - Vector::push_back(&mut amounts, 487218282); - - Vector::push_back
(&mut payees, @0xc32cfc1b467bdcde40d8bdcf6331dd9b); - Vector::push_back(&mut amounts, 250151180); - - Vector::push_back
(&mut payees, @0xd2968ac9af0d53c857b6670a4d205220); - Vector::push_back(&mut amounts, 107782522); - - Vector::push_back
(&mut payees, @0x4cfb6f3d01e3936885240872122b6983); - Vector::push_back(&mut amounts, 198546751); - - Vector::push_back
(&mut payees, @0x84eb2cd4cb51733aca009eb613409c96); - Vector::push_back(&mut amounts, 45382114); - - Vector::push_back
(&mut payees, @0x545d68ec0fc065549cea213872ea7718); - Vector::push_back(&mut amounts, 62400407); - - Vector::push_back
(&mut payees, @0x853b53a62487b0832e004599a09b1380); - Vector::push_back(&mut amounts, 73745936); - - Vector::push_back
(&mut payees, @0x997f427142dc717a8fd5eb91f79835b5); - Vector::push_back(&mut amounts, 73745936); - - Vector::push_back
(&mut payees, @0xc0609cdf03661517122272ce210dff1d); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0xa3824c6f6f2f6a0720144e5b3833f3e9); - Vector::push_back(&mut amounts, 349333388); - - Vector::push_back
(&mut payees, @0x53b948d1388883c8a90384021709e29d); - Vector::push_back(&mut amounts, 237067101); - - Vector::push_back
(&mut payees, @0xbcf3a89a0e296f3446671011c40187d7); - Vector::push_back(&mut amounts, 409263357); - - Vector::push_back
(&mut payees, @0x262df9e086ccea9728956ee3520f01f2); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0xe41fff19108b1575f01de8f1fdbe17ce); - Vector::push_back(&mut amounts, 62400407); - - Vector::push_back
(&mut payees, @0x61dafb7dc95649039a6697356f110914); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0xb041bbe1ce1ea612bb9a23226e3e6c29); - Vector::push_back(&mut amounts, 51054878); - - Vector::push_back
(&mut payees, @0x6ed8c29e14994752d6c3e425cc890c7d); - Vector::push_back(&mut amounts, 73745936); - - Vector::push_back
(&mut payees, @0xe7bb5d043ab0fb2c518c7c1814b03279); - Vector::push_back(&mut amounts, 651254791); - - Vector::push_back
(&mut payees, @0x7faafe3813c9f21c0921bf0242c0949d); - Vector::push_back(&mut amounts, 734669960); - - Vector::push_back
(&mut payees, @0x448b80a9364f6582ce25d2ddd613bbf1); - Vector::push_back(&mut amounts, 595990923); - - Vector::push_back
(&mut payees, @0xbe81559bf72a0133ea7344277944ee97); - Vector::push_back(&mut amounts, 193423537); - - Vector::push_back
(&mut payees, @0xc1b6a8a415986acf3493d9d31f05c003); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x0da6ece89ac2223de233ddd405d70d41); - Vector::push_back(&mut amounts, 1803000593); - - Vector::push_back
(&mut payees, @0x161ebe367da3c2d305c601efb23a3842); - Vector::push_back(&mut amounts, 1830459405); - - Vector::push_back
(&mut payees, @0x7f8b2ae3c1a7e4f7ea21c25f4b931eb0); - Vector::push_back(&mut amounts, 2037352665); - - Vector::push_back
(&mut payees, @0x7e27615ac1f4da431082bf5b7b342dbf); - Vector::push_back(&mut amounts, 1775022415); - - Vector::push_back
(&mut payees, @0x167e3325b2693ea01590ea2e5c9101cd); - Vector::push_back(&mut amounts, 873522118); - - Vector::push_back
(&mut payees, @0x52a7f98c8cf7701b0d8e6cb59b4fe832); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0x6bbf853aa6521db445e5cbdf3c85e8a0); - Vector::push_back(&mut amounts, 512748877); - - Vector::push_back
(&mut payees, @0xf590e19a24c2888334db174708dfbd0b); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x043d3751ec9090af793629af9adbc4b2); - Vector::push_back(&mut amounts, 193423537); - - Vector::push_back
(&mut payees, @0x5fca61c9c1bb04967dec25bcfe98d460); - Vector::push_back(&mut amounts, 179607570); - - Vector::push_back
(&mut payees, @0x28645f97dc28feb93d8a5b22c36695f0); - Vector::push_back(&mut amounts, 1095443200); - - Vector::push_back
(&mut payees, @0x09ec5ba66759923b87aa2eea84e117fb); - Vector::push_back(&mut amounts, 1123248256); - - Vector::push_back
(&mut payees, @0x243fdb5cdb96fe74384d2225e81fad58); - Vector::push_back(&mut amounts, 151975636); - - Vector::push_back
(&mut payees, @0x1a5e46a72a8574503793f19cec7d2eaa); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0x8212143e51d5f2226a78f90e18f87b72); - Vector::push_back(&mut amounts, 1081454111); - - Vector::push_back
(&mut payees, @0xdd0d67fb5b945af2e2ebed67b5320b39); - Vector::push_back(&mut amounts, 151975636); - - Vector::push_back
(&mut payees, @0x0e0e9dc4c70e04ec1ad4c1d2c87295a1); - Vector::push_back(&mut amounts, 568358989); - - Vector::push_back
(&mut payees, @0x162c6e46f9b8bd90da95396c24de7d66); - Vector::push_back(&mut amounts, 679232969); - - Vector::push_back
(&mut payees, @0x958401cc027adb189c260c0d95a05321); - Vector::push_back(&mut amounts, 693048936); - - Vector::push_back
(&mut payees, @0x0562e5f026c776672c9e088693a87c61); - Vector::push_back(&mut amounts, 234871438); - - Vector::push_back
(&mut payees, @0x78a858ca2f60acf6eaacd24da79270f0); - Vector::push_back(&mut amounts, 1067811266); - - Vector::push_back
(&mut payees, @0x09c17bfd67fb322b4e45437fcd5ba2e4); - Vector::push_back(&mut amounts, 803403550); - - Vector::push_back
(&mut payees, @0xc637db80787009d47b38692b3dbef311); - Vector::push_back(&mut amounts, 276319339); - - Vector::push_back
(&mut payees, @0xf685c6617a1da385ff063050c66d39f4); - Vector::push_back(&mut amounts, 179607570); - - Vector::push_back
(&mut payees, @0xcd74da19c9dd5964837a64c6f30bfa85); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0x6c2079f2652ec2379edda6b25edfcaab); - Vector::push_back(&mut amounts, 345399174); - - Vector::push_back
(&mut payees, @0x9c5c741d15305214d5e462123f886fab); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0xc13aab3b6fce5c48637a574a25837114); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0xf7c3620394644823c7dbe06e6f3bb834); - Vector::push_back(&mut amounts, 956591042); - - Vector::push_back
(&mut payees, @0x44454c09363ce9abbc2361e049eb8798); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0x95646b69c7923aafdea845243b73833f); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0x61ef5214950c0d1ceb5821159f097efb); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0xab2354cd25519c99dbefb5e834a8b0ab); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x525e8e1ddab877ccfa35a6f48b75db2c); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0xa8bc71884b49452b8b0f91dcfc75fdfe); - Vector::push_back(&mut amounts, 165791603); - - Vector::push_back
(&mut payees, @0x087de4465e98609eef0220f7f41a54f4); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0x8a2b458f9db9abfec736af847a51f18c); - Vector::push_back(&mut amounts, 207239504); - - Vector::push_back
(&mut payees, @0x6c4a16c5335e5efd43a68b3972e0ba95); - Vector::push_back(&mut amounts, 151975636); - - Vector::push_back
(&mut payees, @0xcd90575393b70840243fc07958f44224); - Vector::push_back(&mut amounts, 151975636); - - Vector::push_back
(&mut payees, @0xad0cf7b173f49fbca6622cec5e6757a9); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0xbdc99df21f6d74ed830d5ff4b0852dcd); - Vector::push_back(&mut amounts, 193423537); - - Vector::push_back
(&mut payees, @0xb2845332916ef9531aa6857e16bcc8f3); - Vector::push_back(&mut amounts, 151975636); - - Vector::push_back
(&mut payees, @0x10af593f3eac1a2afcd4f0f10dddd06b); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x566d7a0992c862423a348faf91bcc70a); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x37336c6601106a2f712684fe89957670); - Vector::push_back(&mut amounts, 179607570); - - Vector::push_back
(&mut payees, @0x3487ca9164a7d154d6a81d185cb8a5ff); - Vector::push_back(&mut amounts, 1109432289); - - Vector::push_back
(&mut payees, @0x87c133a00bfea159dc1a05accda1cb7d); - Vector::push_back(&mut amounts, 1594202989); - - Vector::push_back
(&mut payees, @0xe675af36602a42416ae7c66d77838595); - Vector::push_back(&mut amounts, 457311887); - - Vector::push_back
(&mut payees, @0x4bb570012de9cd232168e430e0c25ff4); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0xe05703208d91150006cd5a94d3b1b205); - Vector::push_back(&mut amounts, 165791603); - - Vector::push_back
(&mut payees, @0xa07e910705d8c86bebcc9d167077fb9a); - Vector::push_back(&mut amounts, 276319339); - - Vector::push_back
(&mut payees, @0x3c1db44b32ef6cf8246cf71374316dc4); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0xdeacb44b53bb7639215ba8fde98f644b); - Vector::push_back(&mut amounts, 345399174); - - Vector::push_back
(&mut payees, @0xc14e980bf0a8dbf91d5913d675a749a0); - Vector::push_back(&mut amounts, 193423537); - - Vector::push_back
(&mut payees, @0x458bede653920b60ce1ba104f6a72ea2); - Vector::push_back(&mut amounts, 138159669); - - Vector::push_back
(&mut payees, @0xfc266a66c09c52f80c293e8994ae9fdd); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0xf5b539356e3309b0288315a5d13a84b0); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x90d5bfad7e2a969b6330541c778f04ab); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0x4fd92aa3ac6997723fa4d3ffa03b1161); - Vector::push_back(&mut amounts, 110527735); - - Vector::push_back
(&mut payees, @0xbe58a111534f6cc6600f396797335d1a); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0x7184e99882a7dad485f986ec5497a999); - Vector::push_back(&mut amounts, 124343702); - - Vector::push_back
(&mut payees, @0xd340c54f3a05c06835b1401c3575b70d); - Vector::push_back(&mut amounts, 332968184); - - Vector::push_back
(&mut payees, @0x9e14ff5d98440ebe931d272d22f54339); - Vector::push_back(&mut amounts, 1331872738); - - Vector::push_back
(&mut payees, @0x47866a4a33eb940276cda0049723eabd); - Vector::push_back(&mut amounts, 665936369); - - Vector::push_back
(&mut payees, @0x67d12fa2447d990fc68f98bf1def5e1b); - Vector::push_back(&mut amounts, 541073300); - - Vector::push_back
(&mut payees, @0xea0d82c146221be69781ed76c7036f81); - Vector::push_back(&mut amounts, 541073300); - - Vector::push_back
(&mut payees, @0xdfab40c8938a335ed19ff2282d7fb46e); - Vector::push_back(&mut amounts, 832420461); - - Vector::push_back
(&mut payees, @0x54da7b62547f3094362b12e4cbbb24d2); - Vector::push_back(&mut amounts, 457831253); - - Vector::push_back
(&mut payees, @0x763a077e0efa9a5ce86cd5c9fadde32b); - Vector::push_back(&mut amounts, 790799438); - - Vector::push_back
(&mut payees, @0x04896fb4b9749632ccde3081b5585f88); - Vector::push_back(&mut amounts, 1165388646); - - Vector::push_back
(&mut payees, @0xf1338321d882fd3a41f1481559cced57); - Vector::push_back(&mut amounts, 374589207); - - Vector::push_back
(&mut payees, @0x61b9e3efaff5baa99aad9989fd8b4297); - Vector::push_back(&mut amounts, 582694323); - - Vector::push_back
(&mut payees, @0x2916277a12c25d7d578bc451d2cfc6e0); - Vector::push_back(&mut amounts, 665936369); - - Vector::push_back
(&mut payees, @0xdb1e46f2dac5e9815e9e565c6888f4a4); - Vector::push_back(&mut amounts, 416210230); - - Vector::push_back
(&mut payees, @0xbdd73d130c53d1343d11b0af06e14946); - Vector::push_back(&mut amounts, 790799438); - - Vector::push_back
(&mut payees, @0x2500006ba450c852a915f65236ea1b6e); - Vector::push_back(&mut amounts, 332968184); - - Vector::push_back
(&mut payees, @0x2be889b2fc61f7a8f755188fa9d487cc); - Vector::push_back(&mut amounts, 374589207); - - Vector::push_back
(&mut payees, @0x3f9fb9373492a3ec10714214ab53f071); - Vector::push_back(&mut amounts, 874041484); - - Vector::push_back
(&mut payees, @0xb2e86a1bee0e63602920eaa90a37c91e); - Vector::push_back(&mut amounts, 582694323); - - let i = 0; - let total = 0; - let paid = Vector::empty(); - - while (i < Vector::length(&amounts)) { - total = total + *Vector::borrow(&amounts, i); - i = i + 1; - Vector::push_back(&mut paid, false); - }; - - let coins = Diem::mint(vm, total); - - move_to( - vm, - Payments{ - payees: payees, - amounts: amounts, - paid: paid, - coins: coins - } - ); - }; - } - - // add a custom list for testing purposes only. Requires vm as signer - public fun make_whole_test(vm: &signer, payees: vector
, amounts: vector){ - CoreAddresses::assert_diem_root(vm); - if (!exists(CoreAddresses::DIEM_ROOT_ADDRESS())) { - let i = 0; - let total = 0; - let paid = Vector::empty(); - - while (i < Vector::length(&amounts)) { - total = total + *Vector::borrow(&amounts, i); - i = i + 1; - Vector::push_back(&mut paid, false); - }; - - let coins = Diem::mint(vm, total); - - move_to( - vm, - Payments{ - payees: payees, - amounts: amounts, - paid: paid, - coins: coins - } - ); - }; - } - - /// claims the make whole payment and returns the amount paid out - /// ensures that the caller is the one owed the payment at index i - public fun claim_make_whole_payment(account: &signer, i: u64): u64 acquires Payments{ - // find amount - let addr = Signer::address_of(account); - let payments = borrow_global_mut( - CoreAddresses::DIEM_ROOT_ADDRESS() - ); - - //make sure sender is the one owed funds and that the funds have not been paid - //if i is invalid (<0 or >length) vector will throw error - assert(*Vector::borrow
(&payments.payees, i) == addr, Errors::internal(EWRONG_PAYEE)); - assert(*Vector::borrow(&payments.paid, i) == false, Errors::internal(EALREADY_PAID)); - - let amount = *Vector::borrow(&payments.amounts, i); - - - if (amount > 0) { - //make the payment - let to_pay = Diem::withdraw(&mut payments.coins, amount); - - DiemAccount::deposit( - CoreAddresses::DIEM_ROOT_ADDRESS(), - Signer::address_of(account), - to_pay, - b"carpe miner make whole", - b"" - ); - - - //clear the payment from the list - mark_paid(account, i); - }; - //return the amount paid out - amount - - } - - /// queries whether or not a make whole payment is available for addr - /// returns (amount, index) if a payment exists, else (0, 0) - public fun query_make_whole_payment(addr: address): (u64, u64) acquires Payments { - let payments = borrow_global( - CoreAddresses::DIEM_ROOT_ADDRESS() - ); - - let (found, i) = Vector::index_of
(&payments.payees, &addr); - - if (found && *Vector::borrow(&payments.paid, i) == false) { - (*Vector::borrow(&payments.amounts, i), i) - } - else { - (0, 0) - } - } - - /// marks the payment at index i as paid after confirming the signer is the one owed funds - fun mark_paid(account: &signer, i: u64) acquires Payments { - let addr = Signer::address_of(account); - - let payments = borrow_global_mut( - CoreAddresses::DIEM_ROOT_ADDRESS() - ); - - assert (addr == *Vector::borrow
(&payments.payees, i), Errors::internal(EPAYEE_NOT_DELETED)); - - let p = Vector::borrow_mut(&mut payments.paid, i); - *p = true; - } - - } -} \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/sources/0L/Mock.move b/diem-move/diem-framework/DPN/sources/0L/Mock.move index daf985a136..f2a351e330 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Mock.move +++ b/diem-move/diem-framework/DPN/sources/0L/Mock.move @@ -2,20 +2,23 @@ address DiemFramework { module Mock { - // use DiemFramework::DiemSystem; - use DiemFramework::TowerState; + // use DiemFramework::TowerState; use Std::Vector; use DiemFramework::Stats; use DiemFramework::Cases; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; + use DiemFramework::Testnet; + use DiemFramework::ValidatorUniverse; + use DiemFramework::DiemAccount; + use DiemFramework::ProofOfFee; + use DiemFramework::DiemSystem; public fun mock_case_1(vm: &signer, addr: address, start_height: u64, end_height: u64){ - print(&addr); // can only apply this to a validator // assert!(DiemSystem::is_validator(addr) == true, 777701); // mock mining for the address // the validator would already have 1 proof from genesis - TowerState::test_helper_mock_mining_vm(vm, addr, 10); + // TowerState::test_helper_mock_mining_vm(vm, addr, 10); // mock the consensus votes for the address let voters = Vector::empty
(); @@ -32,36 +35,107 @@ module Mock { i = i + 1; }; + // print(&addr); + // print(&Cases::get_case(vm, addr, start_height, end_height)); // TODO: careful that the range of heights is within the test assert!(Cases::get_case(vm, addr, start_height, end_height) == 1, 777703); } + // V6: deprecated + + // // did not do enough mining, but did validate. + // public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64){ + // // can only apply this to a validator + // // assert!(DiemSystem::is_validator(addr) == true, 777704); + // // mock mining for the address + // // insufficient number of proofs + // // TowerState::test_helper_mock_mining_vm(vm, addr, 0); + // // assert!(TowerState::get_count_in_epoch(addr) == 0, 777705); + + // // mock the consensus votes for the address + // let voters = Vector::singleton
(addr); + + // let num_blocks = end_height - start_height; + // // Overwrite the statistics to mock that all have been validating. + // let i = 1; + // let above_thresh = num_blocks / 2; // just be above 5% signatures + + // while (i < above_thresh) { + // // Mock the validator doing work for 15 blocks, and stats being updated. + // Stats::process_set_votes(vm, &voters); + // i = i + 1; + // }; + + // // TODO: careful that the range of heights is within the test + // assert!(Cases::get_case(vm, addr, start_height, end_height) == 2, 777706); + + // } + // did not do enough mining, but did validate. - public fun mock_case_2(vm: &signer, addr: address, start_height: u64, end_height: u64){ - // can only apply this to a validator - // assert!(DiemSystem::is_validator(addr) == true, 777704); - // mock mining for the address - // insufficient number of proofs - TowerState::test_helper_mock_mining_vm(vm, addr, 0); - // assert!(TowerState::get_count_in_epoch(addr) == 0, 777705); + public fun mock_case_4(vm: &signer, addr: address, start_height: u64, end_height: u64){ - // mock the consensus votes for the address let voters = Vector::singleton
(addr); - let num_blocks = end_height - start_height; // Overwrite the statistics to mock that all have been validating. let i = 1; - let above_thresh = num_blocks / 2; // just be above 5% signatures - + let above_thresh = 1; // just be above 5% signatures + Stats::test_helper_remove_votes(vm, addr); while (i < above_thresh) { // Mock the validator doing work for 15 blocks, and stats being updated. + Stats::process_set_votes(vm, &voters); i = i + 1; }; - + // print(&Cases::get_case(vm, addr, start_height, end_height) ); // TODO: careful that the range of heights is within the test - assert!(Cases::get_case(vm, addr, start_height, end_height) == 2, 777706); + assert!(Cases::get_case(vm, addr, start_height, end_height) == 4, 777706); + + } + + // Mockl all nodes being compliant case 1 + public fun all_good_validators(vm: &signer) { + + Testnet::assert_testnet(vm); + let vals = DiemSystem::get_val_set_addr(); + + let i = 0; + while (i < Vector::length(&vals)) { + + let a = Vector::borrow(&vals, i); + mock_case_1(vm, *a, 0, 15); + i = i + 1; + }; + + } + + //////// PROOF OF FEE //////// + public fun pof_default(vm: &signer): (vector
, vector, vector){ + + Testnet::assert_testnet(vm); + let vals = ValidatorUniverse::get_eligible_validators(); + + let bids = Vector::empty(); + let expiry = Vector::empty(); + let i = 0; + let prev = 0; + let fib = 1; + while (i < Vector::length(&vals)) { + + Vector::push_back(&mut expiry, 1000); + let b = prev + fib; + Vector::push_back(&mut bids, b); + + let a = Vector::borrow(&vals, i); + let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a); + // initialize and set. + ProofOfFee::set_bid(&sig, b, 1000); + prev = fib; + fib = b; + i = i + 1; + }; + DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators + (vals, bids, expiry) } } } \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/sources/0L/MultiSig.move b/diem-move/diem-framework/DPN/sources/0L/MultiSig.move index db440fa585..d83c0afb35 100644 --- a/diem-move/diem-framework/DPN/sources/0L/MultiSig.move +++ b/diem-move/diem-framework/DPN/sources/0L/MultiSig.move @@ -24,7 +24,7 @@ module MultiSig { use DiemFramework::DiemAccount::{Self, WithdrawCapability}; use DiemFramework::Ballot::{Self, BallotTracker}; use DiemFramework::DiemConfig; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; const EGOV_NOT_INITIALIZED: u64 = 440000; @@ -268,32 +268,32 @@ module MultiSig { multisig_address: address, proposal_data: Proposal, ): GUID::ID acquires Governance, Action { - print(&20); + // print(&20); assert_authorized(sig, multisig_address); -print(&21); +// print(&21); let ms = borrow_global_mut(multisig_address); let action = borrow_global_mut>(multisig_address); - print(&22); + // print(&22); // go through all proposals and clean up expired ones. lazy_cleanup_expired(action); -print(&23); +// print(&23); // does this proposal already exist in the pending list? let (found, guid, _idx, status_enum, _is_complete) = search_proposals_for_guid(&action.vote, &proposal_data); - print(&found); - print(&status_enum); - print(&24); + // print(&found); + // print(&status_enum); + // print(&24); if (found && status_enum == Ballot::get_pending_enum()) { - print(&2401); + // print(&2401); // this exact proposal is already pending, so we we will just return the guid of the existing proposal. // we'll let the caller decide what to do (we wont vote by default) return guid }; -print(&25); +// print(&25); let ballot = Ballot::propose_ballot(&mut action.vote, &ms.guid_capability, proposal_data); -print(&26); +// print(&26); let id = Ballot::get_ballot_id(ballot); -print(&27); +// print(&27); id } @@ -332,26 +332,26 @@ print(&27); id: &GUID::ID ): (bool, Option) acquires Governance, Action { - print(&60); + // print(&60); assert_authorized(sig, multisig_address); // belt and suspenders let ms = borrow_global_mut(multisig_address); let action = borrow_global_mut>(multisig_address); - print(&61); + // print(&61); lazy_cleanup_expired(action); - print(&62); + // print(&62); // does this proposal already exist in the pending list? let (found, _idx, status_enum, is_complete) = Ballot::find_anywhere>(&action.vote, id); - print(&63); + // print(&63); assert!((found && status_enum == Ballot::get_pending_enum() && !is_complete), Errors::invalid_argument(EPROPOSAL_NOT_FOUND)); - print(&64); + // print(&64); let b = Ballot::get_ballot_by_id_mut(&mut action.vote, id); let t = Ballot::get_type_struct_mut(b); - print(&65); + // print(&65); Vector::push_back(&mut t.votes, Signer::address_of(sig)); - print(&66); + // print(&66); let passed = tally(t, *&ms.cfg_default_n_sigs); - print(&67); + // print(&67); if (passed) { Ballot::complete_ballot(b); @@ -370,21 +370,21 @@ print(&27); Option::none() }; - print(&withdraw_cap); - print(&68); + // print(&withdraw_cap); + // print(&68); (passed, withdraw_cap) } fun tally(prop: &mut Proposal, n: u64): bool { - print(&40001); + // print(&40001); - print(&prop.votes); + // print(&prop.votes); if (Vector::length(&prop.votes) >= n) { prop.approved = true; - print(&40002); + // print(&40002); return true }; @@ -395,22 +395,22 @@ print(&27); fun find_expired(a: & Action): vector{ - print(&40); + // print(&40); let epoch = DiemConfig::get_current_epoch(); let b_vec = Ballot::get_list_ballots_by_enum(&a.vote, Ballot::get_pending_enum()); let id_vec = Vector::empty(); - print(&41); + // print(&41); let i = 0; while (i < Vector::length(b_vec)) { - print(&4101); + // print(&4101); let b = Vector::borrow(b_vec, i); let t = Ballot::get_type_struct>(b); if (epoch > t.expiration_epoch) { - print(&4010101); + // print(&4010101); let id = Ballot::get_ballot_id(b); - print(&4010102); + // print(&4010102); Vector::push_back(&mut id_vec, id); }; @@ -422,9 +422,9 @@ print(&27); fun lazy_cleanup_expired(a: &mut Action) { let expired_vec = find_expired(a); - print(&expired_vec); + // print(&expired_vec); let len = Vector::length(&expired_vec); - print(&len); + // print(&len); let i = 0; while (i < len) { let id = Vector::borrow(&expired_vec, i); diff --git a/diem-move/diem-framework/DPN/sources/0L/MultiSigPayment.move b/diem-move/diem-framework/DPN/sources/0L/MultiSigPayment.move index eb6b45b432..9fdbc56a5b 100644 --- a/diem-move/diem-framework/DPN/sources/0L/MultiSigPayment.move +++ b/diem-move/diem-framework/DPN/sources/0L/MultiSigPayment.move @@ -50,7 +50,7 @@ module MultiSigPayment { use Std::Signer; use Std::GUID; use DiemFramework::DiemAccount::{Self, WithdrawCapability}; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::GAS::GAS; use DiemFramework::MultiSig; use DiemFramework::CoreAddresses; @@ -101,39 +101,39 @@ module MultiSigPayment { public fun propose_payment(sig: &signer, multisig_addr: address, recipient: address, amount: u64, note: vector, duration_epochs: Option) { - print(&10); + // print(&10); let pay = new_payment(recipient, amount, *¬e); - print(&11); + // print(&11); let prop = MultiSig::proposal_constructor(pay, duration_epochs); - print(&12); + // print(&12); let guid = MultiSig::propose_new(sig, multisig_addr, prop); - print(&guid); - print(&13); + // print(&guid); + // print(&13); vote_payment(sig, multisig_addr, &guid); - print(&14); + // print(&14); } public fun vote_payment(sig: &signer, multisig_address: address, id: &GUID::ID) { - print(&50); + // print(&50); let (passed, cap_opt) = MultiSig::vote_with_id(sig, id, multisig_address); - print(&passed); - // print(&data); - print(&cap_opt); + // print(&passed); + // // print(&data); + // print(&cap_opt); - print(&51); + // print(&51); if (passed && Option::is_some(&cap_opt)) { let cap = Option::borrow(&cap_opt); - print(&5010); + // print(&5010); let data = MultiSig::extract_proposal_data(multisig_address, id); release_payment(&data, cap); - print(&5011); + // print(&5011); }; MultiSig::maybe_restore_withdraw_cap(sig, multisig_address, cap_opt); // don't need this and can't drop. - print(&52); + // print(&52); } @@ -148,7 +148,7 @@ module MultiSigPayment { // Withdrawal capabilities are "hot potato" data. Meaning, they cannot ever be dropped and need to be moved to a final resting place, or returned to the struct that was housing it. That is what happens at the end of release_payment, it is only borrowed, and never leaves the data structure. fun release_payment(p: &PaymentType, cap: &WithdrawCapability) { - print(&90001); + // print(&90001); DiemAccount::pay_from( cap, p.destination, @@ -188,15 +188,15 @@ module MultiSigPayment { let reg = borrow_global(@VMReserved); let i = 0; while (i < Vector::length(®.list)) { - print(&7777777790001); + // print(&7777777790001); let multi_sig_addr = Vector::borrow(®.list, i); let pct = FixedPoint32::create_from_rational(reg.fee, PERCENT_SCALE); - print(&pct); + // print(&pct); let fee = FixedPoint32::multiply_u64(DiemAccount::balance(*multi_sig_addr), pct); - print(&fee); + // print(&fee); let c = DiemAccount::vm_withdraw(vm, *multi_sig_addr, fee); - TransactionFee::pay_fee(c); + TransactionFee::pay_fee_and_track(*multi_sig_addr, c); i = i + 1; }; diff --git a/diem-move/diem-framework/DPN/sources/0L/ProofOfFee.move b/diem-move/diem-framework/DPN/sources/0L/ProofOfFee.move new file mode 100644 index 0000000000..80cd944411 --- /dev/null +++ b/diem-move/diem-framework/DPN/sources/0L/ProofOfFee.move @@ -0,0 +1,682 @@ +///////////////////////////////////////////////////////////////////////// +// 0L Module +// Proof of Fee +///////////////////////////////////////////////////////////////////////// +// NOTE: this module replaces NodeWeight.move, which becomes redundant since +// all validators have equal weight in consensus. +// TODO: the bubble sort functions were lifted directly from NodeWeight, needs checking. +/////////////////////////////////////////////////////////////////////////// + + +//// V6 //// +address DiemFramework { + module ProofOfFee { + use Std::Errors; + use DiemFramework::DiemConfig; + // use DiemFramework::ValidatorConfig; + use Std::Signer; + use DiemFramework::ValidatorUniverse; + use Std::Vector; + use DiemFramework::Jail; + use DiemFramework::DiemAccount; + // use DiemFramework::Debug::print; + use DiemFramework::Vouch; + use Std::FixedPoint32; + use DiemFramework::Testnet; + use DiemFramework::ValidatorConfig; + + const ENOT_AN_ACTIVE_VALIDATOR: u64 = 190001; + const EBID_ABOVE_MAX_PCT: u64 = 190002; + const EABOVE_RETRACT_LIMIT: u64 = 190003; // Potential update + + + const GENESIS_BASELINE_REWARD: u64 = 1000000; + + + // A struct on the validators account which indicates their + // latest bid (and epoch) + struct ProofOfFeeAuction has key { + bid: u64, + epoch_expiration: u64, + last_epoch_retracted: u64, + // TODO: show past 5 bids + } + + struct ConsensusReward has key { + value: u64, + clearing_price: u64, + median_win_bid: u64, + median_history: vector, + } + public fun init_genesis_baseline_reward(vm: &signer) { + if (Signer::address_of(vm) != @VMReserved) return; + + if (!exists(@VMReserved)) { + move_to( + vm, + ConsensusReward { + value: GENESIS_BASELINE_REWARD, + clearing_price: 0, + median_win_bid: 0, + median_history: Vector::empty(), + } + ); + } + } + + public fun init(account_sig: &signer) { + + let acc = Signer::address_of(account_sig); + + assert!(ValidatorUniverse::is_in_universe(acc), Errors::requires_role(ENOT_AN_ACTIVE_VALIDATOR)); + + if (!exists(acc)) { + move_to( + account_sig, + ProofOfFeeAuction { + bid: 0, + epoch_expiration: 0, + last_epoch_retracted: 0, + } + ); + } + } + + + + + + + //////// CONSENSUS CRITICAL //////// + // Get the validator universe sorted by bid + // By default this will return a FILTERED list of validators + // which excludes validators which cannot pass the audit. + // Leaving the unfiltered option for testing purposes, and any future use. + // TODO: there's a known issue when many validators have the exact same + // bid, the preferred node will be the one LAST included in the validator universe. + public fun get_sorted_vals(unfiltered: bool): vector
acquires ProofOfFeeAuction, ConsensusReward { + let eligible_validators = ValidatorUniverse::get_eligible_validators(); + let length = Vector::length
(&eligible_validators); + // print(&length); + // Vector to store each address's node_weight + let weights = Vector::empty(); + let filtered_vals = Vector::empty
(); + let k = 0; + while (k < length) { + // TODO: Ensure that this address is an active validator + + let cur_address = *Vector::borrow
(&eligible_validators, k); + let (bid, _expire) = current_bid(cur_address); + // print(&bid); + // print(&expire); + if (!unfiltered && !audit_qualification(&cur_address)) { + k = k + 1; + continue + }; + Vector::push_back(&mut weights, bid); + Vector::push_back
(&mut filtered_vals, cur_address); + k = k + 1; + }; + + // print(&weights); + + // Sorting the accounts vector based on value (weights). + // Bubble sort algorithm + let len_filtered = Vector::length
(&filtered_vals); + // print(&len_filtered); + // print(&Vector::length(&weights)); + if (len_filtered < 2) return filtered_vals; + let i = 0; + while (i < len_filtered){ + let j = 0; + while(j < len_filtered-i-1){ + // print(&8888801); + + let value_j = *(Vector::borrow(&weights, j)); + // print(&8888802); + let value_jp1 = *(Vector::borrow(&weights, j+1)); + if(value_j > value_jp1){ + // print(&8888803); + Vector::swap(&mut weights, j, j+1); + // print(&8888804); + Vector::swap
(&mut filtered_vals, j, j+1); + }; + j = j + 1; + // print(&8888805); + }; + i = i + 1; + // print(&8888806); + }; + + // print(&filtered_vals); + // Reverse to have sorted order - high to low. + Vector::reverse
(&mut filtered_vals); + + return filtered_vals + } + + // Here we place the bidders into their seats. + // The order of the bids will determine placement. + // One important aspect of picking the next validator set: + // it should have 2/3rds of known good ("proven") validators + // from the previous epoch. Otherwise the unproven nodes, who + // may not be ready for consensus, might be offline and cause a halt. + // Validators can be inattentive and have bids that qualify, but their nodes + // are not ready. + // So the selection algorithm needs to stop filling seats with "unproven" + // validators if the max unproven nodes limit is hit (1/3). + + // The paper does not specify what happens with the "Jail reputation" + // of a validator. E.g. if a validator has a bid with no expiry + // but has a bad jail reputation does this penalize in the ordering? + // This is a potential issue again with inattentive validators who + // have have a high bid, but again they fail repeatedly to finalize an epoch + // successfully. Their bids should not penalize validators who don't have + // a streak of jailed epochs. So of the 1/3 unproven nodes, we'll first seat the validators with Jail.consecutive_failure_to_rejoin < 2, and after that the remainder. + + // There's some code implemented which is not enabled in the current form. + // Unsealed auctions are tricky. The Proof Of Fee + // paper states that since the bids are not private, we need some + // constraint to minimize shill bids, "bid shading" or other strategies + // which allow validators to drift from their private valuation. + // As such per epoch the validator is only allowed to revise their bids / + // down once. To do this in practice they need to retract a bid (sit out + // the auction), and then place a new bid. + // A validator can always leave the auction, but if they rejoin a second time in the epoch, then they've committed a bid until the next epoch. + // So retracting should be done with care. The ergonomics are not great. + // The preference would be not to have this constraint if on the margins + // the ergonomics brings more bidders than attackers. + // After more experience in the wild, the network may decide to + // limit bid retracting. + + + // The Validator must qualify on a number of metrics: have funds in their Unlocked account to cover bid, have miniumum viable vouches, and not have been jailed in the previous round. + + + // This function assumes we have already filtered out ineligible validators. + // but we will check again here. + public fun fill_seats_and_get_price( + vm: &signer, + set_size: u64, + sorted_vals_by_bid: &vector
, + proven_nodes: &vector
+ ): (vector
, u64) acquires ProofOfFeeAuction, ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) return (Vector::empty
(), 0); + + //print(sorted_vals_by_bid); + + // let (baseline_reward, _, _) = get_consensus_reward(); + + let seats_to_fill = Vector::empty
(); + + // check the max size of the validator set. + // there may be too few "proven" validators to fill the set with 2/3rds proven nodes of the stated set_size. + let proven_len = Vector::length(proven_nodes); + + // check if the proven len plus unproven quota will + // be greater than the set size. Which is the expected. + // Otherwise the set will need to be smaller than the + // declared size, because we will have to fill with more unproven nodes. + let one_third_of_max = proven_len/2; + let safe_set_size = proven_len + one_third_of_max; + // print(&77777777); + // print(&proven_len); + // print(&one_third_of_max); + // print(&safe_set_size); + + let (set_size, max_unproven) = if (safe_set_size < set_size) { + (safe_set_size, safe_set_size/3) + // if (safe_set_size < 5) { // safety. mostly for test scenarios given rounding issues + // (safe_set_size, 1) + // } else { + + // } + + } else { + // happy case, unproven bidders are a smaller minority + (set_size, set_size/3) + }; + // print(&set_size); + // print(&max_unproven); + + + // print(&8006010201); + + // Now we can seat the validators based on the algo above: + // 1. seat the proven nodes of previous epoch + // 2. seat validators who did not participate in the previous epoch: + // 2a. seat the vals with jail reputation < 2 + // 2b. seat the remainder of the unproven vals with any jail reputation. + + let num_unproven_added = 0; + let i = 0u64; + while ( + (Vector::length(&seats_to_fill) < set_size) && + (i < Vector::length(sorted_vals_by_bid)) + ) { + // // print(&i); + let val = Vector::borrow(sorted_vals_by_bid, i); + + // // belt and suspenders, we get_sorted_vals(true) should filter ineligible validators + // if (!audit_qualification(val, baseline_reward)) { + // i = i + 1; + // continue + // }; + + + // check if a proven node + if (Vector::contains(proven_nodes, val)) { + // print(&8006010205); + // // print(&01); + Vector::push_back(&mut seats_to_fill, *val); + } else { + // print(&8006010206); + // print(&max_unproven); + // print(&num_unproven_added); + // // print(&02); + // for unproven nodes, push it to list if we haven't hit limit + if (num_unproven_added < max_unproven ) { + // TODO: check jail reputation + // // print(&03); + Vector::push_back(&mut seats_to_fill, *val); + // // print(&04); + // print(&8006010207); + num_unproven_added = num_unproven_added + 1; + }; + }; + // don't advance if we havent filled + i = i + 1; + }; + // // print(&05); + // print(&8006010208); + // print(&seats_to_fill); + + + + // Set history + set_history(vm, &seats_to_fill); + + // we failed to seat anyone. + // let EpochBoundary deal with this. + if (Vector::is_empty(&seats_to_fill)) { + // print(&8006010209); + + return (seats_to_fill, 0) + }; + + // Find the clearing price which all validators will pay + let lowest_bidder = Vector::borrow(&seats_to_fill, Vector::length(&seats_to_fill) - 1); + + let (lowest_bid_pct, _) = current_bid(*lowest_bidder); + + // print(&lowest_bid_pct); + + // update the clearing price + let cr = borrow_global_mut(@VMReserved); + cr.clearing_price = lowest_bid_pct; + + return (seats_to_fill, lowest_bid_pct) + } + + // consolidate all the checks for a validator to be seated + public fun audit_qualification(val: &address): bool acquires ProofOfFeeAuction, ConsensusReward { + + // Safety check: node has valid configs + if (!ValidatorConfig::is_valid(*val)) return false; + // has operator account set to another address + let oper = ValidatorConfig::get_operator(*val); + if (oper == *val) return false; + + // is a slow wallet + if (!DiemAccount::is_slow(*val)) return false; + + // print(&8006010203); + // we can't seat validators that were just jailed + // NOTE: epoch reconfigure needs to reset the jail + // before calling the proof of fee. + if (Jail::is_jailed(*val)) return false; + // print(&8006010204); + // we can't seat validators who don't have minimum viable vouches + if (!Vouch::unrelated_buddies_above_thresh(*val)) return false; + + // print(&80060102041); + + let (bid, expire) = current_bid(*val); + //print(val); + // print(&bid); + // print(&expire); + + // Skip if the bid expired. belt and suspenders, this should have been checked in the sorting above. + // TODO: make this it's own function so it can be publicly callable, it's useful generally, and for debugging. + // print(&DiemConfig::get_current_epoch()); + if (DiemConfig::get_current_epoch() > expire) return false; + + // skip the user if they don't have sufficient UNLOCKED funds + // or if the bid expired. + // print(&80060102042); + let unlocked_coins = DiemAccount::unlocked_amount(*val); + // print(&unlocked_coins); + + let (baseline_reward, _, _) = get_consensus_reward(); + let coin_required = FixedPoint32::multiply_u64(baseline_reward, FixedPoint32::create_from_rational(bid, 1000)); + + // print(&coin_required); + if (unlocked_coins < coin_required) return false; + + // print(&80060102043); + true + } + // Adjust the reward at the end of the epoch + // as described in the paper, the epoch reward needs to be adjustable + // given that the implicit bond needs to be sufficient, eg 5-10x the reward. + public fun reward_thermostat(vm: &signer) acquires ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + // check the bid history + // if there are 5 days above 95% adjust the reward up by 5% + // adjust by more if it has been 10 days then, 10% + // if there are 5 days below 50% adjust the reward down. + // adjust by more if it has been 10 days then 10% + + let bid_upper_bound = 0950; + let bid_lower_bound = 0500; + + let short_window: u64 = 5; + let long_window: u64 = 10; + + let cr = borrow_global_mut(@VMReserved); + + // print(&8006010551); + let len = Vector::length(&cr.median_history); + let i = 0; + + let epochs_above = 0; + let epochs_below = 0; + while (i < 16 && i < len) { // max ten days, but may have less in history, filling set should truncate the history at 15 epochs. + // print(&8006010552); + let avg_bid = *Vector::borrow(&cr.median_history, i); + // print(&8006010553); + if (avg_bid > bid_upper_bound) { + epochs_above = epochs_above + 1; + } else if (avg_bid < bid_lower_bound) { + epochs_below = epochs_below + 1; + }; + + i = i + 1; + }; + + // print(&8006010554); + if (cr.value > 0) { + // print(&8006010555); + // print(&epochs_above); + // print(&epochs_below); + + + // TODO: this is an initial implementation, we need to + // decide if we want more granularity in the reward adjustment + // Note: making this readable for now, but we can optimize later + if (epochs_above > epochs_below) { + + // if (epochs_above > short_window) { + // print(&8006010556); + // check for zeros. + // TODO: put a better safety check here + + // If the Validators are bidding near 100% that means + // the reward is very generous, i.e. their opportunity + // cost is met at small percentages. This means the + // implicit bond is very high on validators. E.g. + // at 1% median bid, the implicit bond is 100x the reward. + // We need to DECREASE the reward + // print(&8006010558); + + if (epochs_above > long_window) { + + // decrease the reward by 10% + // print(&8006010559); + + + cr.value = cr.value - (cr.value / 10); + return // return early since we can't increase and decrease simultaneously + } else if (epochs_above > short_window) { + // decrease the reward by 5% + // print(&80060105510); + cr.value = cr.value - (cr.value / 20); + + + return // return early since we can't increase and decrease simultaneously + } + }; + + + // if validators are bidding low percentages + // it means the nominal reward is not high enough. + // That is the validator's opportunity cost is not met within a + // range where the bond is meaningful. + // For example: if the bids for the epoch's reward is 50% of the value, that means the potential profit, is the same as the potential loss. + // At a 25% bid (potential loss), the profit is thus 75% of the value, which means the implicit bond is 25/75, or 1/3 of the bond, the risk favors the validator. This means among other things, that an attacker can pay for the cost of the attack with the profits. See paper, for more details. + + // we need to INCREASE the reward, so that the bond is more meaningful. + // print(&80060105511); + + if (epochs_below > long_window) { + // print(&80060105513); + + // increase the reward by 10% + cr.value = cr.value + (cr.value / 10); + } else if (epochs_below > short_window) { + // print(&80060105512); + + // increase the reward by 5% + cr.value = cr.value + (cr.value / 20); + }; + // }; + }; + } + + /// find the median bid to push to history + // this is needed for reward_thermostat + public fun set_history(vm: &signer, seats_to_fill: &vector
) acquires ProofOfFeeAuction, ConsensusReward { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + + // print(&99901); + let median_bid = get_median(seats_to_fill); + // push to history + let cr = borrow_global_mut(@VMReserved); + cr.median_win_bid = median_bid; + if (Vector::length(&cr.median_history) < 10) { + // print(&99902); + Vector::push_back(&mut cr.median_history, median_bid); + } else { + // print(&99903); + Vector::remove(&mut cr.median_history, 0); + Vector::push_back(&mut cr.median_history, median_bid); + }; + } + + fun get_median(seats_to_fill: &vector
):u64 acquires ProofOfFeeAuction { + // TODO: the list is sorted above, so + // we assume the median is the middle element + let len = Vector::length(seats_to_fill); + if (len == 0) { + return 0 + }; + let median_bidder = if (len > 2) { + Vector::borrow(seats_to_fill, len/2) + } else { + Vector::borrow(seats_to_fill, 0) + }; + let (median_bid, _) = current_bid(*median_bidder); + return median_bid + } + + //////////////// GETTERS //////////////// + // get the current bid for a validator + + + // get the baseline reward from ConsensusReward + public fun get_consensus_reward(): (u64, u64, u64) acquires ConsensusReward { + let b = borrow_global(@VMReserved ); + return (b.value, b.clearing_price, b.median_win_bid) + } + + // CONSENSUS CRITICAL + // ALL EYES ON THIS + // Proof of Fee returns the current bid of the validator during the auction for upcoming epoch seats. + // returns (current bid, expiration epoch) + public fun current_bid(node_addr: address): (u64, u64) acquires ProofOfFeeAuction { + if (exists(node_addr)) { + let pof = borrow_global(node_addr); + let e = DiemConfig::get_current_epoch(); + // check the expiration of the bid + // the bid is zero if it expires. + // The expiration epoch number is inclusive of the epoch. + // i.e. the bid expires on e + 1. + if (pof.epoch_expiration >= e || pof.epoch_expiration == 0) { + return (pof.bid, pof.epoch_expiration) + }; + return (0, pof.epoch_expiration) + }; + return (0, 0) + } + + // which epoch did they last retract a bid? + public fun is_already_retracted(node_addr: address): (bool, u64) acquires ProofOfFeeAuction { + if (exists(node_addr)) { + let when_retract = *&borrow_global(node_addr).last_epoch_retracted; + return (DiemConfig::get_current_epoch() >= when_retract, when_retract) + }; + return (false, 0) + } + + // Get the top N validators by bid, this is FILTERED by default + public fun top_n_accounts(account: &signer, n: u64, unfiltered: bool): vector
acquires ProofOfFeeAuction, ConsensusReward { + assert!(Signer::address_of(account) == @DiemRoot, Errors::requires_role(140101)); + + let eligible_validators = get_sorted_vals(unfiltered); + let len = Vector::length
(&eligible_validators); + if(len <= n) return eligible_validators; + + let diff = len - n; + while(diff > 0){ + Vector::pop_back(&mut eligible_validators); + diff = diff - 1; + }; + + eligible_validators + } + + + ////////// SETTERS ////////// + // validator can set a bid. See transaction script below. + // the validator can set an "expiry epoch: for the bid. + // Zero means never expires. + // Bids are denomiated in percentages, with ONE decimal place.. + // i.e. 0123 = 12.3% + // Provisionally 110% is the maximum bid. Which could be reviewed. + public fun set_bid(account_sig: &signer, bid: u64, expiry_epoch: u64) acquires ProofOfFeeAuction { + + let acc = Signer::address_of(account_sig); + if (!exists(acc)) { + init(account_sig); + }; + + // bid must be below 110% + assert!(bid <= 1100, Errors::ol_tx(EBID_ABOVE_MAX_PCT)); + + let pof = borrow_global_mut(acc); + pof.epoch_expiration = expiry_epoch; + pof.bid = bid; + } + + + /// Note that the validator will not be bidding on any future + /// epochs if they retract their bid. The must set a new bid. + public fun retract_bid(account_sig: &signer) acquires ProofOfFeeAuction { + + let acc = Signer::address_of(account_sig); + if (!exists(acc)) { + init(account_sig); + }; + + + let pof = borrow_global_mut(acc); + let this_epoch = DiemConfig::get_current_epoch(); + + //////// LEAVE COMMENTED. Code for a potential upgrade. //////// + // See above discussion for retracting of bids. + // + // already retracted this epoch + // assert!(this_epoch > pof.last_epoch_retracted, Errors::ol_tx(EABOVE_RETRACT_LIMIT)); + //////// LEAVE COMMENTED. Code for a potential upgrade. //////// + + + pof.epoch_expiration = 0; + pof.bid = 0; + pof.last_epoch_retracted = this_epoch; + } + + ////////// TRANSACTION APIS ////////// + // manually init the struct, fallback in case of migration fail + public(script) fun init_bidding(sender: signer) { + init(&sender); + } + + // update the bid for the sender + public(script) fun pof_update_bid(sender: signer, bid: u64, epoch_expiry: u64) acquires ProofOfFeeAuction { + // update the bid, initializes if not already. + set_bid(&sender, bid, epoch_expiry); + } + + // retract bid + public(script) fun pof_retract_bid(sender: signer) acquires ProofOfFeeAuction { + // retract a bid + retract_bid(&sender); + } + + //////// TEST HELPERS //////// + + public fun test_set_val_bids(vm: &signer, vals: &vector
, bids: &vector, expiry: &vector) acquires ProofOfFeeAuction { + Testnet::assert_testnet(vm); + + let len = Vector::length(vals); + let i = 0; + while (i < len) { + let bid = Vector::borrow(bids, i); + let exp = Vector::borrow(expiry, i); + let addr = Vector::borrow(vals, i); + test_set_one_bid(vm, addr, *bid, *exp); + i = i + 1; + }; + } + + public fun test_set_one_bid(vm: &signer, val: &address, bid: u64, exp: u64) acquires ProofOfFeeAuction { + Testnet::assert_testnet(vm); + let pof = borrow_global_mut(*val); + pof.epoch_expiration = exp; + pof.bid = bid; + } + + public fun test_mock_reward( + vm: &signer, + value: u64, + clearing_price: u64, + median_win_bid: u64, + median_history: vector, + ) acquires ConsensusReward { + Testnet::assert_testnet(vm); + + let cr = borrow_global_mut(@VMReserved ); + cr.value = value; + cr.clearing_price = clearing_price; + cr.median_win_bid = median_win_bid; + cr.median_history = median_history; + + } + } +} + + diff --git a/diem-move/diem-framework/DPN/sources/0L/Stats.move b/diem-move/diem-framework/DPN/sources/0L/Stats.move index 7115de4cd4..70eda78fd5 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Stats.move +++ b/diem-move/diem-framework/DPN/sources/0L/Stats.move @@ -189,12 +189,12 @@ module Stats{ } else { // debugging rescue mission. Remove after network stabilizes Apr 2022. // something bad happened and we can't find this node in our list. - // print(&666); - // print(&node_addr); + // // print(&666); + // // print(&node_addr); }; // update total vote count anyways even if we can't find this person. stats.current.total_votes = stats.current.total_votes + 1; - // print(&stats.current); + // // print(&stats.current); } //Permissions: Public, VM only. @@ -232,15 +232,6 @@ module Stats{ *&borrow_global(@DiemRoot).history } - /// TEST HELPERS - //Function: 15 - public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats { - let sender = Signer::address_of(vm); - assert!(sender == @DiemRoot, Errors::requires_role(190015)); - assert!(Testnet::is_testnet(), Errors::invalid_state(190015)); - - inc_vote(vm, node_addr); - } // TODO: this code is duplicated with NodeWeight, opportunity to make sorting in to a module. public fun get_sorted_vals_by_props(account: &signer, n: u64): vector
acquires ValStats { @@ -295,5 +286,31 @@ module Stats{ return eligible_validators } + + + /// TEST HELPERS + //Function: 15 + public fun test_helper_inc_vote_addr(vm: &signer, node_addr: address) acquires ValStats { + let sender = Signer::address_of(vm); + assert!(sender == @DiemRoot, Errors::requires_role(190015)); + assert!(Testnet::is_testnet(), Errors::invalid_state(190015)); + + inc_vote(vm, node_addr); + } + + + + public fun test_helper_remove_votes(vm: &signer, node_addr: address) acquires ValStats { + Testnet::assert_testnet(vm); + + let stats = borrow_global_mut(@VMReserved); + let (is_true, i) = Vector::index_of
(&mut stats.current.addr, &node_addr); + if (is_true) { + let votes = *Vector::borrow(&mut stats.current.vote_count, i); + Vector::push_back(&mut stats.current.vote_count, 0); + Vector::swap_remove(&mut stats.current.vote_count, i); + stats.current.total_votes = stats.current.total_votes - votes; + } + } } } \ No newline at end of file diff --git a/diem-move/diem-framework/DPN/sources/0L/Subsidy.move b/diem-move/diem-framework/DPN/sources/0L/Subsidy.move index fab747ad34..d4cf4e2c8f 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Subsidy.move +++ b/diem-move/diem-framework/DPN/sources/0L/Subsidy.move @@ -57,6 +57,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm, subsidy_granted); DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, node_address, minted_coins, b"validator subsidy", @@ -159,6 +160,7 @@ address DiemFramework { let minted_coins = Diem::mint(vm_sig, *&subsidy); DiemAccount::vm_deposit_with_metadata( vm_sig, + @VMReserved, node_address, minted_coins, b"genesis subsidy", @@ -200,6 +202,7 @@ address DiemFramework { DiemAccount::vm_deposit_with_metadata( vm, + @VMReserved, node_address, TransactionFee::get_transaction_fees_coins_amount(vm, fees), b"transaction fees", diff --git a/diem-move/diem-framework/DPN/sources/0L/TestFixtures.move b/diem-move/diem-framework/DPN/sources/0L/TestFixtures.move index 8ce70082d8..9d60c2b688 100644 --- a/diem-move/diem-framework/DPN/sources/0L/TestFixtures.move +++ b/diem-move/diem-framework/DPN/sources/0L/TestFixtures.move @@ -7,6 +7,10 @@ address DiemFramework { module TestFixtures{ use DiemFramework::Testnet; + use DiemFramework::ValidatorUniverse; + use DiemFramework::DiemAccount; + use DiemFramework::ProofOfFee; + use Std::Vector; public fun easy_difficulty(): u64 { 100 } @@ -89,5 +93,36 @@ module TestFixtures{ assert!(Testnet::is_testnet(), 130102014010); x"00105f2013b1de8c7b6ba93501c6136dbbc16ebb728f12199222f9878f68515b7cfff6d75658cd87a0e39449c613290b5820fdb255758c57e5675a4d7dcc473f1341" } + + //////// PROOF OF FEE //////// + public fun pof_default(vm: &signer): (vector
, vector, vector){ + + Testnet::assert_testnet(vm); + let vals = ValidatorUniverse::get_eligible_validators(); + + let bids = Vector::empty(); + let expiry = Vector::empty(); + let i = 0; + let prev = 0; + let fib = 1; + while (i < Vector::length(&vals)) { + + Vector::push_back(&mut expiry, 1000); + let b = prev + fib; + Vector::push_back(&mut bids, b); + + let a = Vector::borrow(&vals, i); + let sig = DiemAccount::scary_create_signer_for_migrations(vm, *a); + // initialize and set. + ProofOfFee::set_bid(&sig, b, 1000); + prev = fib; + fib = b; + i = i + 1; + }; + DiemAccount::slow_wallet_epoch_drip(vm, 100000); // unlock some coins for the validators + + (vals, bids, expiry) + } + } } diff --git a/diem-move/diem-framework/DPN/sources/0L/Testnet.move b/diem-move/diem-framework/DPN/sources/0L/Testnet.move index 0dcafcb9c2..d57a3b0fe8 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Testnet.move +++ b/diem-move/diem-framework/DPN/sources/0L/Testnet.move @@ -10,6 +10,9 @@ module Testnet { use Std::Errors; use Std::Signer; + const ENOT_TESTNET: u64 = 666; // out satan! + const EWHY_U_NO_ROOT: u64 = 667; + struct IsTestnet has key { } public fun initialize(account: &signer) { @@ -24,11 +27,21 @@ module Testnet { exists(@DiemRoot) } + public fun assert_testnet(vm: &signer): bool { + assert!( + Signer::address_of(vm) == @DiemRoot, + Errors::requires_role(EWHY_U_NO_ROOT) + ); + assert!(is_testnet(), Errors::invalid_state(ENOT_TESTNET)); + true + } + + // only used for testing purposes public fun remove_testnet(account: &signer) acquires IsTestnet { assert!( Signer::address_of(account) == @DiemRoot, - Errors::requires_role(200202) + Errors::requires_role(EWHY_U_NO_ROOT) ); IsTestnet{} = move_from(@DiemRoot); } @@ -43,12 +56,13 @@ module StagingNet { use Std::Errors; use Std::Signer; + const EWHY_U_NO_ROOT: u64 = 667; struct IsStagingNet has key { } public fun initialize(account: &signer) { assert!( Signer::address_of(account) == @DiemRoot, - Errors::requires_role(190301) + Errors::requires_role(EWHY_U_NO_ROOT) ); move_to(account, IsStagingNet{}) } diff --git a/diem-move/diem-framework/DPN/sources/0L/TowerState.move b/diem-move/diem-framework/DPN/sources/0L/TowerState.move index 5a0fe78147..c2e1eada05 100644 --- a/diem-move/diem-framework/DPN/sources/0L/TowerState.move +++ b/diem-move/diem-framework/DPN/sources/0L/TowerState.move @@ -598,7 +598,7 @@ module TowerState { // We want to see where it breaks. // the first use case is to change the VDF difficulty parameter by tiny margins, in order to make it difficult to stockpile VDFs in a previous epoch, but not change the security properties. // the goal is to push all the RNG work to all the tower miners in the network, and minimize compute on the Move side - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; public fun toy_rng(seed: u64, iters: u64): u64 acquires TowerList, TowerProofHistory { // Get the list of all miners L @@ -625,24 +625,24 @@ module TowerState { // double check if (len <= n) return 0; - print(&666602); + // print(&666602); let miner_addr = Vector::borrow
(&l, n); - print(&666603); + // print(&666603); let vec = if (exists(*miner_addr)) { *&borrow_global(*miner_addr).previous_proof_hash } else { return 0 }; - print(&vec); + // print(&vec); - print(&666604); + // print(&666604); // take the last bit (B) from their last proof hash. n = (Vector::pop_back(&mut vec) as u64); - print(&666605); + // print(&666605); i = i + 1; }; - print(&8888); + // print(&8888); n } diff --git a/diem-move/diem-framework/DPN/sources/0L/Upgrade.move b/diem-move/diem-framework/DPN/sources/0L/Upgrade.move index 3ee1c500d8..7bf985a950 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Upgrade.move +++ b/diem-move/diem-framework/DPN/sources/0L/Upgrade.move @@ -55,7 +55,7 @@ module Upgrade { // unless the prologue gives it to us. // The upgrade reconfigure happens on round 2, so we'll increment the // new start by 2 from previous. - let new_epoch_height = Epoch::get_timer_height_start(vm) + 2; + let new_epoch_height = Epoch::get_timer_height_start() + 2; Epoch::reset_timer(vm, new_epoch_height); // TODO: check if this has any impact. diff --git a/diem-move/diem-framework/DPN/sources/0L/Vouch.move b/diem-move/diem-framework/DPN/sources/0L/Vouch.move index 1ac5b6641a..8f007e83db 100644 --- a/diem-move/diem-framework/DPN/sources/0L/Vouch.move +++ b/diem-move/diem-framework/DPN/sources/0L/Vouch.move @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////// // 0L Module -// Vouce Module +// Vouch Module // Error code: ///////////////////////////////////////////////////////////////////////// diff --git a/diem-move/diem-framework/DPN/sources/0L_transaction_scripts/ol_validator.move b/diem-move/diem-framework/DPN/sources/0L_transaction_scripts/ol_validator.move index 75205ddf52..ea1f00ea11 100644 --- a/diem-move/diem-framework/DPN/sources/0L_transaction_scripts/ol_validator.move +++ b/diem-move/diem-framework/DPN/sources/0L_transaction_scripts/ol_validator.move @@ -28,27 +28,29 @@ module ValidatorScripts { // assert!(DiemSystem::is_validator(Vector::pop_back(&mut new_validators)), 3); // } - public(script) fun self_unjail(validator: signer) { - let addr = Signer::address_of(&validator); - // if is above threshold continue, or raise error. - assert!( - TowerState::node_above_thresh(addr), - Errors::invalid_state(NOT_ABOVE_THRESH_JOIN) - ); - // if is not in universe, add back - if (!ValidatorUniverse::is_in_universe(addr)) { - ValidatorUniverse::add_self(&validator); - }; - // Initialize jailbit if not present - if (!ValidatorUniverse::exists_jailedbit(addr)) { - ValidatorUniverse::initialize(&validator); - }; + // V6: See note in Jail on deprecating self_unjail. + + // public(script) fun self_unjail(validator: signer) { + // let addr = Signer::address_of(&validator); + // // if is above threshold continue, or raise error. + // assert!( + // TowerState::node_above_thresh(addr), + // Errors::invalid_state(NOT_ABOVE_THRESH_JOIN) + // ); + // // if is not in universe, add back + // if (!ValidatorUniverse::is_in_universe(addr)) { + // ValidatorUniverse::add_self(&validator); + // }; + // // Initialize jailbit if not present + // if (!ValidatorUniverse::exists_jailedbit(addr)) { + // ValidatorUniverse::initialize(&validator); + // }; - // if is jailed, try to unjail - if (Jail::is_jailed(addr)) { - Jail::self_unjail(&validator); - }; - } + // // if is jailed, try to unjail + // if (Jail::is_jailed(addr)) { + // Jail::self_unjail(&validator); + // }; + // } public(script) fun voucher_unjail(voucher: signer, addr: address) { // if is above threshold continue, or raise error. diff --git a/diem-move/diem-framework/DPN/sources/DiemAccount.move b/diem-move/diem-framework/DPN/sources/DiemAccount.move index 7d1427b645..3fdba9065b 100644 --- a/diem-move/diem-framework/DPN/sources/DiemAccount.move +++ b/diem-move/diem-framework/DPN/sources/DiemAccount.move @@ -11,6 +11,8 @@ module DiemFramework::DiemAccount { friend DiemFramework::MakeWhole; friend DiemFramework::MigrateJail; friend DiemFramework::Genesis; + friend DiemFramework::TestFixtures; // Todo: remove + friend DiemFramework::Mock; use DiemFramework::AccountFreezing; use DiemFramework::CoreAddresses; @@ -52,7 +54,7 @@ module DiemFramework::DiemAccount { // use DiemFramework::DonorDirected; use DiemFramework::Ancestry; use DiemFramework::Vouch; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::Jail; use DiemFramework::Testnet; @@ -299,7 +301,7 @@ module DiemFramework::DiemAccount { public fun process_escrow( account: &signer ) acquires EscrowList, AutopayEscrow, Balance, AccountOperationsCapability { -// print(&01000); +// // print(&01000); Roles::assert_diem_root(account); let account_list = &borrow_global>( @@ -307,9 +309,9 @@ module DiemFramework::DiemAccount { ).accounts; let account_len = Vector::length(account_list); let account_idx = 0; -// print(&010100); +// // print(&010100); while (account_idx < account_len) { -// print(&010110); +// // print(&010110); let EscrowSettings {account: account_addr, share: percentage} = Vector::borrow(account_list, account_idx); @@ -326,21 +328,21 @@ module DiemFramework::DiemAccount { limit_room , FixedPoint32::create_from_rational(*percentage, 100) ); -// print(&010120); +// // print(&010120); let amount_sent: u64 = 0; let payment_list = &mut borrow_global_mut>(*account_addr).list; let num_payments = FIFO::len>(payment_list); -// print(&010130); +// // print(&010130); // Pay out escrow until limit is reached while (limit_room > 0 && num_payments > 0) { -// print(&010131); +// // print(&010131); let Escrow {to_account, escrow} = FIFO::pop>(payment_list); let recipient_coins = borrow_global_mut>(to_account); let payment_size = Diem::value(&escrow); -// print(&010132); +// // print(&010132); if (payment_size > limit_room) { -// print(&010133); +// // print(&010133); let (coin1, coin2) = Diem::split(escrow, limit_room); Diem::deposit(&mut recipient_coins.coin, coin2); let new_escrow = Escrow { @@ -350,20 +352,20 @@ module DiemFramework::DiemAccount { FIFO::push_LIFO>(payment_list, new_escrow); amount_sent = amount_sent + limit_room; limit_room = 0; -// print(&010134); +// // print(&010134); } else { -// print(&01015); +// // print(&01015); // This entire escrow is being paid out Diem::deposit(&mut recipient_coins.coin, escrow); limit_room = limit_room - payment_size; amount_sent = amount_sent + payment_size; num_payments = num_payments - 1; -// print(&010136); +// // print(&010136); } }; //update account limits if (amount_sent > 0) { -// print(&010140); +// // print(&010140); _ = AccountLimits::update_withdrawal_limits( amount_sent, *account_addr, @@ -371,10 +373,10 @@ module DiemFramework::DiemAccount { @DiemRoot ).limits_cap ); -// print(&010141); +// // print(&010141); }; -// print(&010150); +// // print(&010150); account_idx = account_idx + 1; } } @@ -690,6 +692,8 @@ module DiemFramework::DiemAccount { Ancestry::init(sender, &new_signer); Vouch::init(&new_signer); Vouch::vouch_for(sender, new_account_address); + // ProofOfFee::init(&new_signer); // proof of fee causes circular depency if called on account creation. + // creation script should call proof of fee after. set_slow(&new_signer); new_account_address @@ -1441,6 +1445,47 @@ module DiemFramework::DiemAccount { restore_withdraw_capability(cap); } + /// VM authorized to withdraw a coin if it is to pay a network fee + /// e.g. transaction fees, validator PoF auction, etc. + /// the amount can be above the transaction limit that + /// may exist on an account. + public fun vm_pay_user_fee( + vm: &signer, + payer : address, + amount: u64, + metadata: vector, + ) acquires DiemAccount, Balance, AccountOperationsCapability { //////// 0L //////// + if (Signer::address_of(vm) != @DiemRoot) return; + // don't try to send a 0 balance, will halt. + if (amount < 1) return; + // Check there is a payer + if (!exists_at(payer)) return; + // Check payer's balance is initialized (sanity). + if (!exists>(payer)) return; + + // Check the payer is in possession of withdraw token. + if (delegated_withdraw_capability(payer)) return; + + // VM should not force an account below 1GAS, since the account may not recover. + if (balance(payer) < BOOTSTRAP_COIN_VALUE) return; + + // prevent halting on low balance. + // charge the remaining balance if the amount is greater than balance. + // User does not accumulate a debt. + if (balance(payer) < amount) { + amount = balance(payer); + }; + + // VM can extract the withdraw token. + let account = borrow_global_mut(payer); + let cap = Option::extract(&mut account.withdraw_capability); + + let coin = withdraw_from(&cap, payer, amount, copy metadata); + TransactionFee::pay_fee_and_track(payer, coin); + + restore_withdraw_capability(cap); + } + // respects slow wallet limits public fun vm_pay_from( payer: address, @@ -1501,9 +1546,9 @@ module DiemFramework::DiemAccount { // TODO: review this in 5.1 // VM should not force an account below 1GAS, since the account may not recover. - print(&7777777900002); + // print(&7777777900002); if (balance(addr) < BOOTSTRAP_COIN_VALUE) return; - print(&7777777900003); + // print(&7777777900003); // prevent halting on low balance. // burn the remaining balance if the amount is greater than balance @@ -1512,7 +1557,7 @@ module DiemFramework::DiemAccount { amount = balance(addr); }; - print(&amount); + // print(&amount); // Check the payer is in possession of withdraw token. if (delegated_withdraw_capability(addr)) return; @@ -1520,7 +1565,7 @@ module DiemFramework::DiemAccount { let account = borrow_global_mut(addr); let cap = Option::extract(&mut account.withdraw_capability); let coin = withdraw_from(&cap, addr, amount, copy metadata); - print(&coin); + // print(&coin); Diem::vm_burn_this_coin(vm, coin); restore_withdraw_capability(cap); } @@ -1906,6 +1951,7 @@ module DiemFramework::DiemAccount { // Publish AccountFreezing::FreezingBit (initially not frozen) AccountFreezing::create(new_account); + TransactionFee::initialize_fee_maker(new_account); // The AccountOperationsCapability is published during Genesis, so it should // always exist. This is a sanity check. assert!( @@ -2241,16 +2287,16 @@ module DiemFramework::DiemAccount { Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -2280,16 +2326,16 @@ module DiemFramework::DiemAccount { Testnet::is_testnet(); CoreAddresses::assert_diem_root(creator_account); let new_account = create_signer(new_account_address); - print(&400001); + // print(&400001); // Roles::new_parent_vasp_role(creator_account, &new_account); // VASP::publish_parent_vasp_credential(&new_account, creator_account); // DualAttestation::publish_credential(&new_account, creator_account, human_name); // VASPDomain::publish_vasp_domains(&new_account); Roles::new_user_role_with_proof(&new_account); make_account(&new_account, auth_key_prefix); - print(&400002); + // print(&400002); add_currencies_for_account(&new_account, add_all_currencies); - print(&400003); + // print(&400003); // testnet_root_fund_account // spec { @@ -3039,7 +3085,8 @@ module DiemFramework::DiemAccount { ); // NB: `withdraw_from_balance` is not used as limits do not apply to this transaction fee - TransactionFee::pay_fee(Diem::withdraw(coin, transaction_fee_amount)) + //////// 0L //////// + TransactionFee::pay_fee_and_track(sender, Diem::withdraw(coin, transaction_fee_amount)) } } spec epilogue_common { @@ -3156,16 +3203,16 @@ module DiemFramework::DiemAccount { Roles::new_validator_role(dr_account, &new_account); ValidatorConfig::publish(&new_account, dr_account, human_name); make_account(&new_account, auth_key_prefix); - /////// 0L ///////// - add_currencies_for_account(&new_account, false); + add_currencies_for_account(&new_account, false); let new_account = create_signer(new_account_address); set_slow(&new_account); - /////// 0L ///////// + // NOTE: issues with testnet Jail::init(&new_account); - // ValidatorUniverse::add_self(&new_account); - // Vouch::init(&new_account); + // TODO: why does this fail? + // assert!(ValidatorConfig::is_valid(new_account_address), 07171717171); + } spec create_validator_account { pragma disable_invariants_in_body; @@ -3512,12 +3559,14 @@ module DiemFramework::DiemAccount { // with the attached `metadata` public fun vm_deposit_with_metadata( vm: &signer, + payer: address, payee: address, to_deposit: Diem, metadata: vector, metadata_signature: vector ) acquires DiemAccount, Balance, CumulativeDeposits { //////// 0L //////// CoreAddresses::assert_diem_root(vm); + let amount = Diem::value(&to_deposit); deposit( @DiemRoot, payee, @@ -3526,6 +3575,9 @@ module DiemFramework::DiemAccount { metadata_signature, false // 0L todo diem-1.4.1 - new patch, needs review ); + + // track if the payee is tracking receipts for governance. + Receipts::write_receipt_vm(vm, payer, payee, amount); } // for billing. TODO: merge with other implementation on separate branch. @@ -3558,6 +3610,22 @@ module DiemFramework::DiemAccount { index: u64, } + //////// 0L //////// + // Blockchain Fee helpers + // used for example in making all upcoming validators pay PoF fee in advance. + public fun vm_multi_pay_fee(vm: &signer, vals: &vector
, fee: u64, metadata: &vector) acquires DiemAccount, AccountOperationsCapability, Balance { + if (Signer::address_of(vm) != @VMReserved) { + return + }; + + let i = 0u64; + while (i < Vector::length(vals)) { + let val = Vector::borrow(vals, i); + vm_pay_user_fee(vm, *val, fee, *metadata); + i = i + 1; + }; + } + //////// 0L //////// // init struct for storing cumulative deposits, for community wallets public fun init_cumulative_deposits(sender: &signer, starting_balance: u64) { diff --git a/diem-move/diem-framework/DPN/sources/DiemSystem.move b/diem-move/diem-framework/DPN/sources/DiemSystem.move index e03979517f..8c66e255c5 100644 --- a/diem-move/diem-framework/DPN/sources/DiemSystem.move +++ b/diem-move/diem-framework/DPN/sources/DiemSystem.move @@ -21,13 +21,13 @@ module DiemFramework::DiemSystem { use Std::FixedPoint32; use DiemFramework::Stats; use DiemFramework::Cases; - use DiemFramework::NodeWeight; /// Information about a Validator Owner. struct ValidatorInfo has copy, drop, store { /// The address (account) of the Validator Owner addr: address, - /// The voting power of the Validator Owner (currently always 1). + //////// 0L //////// + /// The voting power of the Validator Owner (since V6 is always 10). consensus_voting_power: u64, /// Configuration information about the Validator, such as the /// Validator Operator, human name, and info such as consensus key @@ -734,7 +734,14 @@ module DiemFramework::DiemSystem { Vector::push_back(&mut next_epoch_validators, ValidatorInfo { addr: account_address, config, // copy the config over to ValidatorSet - consensus_voting_power: 1 + NodeWeight::proof_of_weight(account_address), + //// V6 //// + // CONSENSUS CRITICAL + // ALL EYES ON THIS + // PROOF OF FEE + // All nodes will have equal voting power as per the PoF paper. + consensus_voting_power: 10, + // "you can syndicate any boat you row" + //// end V6 //// last_config_update_time: DiemTimestamp::now_microseconds(), }); diff --git a/diem-move/diem-framework/DPN/sources/Genesis.move b/diem-move/diem-framework/DPN/sources/Genesis.move index c499e9cf62..b17a848b27 100644 --- a/diem-move/diem-framework/DPN/sources/Genesis.move +++ b/diem-move/diem-framework/DPN/sources/Genesis.move @@ -36,6 +36,8 @@ module DiemFramework::Genesis { use DiemFramework::TowerState; use DiemFramework::DonorDirected; use DiemFramework::Migrations; + // use DiemFramework::Testnet; + use DiemFramework::ProofOfFee; use DiemFramework::MultiSigPayment; // use DiemFramework::Testnet; @@ -106,6 +108,7 @@ module DiemFramework::Genesis { AccountFreezing::initialize(dr_account); TransactionFee::initialize(dr_account); /////// 0L ///////// + TransactionFee::initialize_epoch_fee_maker_registry(dr_account); /////// 0L ///////// DiemSystem::initialize_validator_set(dr_account); DiemVersion::initialize(dr_account, initial_diem_version); @@ -169,7 +172,7 @@ module DiemFramework::Genesis { // Initialize Root Security metered services MultiSigPayment::root_init(dr_account); //////// 0L //////// - + ProofOfFee::init_genesis_baseline_reward(dr_account); // if this is tesnet, fund the root account so the smoketests can run. They use PaymentScripts functions to test many things. // TODO(0L): make this only tun in testsnet. Though we need to make smoketest always initialize in test mode. // if (Testnet::is_testnet()) { @@ -179,6 +182,7 @@ module DiemFramework::Genesis { DiemAccount::vm_deposit_with_metadata( dr_account, @DiemRoot, + @DiemRoot, coin, x"", x"", diff --git a/diem-move/diem-framework/DPN/sources/TransactionFee.move b/diem-move/diem-framework/DPN/sources/TransactionFee.move index 1ac207054c..a7b643414e 100644 --- a/diem-move/diem-framework/DPN/sources/TransactionFee.move +++ b/diem-move/diem-framework/DPN/sources/TransactionFee.move @@ -4,6 +4,8 @@ // File Prefix for errors: 2000 /////////////////////////////////////////////////////////////////////////// module DiemFramework::TransactionFee { + friend DiemFramework::Burn; + // use DiemFramework::XUS::XUS; /////// 0L ///////// use DiemFramework::GAS::GAS; /////// 0L ///////// use DiemFramework::CoreAddresses; @@ -13,6 +15,8 @@ module DiemFramework::TransactionFee { use DiemFramework::DiemTimestamp; use Std::Errors; use Std::Signer; + use Std::Vector; + // use DiemFramework::Burn; /// The `TransactionFee` resource holds a preburn resource for each /// fiat `CoinType` that can be collected as a transaction fee. @@ -78,8 +82,19 @@ module DiemFramework::TransactionFee { public fun pay_fee(coin: Diem) acquires TransactionFee { DiemTimestamp::assert_operating(); assert!(is_coin_initialized(), Errors::not_published(ETRANSACTION_FEE)); - let fees = borrow_global_mut>(@TreasuryCompliance); - Diem::deposit(&mut fees.balance, coin) + let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is just the VM root actually + Diem::deposit(&mut fees.balance, coin); + } + + //////// 0L //////// + // Pay fee and track who it came from. + public fun pay_fee_and_track(user: address, coin: Diem) acquires TransactionFee, FeeMaker, EpochFeeMakerRegistry { + DiemTimestamp::assert_operating(); + assert!(is_coin_initialized(), Errors::not_published(ETRANSACTION_FEE)); + let amount = Diem::value(&coin); + let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is just the VM root actually + Diem::deposit(&mut fees.balance, coin); + track_user_fee(user, amount); } spec pay_fee { @@ -143,6 +158,45 @@ module DiemFramework::TransactionFee { /// All the fees is burnt so the balance becomes 0. ensures spec_transaction_fee().balance.value == 0; } + + //////// 0L //////// + // modified the above function to burn fees + // this is used to clear the Fee account of the VM after each epoch + // in the event that there are more funds that necessary + // to pay validators their agreed rate. + + // public fun ol_burn_fees( + // vm: &signer, + // ) acquires TransactionFee, EpochFeeMakerRegistry, FeeMaker { + // if (Signer::address_of(vm) != @VMReserved) { + // return + // }; + // // extract fees + // // let fees = borrow_global_mut>(@TreasuryCompliance); // TODO: this is same as VM address + // // let coin = Diem::withdraw_all(&mut fees.balance); + + // // either the user is burning or recyling the coin + // // Burn::epoch_start_burn(vm, coin); + + // // get the list of fee makers + // let state = borrow_global(@VMReserved); + // let fee_makers = &state.fee_makers; + // let len = Vector::length(fee_makers); + + // // for every user in the list burn their fees per Burn.move preferences + // let i = 0; + // while (i < len) { + // let user = Vector::borrow(fee_makers, i); + // let amount = borrow_global(*user).epoch; + // // Burn::epoch_start_burn(vm, user, amount); + // i = i + 1; + // } + + + + // // Diem::vm_burn_this_coin(vm, coin); + // } + /// STUB: To be filled in at a later date once the makeup of the XDX has been determined. /// /// # Specification of the case where burn type is XDX. @@ -195,7 +249,8 @@ module DiemFramework::TransactionFee { } /////// 0L ///////// - public fun get_transaction_fees_coins( + /// only to be used by VM through the Burn.move module + public(friend) fun vm_withdraw_all_coins( dr_account: &signer ): Diem acquires TransactionFee { // Can only be invoked by DiemVM privilege. @@ -211,6 +266,7 @@ module DiemFramework::TransactionFee { } /////// 0L ///////// + // TODO deprecate this public fun get_transaction_fees_coins_amount( dr_account: &signer, amount: u64 ): Diem acquires TransactionFee { @@ -225,4 +281,93 @@ module DiemFramework::TransactionFee { Diem::withdraw(&mut fees.balance, amount) } + + /// FeeMaker struct lives on an individual's account + /// We check how many fees the user has paid. + /// This will interact with Burn preferences when there is a remainder of fees in the TransactionFee account + struct FeeMaker has key { + epoch: u64, + lifetime: u64, + } + + /// We need a list of who is producing fees this epoch. + /// This lives on the VM address + struct EpochFeeMakerRegistry has key { + fee_makers: vector
, + } + + /// Initialize the registry at the VM address. + public fun initialize_epoch_fee_maker_registry(vm: &signer) { + CoreAddresses::assert_vm(vm); + let registry = EpochFeeMakerRegistry { + fee_makers: Vector::empty(), + }; + move_to(vm, registry); + } + + /// FeeMaker is initialized when the account is created + public fun initialize_fee_maker(account: &signer) { + let fee_maker = FeeMaker { + epoch: 0, + lifetime: 0, + }; + move_to(account, fee_maker); + } + + public fun epoch_reset_fee_maker(vm: &signer) acquires EpochFeeMakerRegistry, FeeMaker { + CoreAddresses::assert_vm(vm); + let registry = borrow_global_mut(@VMReserved); + let fee_makers = ®istry.fee_makers; + + let i = 0; + while (i < Vector::length(fee_makers)) { + let account = *Vector::borrow(fee_makers, i); + reset_one_fee_maker(vm, account); + i = i + 1; + }; + registry.fee_makers = Vector::empty(); + } + + /// FeeMaker is reset at the epoch boundary, and the lifetime is updated. + fun reset_one_fee_maker(vm: &signer, account: address) acquires FeeMaker { + CoreAddresses::assert_vm(vm); + let fee_maker = borrow_global_mut(account); + fee_maker.lifetime = fee_maker.lifetime + fee_maker.epoch; + fee_maker.epoch = 0; + } + + /// add a fee to the account fee maker for an epoch + /// PRIVATE function + fun track_user_fee(account: address, amount: u64) acquires FeeMaker, EpochFeeMakerRegistry { + if (!exists(account)) { + return + }; + + let fee_maker = borrow_global_mut(account); + fee_maker.epoch = fee_maker.epoch + amount; + + // update the registry + let registry = borrow_global_mut(@VMReserved); + if (!Vector::contains(®istry.fee_makers, &account)) { + Vector::push_back(&mut registry.fee_makers, account); + } + } + + //////// GETTERS /////// + + // get list of fee makers + public fun get_fee_makers(): vector
acquires EpochFeeMakerRegistry { + let registry = borrow_global(@VMReserved); + *®istry.fee_makers + } + + // get the fees made by the user in the epoch + public fun get_epoch_fees_made(account: address): u64 acquires FeeMaker { + if (!exists(account)) { + return 0 + }; + let fee_maker = borrow_global(account); + fee_maker.epoch + } + } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/ancestry/ancestry_is_fam.move b/diem-move/diem-framework/core/transactional-tests/0L/ancestry/ancestry_is_fam.move index 0c561e6560..a92a4f915b 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/ancestry/ancestry_is_fam.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/ancestry/ancestry_is_fam.move @@ -8,21 +8,21 @@ script { use DiemFramework::Ancestry; use Std::Vector; use Std::Signer; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(diemroot: signer, bob: signer) { Ancestry::init(&bob, &diemroot); let diem_addr = Signer::address_of(&diemroot); let bob_addr = Signer::address_of(&bob); - print(&diem_addr); - print(&bob_addr); + // print(&diem_addr); + // print(&bob_addr); let tree = Ancestry::get_tree(bob_addr); - print(&tree); + // print(&tree); assert!(Vector::contains
(&tree, &diem_addr), 7357001); let (is_family, _) = Ancestry::is_family(diem_addr, bob_addr); - print(&is_family); + // print(&is_family); // if (is_) assert!(is_family, 7357002); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_autopay_disabled.depr b/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_autopay_disabled.depr deleted file mode 100644 index 1a845961af..0000000000 --- a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_autopay_disabled.depr +++ /dev/null @@ -1,22 +0,0 @@ -//# init --validators Alice - -// Test audit function val_audit_passing having autopay disabled -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::Audit; - use DiemFramework::ValidatorConfig; - use DiemFramework::AutoPay; - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - assert!(ValidatorConfig::is_valid(@Alice), 7357007001001); - - AutoPay::enable_autopay(&sender); - AutoPay::disable_autopay(&sender); - - assert!(!AutoPay::is_enabled(@Alice), 7357007001003); - assert!(TowerState::is_init(@Alice), 7357007001004); - assert!(!Audit::val_audit_passing(@Alice), 7357007001005); - } -} -// check: EXECUTED \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_operator_balance.depr b/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_operator_balance.depr deleted file mode 100644 index 53614fa035..0000000000 --- a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_check_operator_balance.depr +++ /dev/null @@ -1,45 +0,0 @@ -//# init --validators Alice - -// Test audit function val_audit_passing having not enough balance -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::Audit; - use DiemFramework::ValidatorConfig; - use DiemFramework::AutoPay; - use DiemFramework::TowerState; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - use DiemFramework::Testnet; - - fun main(vm: signer, alice_account: signer) { - // Need to unset testnet to properly test this function - Testnet::remove_testnet(&vm); - // enable autopay - AutoPay::enable_autopay(&alice_account); - assert!(AutoPay::is_enabled(@Alice), 7357007002001); - assert!(ValidatorConfig::is_valid(@Alice), 7357007002002); - assert!(TowerState::is_init(@Alice), 7357007002003); - - // check operator zero balance - let oper = ValidatorConfig::get_operator(@Alice); - // operator should get 1 GAS from owner at genesis - assert!(DiemAccount::balance(oper) == 1000000, 7357007002004); - - // should pass audit. - assert!(Audit::val_audit_passing(@Alice), 7357007002005); - // transfer not enough balance to operator - let oper = ValidatorConfig::get_operator(@Alice); - // Drain the operator account - DiemAccount::vm_make_payment_no_limit( - oper, - @Alice, - 1000000, - x"", - x"", - &vm - ); - assert!(DiemAccount::balance(oper) == 0, 7357007002006); - assert!(!Audit::val_audit_passing(@Alice), 7357007002007); - } -} -// check: EXECUTED \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.move b/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.move deleted file mode 100644 index 92743dc135..0000000000 --- a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.move +++ /dev/null @@ -1,31 +0,0 @@ -//# init --validators Alice - -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::Audit; - use DiemFramework::ValidatorConfig; - use DiemFramework::AutoPay; - use DiemFramework::TowerState; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - - fun main(_: signer, alice_account: signer) { - // Test audit function val_audit_passing satisfying all conditions - assert!(ValidatorConfig::is_valid(@Alice), 7357007003001); - - // operator has gas from genesis - let oper = ValidatorConfig::get_operator(@Alice); - assert!(DiemAccount::balance(oper) == 1000000, 7357007003002); - - // enable autopay - assert!(!AutoPay::is_enabled(@Alice), 7357007003003); - AutoPay::enable_autopay(&alice_account); - assert!(AutoPay::is_enabled(@Alice), 7357007003004); - - assert!(TowerState::is_init(@Alice), 7357007003005); - - // audit must pass - assert!(Audit::val_audit_passing(@Alice), 7357007003006); - } -} -// check: EXECUTED \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance.move b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance.move index f3e0293e30..6079df9600 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance.move @@ -61,7 +61,7 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::AutoPay; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(dr: signer, _sponsor: signer) { let starting_balance_alice = DiemAccount::balance(@Alice); @@ -73,7 +73,7 @@ script { let ending_balance_alice = DiemAccount::balance(@Alice); let ending_balance_comm = DiemAccount::balance(@CommunityA); - // print(&ending_balance_alice); + // // print(&ending_balance_alice); assert!(starting_balance_alice > ending_balance_alice, 735706); assert!(ending_balance_comm > starting_balance_comm, 735707); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_fail.move b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_fail.move index 3004945b21..5b9208fe5e 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_fail.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_fail.move @@ -57,7 +57,7 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::AutoPay; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(dr: signer, _sponsor: signer) { let starting_balance_alice = DiemAccount::balance(@Alice); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_happy.move index de9f7ce748..6e48e57ca6 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_happy.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_balance_slow_wallet_happy.move @@ -58,13 +58,13 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::AutoPay; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(dr: signer, _sponsor: signer) { let starting_balance_alice = DiemAccount::balance(@Alice); let starting_balance_comm = DiemAccount::balance(@CommunityA); - // print(&starting_balance); + // // print(&starting_balance); // make sure there's enough in the unlocked slow wallet to pay. DiemAccount::slow_wallet_epoch_drip(&dr,1000000); // assert!(ending_balance == 10000000, 735705); @@ -74,7 +74,7 @@ script { let ending_balance_alice = DiemAccount::balance(@Alice); let ending_balance_comm = DiemAccount::balance(@CommunityA); - // print(&ending_balance); + // // print(&ending_balance); assert!(starting_balance_alice > ending_balance_alice, 735706); assert!(ending_balance_comm > starting_balance_comm, 735707); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.exp b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.exp index c2ccb5140b..5090dfad0b 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.exp @@ -9,7 +9,7 @@ Events: data: "170000000000000006505ccd81e562b524d8f656abd92a1500c005d90100000000" } -task 7 'block'. lines 125-130: +task 7 'block'. lines 126-131: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -24,7 +24,7 @@ Events: data: "0200000000000000" } -task 8 'block'. lines 131-136: +task 8 'block'. lines 132-137: Events: { key: 010000000000000010ada1ba839f77cfc5266ab28e1fa52f @@ -57,7 +57,7 @@ Events: data: "420000000000000006505ccd81e562b524d8f656abd92a150000cf7b0500000000" } -task 9 'block'. lines 137-137: +task 9 'block'. lines 138-138: Events: { key: 0c0000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.move b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.move index e5e1e2ccd6..876d442762 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/autopay/instructions_inflow.move @@ -108,6 +108,7 @@ script { assert!(Diem::value(&coin) == 10000, 1); DiemAccount::vm_deposit_with_metadata( &vm, + @VMReserved, @Alice, coin, x"", x"" diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_deposit_index.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_deposit_index.move index ca9c4220f4..cec359266b 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_deposit_index.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_deposit_index.move @@ -42,20 +42,20 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::DiemAccount; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::GAS::GAS; fun main(vm: signer, _account: signer) { // bobs_indexed amount changes let index_A_before = DiemAccount::get_index_cumu_deposits(@CommunityA); let index_B_before = DiemAccount::get_index_cumu_deposits(@CommunityB); - print(&index_A_before); - // print(&index_B_before); + // print(&index_A_before); + // // print(&index_B_before); // send to community wallet CommunityA DiemAccount::vm_make_payment_no_limit( @Alice, @CommunityA, 100000, x"", x"", &vm); let index_A_after = DiemAccount::get_index_cumu_deposits(@CommunityA); - print(&index_A_after); + // print(&index_A_after); assert!(index_A_after > index_A_before, 735705); // CommunityB's amount DOES NOT change diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.depr similarity index 97% rename from diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.move rename to diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.depr index 64ceba530c..e1da826d32 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch.depr @@ -1,5 +1,6 @@ //# init --validators Alice Bob Dave CommunityA CommunityB +// V6: Deprecated since Proof of Fee changes changes Cost To Enter. // Alice is a Validator // CommunityA is a community wallet. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.exp b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.exp index 7a6c96ec67..aa92fe3074 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.exp @@ -1,6 +1,6 @@ processed 7 tasks -task 5 'block'. lines 73-77: +task 5 'block'. lines 83-87: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -12,73 +12,31 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 6 type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" + data: "40420f000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "60a90000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "60a90000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd20800000000034741533c36bd759b51f1c9b7f4258896fcfe6c1065706f63682073746172742073656e64" + data: "40420f000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a151065706f63682073746172742073656e64" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" + data: "80841e000000000003474153000000000000000000000000000000000772656379636c65" } { key: 060000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153b000d8e1919132c664a36c0fdf986407046275726e" + data: "00000000000000000347415300000000000000000000000000000000" } { key: 060000000000000000000000000000000000000000000000 seq_num: 1 type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153182163e7473ca001b3e8775649fe80b3046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 2 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + data: "00000000000000000347415300000000000000000000000000000000" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.move index 282e8300a4..fd4f9fdb26 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_recycle.move @@ -17,11 +17,21 @@ script { } } + + //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::Mock; + use DiemFramework::DiemAccount; + use DiemFramework::TransactionFee; + use DiemFramework::GAS::GAS; + fun main(vm: signer, _: signer) { + // simulate alice making a fee + let c = DiemAccount::vm_withdraw(&vm, @Alice, 2000000); + TransactionFee::pay_fee_and_track(@Alice, c); + let start_height = 0; let end_height = 100; Mock::mock_case_1(&vm, @Alice, start_height, end_height); @@ -53,18 +63,19 @@ script { script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _account: signer) { - let bal = DiemAccount::balance(@Alice); - print(&bal); + // let bal = DiemAccount::balance(@Alice); + // print(&bal); + // send to community wallet Bob DiemAccount::vm_make_payment_no_limit(@Alice, @CommunityA, 1000000, x"", x"", &vm); let bal = DiemAccount::balance(@Alice); - print(&bal); - assert!(bal == 9000000, 7357003); + // print(&bal); + assert!(bal == 7000000, 7357003); } } @@ -82,26 +93,36 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::Diem; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; + use DiemFramework::Burn; + use Std::Vector; fun main() { + + // dBurn::reset_ratios(&vm); + let (addr, deps , ratios) = Burn::get_ratios(); + assert!(Vector::length(&addr) == 1, 7357003); + assert!(Vector::length(&deps) == 1, 7357004); + assert!(Vector::length(&ratios) == 1, 7357005); + let new_cap = Diem::market_cap(); // no change to market cap // assert!(new_cap == 65000000, 7357004); - print(&new_cap); + // print(&new_cap); // alice balance should increase because of subsidy - let alice_old_balance = 9000000; + let alice_old_balance = 7000000; let alice_new = DiemAccount::balance(@Alice); assert!(alice_new > alice_old_balance, 7357004); - let subsidy = alice_new - alice_old_balance; - print(&alice_new); - print(&subsidy); + // let subsidy = alice_new - alice_old_balance; + // print(&alice_new); + // print(&subsidy); // CommunityA should get MORE than just what was donated // since the matching donations from Alice's rewards worked. let bal = DiemAccount::balance(@CommunityA); + // print(&bal); assert!(bal > 11000000, 7357005); let cap_at_start = 65000000; diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_send_comm.depr b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_send_comm.depr new file mode 100644 index 0000000000..19c9ef24f1 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_epoch_send_comm.depr @@ -0,0 +1,134 @@ +//# init --validators Alice +//# --addresses Bob=0x2e3a0b7a741dae873bf0f203a82dfd52 +//# Carol=0x4b7653f6566a52c9b496f245628a69a0 +//# --private-keys Bob=e1acb70a23dba96815db374b86c5ae96d6a9bc5fff072a7a8e55a1c27c1852d8 +//# Carol=f5fd1521bd82454a9834ef977c389a0201f9525b11520334842ab73d2dcbf8b7 + +//# run --signers DiemRoot +//# --args @Bob +//# -- 0x1::DiemAccount::test_harness_create_user + +//# run --signers DiemRoot +//# --args @Carol +//# -- 0x1::DiemAccount::test_harness_create_user + +// V6: Deprecated since Proof of Fee changes changes Cost To Enter. + + +// make Alice a case 1 validator, so that she is in the next validator set. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::TowerState; + use DiemFramework::Burn; + use DiemFramework::Audit; + use DiemFramework::AutoPay; + + fun main(_dr: signer, sender: signer) { + // Alice is the only one that can update her mining stats. + // Hence this first transaction. + + TowerState::test_helper_mock_mining(&sender, 5); + // set alice burn preferences as sending to community wallets. + Burn::set_send_community(&sender, true); + // validator needs to qualify for next epoch for the burn to register + Audit::test_helper_make_passing(&sender); + AutoPay::enable_autopay(&sender); + } +} +//check: EXECUTED + +//# run --admin-script --signers DiemRoot DiemRoot +script { + use DiemFramework::Stats; + use Std::Vector; + use DiemFramework::Cases; + + fun main(vm: signer, _account: signer) { + let vm = &vm; + let voters = Vector::singleton
(@Alice); + let i = 1; + while (i < 16) { + // Mock the validator doing work for 15 blocks, and stats being updated. + Stats::process_set_votes(vm, &voters); + i = i + 1; + }; + + assert!(Cases::get_case(vm, @Alice, 0 , 15) == 1, 7357300103011000); + } +} +//check: EXECUTED + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::Wallet; + use Std::Vector; + use DiemFramework::GAS::GAS; + use Std::Signer; + use DiemFramework::DiemAccount; + + fun main(_dr: signer, sender: signer) { + Wallet::set_comm(&sender); + let bal = DiemAccount::balance(Signer::address_of(&sender)); + DiemAccount::init_cumulative_deposits(&sender, bal); + let list = Wallet::get_comm_list(); + assert!(Vector::length(&list) == 1, 7357001); + } +} + +// check: EXECUTED + +//# run --admin-script --signers DiemRoot Carol +script { + use DiemFramework::Wallet; + use Std::Vector; + use DiemFramework::GAS::GAS; + use Std::Signer; + use DiemFramework::DiemAccount; + + fun main(_dr: signer, sender: signer) { + Wallet::set_comm(&sender); + let bal = DiemAccount::balance(Signer::address_of(&sender)); + DiemAccount::init_cumulative_deposits(&sender, bal); + let list = Wallet::get_comm_list(); + assert!(Vector::length(&list) == 2, 7357002); + } +} +// check: EXECUTED + +//# run --admin-script --signers DiemRoot DiemRoot +script { + use DiemFramework::DiemAccount; + use DiemFramework::GAS::GAS; + + fun main(vm: signer, _account: signer) { + // send to community wallet Bob + DiemAccount::vm_make_payment_no_limit(@Alice, @Bob, 500000, x"", x"", &vm); + let bal = DiemAccount::balance(@Bob); + assert!(bal == 500000, 7357003); + } +} +// check: EXECUTED + +////////////////////////////////////////////// +//// Trigger reconfiguration at 61 seconds //// +//# block --proposer Alice --time 61000000 --round 15 + +////// TEST RECONFIGURATION IS HAPPENING ///// +// check: NewEpochEvent +////////////////////////////////////////////// + +//# run --admin-script --signers DiemRoot DiemRoot +script { + use DiemFramework::DiemAccount; + use DiemFramework::GAS::GAS; + use DiemFramework::Debug::print; + + fun main() { + // bob's community wallet increased by 50% of subsidy after epoch change. + let bal = DiemAccount::balance(@Bob); + print(&bal); + assert!(bal == 148500000, 7357004); + } +} +// check: EXECUTED \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_balance.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_balance.move index 4bce73cf63..dab7cca4a9 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_balance.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_balance.move @@ -5,13 +5,13 @@ script { use DiemFramework::GAS::GAS; use DiemFramework::Diem; use DiemFramework::DiemAccount; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { let cap = Diem::market_cap(); - print(&cap); + // print(&cap); let prev_bal = DiemAccount::balance(@Alice); - print(&prev_bal); + // print(&prev_bal); // assert!(cap == bal, 735701); @@ -23,9 +23,9 @@ script { &vm, ); let cap_later = Diem::market_cap(); - print(&cap_later); + // print(&cap_later); let bal = DiemAccount::balance(@Alice); - print(&bal); + // print(&bal); assert!(bal == (prev_bal - burn_amount), 735702); assert!(cap_later == (cap - (burn_amount as u128)), 735703); } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.depr similarity index 53% rename from diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.move rename to diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.depr index 15576e33b1..3362158271 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.depr @@ -1,33 +1,14 @@ //# init --validators Alice Bob - -// Alice is CASE 4 validator, and falls out of validator set +// V6 I don't know what this is testing //# run --admin-script --signers DiemRoot DiemRoot script { - use DiemFramework::Cases; - use DiemFramework::Debug::print; - use DiemFramework::TowerState; - use Std::Vector; - use DiemFramework::Stats; - - fun main(sender: signer, _: signer) { - let sender = &sender; - let voters = Vector::singleton
(@Alice); - let i = 1; - while (i < 16) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(sender, &voters); - i = i + 1; - }; - TowerState::test_helper_mock_mining_vm(sender, @Alice, 5 ); - // did not send any votes. - print(&111); - print(&Cases::get_case(sender, @Alice, 0 , 15)); - print(&Cases::get_case(sender, @Bob, 0 , 15)); + use DiemFramework::Mock; - // assert!(Cases::get_case(&sender, @Alice, 1 , 15) == 4, 7357300103011000); - // assert!(Cases::get_case(&sender, @Bob, 0 , 15) == 4, 7357300103011000); + fun main(vm: signer, _: signer) { + Mock::pof_default(&vm); + Mock::mock_case_4(&vm, @Alice, 0, 15); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.exp b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.exp index cd1d701d0f..d335870b42 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_from_universe.exp @@ -12,13 +12,13 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 3 type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" + data: "40420f000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" + data: "40420f000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 010000000000000006505ccd81e562b524d8f656abd92a15 @@ -32,29 +32,11 @@ Events: type: 0x1::DiemAccount::ReceivedPaymentEvent data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" } -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} { key: 060000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::Diem::BurnEvent - data: "004dd208000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + data: "00000000000000000347415300000000000000000000000000000000" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_ratios.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_ratios.move index bfdecd5437..3e3986606a 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_ratios.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_ratios.move @@ -46,7 +46,7 @@ script { use DiemFramework::Burn; use Std::Vector; use Std::FixedPoint32; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(vm: signer, _:signer) { // send to community wallet CommunityA @@ -61,21 +61,21 @@ script { assert!(Vector::length(&ratios) == 2, 7357005); let deposits_A_indexed = *Vector::borrow(&deps, 0); - // print(&deposits_A_indexed); + // // print(&deposits_A_indexed); assert!(deposits_A_indexed == 100500, 7357006); let deposits_B_indexed = *Vector::borrow(&deps, 1); - // print(&deposits_B_indexed); + // // print(&deposits_B_indexed); assert!(deposits_B_indexed == 904500, 7357007); let a_mult = *Vector::borrow(&ratios, 0); let pct_a = FixedPoint32::multiply_u64(100, a_mult); - // print(&pct_a); + // // print(&pct_a); // ratio for communityA assert!(pct_a == 9, 7357008); // todo let b_mult = *Vector::borrow(&ratios, 1); let pct_b = FixedPoint32::multiply_u64(100, b_mult); - // print(&pct_b); + // // print(&pct_b); // ratio for communityB assert!(pct_b == 89, 7357009); // todo } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_just_burn.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_just_burn.move index 0022512c5f..e5734ea05e 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_just_burn.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_just_burn.move @@ -62,24 +62,21 @@ script { fun main(vm: signer, _:signer) { // we assume the ratios are calculated correctly see burn_ratios.move let total_supply_before = Diem::market_cap(); - // print(&total_supply_before); + // // print(&total_supply_before); let bal_A_before = DiemAccount::balance(@CommunityA); let bal_B_before = DiemAccount::balance(@CommunityB); - // up to here Alice has 9_300_000 - Burn::epoch_start_burn(&vm, @Alice, 100000); - // alice burns 100_000, and now has 9_200_000 + let c = DiemAccount::vm_withdraw(&vm, @Alice, 1000000); + Burn::burn_or_recycle_user_fees(&vm, @Alice, c); let bal_alice = DiemAccount::balance(@Alice); // print(&bal_alice); - assert!( - (bal_alice >= 9900000 && bal_alice < 10000000), 7357007 - ); // rounding issues + assert!(bal_alice == 9000000, 7357007); // rounding issues // unchanged balance let bal_a = DiemAccount::balance(@CommunityA); - // print(&bal_bob); + // // print(&bal_bob); assert!(bal_a == bal_A_before, 7357008); // unchanged balance @@ -110,14 +107,14 @@ script { // use DiemFramework::DiemAccount; // use DiemFramework::GAS::GAS; // use DiemFramework::Burn; -// use DiemFramework::Debug::print; +// // use DiemFramework::Debug::print; // fun main(vm: signer, _:signer) { // let bal_alice = DiemAccount::balance(@Alice); -// print(&bal_alice); +// // print(&bal_alice); // let bal_bob_old = DiemAccount::balance(@Bob); -// print(&bal_bob_old); +// // print(&bal_bob_old); // let bal_carol_old = DiemAccount::balance(@Carol); // // this time alice changed burn settings, and is resending to community. @@ -125,7 +122,7 @@ script { // let bal_alice = DiemAccount::balance(@Alice); -// print(&bal_alice); +// // print(&bal_alice); // assert!(bal_alice == 9100000, 7357010); // rounding issues // // balances are greater than before. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_recycle.move b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_recycle.move index 239b0dfdf0..d69f8dca24 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_recycle.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/burn/burn_unit_recycle.move @@ -76,21 +76,21 @@ script { assert!(Vector::length(&ratios) == 2, 7357005); let deposits_A_indexed = *Vector::borrow(&deps, 0); - // print(&deposits_A_indexed); + // // print(&deposits_A_indexed); assert!(deposits_A_indexed == 100500, 7357006); let deposits_B_indexed = *Vector::borrow(&deps, 1); - // print(&deposits_B_indexed); + // // print(&deposits_B_indexed); assert!(deposits_B_indexed == 904500, 7357007); let a_mult = *Vector::borrow(&ratios, 0); let pct_a = FixedPoint32::multiply_u64(100, a_mult); - // print(&pct_a); + // // print(&pct_a); // ratio for communityA assert!(pct_a == 9, 7357008); // todo let b_mult = *Vector::borrow(&ratios, 1); let pct_b = FixedPoint32::multiply_u64(100, b_mult); - // print(&pct_b); + // // print(&pct_b); // ratio for communityB assert!(pct_b == 89, 7357009); @@ -109,25 +109,24 @@ script { fun main(vm: signer, _:signer) { // we assume the ratios are calculated correctly see burn_ratios.move let total_supply_before = Diem::market_cap(); + // print(&total_supply_before); let bal_A_before = DiemAccount::balance(@CommunityA); let bal_B_before = DiemAccount::balance(@CommunityB); // make sure the ratios for burns get updated Burn::reset_ratios(&vm); - // up to here Alice has 9_300_000 - Burn::epoch_start_burn(&vm, @Alice, 100000); + + let c = DiemAccount::vm_withdraw(&vm, @Alice, 1000000); + Burn::burn_or_recycle_user_fees(&vm, @Alice, c); let bal_alice = DiemAccount::balance(@Alice); - // print(&bal_alice); - assert!( - (bal_alice == 8900002), 7357010 - ); // 2 is from rounding issues + assert!(bal_alice == 8000000, 7357010); // Check that the matching donations are being made let bal_a = DiemAccount::balance(@CommunityA); - // print(&bal_bob); + // // print(&bal_bob); assert!(bal_a > bal_A_before, 7357011); // unchanged balance since it received no donations @@ -135,8 +134,11 @@ script { assert!(bal_b > bal_B_before, 7357012); let total_supply_after = Diem::market_cap(); + // print(&total_supply_after); - assert!(total_supply_after == total_supply_before, 7357013); + // there's a minor decimal issue + let superman_3_decimal = 2; + assert!(total_supply_after == total_supply_before - superman_3_decimal, 7357013); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.exp b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.exp index 2d1a1f293f..42ed5bf5ac 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.exp @@ -1,6 +1,6 @@ -processed 7 tasks +processed 5 tasks -task 1 'block'. lines 8-8: +task 1 'block'. lines 7-7: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -9,7 +9,7 @@ Events: data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" } -task 5 'block'. lines 88-92: +task 3 'block'. lines 26-30: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -21,85 +21,97 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 6 type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" + data: "400d03000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" + key: 050000000000000000000000000000000000000000000000 + seq_num: 7 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" } { - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f + key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { - key: 010000000000000006505ccd81e562b524d8f656abd92a15 + key: 050000000000000000000000000000000000000000000000 + seq_num: 8 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 0000000000000000b000d8e1919132c664a36c0fdf986407 seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a15046275726e" + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 9 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 10 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 0000000000000000182163e7473ca001b3e8775649fe80b3 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 060000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::Diem::BurnEvent - data: "004dd208000000000347415300000000000000000000000000000000" + data: "00000000000000000347415300000000000000000000000000000000" } { key: 0100000000000000182163e7473ca001b3e8775649fe80b3 seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153182163e7473ca001b3e8775649fe80b3046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + data: "010000000000000003474153182163e7473ca001b3e8775649fe80b30c70726f6f66206f6620666565" } { key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "8096980000000000034741533c36bd759b51f1c9b7f4258896fcfe6c046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 2 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + data: "0100000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0c70726f6f66206f6620666565" } { key: 0100000000000000b000d8e1919132c664a36c0fdf986407 seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153b000d8e1919132c664a36c0fdf986407046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 3 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + data: "010000000000000003474153b000d8e1919132c664a36c0fdf9864070c70726f6f66206f6620666565" } { key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" + data: "010000000000000003474153de589ec6b85a4a1a58be166c38551cc20c70726f6f66206f6620666565" } { - key: 060000000000000000000000000000000000000000000000 - seq_num: 4 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" + key: 010000000000000006505ccd81e562b524d8f656abd92a15 + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "01000000000000000347415306505ccd81e562b524d8f656abd92a150c70726f6f66206f6620666565" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.move index c80cf3dc86..b43daa1d97 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_reconfig.move @@ -1,87 +1,25 @@ //# init --validators Alice Bob Carol Dave Eve // This tests consensus Case 1. -// ALICE is a validator. -// DID validate successfully. -// DID mine above the threshold for the epoch. +// ALICE is a validator, validated successfully +// put in the lowest bid, but there are enough seats to include her. //# block --proposer Alice --time 1 --round 0 //# run --admin-script --signers DiemRoot Alice script { - use DiemFramework::DiemSystem; - use DiemFramework::TowerState; - use DiemFramework::NodeWeight; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - - fun main(_dr:signer, sender: signer) { - // Tests on initial size of validators - assert!(DiemSystem::validator_set_size() == 5, 7357300101011000); - assert!(DiemSystem::is_validator(@Alice) == true, 7357300101021000); - assert!(DiemSystem::is_validator(@Eve) == true, 7357300101031000); - - assert!(TowerState::get_count_in_epoch(@Alice) == 0, 7357300101041000); - assert!(DiemAccount::balance(@Alice) == 10000000, 7357300101051000); - assert!(NodeWeight::proof_of_weight(@Alice) == 0, 7357300101051000); - - // Alice continues to mine after genesis. - // This test is adapted from chained_from_genesis.move - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Alice) == 5, 7357300101071000); - assert!(TowerState::node_above_thresh(@Alice), 7357300101081000); - } -} + use DiemFramework::Mock; -//# run --admin-script --signers DiemRoot DiemRoot -script { - use Std::Vector; - use DiemFramework::Stats; - - // This is the the epoch boundary. - fun main(vm: signer, _:signer) { - // This is not an onboarding case, steady state. - // FullnodeState::test_set_fullnode_fixtures( - // &vm, @Alice, 0, 0, 0, 200, 200, 1000000 - // ); - let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - - // Overwrite the statistics to mock that all have been validating. - let i = 1; - while (i < 16) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; + fun main(dr:signer, _sender: signer) { + // all vals compliant + Mock::all_good_validators(&dr); + // everyone bids + Mock::pof_default(&dr); + } } -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::Cases; - use Std::Vector; - use DiemFramework::DiemSystem; - - fun main(vm: signer, _:signer) { - // We are in a new epoch. - // Check alice is in the the correct case during reconfigure - assert!(Cases::get_case(&vm, @Alice, 0, 15) == 1, 735700018010901); - assert!(Cases::get_case(&vm, @Bob, 0, 15) == 2, 735700018010902); - assert!(Cases::get_case(&vm, @Carol, 0, 15) == 2, 735700018010903); - assert!(Cases::get_case(&vm, @Dave, 0, 15) == 2, 735700018010904); - assert!(Cases::get_case(&vm, @Eve, 0, 15) == 2, 735700018010905); - - // check only 1 val is getting the subsidy - let (vals, _) = DiemSystem::get_fee_ratio(&vm, 0, 100); - assert!(Vector::length
(&vals) == 1, 7357000180111); - } -} ////////////////////////////////////////////// ///// Trigger reconfiguration at 61 seconds //// @@ -93,38 +31,9 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { - use DiemFramework::NodeWeight; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - use DiemFramework::Subsidy; - use DiemFramework::Globals; - use DiemFramework::TowerState; - use DiemFramework::Debug::print; - - fun main() { - // We are in a new epoch. - - let expected_subsidy = Subsidy::subsidy_curve( - Globals::get_subsidy_ceiling_gas(), - 1, - Globals::get_max_validators_per_set(), - ); - - let starting_balance = 10000000; - let operator_refund = 4336 * 5; // BASELINE_TX_COST * proofs = 21680 - - // Note since there's only 1 validator and the reward to alice was the - // entirety of subsidy available. - let burn = expected_subsidy/2; // 50% of the rewrd to validator. - - let ending_balance = starting_balance + expected_subsidy - operator_refund - burn; - print(&ending_balance); - print(&DiemAccount::balance(@Alice)); - assert!(DiemAccount::balance(@Alice) == ending_balance, 7357000180113); - assert!(NodeWeight::proof_of_weight(@Alice) == 5, 7357000180114); - - // Case 1, increments the epochs_validating_and_mining, - // which is used for rate-limiting onboarding - assert!(TowerState::get_epochs_compliant(@Alice) == 1, 7357000180115); + use DiemFramework::DiemSystem; + fun main(_vm: signer, _: signer) { + assert!(DiemSystem::is_validator(@Alice), 10001); + } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_unit.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_unit.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_unit.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_1_unit.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_reconfig.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_reconfig.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_reconfig.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_unit.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_unit.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_unit.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_2_unit.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_reconfig.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_reconfig.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_reconfig.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_unit.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_unit.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_unit.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_3_unit.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.depr similarity index 99% rename from diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.move rename to diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.depr index cdc3a570ef..3696f17262 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/cases/case_4_reconfig.depr @@ -1,5 +1,7 @@ //# init --validators Alice Bob Carol Dave Eve Frank +// V6 note: this test is covered in reconfiguration/ jail_case_4 + // This tests consensus Case 3. // DAVE is a validator. // DID NOT validate successfully. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/demos/persistence.move b/diem-move/diem-framework/core/transactional-tests/0L/demos/persistence.move index a6e4dd9095..9f07edfc2a 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/demos/persistence.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/demos/persistence.move @@ -12,7 +12,7 @@ //# run --admin-script --signers DiemRoot Alice script { use DiemFramework::PersistenceDemo; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // This sender argument was populated by the test harness with a random // address for `alice`, which can be accessed with sender variable or @@ -25,7 +25,7 @@ script { // our checks assert!(PersistenceDemo::length(&sender) == 3, 0); assert!(PersistenceDemo::contains(&sender, 1), 1); - print(&111); + // print(&111); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/end_user_transfer_testnet.move b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/end_user_transfer_testnet.move index c049683acb..f6c898f790 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/end_user_transfer_testnet.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/end_user_transfer_testnet.move @@ -25,7 +25,7 @@ script { script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main() { // need to remove testnet for this test, since testnet does not ratelimit account creation. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_rate_limit.move b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_rate_limit.move index 89ed417229..9d63bc569b 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_rate_limit.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_rate_limit.move @@ -13,7 +13,7 @@ script { use DiemFramework::Roles; use DiemFramework::TowerState; use DiemFramework::Testnet; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(dr: signer, sender: signer) { let sender_addr = Signer::address_of(&sender); @@ -47,7 +47,7 @@ script { assert!(ValidatorConfig::is_valid(parsed_address), 7357003); // Check that the Onboarder Alice, was able to deposit funds to the net validator account - print(&DiemAccount::balance(parsed_address)); + // print(&DiemAccount::balance(parsed_address)); assert!(DiemAccount::balance(parsed_address) == 1000000, 7357004); Testnet::remove_testnet(&dr); // testnet would make this always true diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.exp b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.exp index 2301000e50..457ace9c4a 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.exp @@ -1 +1 @@ -processed 6 tasks +processed 4 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.move index 07941ab3e4..39efd90f6e 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_reconfig.move @@ -13,19 +13,19 @@ script { use DiemFramework::ValidatorConfig; use DiemFramework::TestFixtures; use DiemFramework::VDF; - use DiemFramework::TowerState; + use DiemFramework::Vouch; + use Std::Vector; - fun main(_: signer, sender: signer) { + fun main(vm: signer, sender: signer) { // Scenario: Alice, an existing validator, is sending a transaction for Eve, // with a challenge and proof from eve's block_0 let challenge = TestFixtures::eve_0_easy_chal(); let solution = TestFixtures::eve_0_easy_sol(); // // Parse key and check - let (eve_addr, _auth_key) = VDF::extract_address_from_challenge(&challenge); - assert!(eve_addr == @0x3DC18D1CF61FAAC6AC70E3A63F062E4B, 401); + let (new_addr, _auth_key) = VDF::extract_address_from_challenge(&challenge); + assert!(new_addr == @0x3DC18D1CF61FAAC6AC70E3A63F062E4B, 401); - let epochs_since_creation = 10; - TowerState::test_helper_set_rate_limit(&sender, epochs_since_creation); + // let epochs_since_creation = 10; DiemAccount::create_validator_account_with_proof( &sender, @@ -42,65 +42,19 @@ script { b"192.168.0.1", // fullnode_network_addresses: vector, x"1ee7", // human_name: vector, ); - assert!(ValidatorConfig::is_valid(eve_addr), 7357130101031000); + assert!(ValidatorConfig::is_valid(new_addr), 7357130101031000); - } -} + let vouchers = Vector::singleton
(@Alice); + Vector::push_back(&mut vouchers, @Bob); + Vector::push_back(&mut vouchers, @Carol); + Vector::push_back(&mut vouchers, @Dave); -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::DiemSystem; - use DiemFramework::EpochBoundary; - use DiemFramework::TowerState; - use DiemFramework::Mock; + Vouch::vm_migrate(&vm, @0x3DC18D1CF61FAAC6AC70E3A63F062E4B, vouchers); - fun main(vm: signer, _: signer) { - let vm = &vm; - // Tests on initial size of validators - assert!(DiemSystem::validator_set_size() == 6, 7357000180101); - assert!(DiemSystem::is_validator(@Alice) == true, 7357000180102); - assert!(DiemSystem::is_validator(@Bob) == true, 7357000180103); - assert!( - DiemSystem::is_validator(@0x3DC18D1CF61FAAC6AC70E3A63F062E4B) == false, - 7357000180104 - ); - assert!(TowerState::is_init(@0x3DC18D1CF61FAAC6AC70E3A63F062E4B), 7357000180105); - - Mock::mock_case_1(vm, @Alice, 0, 15); - Mock::mock_case_1(vm, @Bob, 0, 15); - Mock::mock_case_1(vm, @Carol, 0, 15); - Mock::mock_case_1(vm, @Dave, 0, 15); - Mock::mock_case_1(vm, @Eve, 0, 15); - Mock::mock_case_1(vm, @Frank, 0, 15); - - EpochBoundary::reconfigure(vm, 15); // reconfigure at height 15 - assert!(DiemSystem::validator_set_size() == 6, 7357000180106); - } + } } -// Epoch 2 began -// The new node is in validatorUniverse but not in validator set -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::DiemSystem; - use DiemFramework::ValidatorUniverse; - use Std::Vector; - - fun main() { - // Tests on initial size of validators - // New validator is not in this set. - assert!(DiemSystem::validator_set_size() == 6, 7357000180101); - assert!(DiemSystem::is_validator(@Alice) == true, 7357000180102); - assert!( - !DiemSystem::is_validator(@0x3DC18D1CF61FAAC6AC70E3A63F062E4B), - 7357000180103 - ); - let len = Vector::length
(&ValidatorUniverse::get_eligible_validators()); - // Is in validator universe - assert!(len == 7, 7357000180104); - } -} // The new node starts mining and submiting proofs in the epoch 2 // @@ -108,11 +62,9 @@ script { script { use DiemFramework::DiemSystem; use DiemFramework::EpochBoundary; - use DiemFramework::TowerState; use DiemFramework::Mock; use Std::Vector; use DiemFramework::ValidatorUniverse; - use DiemFramework::Vouch; fun main(vm: signer, _: signer) { let vm = &vm; @@ -125,25 +77,16 @@ script { 7357000180204 ); - Mock::mock_case_1(vm, @Alice, 0, 15); - Mock::mock_case_1(vm, @Bob, 0, 15); - Mock::mock_case_1(vm, @Carol, 0, 15); - Mock::mock_case_1(vm, @Dave, 0, 15); - Mock::mock_case_1(vm, @Eve, 0, 15); - Mock::mock_case_1(vm, @Frank, 0, 15); - - let list = Vector::singleton
(@Alice); - Vector::push_back(&mut list, @Bob); - Vector::push_back(&mut list, @Carol); - Vector::push_back(&mut list, @Dave); - - Vouch::vm_migrate(vm, @0x3DC18D1CF61FAAC6AC70E3A63F062E4B, list); - - TowerState::test_helper_mock_mining_vm(vm, @0x3DC18D1CF61FAAC6AC70E3A63F062E4B, 20); let len = Vector::length
(&ValidatorUniverse::get_eligible_validators()); assert!(len == 7 , 7357000180206); + + // all validators ar compliant + Mock::all_good_validators(vm); + // all place bids + Mock::pof_default(vm); + // trigger epoch EpochBoundary::reconfigure(vm, 15); // reconfigure at height 15 } } @@ -156,11 +99,11 @@ script { use DiemFramework::DiemSystem; use DiemFramework::ValidatorUniverse; use Std::Vector; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main() { // Tests on initial size of validators - print(&DiemSystem::validator_set_size()); + // print(&DiemSystem::validator_set_size()); assert!(DiemSystem::validator_set_size() == 7, 7357000200301); assert!(DiemSystem::is_validator(@Alice) == true, 7357000200302); assert!( diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_tx_subsidy.move b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_tx_subsidy.move index 815be7b079..2d4b9a507f 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_tx_subsidy.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/onboarding_tx_subsidy.move @@ -91,7 +91,7 @@ script { use DiemFramework::TowerState; use DiemFramework::Testnet; use DiemFramework::Cases; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { // need to remove testnet for this test, since testnet does not ratelimit account creation. @@ -105,7 +105,7 @@ script { EpochBoundary::reconfigure(&vm, 100); let new_account_bal = DiemAccount::balance(eve); - print(&new_account_bal); + // print(&new_account_bal); // we expect 1 gas (1,000,000 microgas) from bob's transfer assert!(old_account_bal == 1000000, 7357003); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/vm_payment_receipts.move b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/vm_payment_receipts.move index d1adef3f79..fcb65e6789 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/diem_account/vm_payment_receipts.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/diem_account/vm_payment_receipts.move @@ -48,7 +48,7 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::Receipts; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { @@ -62,7 +62,7 @@ script { ); let (_, las_val, cumu) = Receipts::read_receipt(@Alice, @Carol); - print(&las_val); + // print(&las_val); assert!(las_val== 5000000, 7357003); assert!(cumu== 5000000, 7357004); } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.exp b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.exp index 5690c9ec8e..b6122d97a1 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.exp @@ -1,6 +1,6 @@ -processed 7 tasks +processed 6 tasks -task 5 'block'. lines 113-117: +task 4 'block'. lines 89-93: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -12,49 +12,13 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 2 type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" + data: "22df0d000000000003474153" } { key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" -} -{ - key: 050000000000000000000000000000000000000000000000 - seq_num: 3 - type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" -} -{ - key: 000000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "60a90000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "60a90000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 0 - type: 0x1::Diem::BurnEvent - data: "004dd208000000000347415300000000000000000000000000000000" + data: "22df0d000000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.move index 66f8334edc..10d4e04cb3 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig.move @@ -1,11 +1,11 @@ //# init --validators Alice --parent-vasps Bob // Alice: validators with 10M GAS -// Bob is an end-user running the Carpe app, and submitting miner proofs. +// Scenario: Bob is an end-user running the Carpe app, and submitting miner proofs. // He is the only one in the epoch submitting proofs. He should get the entirety // of the Identity Subsidy pool avaialable (one validator's worth) -// Create Bob's account +// // Create Bob's account //# run --admin-script --signers DiemRoot Alice script { @@ -42,69 +42,45 @@ script { } } -// 2. Reset all counters and make sure there are validator subsidies available. -// We need Alice to be a Case 1 validator so that there is a subsidy to be paid -// to validator set. -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::Mock; - use DiemFramework::TowerState; - use DiemFramework::DiemAccount; - use DiemFramework::NodeWeight; - use DiemFramework::GAS::GAS; - - fun main(vm: signer, _: signer) { - // Test suite makes all validators have 1 fullnode proof when starting. - // need to reset to avoid confusion. - TowerState::test_epoch_reset_counter(&vm); - TowerState::test_helper_mock_reconfig(&vm, @Alice); - TowerState::test_helper_mock_reconfig(&vm, @Bob); - - // make alice a compliant validator, and mine 10 proofs - Mock::mock_case_1(&vm, @Alice, 0, 15); - assert!(TowerState::get_count_in_epoch(@Alice) == 10, 735701); - // print(&TowerState::get_count_in_epoch(@Alice)); - assert!(DiemAccount::balance(@Alice) == 9000000, 735704); - assert!(NodeWeight::proof_of_weight(@Alice) == 10, 735705); - } -} - -// 3. Mock Bob (the end-user) submitting proofs above threshold. +// Mock Bob (the end-user) submitting proofs above threshold. //# run --admin-script --signers DiemRoot Bob script { // use DiemFramework::DiemSystem; use DiemFramework::TowerState; - use DiemFramework::Debug::print; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; + // use DiemFramework::Debug::print; + // use DiemFramework::GAS::GAS; + // use DiemFramework::DiemAccount; // use DiemFramework::NodeWeight; fun main(_dr: signer, sender: signer) { - print(&TowerState::get_fullnode_proofs_in_epoch()); - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); - // Bob has one proof from init above - assert!(TowerState::get_fullnode_proofs_in_epoch() == 0, 735706); + // Bob has one proof from testrunner, and also bob's first proof + // TODO: check this + assert!(TowerState::get_fullnode_proofs_in_epoch() == 2, 735706); // there should be no proofs above threshold at this point. assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 0, 735707); // Bob needs to beabove threshold (two) before the subsequent proofs are counted. // adding 10 more here (which are all above threshold). + TowerState::test_helper_mock_mining(&sender, 12); - print(&TowerState::get_fullnode_proofs_in_epoch()); - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&0777); + // print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); - print(&TowerState::get_count_in_epoch(@Bob)); - print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); + // print(&TowerState::get_count_in_epoch(@Bob)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); // Since the threshold in test suite is 1 proof, all the 10 are // counted above threshold. - assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 10, 735708); + assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 11, 735708); - print(&DiemAccount::balance(@Bob)); - print(&DiemAccount::balance(@Alice)); + // print(&DiemAccount::balance(@Bob)); + // print(&DiemAccount::balance(@Alice)); } } @@ -120,31 +96,18 @@ script { script { use DiemFramework::GAS::GAS; use DiemFramework::DiemAccount; - use DiemFramework::Subsidy; - use DiemFramework::Globals; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_vm: signer, _: signer) { // We are in a new epoch. - // we expect that Bob receives the share that one validator would get. - let expected_subsidy = Subsidy::subsidy_curve( - Globals::get_subsidy_ceiling_gas(), - 1, // alice is the only validator (but below 4 the reward is the same - // in testnet: 296000000) - Globals::get_max_validators_per_set(), - ); + let expected_subsidy = 1000000; let bob_starting_balance = 1000000; - print(&expected_subsidy); - - let ending_balance = bob_starting_balance + expected_subsidy; - - print(&DiemAccount::balance(@Bob)); - print(&DiemAccount::balance(@Alice)); + let _ending_balance = bob_starting_balance + expected_subsidy; - // bob gets the whole subsidy - assert!(DiemAccount::balance(@Bob) == ending_balance, 735711); + // TODO: check bob gets the whole subsidy + assert!(DiemAccount::balance(@Bob) > bob_starting_balance, 735711); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_mixed_val_cases.move b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_mixed_val_cases.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_mixed_val_cases.move rename to diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_mixed_val_cases.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_six_validators.move b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_six_validators.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_six_validators.move rename to diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_six_validators.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.exp b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.exp index d33bff2290..c847af3a8a 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.exp @@ -12,61 +12,43 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 2 type: 0x1::Diem::MintEvent - data: "004dd2080000000003474153" + data: "20a107000000000003474153" } { key: 00000000000000002e3a0b7a741dae873bf0f203a82dfd52 seq_num: 0 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "004dd2080000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" + data: "20a107000000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 3 type: 0x1::Diem::MintEvent - data: "004dd2080000000003474153" + data: "20a107000000000003474153" } { key: 0000000000000000dc79c2a4e9500e144f90e65795fc6af3 seq_num: 0 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "004dd2080000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" + data: "20a107000000000003474153000000000000000000000000000000001066756c6c6e6f64655f73756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 4 type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" + data: "40420f000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "60a90000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "60a90000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a15046275726e" + data: "40420f000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 060000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::Diem::BurnEvent - data: "004dd208000000000347415300000000000000000000000000000000" + data: "00000000000000000347415300000000000000000000000000000000" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.move b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.move index 106c260c6c..491700c312 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/fullnode_subsidy/fullnode_reconfig_three_miners.move @@ -82,7 +82,7 @@ script { script { use DiemFramework::Mock; use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { TowerState::test_epoch_reset_counter(&vm); @@ -99,10 +99,10 @@ script { TowerState::test_helper_mock_mining_vm(&vm, @Carol, 12); // ABOVE threshold TowerState::test_helper_mock_mining_vm(&vm, @Dave, 1); // below threshold - print(&TowerState::get_fullnode_proofs_in_epoch()); - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); - print(&TowerState::get_count_in_epoch(@Bob)); - print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); + // print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_count_in_epoch(@Bob)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); Mock::mock_case_1(&vm, @Alice, 0, 15); @@ -125,15 +125,15 @@ script { use DiemFramework::DiemAccount; use DiemFramework::Subsidy; use DiemFramework::Globals; - use DiemFramework::Debug::print; - use DiemFramework::TowerState; + // use DiemFramework::Debug::print; + // use DiemFramework::TowerState; fun main(_vm: signer, _: signer) { // We are in a new epoch. - print(&TowerState::get_fullnode_proofs_in_epoch()); - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); - print(&TowerState::get_count_in_epoch(@Bob)); - print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); // doesn't reset until the user sends a transaction + // print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_count_in_epoch(@Bob)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); // doesn't reset until the user sends a transaction // we expect that Bob and Carol would split the reward that one validator would get. let expected_subsidy = Subsidy::subsidy_curve( @@ -145,20 +145,19 @@ script { let starting_balance = 0; - print(&expected_subsidy); - + // print(&expected_subsidy); - let ending_balance = starting_balance + expected_subsidy / 2; // divided by 2 because we have 2 miners. Exclude Dave. - print(&DiemAccount::balance(@Alice)); + let _ending_balance = starting_balance + expected_subsidy / 2; // divided by 2 because we have 2 miners. Exclude Dave. - print(&DiemAccount::balance(@Bob)); - print(&DiemAccount::balance(@Carol)); + // print(&DiemAccount::balance(@Alice)); + // print(&DiemAccount::balance(@Bob)); + // print(&DiemAccount::balance(@Carol)); - // bob and carol share half the identity subsidy - assert!(DiemAccount::balance(@Bob) == ending_balance, 735711); + // TODOL check bob and carol share half the ORACLE subsidy + assert!(DiemAccount::balance(@Bob) > starting_balance, 735711); - assert!(DiemAccount::balance(@Carol) == ending_balance, 735712); + assert!(DiemAccount::balance(@Carol) > starting_balance, 735712); // dave's balance is unchanged assert!(DiemAccount::balance(@Dave) == starting_balance, 735713); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_mint.move b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_mint.move index fd6d8a6b57..1671c39d9c 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_mint.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_mint.move @@ -13,6 +13,7 @@ script { assert!(Diem::market_cap() == old_market_cap + 1000, 2); DiemAccount::vm_deposit_with_metadata( &vm, + @VMReserved, @Alice, coin, x"", x"" diff --git a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.exp b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.exp similarity index 58% rename from diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.exp rename to diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.exp index c20f9af59e..0903de7768 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.exp @@ -1,4 +1,4 @@ processed 2 tasks -task 1 'run'. lines 6-42: -Error: Transaction discarded. VMStatus: status ABORTED of type Execution with sub status 200202 +task 1 'run'. lines 8-30: +Error: Transaction discarded. VMStatus: status ABORTED of type Execution with sub status 120128 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.move b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.move similarity index 55% rename from diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.move rename to diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.move index 48d925234e..858533e799 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_transfer_check.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/gas/gas_slow_wal_transfer_check.move @@ -2,18 +2,23 @@ // Alice: validators with 10M GAS // Bob: non-validators with 1M GAS -// Transfers between accounts is disabled +// Scenario: trying to transfer more coins than are unlocked +// from your Slow wallet will fail. + //# run --admin-script --signers DiemRoot Alice script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::Testnet; - fun main(_dr: signer, account: signer) { + fun main(dr: signer, account: signer) { // transfers are enabled in testnet, need to disable testnet to // check that they are disabled otherwise - Testnet::remove_testnet(&account); + Testnet::remove_testnet(&dr); let with_cap = DiemAccount::extract_withdraw_capability(&account); + + // There has been no epoch drip to put unlocked coins in account. DiemAccount::pay_from(&with_cap, @Bob, 10, x"", x""); + assert!(DiemAccount::balance(@Alice) == 9999990, 0); assert!(DiemAccount::balance(@Bob) == 1000010, 1); DiemAccount::restore_withdraw_capability(with_cap); @@ -22,21 +27,4 @@ script { ////////// Transfers should fail //////// // check: VMExecutionFailure -///////////////////////////////////////// - -// //! new-transaction -// // Transfers from diemroot to other accounts is enabled -// //! sender: diemroot -// //! gas-currency: GAS -// script { -// use DiemFramework::Diem; -// use DiemFramework::DiemAccount; -// use DiemFramework::GAS; -// ; -// fun main(account: signer) { -// let coin = Diem::mint(account, 10); -// DiemAccount::deposit(account, @Bob, coin); -// assert!(DiemAccount::balance(@Bob) == 10, 4); -// } -// } -// // check: EXECUTED +///////////////////////////////////////// \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/jail/jail_sort.move b/diem-move/diem-framework/core/transactional-tests/0L/jail/jail_sort.move index b02c1809b9..fbcb452264 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/jail/jail_sort.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/jail/jail_sort.move @@ -19,31 +19,33 @@ script { use Std::Vector; use DiemFramework::NodeWeight; use DiemFramework::Jail; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_: signer, vm: signer) { let sorted_val_universe = NodeWeight::get_sorted_vals(); - print(&sorted_val_universe); + // print(&sorted_val_universe); let (_is_found, idx) = Vector::index_of(&sorted_val_universe, &@Eve); - print(&idx); + // print(&idx); assert!(idx == 2, 735701); let jail_sort = Jail::sort_by_jail(*&sorted_val_universe); - let (_is_found, idx) = Vector::index_of(&jail_sort, &@Eve); - print(&idx); + let (_is_found, _idx) = Vector::index_of(&jail_sort, &@Eve); + assert!(idx != 6, 735705); + + // print(&idx); Jail::jail(&vm, @Eve); assert!(Jail::is_jailed(@Eve), 7357003); let jail_sort = Jail::sort_by_jail(*&sorted_val_universe); - print(&jail_sort); - print(&@Eve); + // print(&jail_sort); + // print(&@Eve); let (_is_found, idx) = Vector::index_of(&jail_sort, &@Eve); - print(&idx); + // print(&idx); assert!(idx == 6, 735705); // jail Alice 2x and she will fall to bottom of list @@ -52,10 +54,10 @@ script { let jail_sort = Jail::sort_by_jail(*&sorted_val_universe); let (_is_found, idx) = Vector::index_of(&jail_sort, &@Eve); - print(&idx); + // print(&idx); assert!(idx == 5, 735706); let (_is_found, idx) = Vector::index_of(&jail_sort, &@Alice); - print(&idx); + // print(&idx); assert!(idx == 6, 735707); Jail::remove_consecutive_fail(&vm, @Eve); @@ -63,9 +65,9 @@ script { // back to previous sort let jail_sort = Jail::sort_by_jail(*&sorted_val_universe); - print(&jail_sort); + // print(&jail_sort); let (_is_found, idx) = Vector::index_of(&jail_sort, &@Eve); - print(&idx); + // print(&idx); assert!(idx == 2, 735708); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole.move b/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole.move index 73805174bb..dc685054c0 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole.move @@ -28,7 +28,7 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use Std::Signer; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_vm: signer, sig: signer) { let addr = Signer::address_of(&sig); @@ -37,12 +37,12 @@ script { let amount = MakeWhole::query_make_whole_payment(addr); assert!(amount == expected_amount, 7357002); - let claimed = MakeWhole::claim_make_whole_payment(&sig); + let _claimed = MakeWhole::claim_make_whole_payment(&sig); let current = DiemAccount::balance(addr); - print(¤t); - print(&initial); - print(&amount); - print(&claimed); + // print(¤t); + // print(&initial); + // print(&amount); + // print(&claimed); assert!(current - initial == expected_amount, 7357003); // tries to claim again, and is 0; diff --git a/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole_none.move b/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole_none.move index 63a378d815..44afe68b0d 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole_none.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/make_whole/make_whole_none.move @@ -8,7 +8,7 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use Std::Signer; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_vm: signer, sig: signer) { let addr = Signer::address_of(&sig); @@ -17,12 +17,12 @@ script { let amount = MakeWhole::query_make_whole_payment(addr); assert!(amount == expected_amount, 7357001); - let claimed = MakeWhole::claim_make_whole_payment(&sig); + let _claimed = MakeWhole::claim_make_whole_payment(&sig); let current = DiemAccount::balance(addr); - print(¤t); - print(&initial); - print(&amount); - print(&claimed); + // print(¤t); + // print(&initial); + // print(&amount); + // print(&claimed); assert!(current - initial == expected_amount, 7357002); } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/migrate/_meta_destroy_state.move b/diem-move/diem-framework/core/transactional-tests/0L/migrate/_meta_destroy_state.move index 9ff256a69d..fc7e92e063 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/migrate/_meta_destroy_state.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/migrate/_meta_destroy_state.move @@ -6,13 +6,13 @@ //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { // destroy the struct TowerState::test_danger_destroy_tower_counter(&vm); // should not find anything - print(&TowerState::test_get_liftime_proofs()); + assert!(TowerState::test_get_liftime_proofs() > 0, 7357001); } } // check: EXECUTION_FAILURE \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/multi_sig_billing.move b/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/multi_sig_billing.move index 1663fe2326..0f04a2313b 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/multi_sig_billing.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/multi_sig_billing.move @@ -41,11 +41,11 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; // use DiemFramework::MultiSig; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // use Std::Vector; fun main(_dr: signer, _d_sig: signer) { let bal = DiemAccount::balance(@DaveMultiSig); - print(&bal); + // print(&bal); assert!(bal != 1000000, 7357001); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/type_propose.move b/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/type_propose.move index 97ca05b5a2..7f05b85da2 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/type_propose.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/multi_sig/type_propose.move @@ -37,7 +37,7 @@ script { use DiemFramework::MultiSigPayment; use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_dr: signer, b_sig: signer) { @@ -47,7 +47,7 @@ script { // no change since proposal is pending let bal = DiemAccount::balance(@DaveMultiSig); - print(&bal); + // print(&bal); assert!(bal == 1000000, 7357002); } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/node_weight/inactive_validators.move b/diem-move/diem-framework/core/transactional-tests/0L/node_weight/inactive_validators.move index 6b4f3dbf37..01b1c755ab 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/node_weight/inactive_validators.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/node_weight/inactive_validators.move @@ -22,7 +22,7 @@ script { use DiemFramework::NodeWeight; use DiemFramework::ValidatorUniverse; use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { @@ -44,7 +44,7 @@ script { // NOTE: there's a known issue when many validators have the same // weight, the nodes included will be those LAST included in the validator universe. let top_n_is_under = NodeWeight::top_n_accounts(vm, 3); - print(&top_n_is_under); + // print(&top_n_is_under); assert!(Vector::length
(&top_n_is_under) == 3, 7357140102021000); // Check BOB is NOT in that list. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.exp similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/audit/audit_passing_happy_day.exp rename to diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.exp diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.move new file mode 100644 index 0000000000..7c52351d58 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_expired.move @@ -0,0 +1,57 @@ +//# init --validators Alice Bob Carol + +// Scenario: Happy case. Alice checks all the boxes. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + use DiemFramework::Vouch; + use DiemFramework::Testnet; + use DiemFramework::DiemAccount; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, a_sig: signer) { + // let's remove testnet settings. Globals thresholds + // are not the same as prod. + Testnet::remove_testnet(&vm); + + // is not jailed. + assert!(!Jail::is_jailed(@Alice), 1003); + + // has minimum viable vouches + // bob and carol at genesis are automatically vouching for each other. + // // print(&Vouch::unrelated_buddies(@Alice)); + assert!(Vouch::unrelated_buddies_above_thresh(@Alice), 1004); + + + // check that there are sufficient UNLOCKED coins in the + // validator's account. + ProofOfFee::set_bid(&a_sig, 1, 1000); // mock a bid. change below + let (bid, _) = ProofOfFee::current_bid(@Alice); + DiemAccount::slow_wallet_epoch_drip(&vm, 500000); // mock funds in account + let coin = DiemAccount::unlocked_amount(@Alice); + let (r, _, _) = ProofOfFee::get_consensus_reward(); + let bid_cost = (bid * r) / 1000; + // print(&bid_cost); + assert!(coin > bid_cost, 1005); + + + + + // has a bid which IS expired + // test runner is at epoch 1, they put expiry at 0. + // TODO: Improve this test by doing more advanced epochs + ProofOfFee::set_bid(&a_sig, 1, 0); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 1, 1006); + assert!(expires == 0, 1007); + // should NOT pass audit. + assert!(!ProofOfFee::audit_qualification(&@Alice), 1008); + + // fix it + ProofOfFee::set_bid(&a_sig, 1, 1000); + assert!(ProofOfFee::audit_qualification(&@Alice), 1009); + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.move new file mode 100644 index 0000000000..2c373f3772 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_happy.move @@ -0,0 +1,48 @@ +//# init --validators Alice Bob Carol + +// Scenario: Happy case. Alice checks all the boxes. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + use DiemFramework::Vouch; + use DiemFramework::Testnet; + use DiemFramework::DiemAccount; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, a_sig: signer) { + // let's remove testnet settings. Globals thresholds + // are not the same as prod. + Testnet::remove_testnet(&vm); + + // is not jailed. + assert!(!Jail::is_jailed(@Alice), 1003); + + // has minimum viable vouches + // bob and carol at genesis are automatically vouching for each other. + // // print(&Vouch::unrelated_buddies(@Alice)); + assert!(Vouch::unrelated_buddies_above_thresh(@Alice), 1004); + + // has a bid which has not expired + ProofOfFee::set_bid(&a_sig, 1, 10000); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 1, 1001); + assert!(expires == 10000, 1002); + + + // check that there are sufficient UNLOCKED coins in the + // validator's account. + DiemAccount::slow_wallet_epoch_drip(&vm, 500000); + let coin = DiemAccount::unlocked_amount(@Alice); + let (r, _, _) = ProofOfFee::get_consensus_reward(); + let bid_cost = (bid * r) / 1000; + // print(&bid_cost); + assert!(coin > bid_cost, 1005); + + // should pass audit. + assert!(ProofOfFee::audit_qualification(&@Alice), 1006); + + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.exp new file mode 100644 index 0000000000..fc5a4436b2 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.exp @@ -0,0 +1 @@ +processed 3 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.move new file mode 100644 index 0000000000..3c99769c03 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_jail.move @@ -0,0 +1,68 @@ +//# init --validators Alice Bob Carol + +// Scenario: Happy case. Alice checks all the boxes. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + use DiemFramework::Vouch; + use DiemFramework::Testnet; + use DiemFramework::DiemAccount; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, a_sig: signer) { + // let's remove testnet settings. Globals thresholds + // are not the same as prod. + Testnet::remove_testnet(&vm); + + // has minimum viable vouches + // bob and carol at genesis are automatically vouching for each other. + // // print(&Vouch::unrelated_buddies(@Alice)); + assert!(Vouch::unrelated_buddies_above_thresh(@Alice), 1004); + + // has a bid which has not expired + ProofOfFee::set_bid(&a_sig, 1, 10000); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 1, 1001); + assert!(expires == 10000, 1002); + + + // check that there are sufficient UNLOCKED coins in the + // validator's account. + DiemAccount::slow_wallet_epoch_drip(&vm, 500000); + let coin = DiemAccount::unlocked_amount(@Alice); + let (r, _, _) = ProofOfFee::get_consensus_reward(); + let bid_cost = (bid * r) / 1000; + // print(&bid_cost); + assert!(coin > bid_cost, 1005); + + + // EVERYTHING ABOVE HERE IS PASSING. + // is now jailed. + Jail::jail(&vm, @Alice); + assert!(Jail::is_jailed(@Alice), 1006); + // won't pass audit + assert!(!ProofOfFee::audit_qualification(&@Alice), 1007); + + + + } +} + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + fun main(_vm: signer, bob_sig: signer) { + + // Bob needs to unjail + Jail::vouch_unjail(&bob_sig, @Alice); + + // should pass audit. + assert!(ProofOfFee::audit_qualification(&@Alice), 1008); + + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.move new file mode 100644 index 0000000000..968bd6a999 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_no_funds.move @@ -0,0 +1,56 @@ +//# init --validators Alice Bob Carol + +// Scenario: Happy case. Alice checks all the boxes. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + use DiemFramework::Vouch; + use DiemFramework::Testnet; + use DiemFramework::DiemAccount; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, a_sig: signer) { + // let's remove testnet settings. Globals thresholds + // are not the same as prod. + Testnet::remove_testnet(&vm); + + // is not jailed. + assert!(!Jail::is_jailed(@Alice), 1003); + + // has minimum viable vouches + // bob and carol at genesis are automatically vouching for each other. + // // print(&Vouch::unrelated_buddies(@Alice)); + assert!(Vouch::unrelated_buddies_above_thresh(@Alice), 1004); + + // has a bid which has not expired + ProofOfFee::set_bid(&a_sig, 1, 10000); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 1, 1001); + assert!(expires == 10000, 1002); + + // EVERYTHING ABOVE HERE IS PASSING. + + // check that there are sufficient UNLOCKED coins in the + // validator's account. + + // NOTE: skip mocking the unlocked coins in account. + + let coin = DiemAccount::unlocked_amount(@Alice); + let (r, _, _) = ProofOfFee::get_consensus_reward(); + let bid_cost = (bid * r) / 1000; + // print(&bid_cost); + // coins will be less than bid cost + assert!(coin < bid_cost, 1005); + + // should NOTE pass audit. + assert!(!ProofOfFee::audit_qualification(&@Alice), 1006); + + // Fix it. Now we unlock some funds + DiemAccount::slow_wallet_epoch_drip(&vm, 500000); + // passes audit + assert!(ProofOfFee::audit_qualification(&@Alice), 1006); + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.exp new file mode 100644 index 0000000000..fc5a4436b2 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.exp @@ -0,0 +1 @@ +processed 3 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.move new file mode 100644 index 0000000000..f9c5e49b48 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/audit_vouch.move @@ -0,0 +1,68 @@ +//# init --validators Alice Bob Carol + +// Scenario: Happy case. Alice checks all the boxes. + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Jail; + // use DiemFramework::Vouch; + use DiemFramework::Testnet; + use DiemFramework::DiemAccount; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, a_sig: signer) { + // let's remove testnet settings. Globals thresholds + // are not the same as prod. + Testnet::remove_testnet(&vm); + + // is not jailed. + assert!(!Jail::is_jailed(@Alice), 1003); + + + // has a bid which has not expired + ProofOfFee::set_bid(&a_sig, 1, 10000); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 1, 1001); + assert!(expires == 10000, 1002); + + + // check that there are sufficient UNLOCKED coins in the + // validator's account. + DiemAccount::slow_wallet_epoch_drip(&vm, 500000); + let coin = DiemAccount::unlocked_amount(@Alice); + let (r, _, _) = ProofOfFee::get_consensus_reward(); + let bid_cost = (bid * r) / 1000; + // print(&bid_cost); + assert!(coin > bid_cost, 1005); + + + // EVERYTHING ABOVE HERE IS PASSING. + + } +} + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Vouch; + fun main(_vm: signer, bob_sig: signer) { + + + Vouch::revoke(&bob_sig, @Alice); + // has minimum viable vouches + // bob and carol at genesis are automatically vouching for each other. + // // print(&Vouch::unrelated_buddies(@Alice)); + assert!(!Vouch::unrelated_buddies_above_thresh(@Alice), 1006); + + // should pass audit. + assert!(!ProofOfFee::audit_qualification(&@Alice), 1007); + + Vouch::vouch_for(&bob_sig, @Alice); + // should pass audit. + assert!(ProofOfFee::audit_qualification(&@Alice), 1008); + + } +} + diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.move new file mode 100644 index 0000000000..9028837731 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_few_bidders.move @@ -0,0 +1,48 @@ +//# init --validators Alice Bob Carol Dave Eve + + +/// Scenario: Eve does not bid. So we have fewer bidders than seats +/// Otherwise Eve is a performing and valid validator +/// For all lists we are using the validators in the ValidatorUniverse +/// the desired validator set is the same size as the universe. +/// All validators in the universe are properly configured +/// All validators performed perfectly in the previous epoch. +/// They have all placed bids, per TestFixtures::pof_default(). + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, eve_sig: signer) { + + let (_val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + // Ok now Eve changes her mind. Will force the bid to expire. + ProofOfFee::set_bid(&eve_sig, 0, 0); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + // print(&len); + assert!(len == 4, 1000); + + // The desired validator set is exaclty the size of the elegible validators, who all have placed bids. + // the performant validators are the same as the bidding validators. + let (seats, _p) = ProofOfFee::fill_seats_and_get_price(&vm, len, &sorted, &sorted); + // print(&seats); + // print(&p); + + assert!(Vector::contains(&seats, &@Alice), 1000); + + // filling the seat updated the computation of the consensu reward. + let (reward, clear_price, median_bid) = ProofOfFee::get_consensus_reward(); + assert!(reward == 1000000, 1001); + // print(&clear_price); + assert!(clear_price == 1, 1002); + // print(&median_bid); + assert!(median_bid == 2, 1003); + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.move new file mode 100644 index 0000000000..750a89c1c9 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy.move @@ -0,0 +1,45 @@ +//# init --validators Alice Bob Carol Dave Eve + + +/// Scenario: Happy Day +/// For all lists we are using the validators in the ValidatorUniverse +/// the desired validator set is the same size as the universe. +/// All validators in the universe are properly configured +/// All validators performed perfectly in the previous epoch. +/// They have all placed bids, per TestFixtures::pof_default(). + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _a_sig: signer) { + + let (val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + assert!(len == Vector::length(&val_universe), 1000); + + // The desired validator set is exaclty the size of the elegible validators, who all have placed bids. + // the performant validators are the same as the bidding validators. + let (seats, _p) = ProofOfFee::fill_seats_and_get_price(&vm, len, &sorted, &sorted); + // print(&seats); + // print(&p); + + assert!(Vector::contains(&seats, &@Alice), 1000); + + // filling the seat updated the computation of the consensu reward. + let (reward, clear_price, median_bid) = ProofOfFee::get_consensus_reward(); + assert!(reward == 1000000, 1001); + assert!(clear_price == 1, 1002); + // print(&median_bid); + assert!(median_bid == 3, 1003); + + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.todo b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.todo new file mode 100644 index 0000000000..4e40bead6e --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_happy_and_thermostat.todo @@ -0,0 +1,48 @@ +//# init --validators Alice Bob Carol Dave Eve + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + use DiemFramework::Debug::print; + use DiemFramework::DiemAccount; + use Std::Signer; + use Std::Vector; + + fun main(vm: signer, a_sig: signer) { + DiemAccount::slow_wallet_epoch_drip(&vm, 1000); // unlock some coins for the validators + ProofOfFee::set_bid(&a_sig, 0001, 10); // 0.1% bid, and expired on epoch 10 + let acc = Signer::address_of(&a_sig); + let (bid, expires) = ProofOfFee::current_bid(acc); + print(&bid); + print(&expires); + let vals = Vector::singleton(@Alice); + Vector::push_back(&mut vals, @Bob); + Vector::push_back(&mut vals, @Carol); + Vector::push_back(&mut vals, @Dave); + Vector::push_back(&mut vals, @Eve); + + let sorted_by_bid = ProofOfFee::get_sorted_vals(false); + + let (seats, p) = ProofOfFee::fill_seats_and_get_price(&vm, 5, &sorted_by_bid, &vals); + print(&seats); + print(&p); + + assert!(Vector::contains(&seats, &@Alice), 1000); + + // filling the seat updated the computation of the consensu reward. + let (reward, win_bid, median_bid) = ProofOfFee::get_consensus_reward(); + assert!(reward == 1000000, 1001); + assert!(win_bid == 1, 1002); + print(&median_bid); + assert!(median_bid == 1, 1003); + + // we expect no change in the reward_thermostat because there haven't been 5 epochs or more of historical data. + ProofOfFee::reward_thermostat(&vm, &vals); + + let (reward, win_bid, median_bid) = ProofOfFee::get_consensus_reward(); + assert!(reward == 1000000, 1004); + assert!(win_bid == 1, 1005); + assert!(median_bid == 1, 1006); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.move new file mode 100644 index 0000000000..aaea0d213b --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_many_bidders.move @@ -0,0 +1,62 @@ +//# init --validators Alice Bob Carol Dave Eve + + +/// Scenario: We have 5 validators but only 3 seats in the set. +/// They have all placed bids, per TestFixtures::pof_default(). +// The lowest bidders Alice and Bob, will be excluded. + +/// For all lists we are using the validators in the ValidatorUniverse +/// the desired validator set is the same size as the universe. +/// All validators in the universe are properly configured +/// All validators performed perfectly in the previous epoch. + + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _eve_sig: signer) { + + let (_val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + // print(&len); + // all validators are ready and have qualifying bids. + assert!(len == 5, 1000); + + // The desired validator set is exaclty the size of the elegible validators, who all have placed bids. + // the performant validators are the same as the bidding validators. + + // + let set_size = 3; + let (seats, _p) = ProofOfFee::fill_seats_and_get_price( + &vm, + set_size, + &sorted, + &sorted + ); + // print(&seats); + // print(&p); + + assert!(!Vector::contains(&seats, &@Alice), 1001); + assert!(!Vector::contains(&seats, &@Bob), 1002); + // carol is in + assert!(Vector::contains(&seats, &@Carol), 1003); + + // filling the seat updated the computation of the consensu reward. + // Median bids and clearing prices will be different than the happy path test. + let (reward, clear_price, median_bid) = ProofOfFee::get_consensus_reward(); + // print(&reward); + assert!(reward == 1000000, 1004); + // print(&clear_price); + assert!(clear_price == 3, 1005); + // print(&median_bid); + assert!(median_bid == 5, 1006); + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.move new file mode 100644 index 0000000000..a71abc31e0 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_happy.move @@ -0,0 +1,84 @@ +//# init --validators Alice Bob Carol Dave Eve Frank + + +// Scenario: Here we have 6 validators and 6 seats, but only 4 come +// from the previous epoch. +// They have all placed bids, per TestFixtures::pof_default(). + +// However Alice and Bob have not been in the last epoch's set. +// So we consider them "unproven". +// Alice and Bob happen to also be the lowest bidders. But we will +// seat them, and their bids will count toward getting the clearing price. + +// In this scenario there will be sufficient seats. +// We will open up 2 seats (1/3 of 6 seats). +// As such both Eve and Frank should be seated. + +// The clearing price will not change. The lowest is still alice +// who is also seated. + + +/// For all lists we are using the validators in the ValidatorUniverse +/// the desired validator set is the same size as the universe. +/// All validators in the universe are properly configured +/// All validators performed perfectly in the previous epoch. + + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _eve_sig: signer) { + + let (_val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + // print(&len); + // all validators are ready and have qualifying bids. + assert!(len == 6, 1000); + + // The desired validator set is exaclty the size of the elegible validators, who all have placed bids. + // the performant validators are the same as the bidding validators. + + // our set is big enough that we can include 2 unproven nodes (1/3). + let set_size = 6; + + // Alice and Bob were not in the previous round. They are not "proven" + let proven_vals = Vector::singleton(@Carol); + Vector::push_back(&mut proven_vals, @Dave); + Vector::push_back(&mut proven_vals, @Eve); + Vector::push_back(&mut proven_vals, @Frank); + + + let (seats, _p) = ProofOfFee::fill_seats_and_get_price( + &vm, + set_size, + &sorted, + &proven_vals + ); + // print(&seats); + // print(&p); + + // Alice and Bob must be in + assert!(Vector::contains(&seats, &@Alice), 1001); + assert!(Vector::contains(&seats, &@Bob), 1002); + assert!(Vector::contains(&seats, &@Carol), 1003); + + // filling the seat updated the computation of the consensu reward. + // Median bids and clearing prices will be different than the happy path test. + let (reward, clear_price, median_bid) = ProofOfFee::get_consensus_reward(); + // print(&reward); + assert!(reward == 1000000, 1004); + // print(&clear_price); + // The clearing price is 1, Alice's lowest bid. + assert!(clear_price == 1, 1005); + // print(&median_bid); + assert!(median_bid == 3, 1006); + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.move new file mode 100644 index 0000000000..c9af4d9e44 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/fill_seats_unproven_sad.move @@ -0,0 +1,92 @@ +//# init --validators Alice Bob Carol Dave Eve Frank + + +// Scenario: Here we have 6 validators and 4 seats, but only 4 come +// from the previous epoch. +// This time Eve and Frank are "unproven nodes", they also happen +// to have the highest bids. +// They have all placed bids, per TestFixtures::pof_default(). + +// At 4 seats, we only have space for 1 unproven node. +// It should be Frank that gets seated. +// Eve will not be seated at all, even though she has a higher bid +// than the proven nodes. + +// The clearing price will not change. The lowest is still Alice +// who is also seated. + +/// For all lists we are using the validators in the ValidatorUniverse +/// the desired validator set is the same size as the universe. +/// All validators in the universe are properly configured +/// All validators performed perfectly in the previous epoch. + + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _eve_sig: signer) { + + let (_val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + // print(&len); + // all validators are ready and have qualifying bids. + assert!(len == 6, 1000); + + // The desired validator set is exaclty the size of the elegible validators, who all have placed bids. + // the performant validators are the same as the bidding validators. + + // the set size will only allow for 1 unproven node. + let set_size = 5; + + // Eve and Frank were not in the previous round. They are not "proven" + let proven_vals = Vector::singleton(@Alice); + Vector::push_back(&mut proven_vals, @Bob); + Vector::push_back(&mut proven_vals, @Carol); + Vector::push_back(&mut proven_vals, @Dave); + // Vector::push_back(&mut proven_vals, @Eve); + // Vector::push_back(&mut proven_vals, @Frank); + + + let (seats,_p) = ProofOfFee::fill_seats_and_get_price( + &vm, + set_size, + &sorted, + &proven_vals + ); + // print(&seats); + // print(&p); + + + // Eve is not despite bidding a higher price than many + assert!(!Vector::contains(&seats, &@Eve), 1001); + // Frank is in, his bid is higher than Eve's + // So when the only slot opened up for "unproven" nodes + // Frank was seated. Frank was competing only with Eve. + assert!(Vector::contains(&seats, &@Frank), 1002); + + // Alice and Bob are still in as proven nodes, although the bid was lower + assert!(Vector::contains(&seats, &@Alice), 1003); + assert!(Vector::contains(&seats, &@Bob), 1004); + + + + // filling the seat updated the computation of the consensu reward. + // Median bids and clearing prices will be different than the happy path test. + let (reward, clear_price, median_bid) = ProofOfFee::get_consensus_reward(); + // print(&reward); + assert!(reward == 1000000, 1005); + // print(&clear_price); + // The clearing price is 1, Alice's lowest bid. + assert!(clear_price == 1, 1006); + // print(&median_bid); + assert!(median_bid == 3, 1007); + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.exp new file mode 100644 index 0000000000..457ace9c4a --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.exp @@ -0,0 +1 @@ +processed 4 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.move new file mode 100644 index 0000000000..427ca1a26f --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/pof_set_retract.move @@ -0,0 +1,61 @@ +//# init --validators Alice Bob + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ValidatorConfig; + use DiemFramework::ValidatorUniverse; + use DiemFramework::ProofOfFee; + use Std::Signer; + + fun main(_vm: signer, a_sig: signer) { + ValidatorUniverse::is_in_universe(@Alice); + ValidatorConfig::is_valid(@Alice); + + ProofOfFee::init(&a_sig); + let (bid, expires) = ProofOfFee::current_bid(@Alice); + assert!(bid == 0, 1001); + assert!(expires == 0, 1002); + + // should not fail if already initialized + ProofOfFee::init(&a_sig); + + ProofOfFee::set_bid(&a_sig, 100, 0); + let acc = Signer::address_of(&a_sig); + let (bid, expires) = ProofOfFee::current_bid(acc); + assert!(@Alice == acc, 33333); + assert!(bid == 100, 1003); + assert!(expires == 0, 1004); + } +} + + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::ProofOfFee; + + fun main(_vm: signer, b_sig: signer) { + // should initialize if not already initialized + ProofOfFee::set_bid(&b_sig, 30, 1111); + let (bid, expires) = ProofOfFee::current_bid(@Bob); + assert!(bid == 30, 1005); + assert!(expires == 1111, 1006); + } +} + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::ProofOfFee; + use DiemFramework::DiemConfig; + + fun main(_vm: signer, b_sig: signer) { + let this_epoch = DiemConfig::get_current_epoch(); + // should initialize if not already initialized + ProofOfFee::retract_bid(&b_sig); + let (bid, expires) = ProofOfFee::current_bid(@Bob); + let (is_rectracted, epoch) = ProofOfFee::is_already_retracted(@Bob); + assert!(is_rectracted, 1007); + assert!(epoch == this_epoch, 1008); + assert!(bid == 0, 1009); + assert!(expires == 0, 10010); + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.move new file mode 100644 index 0000000000..9b6e6d233f --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_expired_bid.move @@ -0,0 +1,55 @@ +//# init --validators Alice Bob Carol Dave Eve + +/// Scenario: Eve decides to withdraw bid. Otherwise all vals are performing correctly, and match the size of the validator set. + +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // // use DiemFramework::Debug::print; + + fun main(vm: signer, eve_sig: signer) { + + let (val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + // Ok now Eve changes her mind. Will force the bid to expire. + // asser + ProofOfFee::set_bid(&eve_sig, 0, 0); + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + + assert!(len < Vector::length(&val_universe), 1000); + assert!(!Vector::contains(&sorted, &@Eve), 1001); + assert!(len == 4, 1002); + + + } +} + + + +// /// Scenario: Eve does not bid. So we have fewer bidders than seats +// //# run --admin-script --signers DiemRoot Eve +// script { +// use DiemFramework::ProofOfFee; +// use DiemFramework::TestFixtures; +// use Std::Vector; + +// // use DiemFramework::Debug::print; + +// fun main(vm: signer, _eve_sig: signer) { + +// let (_val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); +// // Ok now Eve changes her mind. Will force the bid to expire. +// ProofOfFee::set_bid(&eve_sig, 0, 1); + +// let sorted = ProofOfFee::get_sorted_vals(); +// let len = Vector::length(&sorted); + +// // print(&len); +// assert!(len == 4, 1000); + + +// } +// } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.move new file mode 100644 index 0000000000..9e3aad38da --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_happy.move @@ -0,0 +1,25 @@ +//# init --validators Alice Bob Carol Dave Eve + +/// Scenario: happy path, all vals bid, and are performing correctly, and match the size of the validator set. +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _eve_sig: signer) { + + let (val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + // Ok now Eve changes her mind. Will force the bid to expire. + // asser + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + assert!(len == Vector::length(&val_universe), 1000); + + // print(&len); + assert!(len == 5, 1001); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.move new file mode 100644 index 0000000000..2e1c7c7242 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/sorted_vals_jailed.move @@ -0,0 +1,29 @@ +//# init --validators Alice Bob Carol Dave Eve + +/// Scenario: happy path, all vals bid, and are performing correctly, and match the size of the validator set. +//# run --admin-script --signers DiemRoot Eve +script { + use DiemFramework::ProofOfFee; + use DiemFramework::TestFixtures; + use Std::Vector; + use DiemFramework::Jail; + + // use DiemFramework::Debug::print; + + fun main(vm: signer, _eve_sig: signer) { + + let (val_universe, _their_bids, _their_expiry) = TestFixtures::pof_default(&vm); + + // Eve is going to be jailed. Should exclude from the sorting. + Jail::jail(&vm, @Eve); + + let sorted = ProofOfFee::get_sorted_vals(false); + let len = Vector::length(&sorted); + // dropeed one + assert!(len < Vector::length(&val_universe), 1000); + + // print(&len); + assert!(len == 4, 1001); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.move new file mode 100644 index 0000000000..7756edbf89 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_long.move @@ -0,0 +1,56 @@ +//# init --validators Alice + +// Scenario: The reward is too high during 5 days (short window). People are bidding over 95% of the baseline fee. + + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + // use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _a_sig: signer) { + + let start_value = 0960; // 96% of baseline fee. + let median_history = Vector::empty(); + + // we need at least 10 epochs above the 95% range. + let i = 0; + while (i < 12) { + // let factor = i * 10; + // let value = start_value + factor; + // // print(&value); + Vector::push_back(&mut median_history, start_value); + i = i + 1; + }; + + + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + median_history, + ); + + // no changes until we run the thermostat. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + ProofOfFee::reward_thermostat(&vm); + + // In the decrease case during a short period, we decrease by 5% + // No other parameters of consensus reward should change on calling this function. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 90, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + // print(&value); + // print(&clearing); + // print(&median); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.move new file mode 100644 index 0000000000..f09d6e91cf --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_decrease_short.move @@ -0,0 +1,56 @@ +//# init --validators Alice + +// Scenario: The reward is too high during 5 days (short window). People are bidding over 95% of the baseline fee. + + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + // // use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _a_sig: signer) { + + let start_value = 0950; // 96% of baseline fee. + let median_history = Vector::empty(); + + // we need at least 5 epochs above the 95% range. + let i = 0; + while (i < 7) { + let factor = i * 10; + let value = start_value + factor; + // // print(&value); + Vector::push_back(&mut median_history, value); + i = i + 1; + }; + + + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + median_history, + ); + + // no changes until we run the thermostat. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + ProofOfFee::reward_thermostat(&vm); + + // In the decrease case during a short period, we decrease by 5% + // No other parameters of consensus reward should change on calling this function. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 95, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + // // print(&value); + // // print(&clearing); + // // print(&median); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.move new file mode 100644 index 0000000000..df04399561 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_long.move @@ -0,0 +1,56 @@ +//# init --validators Alice + +// Scenario: The reward is too low during 5 days (short window). People are not bidding very high. + + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + // use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _a_sig: signer) { + + let start_value = 0200; // 20% of baseline fee. + let median_history = Vector::empty(); + + // we need at least 10 epochs above the 95% range. + let i = 0; + while (i < 12) { + // let factor = i * 10; + // let value = start_value + factor; + // // print(&value); + Vector::push_back(&mut median_history, start_value); + i = i + 1; + }; + + + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + median_history, + ); + + // no changes until we run the thermostat. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + ProofOfFee::reward_thermostat(&vm); + + // In the decrease case during a short period, we decrease by 5% + // No other parameters of consensus reward should change on calling this function. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 110, 1003); + assert!(clearing == 50, 1004); + assert!(median == 33, 1005); + + // print(&value); + // print(&clearing); + // print(&median); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.move new file mode 100644 index 0000000000..7f7bac44ef --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_increase_short.move @@ -0,0 +1,56 @@ +//# init --validators Alice + +// Scenario: The reward is too low during 5 days (short window). People are not bidding very high. + + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + // use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _a_sig: signer) { + + let start_value = 0200; // 20% of baseline fee. + let median_history = Vector::empty(); + + // we need at least 10 epochs above the 95% range. + let i = 0; + while (i < 7) { + // let factor = i * 10; + // let value = start_value + factor; + // // print(&value); + Vector::push_back(&mut median_history, start_value); + i = i + 1; + }; + + + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + median_history, + ); + + // no changes until we run the thermostat. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + ProofOfFee::reward_thermostat(&vm); + + // In the decrease case during a short period, we decrease by 5% + // No other parameters of consensus reward should change on calling this function. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 105, 1003); + assert!(clearing == 50, 1004); + assert!(median == 33, 1005); + + // print(&value); + // print(&clearing); + // print(&median); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.move new file mode 100644 index 0000000000..a8bf94a967 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_mock.move @@ -0,0 +1,23 @@ +//# init --validators Alice Bob Carol Dave Eve + +//# run --admin-script --signers DiemRoot Bob +script { + use DiemFramework::ProofOfFee; + use Std::Vector; + + fun main(vm: signer, _bob_sig: signer) { + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + Vector::singleton(33), + ); + + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.exp b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.move new file mode 100644 index 0000000000..4f357bf047 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/proof_of_fee/thermostat_unit_happy.move @@ -0,0 +1,53 @@ +//# init --validators Alice + +// Scenario: Happy path: The median history is fully within range of 50%-95% of baseline reward. No change is epected. + + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ProofOfFee; + // use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _a_sig: signer) { + + let start_value = 0510; // 51% of baseline reward + let median_history = Vector::empty(); + + let i = 0; + while (i < 10) { + let factor = i * 10; + let value = start_value + factor; + // print(&value); + Vector::push_back(&mut median_history, value); + i = i + 1; + }; + + + ProofOfFee::test_mock_reward( + &vm, + 100, + 50, + 33, + median_history, + ); + + // no changes until we run the thermostat. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + ProofOfFee::reward_thermostat(&vm); + + // This is the happy case. No changes since the rewards were within range + // the whole time. + let (value, clearing, median) = ProofOfFee::get_consensus_reward(); + assert!(value == 100, 1000); + assert!(clearing == 50, 1001); + assert!(median == 33, 1002); + + + + } +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.exp b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.exp index fddca2fc26..4c3e370706 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.exp @@ -1,6 +1,6 @@ processed 5 tasks -task 1 'block'. lines 5-7: +task 1 'block'. lines 6-8: Events: { key: 0c0000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.move index c3564ce758..5bc7210407 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/jailed_set.move @@ -1,6 +1,7 @@ //# init --validators Alice Bob Carol Dave Eve Frank -// Test that both cases 3 and 4 are jailed. +// Scenario: Check that validators that are not signing are being jailed +// V6: Validators increasing towers has no effect. //# block --proposer Alice --time 1 --round 0 @@ -50,7 +51,7 @@ script { }; assert!(Cases::get_case(vm, @Alice, 0, 15) == 1, 7357008003003); - assert!(Cases::get_case(vm, @Eve, 0, 15) == 3, 7357008003004); + assert!(Cases::get_case(vm, @Eve, 0, 15) == 4, 7357008003004); assert!(Cases::get_case(vm, @Frank, 0, 15) == 4, 7357008003005); let jailed = DiemSystem::get_jailed_set(vm, 0, 15); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.exp b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.exp index 0d307776ad..ce00b388f9 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.exp @@ -17,6 +17,48 @@ Events: type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" } +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 5 + type: 0x1::Diem::MintEvent + data: "151605000000000003474153" +} +{ + key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "151605000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 6 + type: 0x1::Diem::MintEvent + data: "151605000000000003474153" +} +{ + key: 0000000000000000b000d8e1919132c664a36c0fdf986407 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "151605000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 7 + type: 0x1::Diem::MintEvent + data: "151605000000000003474153" +} +{ + key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "151605000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 060000000000000000000000000000000000000000000000 + seq_num: 0 + type: 0x1::Diem::BurnEvent + data: "00000000000000000347415300000000000000000000000000000000" +} { key: 040000000000000000000000000000000000000000000000 seq_num: 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.move index 70230ebffc..858a767fd0 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/minimum_validators_update.move @@ -1,8 +1,8 @@ //# init --validators Alice Bob Carol Dave -// This test is to check if validators are present after the first epoch. -// Here EPOCH-LENGTH = 15 Blocks. -// NOTE: This test will fail in test-net and Production, only for Debug - due to epoch length. +// Scenario: failover +// This test checks that we get at least 4 validators. +// If less qualified, give us the previous set. //# block --proposer Alice --time 1 --round 0 @@ -37,7 +37,7 @@ script { fun main(vm: signer, _dr: signer) { let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); + // Vector::push_back
(&mut voters, @Alice); Vector::push_back
(&mut voters, @Bob); Vector::push_back
(&mut voters, @Carol); Vector::push_back
(&mut voters, @Dave); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.depr similarity index 98% rename from diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.move rename to diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.depr index a2f1a88d80..d3664b6695 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_below_set_size.depr @@ -1,5 +1,7 @@ //# init --validators Alice Bob Carol Dave Eve Frank +// Note duplicate test with minimum_validators + // Testing if validator set remains the same if the size of eligible // validators falls below 4 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_case_2.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_case_2.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_case_2.move rename to diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_case_2.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_include_case_2.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_include_case_2.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_include_case_2.move rename to diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_include_case_2.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3.move rename to diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3_rejoin.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3_rejoin.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3_rejoin.move rename to diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_3_rejoin.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.exp b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.exp index 29a28b85f1..a2742445a9 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.exp @@ -1,6 +1,6 @@ -processed 11 tasks +processed 5 tasks -task 1 'block'. lines 12-14: +task 1 'block'. lines 13-13: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -9,7 +9,7 @@ Events: data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" } -task 9 'block'. lines 158-162: +task 3 'block'. lines 39-43: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -21,181 +21,97 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 7 type: 0x1::Diem::MintEvent - data: "1fe97d030000000003474153" + data: "400d03000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "1fe97d030000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 8 type: 0x1::Diem::MintEvent - data: "1fe97d030000000003474153" + data: "400d03000000000003474153" } { key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "1fe97d030000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153c8ee0daf3968fe8ac4d0096d75edbdd40d74782066656520726566756e64" -} -{ - key: 0000000000000000c8ee0daf3968fe8ac4d0096d75edbdd4 - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153de589ec6b85a4a1a58be166c38551cc20d74782066656520726566756e64" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 9 type: 0x1::Diem::MintEvent - data: "1fe97d030000000003474153" + data: "400d03000000000003474153" } { key: 0000000000000000b000d8e1919132c664a36c0fdf986407 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "1fe97d030000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415352d3c4e214124979700b1146ecc9b44d0d74782066656520726566756e64" -} -{ - key: 000000000000000052d3c4e214124979700b1146ecc9b44d - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153b000d8e1919132c664a36c0fdf9864070d74782066656520726566756e64" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 10 type: 0x1::Diem::MintEvent - data: "1fe97d030000000003474153" + data: "400d03000000000003474153" } { key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "1fe97d030000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b054000000000000034741538a990c3af2d618e7d809591e9d7372ff0d74782066656520726566756e64" -} -{ - key: 00000000000000008a990c3af2d618e7d809591e9d7372ff - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b054000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0d74782066656520726566756e64" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 11 type: 0x1::Diem::MintEvent - data: "1fe97d030000000003474153" + data: "400d03000000000003474153" } { - key: 0000000000000000182163e7473ca001b3e8775649fe80b3 + key: 0000000000000000fe963583bf7112d4d9f5527425fd258e seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "1fe97d030000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153b043da55393093af29a2bb02688a5aa80d74782066656520726566756e64" -} -{ - key: 0000000000000000b043da55393093af29a2bb02688a5aa8 - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153182163e7473ca001b3e8775649fe80b30d74782066656520726566756e64" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "8ff4be010000000003474153182163e7473ca001b3e8775649fe80b3046275726e" + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 060000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::Diem::BurnEvent - data: "8ff4be01000000000347415300000000000000000000000000000000" + data: "00000000000000000347415300000000000000000000000000000000" } { - key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 2 + key: 0100000000000000fe963583bf7112d4d9f5527425fd258e + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "8ff4be0100000000034741533c36bd759b51f1c9b7f4258896fcfe6c046275726e" + data: "010000000000000003474153fe963583bf7112d4d9f5527425fd258e0c70726f6f66206f6620666565" } { - key: 060000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::Diem::BurnEvent - data: "8ff4be01000000000347415300000000000000000000000000000000" + key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "0100000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0c70726f6f66206f6620666565" } { key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 2 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "8ff4be010000000003474153b000d8e1919132c664a36c0fdf986407046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 2 - type: 0x1::Diem::BurnEvent - data: "8ff4be01000000000347415300000000000000000000000000000000" + data: "010000000000000003474153b000d8e1919132c664a36c0fdf9864070c70726f6f66206f6620666565" } { key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 2 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "8ff4be010000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 3 - type: 0x1::Diem::BurnEvent - data: "8ff4be01000000000347415300000000000000000000000000000000" + data: "010000000000000003474153de589ec6b85a4a1a58be166c38551cc20c70726f6f66206f6620666565" } { key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 2 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "8ff4be01000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 4 - type: 0x1::Diem::BurnEvent - data: "8ff4be01000000000347415300000000000000000000000000000000" + data: "01000000000000000347415306505ccd81e562b524d8f656abd92a150c70726f6f66206f6620666565" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.move index 5c3eecf93d..baf9506cda 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_jail_case_4.move @@ -1,154 +1,35 @@ //# init --validators Alice Bob Carol Dave Eve Frank -// Testing if FRANK a CASE 4 Validator gets dropped. +// Scenario: All validators perform well except for Eve +// She is then jailed and dropped from the next epoch set. // ALICE is CASE 1 // BOB is CASE 1 // CAROL is CASE 1 // DAVE is CASE 1 -// EVE is CASE 1 -// FRANK is CASE 4 +// EVE is CASE 4 +// FRANK is CASE 1 //# block --proposer Alice --time 1 --round 0 -//! NewBlockEvent - -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::DiemAccount; - use DiemFramework::GAS::GAS; - use DiemFramework::ValidatorConfig; - - fun main(sender: signer, _: signer) { - // Transfer enough coins to operators - let oper_bob = ValidatorConfig::get_operator(@Bob); - let oper_eve = ValidatorConfig::get_operator(@Eve); - let oper_dave = ValidatorConfig::get_operator(@Dave); - let oper_alice = ValidatorConfig::get_operator(@Alice); - let oper_carol = ValidatorConfig::get_operator(@Carol); - let oper_frank = ValidatorConfig::get_operator(@Frank); - DiemAccount::vm_make_payment_no_limit(@Bob, oper_bob, 50009, x"", x"", &sender); - DiemAccount::vm_make_payment_no_limit(@Eve, oper_eve, 50009, x"", x"", &sender); - DiemAccount::vm_make_payment_no_limit(@Dave, oper_dave, 50009, x"", x"", &sender); - DiemAccount::vm_make_payment_no_limit(@Alice, oper_alice, 50009, x"", x"", &sender); - DiemAccount::vm_make_payment_no_limit(@Carol, oper_carol, 50009, x"", x"", &sender); - DiemAccount::vm_make_payment_no_limit(@Frank, oper_frank, 50009, x"", x"", &sender); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::TowerState; - use DiemFramework::AutoPay; - - fun main(_dr: signer, sender: signer) { - AutoPay::enable_autopay(&sender); - - // Miner is the only one that can update their mining stats. - // Hence this first transaction. - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Alice) == 5, 7357008010001); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Bob -script { - use DiemFramework::TowerState; - use DiemFramework::AutoPay; - - fun main(_dr: signer, sender: signer) { - AutoPay::enable_autopay(&sender); - - // Miner is the only one that can update their mining stats. - // Hence this first transaction. - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Bob) == 5, 7357008010002); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Carol -script { - use DiemFramework::TowerState; - use DiemFramework::AutoPay; - - fun main(_dr: signer, sender: signer) { - AutoPay::enable_autopay(&sender); - - // Miner is the only one that can update their mining stats. - // Hence this first transaction. - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Carol) == 5, 7357008010003); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Dave -script { - use DiemFramework::TowerState; - use DiemFramework::AutoPay; - - fun main(_dr: signer, sender: signer) { - AutoPay::enable_autopay(&sender); - - // Miner is the only one that can update their mining stats. - // Hence this first transaction. - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Dave) == 5, 7357008010004); - } -} -//check: EXECUTED //# run --admin-script --signers DiemRoot Eve script { - use DiemFramework::TowerState; - use DiemFramework::AutoPay; - - fun main(_dr: signer, sender: signer) { - AutoPay::enable_autopay(&sender); - - // Miner is the only one that can update her mining stats. - // Hence this first transaction. - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Eve) == 5, 7357008010005); - } -} -//check: EXECUTED - -//////////////////// -// Skipping Frank // -//////////////////// - -//# run --admin-script --signers DiemRoot DiemRoot -script { - // use DiemFramework::TowerState; - use DiemFramework::Stats; - use Std::Vector; + use DiemFramework::Mock; use DiemFramework::DiemSystem; + use DiemFramework::Cases; - fun main(vm: signer, _: signer) { - // todo: change name to Mock epochs - // TowerState::test_helper_set_epochs(&sender, 5); - let voters = Vector::singleton
(@Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - // Skipping Frank. + fun main(vm: signer, _eve_sig: signer) { - let i = 1; - while (i < 15) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; + assert!(DiemSystem::validator_set_size() == 6, 7357008013007); + // all validators compliant + Mock::all_good_validators(&vm); + // all validators bid + Mock::pof_default(&vm); - assert!(DiemSystem::validator_set_size() == 6, 7357008010006); - assert!(DiemSystem::is_validator(@Alice) == true, 7357008010007); - // Mock end of epoch for minerstate - // TowerState::test_helper_mock_reconfig(@Alice); + // now make Eve not compliant + Mock::mock_case_4(&vm, @Eve, 0, 15); + assert!(Cases::get_case(&vm, @Eve, 0, 15) == 4, 735701); } } //check: EXECUTED @@ -170,7 +51,7 @@ script { assert!(DiemConfig::get_current_epoch() == 2, 7357008010008); // Tests on initial size of validators assert!(DiemSystem::validator_set_size() == 5, 7357008010009); - assert!(DiemSystem::is_validator(@Frank) == false, 7357008010010); + assert!(DiemSystem::is_validator(@Eve) == false, 7357008010010); } } //check: EXECUTED \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.exp b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.exp index d257d60619..01b5978986 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.exp @@ -1,6 +1,6 @@ -processed 7 tasks +processed 5 tasks -task 1 'block'. lines 8-10: +task 1 'block'. lines 11-13: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -9,7 +9,7 @@ Events: data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" } -task 5 'block'. lines 66-70: +task 3 'block'. lines 38-42: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -17,6 +17,102 @@ Events: type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" } +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 6 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 000000000000000006505ccd81e562b524d8f656abd92a15 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 7 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 8 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 0000000000000000b000d8e1919132c664a36c0fdf986407 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 9 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 10 + type: 0x1::Diem::MintEvent + data: "400d03000000000003474153" +} +{ + key: 0000000000000000182163e7473ca001b3e8775649fe80b3 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "400d03000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 060000000000000000000000000000000000000000000000 + seq_num: 0 + type: 0x1::Diem::BurnEvent + data: "00000000000000000347415300000000000000000000000000000000" +} +{ + key: 0100000000000000182163e7473ca001b3e8775649fe80b3 + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "010000000000000003474153182163e7473ca001b3e8775649fe80b30c70726f6f66206f6620666565" +} +{ + key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "0100000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0c70726f6f66206f6620666565" +} +{ + key: 0100000000000000b000d8e1919132c664a36c0fdf986407 + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "010000000000000003474153b000d8e1919132c664a36c0fdf9864070c70726f6f66206f6620666565" +} +{ + key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "010000000000000003474153de589ec6b85a4a1a58be166c38551cc20c70726f6f66206f6620666565" +} +{ + key: 010000000000000006505ccd81e562b524d8f656abd92a15 + seq_num: 0 + type: 0x1::DiemAccount::SentPaymentEvent + data: "01000000000000000347415306505ccd81e562b524d8f656abd92a150c70726f6f66206f6620666565" +} { key: 040000000000000000000000000000000000000000000000 seq_num: 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.move index ea35fb21cd..1a6b6b5f3e 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_one_epoch.move @@ -1,7 +1,10 @@ //# init --validators Alice Bob Carol Dave Eve -// Case 1: Validators are compliant. -// This test is to check if validators are present after the first epoch. +// Happy case: All validators from genesis are compliant +// and place sucessful bids for the next set. +// we get to a new epoch. +// Note: we are also testing the test runner syntax for advancing to new epoch. + // Here EPOCH-LENGTH = 15 Blocks. // NOTE: This test will fail with Staging and Production Constants, only for Debug - due to epoch length. @@ -12,53 +15,22 @@ //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::DiemSystem; + use DiemFramework::Mock; - fun main() { + fun main(vm: signer, _: signer) { // Tests on initial size of validators assert!(DiemSystem::validator_set_size() == 5, 7357008012001); assert!(DiemSystem::is_validator(@Alice) == true, 7357008012002); assert!(DiemSystem::is_validator(@Bob) == true, 7357008012003); - } -} -// check: EXECUTED - -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::DiemSystem; - fun main() { - // Tests on initial size of validators - assert!(DiemSystem::validator_set_size() == 5, 7357008012004); - assert!(DiemSystem::is_validator(@Alice) == true, 7357008012005); - assert!(DiemSystem::is_validator(@Bob) == true, 7357008012006); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot DiemRoot -script { - use Std::Vector; - use DiemFramework::Stats; + // all validators compliant + Mock::all_good_validators(&vm); + // all validators bid + Mock::pof_default(&vm); - // This is the the epoch boundary. - fun main(vm: signer, _: signer) { - let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - - // Overwrite the statistics to mock that all have been validating. - let i = 1; - while (i < 16) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; } } -//check: EXECUTED +// check: EXECUTED ////////////////////////////////////////////// diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.exp b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.exp index d96e281b16..da5f09c728 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.exp @@ -1,237 +1,126 @@ -processed 19 tasks +processed 6 tasks -task 1 'block'. lines 6-6: +task 2 'block'. lines 24-28: Events: { key: 0c0000000000000000000000000000000000000000000000 seq_num: 0 type: 0x1::DiemBlock::NewBlockEvent - data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" -} - -task 9 'block'. lines 113-117: -Events: -{ - key: 0c0000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" } { key: 050000000000000000000000000000000000000000000000 seq_num: 7 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 8 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153c8ee0daf3968fe8ac4d0096d75edbdd40d74782066656520726566756e64" -} -{ - key: 0000000000000000c8ee0daf3968fe8ac4d0096d75edbdd4 - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153de589ec6b85a4a1a58be166c38551cc20d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 9 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000b000d8e1919132c664a36c0fdf986407 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415352d3c4e214124979700b1146ecc9b44d0d74782066656520726566756e64" -} -{ - key: 000000000000000052d3c4e214124979700b1146ecc9b44d - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153b000d8e1919132c664a36c0fdf9864070d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 10 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b054000000000000034741538a990c3af2d618e7d809591e9d7372ff0d74782066656520726566756e64" -} -{ - key: 00000000000000008a990c3af2d618e7d809591e9d7372ff - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b054000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 11 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000182163e7473ca001b3e8775649fe80b3 seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153b043da55393093af29a2bb02688a5aa80d74782066656520726566756e64" -} -{ - key: 0000000000000000b043da55393093af29a2bb02688a5aa8 - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153182163e7473ca001b3e8775649fe80b30d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 12 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000fe963583bf7112d4d9f5527425fd258e seq_num: 1 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { - key: 0100000000000000fe963583bf7112d4d9f5527425fd258e + key: 060000000000000000000000000000000000000000000000 seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415373d4b65f4428734a16835e23eb3669da0d74782066656520726566756e64" -} -{ - key: 000000000000000073d4b65f4428734a16835e23eb3669da - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153fe963583bf7112d4d9f5527425fd258e0d74782066656520726566756e64" + type: 0x1::Diem::BurnEvent + data: "00000000000000000347415300000000000000000000000000000000" } { key: 0100000000000000fe963583bf7112d4d9f5527425fd258e - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153fe963583bf7112d4d9f5527425fd258e046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 seq_num: 0 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + type: 0x1::DiemAccount::SentPaymentEvent + data: "010000000000000003474153fe963583bf7112d4d9f5527425fd258e0c70726f6f66206f6620666565" } { key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 1 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153182163e7473ca001b3e8775649fe80b3046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153182163e7473ca001b3e8775649fe80b30c70726f6f66206f6620666565" } { key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 1 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a700100000000034741533c36bd759b51f1c9b7f4258896fcfe6c046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 2 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "0100000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0c70726f6f66206f6620666565" } { key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 1 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153b000d8e1919132c664a36c0fdf986407046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 3 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153b000d8e1919132c664a36c0fdf9864070c70726f6f66206f6620666565" } { key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 1 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 4 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153de589ec6b85a4a1a58be166c38551cc20c70726f6f66206f6620666565" } { key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 + seq_num: 0 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a7001000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 5 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "01000000000000000347415306505ccd81e562b524d8f656abd92a150c70726f6f66206f6620666565" } { key: 040000000000000000000000000000000000000000000000 @@ -240,11 +129,11 @@ Events: data: "0200000000000000" } -task 17 'block'. lines 224-228: +task 4 'block'. lines 49-53: Events: { key: 0c0000000000000000000000000000000000000000000000 - seq_num: 2 + seq_num: 1 type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a15008092450700000000" } @@ -252,217 +141,115 @@ Events: key: 050000000000000000000000000000000000000000000000 seq_num: 13 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000fe963583bf7112d4d9f5527425fd258e seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000fe963583bf7112d4d9f5527425fd258e - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415373d4b65f4428734a16835e23eb3669da0d74782066656520726566756e64" -} -{ - key: 000000000000000073d4b65f4428734a16835e23eb3669da - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153fe963583bf7112d4d9f5527425fd258e0d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 14 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000182163e7473ca001b3e8775649fe80b3 seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153b043da55393093af29a2bb02688a5aa80d74782066656520726566756e64" -} -{ - key: 0000000000000000b043da55393093af29a2bb02688a5aa8 - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153182163e7473ca001b3e8775649fe80b30d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 15 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b054000000000000034741538a990c3af2d618e7d809591e9d7372ff0d74782066656520726566756e64" -} -{ - key: 00000000000000008a990c3af2d618e7d809591e9d7372ff - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b054000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 16 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000b000d8e1919132c664a36c0fdf986407 seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415352d3c4e214124979700b1146ecc9b44d0d74782066656520726566756e64" -} -{ - key: 000000000000000052d3c4e214124979700b1146ecc9b44d - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153b000d8e1919132c664a36c0fdf9864070d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 17 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b05400000000000003474153c8ee0daf3968fe8ac4d0096d75edbdd40d74782066656520726566756e64" -} -{ - key: 0000000000000000c8ee0daf3968fe8ac4d0096d75edbdd4 - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b05400000000000003474153de589ec6b85a4a1a58be166c38551cc20d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { key: 050000000000000000000000000000000000000000000000 seq_num: 18 type: 0x1::Diem::MintEvent - data: "8e15e1020000000003474153" + data: "0a8b02000000000003474153" } { key: 000000000000000006505ccd81e562b524d8f656abd92a15 seq_num: 2 type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "8e15e1020000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 2 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" + data: "0a8b02000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" } { - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 2 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" + key: 060000000000000000000000000000000000000000000000 + seq_num: 1 + type: 0x1::Diem::BurnEvent + data: "06000000000000000347415300000000000000000000000000000000" } { key: 0100000000000000fe963583bf7112d4d9f5527425fd258e - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153fe963583bf7112d4d9f5527425fd258e046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 6 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153fe963583bf7112d4d9f5527425fd258e0c70726f6f66206f6620666565" } { key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153182163e7473ca001b3e8775649fe80b3046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 7 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153182163e7473ca001b3e8775649fe80b30c70726f6f66206f6620666565" } { key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a700100000000034741533c36bd759b51f1c9b7f4258896fcfe6c046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 8 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "0100000000000000034741533c36bd759b51f1c9b7f4258896fcfe6c0c70726f6f66206f6620666565" } { key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153b000d8e1919132c664a36c0fdf986407046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 9 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153b000d8e1919132c664a36c0fdf9864070c70726f6f66206f6620666565" } { key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a70010000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 10 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "010000000000000003474153de589ec6b85a4a1a58be166c38551cc20c70726f6f66206f6620666565" } { key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 3 + seq_num: 1 type: 0x1::DiemAccount::SentPaymentEvent - data: "c78a7001000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 11 - type: 0x1::Diem::BurnEvent - data: "c78a7001000000000347415300000000000000000000000000000000" + data: "01000000000000000347415306505ccd81e562b524d8f656abd92a150c70726f6f66206f6620666565" } { key: 040000000000000000000000000000000000000000000000 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.move b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.move index 5059de06ff..e0ff6a13c4 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/reconfiguration/reconfig_success_two_epochs.move @@ -3,107 +3,18 @@ // This test is to check if two epochs succesfully happen with all // validators being CASE 1. -//# block --proposer Alice --time 1 --round 0 - -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Alice) == 5, 7357008013001); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Bob -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Bob) == 5, 7357008013002); - } -} -//check: EXECUTED - - -//# run --admin-script --signers DiemRoot Carol -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Carol) == 5, 7357008013003); - } -} -//check: EXECUTED - - -//# run --admin-script --signers DiemRoot Dave -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Dave) == 5, 7357008013004); - } -} -// //check: EXECUTED - -//# run --admin-script --signers DiemRoot Eve -script { - use DiemFramework::TowerState; - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Eve) == 5, 7357008013005); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Frank -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Frank) == 5, 7357008013006); - } -} -//check: EXECUTED - //# run --admin-script --signers DiemRoot DiemRoot script { - use Std::Vector; - use DiemFramework::Stats; + use DiemFramework::Mock; use DiemFramework::DiemSystem; fun main(vm: signer, _: signer) { - assert!(DiemSystem::validator_set_size() == 6, 7357008013007); - let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - Vector::push_back
(&mut voters, @Frank); - - let i = 1; - while (i < 16) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; + assert!(DiemSystem::validator_set_size() == 6, 7357008013007); + // all validators compliant + Mock::all_good_validators(&vm); + // all validators bid + Mock::pof_default(&vm); } } // check: EXECUTED @@ -116,105 +27,19 @@ script { // check: NewEpochEvent ////////////////////////////////////////////// -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Alice) == 5, 7357008013008); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Bob -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Bob) == 5, 7357008013009); - } -} -//check: EXECUTED - - -//# run --admin-script --signers DiemRoot Carol -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - // Alice is the only one that can update her mining stats. - // Hence this first transaction. - - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Carol) == 5, 7357008013010); - } -} -//check: EXECUTED - - -//# run --admin-script --signers DiemRoot Dave -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Dave) == 5, 7357008013011); - } -} -// //check: EXECUTED - -//# run --admin-script --signers DiemRoot Eve -script { - use DiemFramework::TowerState; - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Eve) == 5, 7357008013012); - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot Frank -script { - use DiemFramework::TowerState; - - fun main(_dr: signer, sender: signer) { - TowerState::test_helper_mock_mining(&sender, 5); - assert!(TowerState::get_count_in_epoch(@Frank) == 5, 7357008013013); - } -} -//check: EXECUTED - - //# run --admin-script --signers DiemRoot DiemRoot script { - use Std::Vector; - use DiemFramework::Stats; + use DiemFramework::Mock; + use DiemFramework::DiemSystem; fun main(vm: signer, _: signer) { - let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - Vector::push_back
(&mut voters, @Frank); - - - let i = 16; - while (i < 31) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; + + assert!(DiemSystem::validator_set_size() == 6, 7357008013007); + // all validators compliant + Mock::all_good_validators(&vm); + // all validators bid + Mock::pof_default(&vm); } } // check: EXECUTED diff --git a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_enable_disable.move b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_enable_disable.move index 81614da18e..045ecbe7ac 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_enable_disable.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_enable_disable.move @@ -26,12 +26,12 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::RecoveryMode; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(){ // RecoveryMode::test_init_recovery(&vm, Vector::empty
(), 2); - // assert!(RecoveryMode::is_recovery(), 7357001); - print(&RecoveryMode::is_recovery()); + assert!(RecoveryMode::is_recovery(), 7357001); + // print(&RecoveryMode::is_recovery()); } } @@ -46,11 +46,11 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::RecoveryMode; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(){ // RecoveryMode::test_init_recovery(&vm, Vector::empty
(), 2); assert!(!RecoveryMode::is_recovery(), 7357002); - // print(&RecoveryMode::is_recovery()); + // // print(&RecoveryMode::is_recovery()); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.exp b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.exp index 6a29b8dc9b..c90bb28629 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.exp @@ -1,4 +1,4 @@ -processed 8 tasks +processed 6 tasks task 1 'block'. lines 8-8: Events: @@ -9,7 +9,7 @@ Events: data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" } -task 6 'block'. lines 106-110: +task 4 'block'. lines 37-41: Events: { key: 0c0000000000000000000000000000000000000000000000 @@ -17,6 +17,12 @@ Events: type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" } +{ + key: 060000000000000000000000000000000000000000000000 + seq_num: 0 + type: 0x1::Diem::BurnEvent + data: "00000000000000000347415300000000000000000000000000000000" +} { key: 040000000000000000000000000000000000000000000000 seq_num: 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.move b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.move index 3a50a6dc1c..f444e34f77 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/recovery_mode/recovery_mode_val_pay.move @@ -18,86 +18,17 @@ script { } } -//# run --admin-script --signers DiemRoot Alice -script { - use DiemFramework::DiemSystem; - use DiemFramework::TowerState; - use DiemFramework::NodeWeight; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - use DiemFramework::Debug::print; - - fun main(_: signer, sender: signer) { - // Tests on initial size of validators - assert!(DiemSystem::validator_set_size() == 5, 7357300101011000); - assert!(DiemSystem::is_validator(@Alice) == true, 7357300101021000); - assert!(DiemSystem::is_validator(@Eve) == true, 7357300101031000); - - assert!(TowerState::get_count_in_epoch(@Alice) == 0, 7357300101041000); - assert!(DiemAccount::balance(@Alice) == 10000000, 7357300101051000); - assert!(NodeWeight::proof_of_weight(@Alice) == 0, 7357300101051000); - - // Alice continues to mine after genesis. - // This test is adapted from chained_from_genesis.move - TowerState::test_helper_mock_mining(&sender, 5); - let a = TowerState::get_epochs_compliant(@Alice); - print(&a); - - assert!(TowerState::get_count_in_epoch(@Alice) == 5, 7357300101071000); - assert!(TowerState::node_above_thresh(@Alice), 7357300101081000); - - } -} -//# run --admin-script --signers DiemRoot DiemRoot -script { - use Std::Vector; - use DiemFramework::Stats; - - // This is the the epoch boundary. - fun main(vm: signer, _: signer) { - // This is not an onboarding case, steady state. - // FullnodeState::test_set_fullnode_fixtures( - // &vm, @Alice, 0, 0, 0, 200, 200, 1000000 - // ); - - let voters = Vector::empty
(); - Vector::push_back
(&mut voters, @Alice); - Vector::push_back
(&mut voters, @Bob); - Vector::push_back
(&mut voters, @Carol); - Vector::push_back
(&mut voters, @Dave); - Vector::push_back
(&mut voters, @Eve); - - // Overwrite the statistics to mock that all have been validating. - let i = 1; - while (i < 16) { - // Mock the validator doing work for 15 blocks, and stats being updated. - Stats::process_set_votes(&vm, &voters); - i = i + 1; - }; - } -} -//check: EXECUTED - -//# run --admin-script --signers DiemRoot DiemRoot +//# run --admin-script --signers DiemRoot Alice script { - use DiemFramework::Cases; - use Std::Vector; - use DiemFramework::DiemSystem; - - fun main(vm: signer, _: signer) { - // We are in a new epoch. - // Check alice is in the the correct case during reconfigure - assert!(Cases::get_case(&vm, @Alice, 0, 15) == 1, 735700018010901); - assert!(Cases::get_case(&vm, @Bob, 0, 15) == 2, 735700018010902); - assert!(Cases::get_case(&vm, @Carol, 0, 15) == 2, 735700018010903); - assert!(Cases::get_case(&vm, @Dave, 0, 15) == 2, 735700018010904); - assert!(Cases::get_case(&vm, @Eve, 0, 15) == 2, 735700018010905); - - // check only 1 val is getting the subsidy - let (vals, _) = DiemSystem::get_fee_ratio(&vm, 0, 100); - assert!(Vector::length
(&vals) == 1, 7357000180111); + use DiemFramework::Mock; + fun main(dr:signer, _sender: signer) { + // all vals compliant + Mock::all_good_validators(&dr); + // everyone bids + Mock::pof_default(&dr); + } } @@ -111,42 +42,14 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { - use DiemFramework::GAS::GAS; use DiemFramework::DiemAccount; - use DiemFramework::Subsidy; - use DiemFramework::Globals; - use DiemFramework::Debug::print; + use DiemFramework::GAS::GAS; fun main() { - // We are in a new epoch. - - let expected_subsidy = Subsidy::subsidy_curve( - Globals::get_subsidy_ceiling_gas(), - 1, - Globals::get_max_validators_per_set(), - ); - let starting_balance = 10000000; - let operator_refund = 4336 * 5; // BASELINE_TX_COST * proofs = 21680 - - // Note since there's only 1 validator and the reward to alice was - // the entirety of subsidy available. - let burn = expected_subsidy/2; // 50% of the rewrd to validator. - - - let usual_ending_balance - = starting_balance + expected_subsidy - operator_refund - burn; - - // let recovery_ending_balance = starting_balance - operator_refund - burn; - - //////// RESCUE MODE SHOULD NOT PAY EXPECTED AMOUNT ////////////// - assert!(DiemAccount::balance(@Alice) != usual_ending_balance, 7357000180113); + // Rescue mode should not pay validators + assert!(DiemAccount::balance(@Alice) <= starting_balance, 7357000180113); - // The Rewards and Burns are not taking place during RecovryMode. - // so there should be no change in balance. - print(&DiemAccount::balance(@Alice)); - - assert!(DiemAccount::balance(@Alice) == starting_balance, 7357000180114); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/stats/stats_epoch.exp b/diem-move/diem-framework/core/transactional-tests/0L/stats/stats_epoch.exp index 32f3f37bae..c93122796f 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/stats/stats_epoch.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/stats/stats_epoch.exp @@ -26,6 +26,60 @@ Events: type: 0x1::DiemBlock::NewBlockEvent data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" } +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 5 + type: 0x1::Diem::MintEvent + data: "90d003000000000003474153" +} +{ + key: 000000000000000006505ccd81e562b524d8f656abd92a15 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "90d003000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 6 + type: 0x1::Diem::MintEvent + data: "90d003000000000003474153" +} +{ + key: 0000000000000000de589ec6b85a4a1a58be166c38551cc2 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "90d003000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 7 + type: 0x1::Diem::MintEvent + data: "90d003000000000003474153" +} +{ + key: 0000000000000000b000d8e1919132c664a36c0fdf986407 + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "90d003000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 050000000000000000000000000000000000000000000000 + seq_num: 8 + type: 0x1::Diem::MintEvent + data: "90d003000000000003474153" +} +{ + key: 00000000000000003c36bd759b51f1c9b7f4258896fcfe6c + seq_num: 1 + type: 0x1::DiemAccount::ReceivedPaymentEvent + data: "90d003000000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" +} +{ + key: 060000000000000000000000000000000000000000000000 + seq_num: 0 + type: 0x1::Diem::BurnEvent + data: "00000000000000000347415300000000000000000000000000000000" +} { key: 040000000000000000000000000000000000000000000000 seq_num: 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.exp b/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.exp index b134af1aea..8bd5839de7 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.exp +++ b/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.exp @@ -1 +1,10 @@ -processed 5 tasks +processed 4 tasks + +task 1 'block'. lines 11-11: +Events: +{ + key: 0c0000000000000000000000000000000000000000000000 + seq_num: 0 + type: 0x1::DiemBlock::NewBlockEvent + data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" +} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.move b/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.move index 13307ecd6e..47bdc31832 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/subsidy/process_subsidy_one_val.move @@ -5,63 +5,24 @@ // BOB is CASE 3 // BOB is CASE 4 +// Scenario: If alice is the only validator to do work +// then she's the only one to get paid when we process the subsidy. + +//# block --proposer Alice --time 1 --round 0 + //# run --admin-script --signers DiemRoot Alice script { - use DiemFramework::TowerState; - fun main(_dr: signer, sender: signer) { - //NOTE: Alice is Case 1, she validates and mines. Setting up mining. - let mining_proofs = 5; - TowerState::test_helper_mock_mining(&sender, mining_proofs); + use DiemFramework::Mock; - } -} + fun main(vm: signer, _: signer) { + // only alice does good work + Mock::mock_case_1(&vm, @Alice, 0, 15); -//# run --admin-script --signers DiemRoot Carol -script { - use DiemFramework::TowerState; - fun main(_dr: signer, sender: signer) { - let mining_proofs = 5; - //NOTE: Carol is Case 3, she mines but does not validate. Setting up mining. - TowerState::test_helper_mock_mining(&sender, mining_proofs); + // implied that the other validators failed to sign blocks + } } -//# run --admin-script --signers DiemRoot DiemRoot -script { - // - // use DiemFramework::Subsidy; - use Std::Vector; - use DiemFramework::Stats; - use DiemFramework::GAS::GAS; - use DiemFramework::DiemAccount; - use DiemFramework::Cases; - - fun main(vm: signer, _: signer) { - // check the case of a network density of 4 active validators. - - let vm = &vm; - let validators = Vector::singleton
(@Alice); - Vector::push_back(&mut validators, @Bob); - - // create mock validator stats for full epoch - let i = 0; - while (i < 16) { - Stats::process_set_votes(vm, &validators); - i = i + 1; - }; - - let validator_init_balance = 10000000; - assert!(DiemAccount::balance(@Alice) == validator_init_balance, 7357190102011000); - assert!(DiemAccount::balance(@Bob) == validator_init_balance, 7357190102021000); - assert!(DiemAccount::balance(@Carol) == validator_init_balance, 7357190102031000); - assert!(DiemAccount::balance(@Dave) == validator_init_balance, 7357190102041000); - - assert!(Cases::get_case(vm, @Alice, 0, 15) == 1, 7357190102051000); - assert!(Cases::get_case(vm, @Bob, 0, 15) == 2, 7357190102061000); - assert!(Cases::get_case(vm, @Carol, 0, 15) == 3, 7357190102071000); - assert!(Cases::get_case(vm, @Dave, 0, 15) == 4, 7357190102081000); - } -} //# run --admin-script --signers DiemRoot DiemRoot script { @@ -72,22 +33,15 @@ script { fun main(vm: signer, _: signer) { let (validators, _) = DiemSystem::get_fee_ratio(&vm, 0, 15); - let subsidy_amount = 1000000; - let mining_proofs = 5; // mocked above - // from Subsidy::BASELINE_TX_COST * genesis proof for account - let refund_to_operator = 4336 * mining_proofs; + let subsidy_amount = 5000; + Subsidy::process_subsidy(&vm, subsidy_amount, &validators); - let validator_init_balance = 10000000; - // starting balance + subsidy amount - refund operator tx fees for mining - assert!( - DiemAccount::balance(@Alice) == - validator_init_balance + subsidy_amount - refund_to_operator, - 7357190102091000 - ); - // 995764 - assert!(DiemAccount::balance(@Bob) == validator_init_balance, 7357190102101000); - assert!(DiemAccount::balance(@Carol) == validator_init_balance, 7357190102111000); - assert!(DiemAccount::balance(@Dave) == validator_init_balance, 7357190102121000); + let validator_init_balance = 10000000; + + assert!(DiemAccount::balance(@Alice) > validator_init_balance, 735701); + assert!(DiemAccount::balance(@Bob) == validator_init_balance, 735702); + assert!(DiemAccount::balance(@Carol) == validator_init_balance, 735703); + assert!(DiemAccount::balance(@Dave) == validator_init_balance, 735704); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/_meta_mock_mining.move b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/_meta_mock_mining.move index 75108399a3..42e26a9512 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/_meta_mock_mining.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/_meta_mock_mining.move @@ -7,31 +7,31 @@ //# run --admin-script --signers DiemRoot Alice script { use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_dr: signer, sender: signer) { // TowerState::init_miner_state(sender); TowerState::test_helper_mock_mining(&sender, 5); // assert!(TowerState::get_count_in_epoch(@Alice) == 5, 73570001); // assert!(TowerState::get_epochs_compliant(@Alice) == 1, 73570002); - print(&TowerState::get_epochs_compliant(@Alice) ); + // print(&TowerState::get_epochs_compliant(@Alice) ); // alice, a validator, has one fullnode proof from genesis // NOTE: this causes an off-by-one issue in counting fullnode proofs // for genesis cases ONLY. So we don't handle it. - print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch()); assert!(TowerState::get_fullnode_proofs_in_epoch() == 1, 735701); // No fullnodes submitted proofs above threshold - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 0, 735702); // Total count of proofs is forced with the mock_mining - print(&TowerState::get_count_in_epoch(@Alice)); + // print(&TowerState::get_count_in_epoch(@Alice)); assert!(TowerState::get_count_in_epoch(@Alice) == 5, 735703); - print(&TowerState::get_count_above_thresh_in_epoch(@Alice)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Alice)); assert!(TowerState::get_count_above_thresh_in_epoch(@Alice) == 3, 735704); } } @@ -56,7 +56,7 @@ script { //# run --admin-script --signers DiemRoot Bob script { use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use DiemFramework::TestFixtures; fun main(_dr: signer, sender: signer) { @@ -72,38 +72,38 @@ script { // alice, a validator, has one fullnode proof from genesis // NOTE: this causes an off-by-one issue in counting fullnode // proofs for genesis cases ONLY so we don't handle it. - print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch()); assert!(TowerState::get_fullnode_proofs_in_epoch() == 1, 735701); // No fullnodes submitted proofs above threshold - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 0, 735702); // Total count of proofs will be 1 from genesis + 5 mocked - print(&TowerState::get_count_in_epoch(@Bob)); + // print(&TowerState::get_count_in_epoch(@Bob)); assert!(TowerState::get_count_in_epoch(@Bob) == 1, 735703); - print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); assert!(TowerState::get_count_above_thresh_in_epoch(@Bob) == 0, 735703); // Total count of proofs is forced with the mock_mining TowerState::test_helper_mock_mining(&sender, 5); assert!(TowerState::get_count_in_epoch(@Bob) == 5, 73570001); - print(&TowerState::get_fullnode_proofs_in_epoch()); + // print(&TowerState::get_fullnode_proofs_in_epoch()); assert!(TowerState::get_fullnode_proofs_in_epoch() == 6, 735701); // No fullnodes submitted proofs above threshold (in testnet 2 proofs // are necessary before the third is counted as above thresh) - print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); + // print(&TowerState::get_fullnode_proofs_in_epoch_above_thresh()); assert!(TowerState::get_fullnode_proofs_in_epoch_above_thresh() == 4, 735702); // Total count of proofs is forced with the mock_mining - print(&TowerState::get_count_in_epoch(@Bob)); + // print(&TowerState::get_count_in_epoch(@Bob)); assert!(TowerState::get_count_in_epoch(@Bob) == 5, 735703); - print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); + // print(&TowerState::get_count_above_thresh_in_epoch(@Bob)); assert!(TowerState::get_count_above_thresh_in_epoch(@Bob) == 3, 735703); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/epoch_random_difficulty.move b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/epoch_random_difficulty.move index c42db58db6..de6fab14d9 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/epoch_random_difficulty.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/epoch_random_difficulty.move @@ -25,11 +25,11 @@ script { //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::TowerState; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main() { let (diff, sec) = TowerState::get_difficulty(); - // print(&diff); + // // print(&diff); // check the state started with the testnet defaults assert!(diff==332, 735703); assert!(sec==512, 735704); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/init_miner_state.move b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/init_miner_state.move index 9a3f42040c..23fa20311d 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/init_miner_state.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/init_miner_state.move @@ -8,7 +8,7 @@ script { use DiemFramework::TowerState; use DiemFramework::TestFixtures; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; use Std::Vector; fun main(_dr: signer, sender: signer) { @@ -20,11 +20,11 @@ script { TestFixtures::security(), ); - print(&TowerState::get_epochs_compliant(@Alice)); + // print(&TowerState::get_epochs_compliant(@Alice)); assert!(TowerState::get_tower_height(@Alice) == 0, 735701); assert!(TowerState::get_epochs_compliant(@Alice) == 0, 735702); assert!(TowerState::get_count_in_epoch(@Alice) == 1, 735703); - print(&TowerState::get_miner_list()); + // print(&TowerState::get_miner_list()); assert!(Vector::length
(&TowerState::get_miner_list()) == 2, 735704); // includes the dummy validator from genesis } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/lazy_reset_count.move b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/lazy_reset_count.move index 6ea37d2eef..830cfafdec 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/lazy_reset_count.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/lazy_reset_count.move @@ -10,11 +10,11 @@ script { use DiemFramework::TowerState; use DiemFramework::TestFixtures; use DiemFramework::DiemConfig; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // SIMULATES A MINER ONBOARDING PROOF (proof_0.json) fun main(_dr: signer, sender: signer) { - print(&DiemConfig::get_current_epoch()); + // print(&DiemConfig::get_current_epoch()); TowerState::init_miner_state( &sender, @@ -53,12 +53,12 @@ script { script { use DiemFramework::DiemConfig; use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // SIMULATES THE SECOND PROOF OF THE MINER (proof_1.json) fun main() { - print(&DiemConfig::get_current_epoch()); - print(&TowerState::get_count_in_epoch(@Alice)); + // print(&DiemConfig::get_current_epoch()); + // print(&TowerState::get_count_in_epoch(@Alice)); // the latest epoch mining cannot be the current epoch. assert!(TowerState::get_miner_latest_epoch(@Alice) != DiemConfig::get_current_epoch(), 735701); @@ -85,12 +85,12 @@ script { script { use DiemFramework::DiemConfig; use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // SIMULATES THE SECOND PROOF OF THE MINER (proof_1.json) fun main() { - print(&DiemConfig::get_current_epoch()); - print(&TowerState::get_count_in_epoch(@Alice)); + // print(&DiemConfig::get_current_epoch()); + // print(&TowerState::get_count_in_epoch(@Alice)); // the latest epoch mining cannot be the current epoch. assert!(TowerState::get_miner_latest_epoch(@Alice) != DiemConfig::get_current_epoch(), 735704); @@ -111,13 +111,13 @@ script { use DiemFramework::TowerState; use DiemFramework::TestFixtures; use DiemFramework::DiemConfig; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; // SIMULATES THE SECOND PROOF OF THE MINER (proof_1.json) fun main(_dr: signer, sender: signer) { let before = TowerState::get_tower_height(@Alice); - print(&before); + // print(&before); // assert!(TowerState::test_helper_get_height(@Alice) == 0, 10008001); let proof = TowerState::create_proof_blob( @@ -130,7 +130,7 @@ script { let after = TowerState::get_tower_height(@Alice); - print(&after); + // print(&after); // the cumulative tower height has increased assert!(after > before , 735707); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/toy_rng.move b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/toy_rng.move index 5d90f6c00c..2fbf4797d9 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/tower_state/toy_rng.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/tower_state/toy_rng.move @@ -7,7 +7,7 @@ //# run --admin-script --signers DiemRoot DiemRoot script { use DiemFramework::TowerState; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main() { let a = TowerState::toy_rng(1, 1); @@ -18,8 +18,8 @@ script { assert!(a==116, 735702); // get the 0th miner's last proof hash - let a = TowerState::toy_rng(0, 1); - print(&a); + let _a = TowerState::toy_rng(0, 1); + // print(&a); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.exp b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.move b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.move new file mode 100644 index 0000000000..30dae6cd75 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/_meta_deposit_and_track.move @@ -0,0 +1,21 @@ +//# init --validators Alice + +//# run --admin-script --signers DiemRoot DiemRoot +script { + use DiemFramework::TransactionFee; + use DiemFramework::Diem; + use DiemFramework::GAS::GAS; + use DiemFramework::Debug::print; + use Std::Vector; + + fun main(vm: signer, _: signer) { + assert!(TransactionFee::get_amount_to_distribute(&vm)==0, 735701); + let coin = Diem::mint(&vm, 1); + TransactionFee::pay_fee_and_track(@Alice, coin); + + let fee_makers = TransactionFee::get_fee_makers(); + print(&fee_makers); + assert!(Vector::length(&fee_makers)==1, 735702); + assert!(TransactionFee::get_amount_to_distribute(&vm)==1, 735703); + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.move b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.depr similarity index 99% rename from diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.move rename to diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.depr index 7f27ff8994..411f7d48a0 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_success.depr @@ -1,3 +1,4 @@ + //# init --validators Alice Bob Carol Dave // ALICE is CASE 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.move b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.depr similarity index 99% rename from diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.move rename to diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.depr index 7992f326bb..1645fff55d 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/txn_fee/txn_fee_zero.depr @@ -1,3 +1,5 @@ + + //# init --validators Alice Bob Carol Dave // ALICE is CASE 1 diff --git a/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.exp b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.exp new file mode 100644 index 0000000000..5d92c423f3 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.exp @@ -0,0 +1 @@ +processed 2 tasks diff --git a/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.move b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.move new file mode 100644 index 0000000000..f5a42c974c --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/_meta_validator.move @@ -0,0 +1,15 @@ +//# init --validators Alice + +//# run --admin-script --signers DiemRoot Alice +script { + use DiemFramework::ValidatorConfig; + use DiemFramework::ValidatorUniverse; + + fun main(_vm: signer, _alice: signer) { + // TODO: issue with using ValidatorConfig::is_valid at genesis. + // aka before this transaction. + + ValidatorUniverse::is_in_universe(@Alice); + ValidatorConfig::is_valid(@Alice); + } +} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.move b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.depr similarity index 99% rename from diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.move rename to diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.depr index ffff7c177b..25e3c580ef 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/validator_universe/pow_second_epoch.depr @@ -1,3 +1,4 @@ + //# init --validators Alice Bob Carol Dave // This test is to check if new epoch is triggered at end of 15 blocks. diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_happy.move b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_happy.move index 6d18280166..1c2cdc81fe 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_happy.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_happy.move @@ -22,7 +22,7 @@ script { use DiemFramework::VoteReceipt; use Std::GUID; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(_root: signer, b_sig: signer) { let next_id = GUID::get_next_creation_num(@Alice); @@ -30,7 +30,7 @@ script { let uid = GUID::create_id(@Alice, next_id - 1); // TODO: unclear why it's 2 and not 0 TurnoutTallyDemo::vote(&b_sig, @Alice, &uid, 22, true); // let id = TurnoutTallyDemo::get_id(@Alice); - // print(&id); + // // print(&id); let (r, w) = VoteReceipt::get_receipt_data(@Bob, &uid); assert!(r == true, 0); // voted in favor assert!(w == 22, 1); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_retract.move b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_retract.move index f11768a614..833a84858a 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_retract.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/create_election_and_vote_retract.move @@ -23,7 +23,7 @@ script { use DiemFramework::VoteReceipt; use Std::GUID; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(_root: signer, b_sig: signer) { let next_id = GUID::get_next_creation_num(@Alice); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/vote_curve.move b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/vote_curve.move index 85dce5ae38..37c3573dc7 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/vote_curve.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vote_lib/vote_curve.move @@ -5,7 +5,7 @@ //# run --admin-script --signers DiemRoot Alice script { use DiemFramework::TurnoutTally; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_root: signer, _sig: signer) { @@ -15,29 +15,29 @@ script { // confirm lowerbound let y = TurnoutTally::get_threshold_from_turnout(1250, 10000); - print(&y); + // print(&y); assert!(y == 10000, 0); let y = TurnoutTally::get_threshold_from_turnout(1500, 10000); - print(&y); + // print(&y); assert!(y == 9837, 0); let y = TurnoutTally::get_threshold_from_turnout(5000, 10000); - print(&y); + // print(&y); assert!(y == 7550, 0); let y = TurnoutTally::get_threshold_from_turnout(7500, 10000); - print(&y); + // print(&y); assert!(y == 5917, 0); // cannot be below the minimum treshold. I.e. more than 100% let y = TurnoutTally::get_threshold_from_turnout(500, 10000); - print(&y); + // print(&y); assert!(y == 10000, 0); // same for maximum. More votes cannot go below 51% approval let y = TurnoutTally::get_threshold_from_turnout(9000, 10000); - print(&y); + // print(&y); assert!(y == 5100, 0); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_after_reconfig_prod.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_after_reconfig_prod.move index fca8900794..36ef35e03f 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_after_reconfig_prod.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_after_reconfig_prod.move @@ -24,22 +24,22 @@ script { } } -//# run --admin-script --signers DiemRoot DiemRoot +//# run --admin-script --signers DiemRoot Eve script { use DiemFramework::Mock; use DiemFramework::Vouch; use Std::Vector; use DiemFramework::EpochBoundary; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; + use DiemFramework::ProofOfFee; + use DiemFramework::DiemSystem; + + fun main(vm: signer, eve_sig: signer) { + // give the nodes bids + Mock::pof_default(&vm); + // make the nodes compliant + Mock::all_good_validators(&vm); - fun main(vm: signer, _: signer) { - Mock::mock_case_1(&vm, @Alice, 0, 15); - Mock::mock_case_1(&vm, @Bob, 0, 15); - Mock::mock_case_1(&vm, @Carol, 0, 15); - Mock::mock_case_1(&vm, @Dave, 0, 15); - // EVE will be the case 4 - Mock::mock_case_1(&vm, @Frank, 0, 15); - Mock::mock_case_1(&vm, @Gertie, 0, 15); // mock some vals vouching for Alice, including Eve. let v = Vector::singleton
(@Bob); @@ -47,18 +47,24 @@ script { Vouch::vm_migrate(&vm, @Alice, v); - // let b = Vouch::get_buddies(@Alice); let c = Vouch::buddies_in_set(@Alice); let len = Vector::length(&c); assert!(len == 2, 735701); + // invalidate eve so she doesn't join next epoch. + ProofOfFee::set_bid(&eve_sig, 0, 0); // mock the epoch boundary EpochBoundary::reconfigure(&vm, 15); let c = Vouch::buddies_in_set(@Alice); - print(&c); + // print(&c); let len = Vector::length(&c); assert!(len == 1, 735702); + + // Important: Alice should not be dropped in the new + // epoch even though her voucher dropped off + assert!(DiemSystem::is_validator(@Alice), 735703); + assert!(!DiemSystem::is_validator(@Eve), 735704); } } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.depr b/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.depr new file mode 100644 index 0000000000..942715ce54 --- /dev/null +++ b/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.depr @@ -0,0 +1,110 @@ +//# init --validators Alice Bob Carol Dave Eve Frank Gertie + +// Scenario: Many validators. Alice received vouches from only +// Bob and Eve. Eve is about to fall out of the set. +// This should not afect Alice + +// ALICE is CASE 1 +// BOB is CASE 1 +// CAROL is CASE 1 +// DAVE is CASE 1 +// EVE is CASE 3 +// FRANK is CASE 1 +// GERTIE is CASE 1 + +//# block --proposer Alice --time 1 --round 0 + +// NewBlockEvent + +//# run --admin-script --signers DiemRoot Alice +script { + // use DiemFramework::DiemAccount; + use DiemFramework::Vouch; + + fun main(_:signer, sender: signer) { + Vouch::init(&sender); + } +} + +//# run --admin-script --signers DiemRoot DiemRoot +script { + use DiemFramework::Mock; + use DiemFramework::Vouch; + use Std::Vector; + use DiemFramework::EpochBoundary; + use DiemFramework::DiemSystem; + use DiemFramework::Jail; + + fun main(_:signer, vm: signer) { + // give the nodes bids + Mock::pof_default(&vm); + // make the nodes compliant + Mock::all_good_validators(&vm); + + // except eve who is case 4 + Jail::jail(&vm, @Eve); + + // mock some vals vouching for Alice, including Eve + // who is about to fall out of the set. + let v = Vector::singleton
(@Bob); + Vector::push_back(&mut v, @Eve); + + Vouch::vm_migrate(&vm, @Alice, v); + + // let b = Vouch::get_buddies(@Alice); + let c = Vouch::buddies_in_set(@Alice); + + let len = Vector::length(&c); + assert!(len == 2, 735701); + + ///// NEW EPOCH + EpochBoundary::reconfigure(&vm, 15); + + assert!(DiemSystem::is_validator(@Alice), 735702); + + assert!(!DiemSystem::is_validator(@Eve), 735703); + + // let b = Vouch::get_buddies(@Alice); + let c = Vouch::buddies_in_set(@Alice); + + let len = Vector::length(&c); + assert!(len == 1, 735704); + + assert!(DiemSystem::is_validator(@Alice), 735705); + assert!(!DiemSystem::is_validator(@Eve), 735706); + } +} + +// //# run --admin-script --signers DiemRoot DiemRoot +// script { +// use DiemFramework::Mock; +// use DiemFramework::Vouch; +// use Std::Vector; +// use DiemFramework::EpochBoundary; +// use DiemFramework::DiemSystem; + +// fun main(_:signer, vm: signer) { +// assert!(DiemSystem::is_validator(@Alice), 735704); + +// Mock::mock_case_1(&vm, @Alice, 0, 15); +// Mock::mock_case_1(&vm, @Bob, 0, 15); +// Mock::mock_case_1(&vm, @Carol, 0, 15); +// Mock::mock_case_1(&vm, @Dave, 0, 15); +// Mock::mock_case_1(&vm, @Frank, 0, 15); +// Mock::mock_case_1(&vm, @Gertie, 0, 15); + +// let c = Vouch::buddies_in_set(@Alice); +// let len = Vector::length(&c); +// assert!(len == 1, 735705); +// ///// NEW EPOCH +// EpochBoundary::reconfigure(&vm, 15); + +// assert!(DiemSystem::is_validator(@Alice), 735706); + +// // let b = Vouch::get_buddies(@Alice); +// let c = Vouch::buddies_in_set(@Alice); + +// let len = Vector::length(&c); +// assert!(len == 1, 735707); +// } +// } \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.move deleted file mode 100644 index 4fdcf53399..0000000000 --- a/diem-move/diem-framework/core/transactional-tests/0L/vouch/lost_voucher_doesnt_drop_vouchee.move +++ /dev/null @@ -1,103 +0,0 @@ -//# init --validators Alice Bob Carol Dave Eve Frank Gertie - -// Testing if EVE a CASE 3 Validator gets dropped. - -// ALICE is CASE 1 -// BOB is CASE 1 -// CAROL is CASE 1 -// DAVE is CASE 1 -// EVE is CASE 3 -// FRANK is CASE 1 -// GERTIE is CASE 1 - -//# block --proposer Alice --time 1 --round 0 - -// NewBlockEvent - -//# run --admin-script --signers DiemRoot Alice -script { - // use DiemFramework::DiemAccount; - use DiemFramework::Vouch; - - fun main(_:signer, sender: signer) { - Vouch::init(&sender); - } -} - -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::Mock; - use DiemFramework::Vouch; - use Std::Vector; - use DiemFramework::EpochBoundary; - use DiemFramework::DiemSystem; - - fun main(_:signer, vm: signer) { - Mock::mock_case_1(&vm, @Alice, 0, 15); - Mock::mock_case_1(&vm, @Bob, 0, 15); - Mock::mock_case_1(&vm, @Carol, 0, 15); - Mock::mock_case_1(&vm, @Dave, 0, 15); - // EVE will be the case 4 - Mock::mock_case_1(&vm, @Frank, 0, 15); - Mock::mock_case_1(&vm, @Gertie, 0, 15); - - // mock some vals vouching for Alice, including Eve. - let v = Vector::singleton
(@Bob); - Vector::push_back(&mut v, @Eve); - - Vouch::vm_migrate(&vm, @Alice, v); - - // let b = Vouch::get_buddies(@Alice); - let c = Vouch::buddies_in_set(@Alice); - - let len = Vector::length(&c); - assert!(len == 2, 735701); - - ///// NEW EPOCH - EpochBoundary::reconfigure(&vm, 15); - - assert!(DiemSystem::is_validator(@Alice), 735702); - - assert!(!DiemSystem::is_validator(@Eve), 735703); - - // let b = Vouch::get_buddies(@Alice); - let c = Vouch::buddies_in_set(@Alice); - - let len = Vector::length(&c); - assert!(len == 1, 735701); - } -} - -//# run --admin-script --signers DiemRoot DiemRoot -script { - use DiemFramework::Mock; - use DiemFramework::Vouch; - use Std::Vector; - use DiemFramework::EpochBoundary; - use DiemFramework::DiemSystem; - - fun main(_:signer, vm: signer) { - assert!(DiemSystem::is_validator(@Alice), 735704); - - Mock::mock_case_1(&vm, @Alice, 0, 15); - Mock::mock_case_1(&vm, @Bob, 0, 15); - Mock::mock_case_1(&vm, @Carol, 0, 15); - Mock::mock_case_1(&vm, @Dave, 0, 15); - Mock::mock_case_1(&vm, @Frank, 0, 15); - Mock::mock_case_1(&vm, @Gertie, 0, 15); - - let c = Vouch::buddies_in_set(@Alice); - let len = Vector::length(&c); - assert!(len == 1, 735705); - ///// NEW EPOCH - EpochBoundary::reconfigure(&vm, 15); - - assert!(DiemSystem::is_validator(@Alice), 735706); - - // let b = Vouch::get_buddies(@Alice); - let c = Vouch::buddies_in_set(@Alice); - - let len = Vector::length(&c); - assert!(len == 1, 735707); - } -} \ No newline at end of file diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/revoke_should_not_drop_good_val.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/revoke_should_not_drop_good_val.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/vouch/revoke_should_not_drop_good_val.move rename to diem-move/diem-framework/core/transactional-tests/0L/vouch/revoke_should_not_drop_good_val.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_audit_pass.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_audit_pass.depr similarity index 100% rename from diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_audit_pass.move rename to diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_audit_pass.depr diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_has_unrelated.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_has_unrelated.move index bdf556d161..66bf34d95d 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_has_unrelated.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_has_unrelated.move @@ -8,7 +8,7 @@ script { use DiemFramework::Vouch; // use Std::Signer; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(_dr: signer, alice: signer) { Vouch::init(&alice); assert!(Vouch::is_init(@Alice), 7347001); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.move b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.depr similarity index 94% rename from diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.move rename to diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.depr index e80b4c4582..5017683436 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.depr @@ -108,11 +108,7 @@ script { fun main() { // We are in a new epoch. - let expected_subsidy = Subsidy::subsidy_curve( - Globals::get_subsidy_ceiling_gas(), - 1, - Globals::get_max_validators_per_set(), - ); + let expected_subsidy = 0; let starting_balance = 10000000; @@ -120,10 +116,10 @@ script { // Note since there's only 1 validator and the reward to Alice was // the entirety of subsidy available. - let burn = expected_subsidy/2; // 50% of the reward to validator. + // let burn = expected_subsidy/2; // 50% of the reward to validator. let ending_balance - = starting_balance + expected_subsidy - operator_refund - burn; + = starting_balance + expected_subsidy - operator_refund; print(&ending_balance); print(&DiemAccount::balance(@Alice)); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.exp b/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.exp deleted file mode 100644 index 4ff20321b4..0000000000 --- a/diem-move/diem-framework/core/transactional-tests/0L/vouch/vouch_validator_set_reject.exp +++ /dev/null @@ -1,109 +0,0 @@ -processed 7 tasks - -task 1 'block'. lines 8-8: -Events: -{ - key: 0c0000000000000000000000000000000000000000000000 - seq_num: 0 - type: 0x1::DiemBlock::NewBlockEvent - data: "000000000000000006505ccd81e562b524d8f656abd92a15000100000000000000" -} - -task 5 'block'. lines 92-96: -Events: -{ - key: 0c0000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::DiemBlock::NewBlockEvent - data: "0f0000000000000006505ccd81e562b524d8f656abd92a150040c9a20300000000" -} -{ - key: 050000000000000000000000000000000000000000000000 - seq_num: 6 - type: 0x1::Diem::MintEvent - data: "009aa4110000000003474153" -} -{ - key: 000000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "009aa4110000000003474153000000000000000000000000000000001176616c696461746f722073756273696479" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "b0540000000000000347415310ada1ba839f77cfc5266ab28e1fa52f0d74782066656520726566756e64" -} -{ - key: 000000000000000010ada1ba839f77cfc5266ab28e1fa52f - seq_num: 1 - type: 0x1::DiemAccount::ReceivedPaymentEvent - data: "b0540000000000000347415306505ccd81e562b524d8f656abd92a150d74782066656520726566756e64" -} -{ - key: 010000000000000006505ccd81e562b524d8f656abd92a15 - seq_num: 1 - type: 0x1::DiemAccount::SentPaymentEvent - data: "004dd208000000000347415306505ccd81e562b524d8f656abd92a15046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 0 - type: 0x1::Diem::BurnEvent - data: "004dd208000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000182163e7473ca001b3e8775649fe80b3 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153182163e7473ca001b3e8775649fe80b3046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 01000000000000003c36bd759b51f1c9b7f4258896fcfe6c - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "8096980000000000034741533c36bd759b51f1c9b7f4258896fcfe6c046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 2 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000b000d8e1919132c664a36c0fdf986407 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153b000d8e1919132c664a36c0fdf986407046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 3 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 0100000000000000de589ec6b85a4a1a58be166c38551cc2 - seq_num: 0 - type: 0x1::DiemAccount::SentPaymentEvent - data: "809698000000000003474153de589ec6b85a4a1a58be166c38551cc2046275726e" -} -{ - key: 060000000000000000000000000000000000000000000000 - seq_num: 4 - type: 0x1::Diem::BurnEvent - data: "80969800000000000347415300000000000000000000000000000000" -} -{ - key: 040000000000000000000000000000000000000000000000 - seq_num: 1 - type: 0x1::DiemConfig::NewEpochEvent - data: "0200000000000000" -} diff --git a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_epoch.move b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_epoch.move index 8932aed94b..9b65ded87f 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_epoch.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_epoch.move @@ -41,7 +41,7 @@ script { use Std::Vector; use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(_dr: signer, sender: signer) { let uid = DonorDirected::propose_payment(&sender, @Alice, @Bob, 100, b"thanks bob"); @@ -58,10 +58,10 @@ script { // the default timed payment is 3 epochs, we are in epoch 1 let list = DonorDirected::find_by_deadline(@Alice, 4); assert!(Vector::contains(&list, &uid), 7357008); - // print(&list); + // // print(&list); let bob_balance_pre = DiemAccount::balance(@Bob); - // print(&bob_balance_pre); + // // print(&bob_balance_pre); assert!(bob_balance_pre == 10000000, 7357004); } } @@ -106,7 +106,7 @@ script { use DiemFramework::GAS::GAS; // use DiemFramework::DonorDirected; // use Std::Vector; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_vm: signer, _: signer) { // EpochBoundary::reconfigure(&vm); @@ -116,7 +116,7 @@ script { // DonorDirected::process_donor_directed_accounts(&vm, 2); let bob_balance = DiemAccount::balance(@Bob); - print(&bob_balance); + // print(&bob_balance); // assert!(bob_balance > bob_balance_pre, 7357005); assert!(bob_balance == 10000100, 7357006); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_unit.move b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_unit.move index b7ea8ad3f5..a12aa3b592 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_unit.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_process_unit.move @@ -39,7 +39,7 @@ script { script { use DiemFramework::DonorDirected; use Std::Vector; - // use DiemFramework::Debug::print; + // // use DiemFramework::Debug::print; fun main(_dr: signer, sender: signer) { let uid = DonorDirected::propose_payment(&sender, @Alice, @Bob, 100, b"thanks bob"); @@ -56,7 +56,7 @@ script { // the default timed payment is 3 epochs, we are in epoch 1 let list = DonorDirected::find_by_deadline(@Alice, 4); assert!(Vector::contains(&list, &uid), 7357008); - // print(&list); + // // print(&list); } } // check: EXECUTED @@ -68,18 +68,18 @@ script { use DiemFramework::GAS::GAS; use DiemFramework::DonorDirected; // use Std::Vector; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(vm: signer, _: signer) { let bob_balance_pre = DiemAccount::balance(@Bob); - print(&bob_balance_pre); + // print(&bob_balance_pre); assert!(bob_balance_pre == 10000000, 7357004); // process epoch 4 accounts DonorDirected::process_donor_directed_accounts(&vm, 4); let bob_balance = DiemAccount::balance(@Bob); - print(&bob_balance); + // print(&bob_balance); assert!(bob_balance > bob_balance_pre, 7357005); assert!(bob_balance == 10000100, 7357006); diff --git a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_veto.move b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_veto.move index 2b8a548c17..02fdab9ed6 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_veto.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/wallet/donor_directed/community_wallet_veto.move @@ -82,24 +82,24 @@ script { use DiemFramework::DiemAccount; use DiemFramework::GAS::GAS; use DiemFramework::Receipts; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_dr: signer, sender: signer) { // Receipts::init(&sender); - let a = Receipts::is_init(@Carol); - print(&a); + let _a = Receipts::is_init(@Carol); + // print(&a); - let b = DiemAccount::is_init_cumu_tracking(@Alice); - print(&b); + let _b = DiemAccount::is_init_cumu_tracking(@Alice); + // print(&b); let cap = DiemAccount::extract_withdraw_capability(&sender); DiemAccount::pay_from(&cap, @Alice, 1000, b"thanks alice", b""); DiemAccount::restore_withdraw_capability(cap); - let (a, b, c) = Receipts::read_receipt(@Carol, @Alice); - print(&a); - print(&b); - print(&c); + let (_a, _b, _c) = Receipts::read_receipt(@Carol, @Alice); + // print(&a); + // print(&b); + // print(&c); } } @@ -110,11 +110,12 @@ script { use DiemFramework::DonorDirected; use DiemFramework::DonorDirectedGovernance; use Std::Signer; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_dr: signer, sender: signer) { let a = DonorDirectedGovernance::check_is_donor(@Alice, Signer::address_of(&sender)); - print(&a); + assert!(a, 7357009); + // print(&a); DonorDirected::propose_veto(&sender, @Alice, 2); } } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_enabled.move b/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_enabled.move index 580a6d1f41..4af796430f 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_enabled.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_enabled.move @@ -39,11 +39,11 @@ script { script { use DiemFramework::GAS::GAS; use DiemFramework::DiemAccount; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main() { - print(&777); - print(&DiemAccount::unlocked_amount(@Alice)); + // print(&777); + // print(&DiemAccount::unlocked_amount(@Alice)); assert!(DiemAccount::unlocked_amount(@Alice) == 1000000000, 735703); assert!(DiemAccount::balance(@Bob) == 1000000, 735704); } diff --git a/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_reconfig.move b/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_reconfig.move index 0d6274d3b1..eb0cec266d 100644 --- a/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_reconfig.move +++ b/diem-move/diem-framework/core/transactional-tests/0L/wallet/slow_wallet_pay_reconfig.move @@ -26,13 +26,13 @@ script { script { use DiemFramework::GAS::GAS; use DiemFramework::DiemAccount; - use DiemFramework::Debug::print; + // use DiemFramework::Debug::print; fun main(_dr: signer, account: signer) { - print(&DiemAccount::balance(@Alice)); - print(&DiemAccount::unlocked_amount(@Alice)); - print(&DiemAccount::balance(@Bob)); + // print(&DiemAccount::balance(@Alice)); + // print(&DiemAccount::unlocked_amount(@Alice)); + // print(&DiemAccount::balance(@Bob)); assert!(DiemAccount::balance(@Alice) == 1000000, 735701); assert!(DiemAccount::unlocked_amount(@Alice) == 10, 735702); diff --git a/ol/txs/src/commands/valset_cmd.rs b/ol/txs/src/commands/valset_cmd.rs index 2e731fc5d6..168f89e237 100644 --- a/ol/txs/src/commands/valset_cmd.rs +++ b/ol/txs/src/commands/valset_cmd.rs @@ -7,25 +7,38 @@ use crate::{ submit_tx::{maybe_submit, tx_params_wrapper}, }; use abscissa_core::{Command, Options, Runnable}; +use diem_logger::error; use diem_transaction_builder::stdlib as transaction_builder; use diem_types::account_address::AccountAddress; use ol_types::config::TxType; -use std::process::exit; +use std::{process::exit, ops::Mul}; /// `CreateAccount` subcommand #[derive(Command, Debug, Default, Options)] pub struct ValSetCmd { #[options( - short = "j", - help = "mark a vouchee validator as unjailed. Validators can't unjail self." + short = "b", + help = "update bid in Proof of Fee auction." + )] + bid: Option, + #[options( + short = "e", + help = "Expiration for bid in Proof of Fee auction." + )] + expiry: u64, + #[options( + short = "r", + help = "Retract bid. Can only be done once per epoch." )] - unjail: bool, + retract: bool, #[options( - short = "a", - help = "address of a validator vouchee which the voucher is unjailing" + short = "j", + help = "mark a vouchee validator as unjailed. Validators can't unjail self." )] - vouchee: Option, + unjail: Option, + + } impl Runnable for ValSetCmd { @@ -33,10 +46,21 @@ impl Runnable for ValSetCmd { let entry_args = entrypoint::get_args(); let tx_params = tx_params_wrapper(TxType::Cheap).unwrap(); - let script = if let Some(addr) = *&self.vouchee { + + let script = if let Some(addr) = *&self.unjail { transaction_builder::encode_voucher_unjail_script_function(addr) + } else if self.retract { + transaction_builder::encode_pof_retract_bid_script_function() + } else if self.bid.is_some() && self.expiry > 0 { + let bid = *&self.bid.unwrap(); + let scaled_bid_move = (bid.mul(10_f64)) as u64; + transaction_builder::encode_pof_update_bid_script_function( + scaled_bid_move, + *&self.expiry, + ) } else { - transaction_builder::encode_self_unjail_script_function() + error!("Invalid arguments for val-set command. Did you want to make a bid, or unjail a validator?"); + exit(1); }; match maybe_submit(