From 630f86da4ecd436d72b7422e06eaa56ddcdc961c Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:26:19 -0800 Subject: [PATCH 01/17] Add API, tests to expected 100% coverage --- .../sources/emojicoin_dot_fun_claim_link.move | 111 +++++++++++++++++- 1 file changed, 106 insertions(+), 5 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 031187360..efdd0929d 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -8,6 +8,7 @@ module rewards::emojicoin_dot_fun_claim_link { use aptos_framework::coin; use aptos_framework::event; use aptos_std::ed25519::{Self, ValidatedPublicKey}; + use aptos_std::from_bcs; use aptos_std::simple_map::SimpleMap; use aptos_std::smart_table::{Self, SmartTable}; use emojicoin_dot_fun::emojicoin_dot_fun::{Self, Swap}; @@ -118,11 +119,37 @@ module rewards::emojicoin_dot_fun_claim_link { admin: &signer, public_keys_as_bytes: vector> ) acquires Vault { let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; - public_keys_as_bytes.for_each(|public_key_bytes| { - manifest_ref_mut.add(validate_public_key_bytes(public_key_bytes), NIL); + public_keys_as_bytes.for_each_ref(|public_key_bytes_ref| { + manifest_ref_mut.add(validate_public_key_bytes(*public_key_bytes_ref), NIL); }); } + public entry fun add_public_keys_and_fund_gas_escrows( + admin: &signer, public_keys_as_bytes: vector>, amount_per_escrow: u64 + ) acquires Vault { + let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; + let coins = + coin::withdraw( + admin, public_keys_as_bytes.length() * amount_per_escrow + ); + let validated_public_key; + public_keys_as_bytes.for_each_ref( + |public_key_bytes_ref| { + validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); + manifest_ref_mut.add(validated_public_key, NIL); + aptos_account::deposit_coins( + from_bcs::to_address( + ed25519::validated_public_key_to_authentication_key( + &validated_public_key + ) + ), + coin::extract(&mut coins, amount_per_escrow) + ) + } + ); + coin::destroy_zero(coins); + } + public entry fun fund_vault(funder: &signer, n_claims: u64) acquires Vault { let amount = n_claims * Vault[@rewards].claim_amount; aptos_account::transfer( @@ -219,8 +246,8 @@ module rewards::emojicoin_dot_fun_claim_link { admin: &signer, public_keys_as_bytes: vector> ) acquires Vault { let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; - public_keys_as_bytes.for_each(|public_key_bytes| { - let validated_public_key = validate_public_key_bytes(public_key_bytes); + public_keys_as_bytes.for_each_ref(|public_key_bytes_ref| { + let validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); if (manifest_ref_mut.contains(validated_public_key) && *manifest_ref_mut.borrow(validated_public_key) == NIL) { manifest_ref_mut.remove(validated_public_key); @@ -263,7 +290,7 @@ module rewards::emojicoin_dot_fun_claim_link { vault_ref_mut } - inline fun validate_public_key_bytes(public_key_bytes: vector): ValidatedPublicKey { + fun validate_public_key_bytes(public_key_bytes: vector): ValidatedPublicKey { let validated_public_key_option = ed25519::new_validated_public_key_from_bytes(public_key_bytes); assert!(option::is_some(&validated_public_key_option), E_INVALID_PUBLIC_KEY); @@ -349,6 +376,80 @@ module rewards::emojicoin_dot_fun_claim_link { add_public_keys(¬_admin_signer, vector[]); } + #[test_only] + fun test_add_public_keys_and_fund_gas_escrows() acquires Vault { + // Prepare escrow account public keys. + let n_escrows = 3; + let amount_per_escrow = 2; + let escrow_account_public_keys = vector[]; + let escrow_account_public_key_bytes = vector[]; + let validated_public_key; + for (i in 0..n_escrows) { + (_, validated_public_key) = ed25519::generate_keys(); + escrow_account_public_key_bytes.push_back( + ed25519::validated_public_key_to_bytes(&validated_public_key) + ); + escrow_account_public_keys.push_back(validated_public_key); + }; + + // Init packages. + emojicoin_dot_fun::tests::init_package_then_exact_transition(); + let rewards_signer = get_signer(@rewards); + init_module(&rewards_signer); + + // Fund escrows. + emojicoin_dot_fun::test_acquisitions::mint_aptos_coin_to( + @rewards, n_escrows * amount_per_escrow + ); + add_public_keys_and_fund_gas_escrows( + &rewards_signer, escrow_account_public_key_bytes, amount_per_escrow + ); + + // Verify state. + let public_key_bytes; + escrow_account_public_key_bytes.for_each_ref(|public_key_bytes_ref| { + public_key_bytes = *public_key_bytes_ref; + assert!(public_key_is_in_manifest(public_key_bytes)); + assert!(public_key_claimant(public_key_bytes) == NIL); + }); + escrow_account_public_keys.for_each_ref(|public_key_ref| { + assert!( + coin::balance( + from_bcs::to_address( + ed25519::validated_public_key_to_authentication_key(public_key_ref) + ) + ) == amount_per_escrow + ); + }); + + // Call with zero public keys argument to invoke silent return. + assert!(coin::balance(@rewards) == 0); + add_public_keys_and_fund_gas_escrows( + &rewards_signer, vector[], amount_per_escrow + ); + assert!(coin::balance(@rewards) == 0); + + } + + #[test, expected_failure(abort_code = E_INVALID_PUBLIC_KEY)] + fun test_add_public_keys_and_fund_gas_escrows_invalid_public_key() acquires Vault { + emojicoin_dot_fun::tests::init_package(); + let rewards_signer = get_signer(@rewards); + emojicoin_dot_fun::test_acquisitions::mint_aptos_coin_to(@rewards, 1); + init_module(&rewards_signer); + add_public_keys_and_fund_gas_escrows(&rewards_signer, vector[vector[0x0]], 1); + } + + #[test, expected_failure(abort_code = E_NOT_ADMIN)] + fun test_add_public_keys_and_fund_gas_escrows_not_admin() acquires Vault { + emojicoin_dot_fun::tests::init_package(); + let rewards_signer = get_signer(@rewards); + init_module(&rewards_signer); + let not_admin_signer = get_signer(@0x2222); + assert!(&rewards_signer != ¬_admin_signer); + add_public_keys_and_fund_gas_escrows(¬_admin_signer, vector[], 1); + } + #[test] fun test_general_flow() acquires Vault { // Initialize black cat market, have it undergo state transition. From 74a6826523873046f221236251eb04231f2f5e57 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:28:53 -0800 Subject: [PATCH 02/17] Fix `test_only` annotation --- .../rewards/sources/emojicoin_dot_fun_claim_link.move | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index efdd0929d..c07a7ad22 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -290,7 +290,7 @@ module rewards::emojicoin_dot_fun_claim_link { vault_ref_mut } - fun validate_public_key_bytes(public_key_bytes: vector): ValidatedPublicKey { + inline fun validate_public_key_bytes(public_key_bytes: vector): ValidatedPublicKey { let validated_public_key_option = ed25519::new_validated_public_key_from_bytes(public_key_bytes); assert!(option::is_some(&validated_public_key_option), E_INVALID_PUBLIC_KEY); @@ -376,7 +376,7 @@ module rewards::emojicoin_dot_fun_claim_link { add_public_keys(¬_admin_signer, vector[]); } - #[test_only] + #[test] fun test_add_public_keys_and_fund_gas_escrows() acquires Vault { // Prepare escrow account public keys. let n_escrows = 3; @@ -424,9 +424,7 @@ module rewards::emojicoin_dot_fun_claim_link { // Call with zero public keys argument to invoke silent return. assert!(coin::balance(@rewards) == 0); - add_public_keys_and_fund_gas_escrows( - &rewards_signer, vector[], amount_per_escrow - ); + add_public_keys_and_fund_gas_escrows(&rewards_signer, vector[], amount_per_escrow); assert!(coin::balance(@rewards) == 0); } From 1d8a87fb076ff5d341f2d3a1f796141cb03f1452 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 19:37:48 -0800 Subject: [PATCH 03/17] Refactor for two tables --- .../sources/emojicoin_dot_fun_claim_link.move | 212 ++++++++++++------ 1 file changed, 146 insertions(+), 66 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index c07a7ad22..85d1471db 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -17,7 +17,6 @@ module rewards::emojicoin_dot_fun_claim_link { use std::signer; const INTEGRATOR_FEE_RATE_BPS: u8 = 100; - const NIL: address = @0x0; const DEFAULT_CLAIM_AMOUNT: u64 = 100_000_000; const VAULT: vector = b"Claim link vault"; @@ -25,7 +24,7 @@ module rewards::emojicoin_dot_fun_claim_link { const E_NOT_ADMIN: u64 = 0; /// Admin to remove address does not correspond to admin. const E_ADMIN_TO_REMOVE_IS_NOT_ADMIN: u64 = 1; - /// Public key of claim link private key is not in manifest. + /// Public key of claim link private key is not eligible. const E_INVALID_CLAIM_LINK: u64 = 2; /// Claim link has already been claimed. const E_CLAIM_LINK_ALREADY_CLAIMED: u64 = 3; @@ -39,14 +38,21 @@ module rewards::emojicoin_dot_fun_claim_link { const E_ADMIN_TO_REMOVE_IS_REWARDS_PUBLISHER: u64 = 7; /// Admin is already an admin. const E_ALREADY_ADMIN: u64 = 8; + /// Claim link is already eligible. + const E_CLAIM_LINK_ALREADY_ELIGIBLE: u64 = 9; + + struct Nil {} + has copy, drop, store; struct Vault has key { - /// Addresses of signers who can mutate the manifest. + /// Addresses of signers who can mutate the vault. admins: vector
, /// In octas. claim_amount: u64, - /// Map from claim link public key to address of claimant, `NIL` if unclaimed. - manifest: SmartTable, + /// Eligible claim link public keys. + eligible: SmartTable, + /// Map from claim link public key to address of claimant. + claimed: SmartTable, /// Approves transfers from the vault. signer_capability: SignerCapability } @@ -69,32 +75,65 @@ module rewards::emojicoin_dot_fun_claim_link { } #[view] - public fun public_key_is_in_manifest(public_key_bytes: vector): bool acquires Vault { - Vault[@rewards].manifest.contains(validate_public_key_bytes(public_key_bytes)) + public fun public_key_claimant(public_key_bytes: vector): Option
acquires Vault { + let validated_public_key_option = + ed25519::new_validated_public_key_from_bytes(public_key_bytes); + if (option::is_some(&validated_public_key_option)) { + let validated_public_key = option::destroy_some(validated_public_key_option); + let claimed_ref = &Vault[@rewards].claimed; + if (claimed_ref.contains(validated_public_key)) { + option::some(*claimed_ref.borrow(validated_public_key)) + } else { + option::none() + } + } else { + option::none() + } } #[view] - public fun public_key_claimant(public_key_bytes: vector): address acquires Vault { - *Vault[@rewards].manifest.borrow(validate_public_key_bytes(public_key_bytes)) + public fun public_key_is_eligible(public_key_bytes: vector): bool acquires Vault { + let validated_public_key_option = + ed25519::new_validated_public_key_from_bytes(public_key_bytes); + if (option::is_some(&validated_public_key_option)) { + Vault[@rewards].eligible.contains( + option::destroy_some(validated_public_key_option) + ) + } else { false } } #[view] - public fun public_keys(): vector acquires Vault { - Vault[@rewards].manifest.keys() + public fun public_keys_that_are_claimed(): vector acquires Vault { + Vault[@rewards].claimed.keys() } #[view] - public fun public_keys_paginated( + public fun public_keys_that_are_claimed_paginated( starting_bucket_index: u64, starting_vector_index: u64, num_public_keys_to_get: u64 ): (vector, Option, Option) acquires Vault { - Vault[@rewards].manifest.keys_paginated( + Vault[@rewards].claimed.keys_paginated( starting_bucket_index, starting_vector_index, num_public_keys_to_get ) } #[view] - public fun manifest_to_simple_map(): SimpleMap acquires Vault { - Vault[@rewards].manifest.to_simple_map() + public fun public_keys_that_are_claimed_to_simple_map(): + SimpleMap acquires Vault { + Vault[@rewards].claimed.to_simple_map() + } + + #[view] + public fun public_keys_that_are_eligible(): vector acquires Vault { + Vault[@rewards].eligible.keys() + } + + #[view] + public fun public_keys_that_are_eligible_paginated( + starting_bucket_index: u64, starting_vector_index: u64, num_public_keys_to_get: u64 + ): (vector, Option, Option) acquires Vault { + Vault[@rewards].eligible.keys_paginated( + starting_bucket_index, starting_vector_index, num_public_keys_to_get + ) } #[view] @@ -118,16 +157,32 @@ module rewards::emojicoin_dot_fun_claim_link { public entry fun add_public_keys( admin: &signer, public_keys_as_bytes: vector> ) acquires Vault { - let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; - public_keys_as_bytes.for_each_ref(|public_key_bytes_ref| { - manifest_ref_mut.add(validate_public_key_bytes(*public_key_bytes_ref), NIL); - }); + let vault_ref_mut = borrow_vault_mut_checked(admin); + let claimed_ref = &vault_ref_mut.claimed; + let eligible_ref_mut = &mut vault_ref_mut.eligible; + let validated_public_key; + public_keys_as_bytes.for_each_ref( + |public_key_bytes_ref| { + validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); + assert!( + !claimed_ref.contains(validated_public_key), + E_CLAIM_LINK_ALREADY_CLAIMED + ); + assert!( + !eligible_ref_mut.contains(validated_public_key), + E_CLAIM_LINK_ALREADY_ELIGIBLE + ); + eligible_ref_mut.add(validated_public_key, Nil {}); + } + ); } public entry fun add_public_keys_and_fund_gas_escrows( admin: &signer, public_keys_as_bytes: vector>, amount_per_escrow: u64 ) acquires Vault { - let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; + let vault_ref_mut = borrow_vault_mut_checked(admin); + let claimed_ref = &vault_ref_mut.claimed; + let eligible_ref_mut = &mut vault_ref_mut.eligible; let coins = coin::withdraw( admin, public_keys_as_bytes.length() * amount_per_escrow @@ -136,7 +191,15 @@ module rewards::emojicoin_dot_fun_claim_link { public_keys_as_bytes.for_each_ref( |public_key_bytes_ref| { validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); - manifest_ref_mut.add(validated_public_key, NIL); + assert!( + !claimed_ref.contains(validated_public_key), + E_CLAIM_LINK_ALREADY_CLAIMED + ); + assert!( + !eligible_ref_mut.contains(validated_public_key), + E_CLAIM_LINK_ALREADY_ELIGIBLE + ); + eligible_ref_mut.add(validated_public_key, Nil {}); aptos_account::deposit_coins( from_bcs::to_address( ed25519::validated_public_key_to_authentication_key( @@ -183,12 +246,13 @@ module rewards::emojicoin_dot_fun_claim_link { // Verify public key is eligible for claim. let vault_ref_mut = &mut Vault[@rewards]; - let manifest_ref_mut = &mut vault_ref_mut.manifest; - assert!(manifest_ref_mut.contains(validated_public_key), E_INVALID_CLAIM_LINK); + let claimed_ref_mut = &mut vault_ref_mut.claimed; + let eligible_ref_mut = &mut vault_ref_mut.eligible; assert!( - *manifest_ref_mut.borrow(validated_public_key) == NIL, + !claimed_ref_mut.contains(validated_public_key), E_CLAIM_LINK_ALREADY_CLAIMED ); + assert!(eligible_ref_mut.contains(validated_public_key), E_INVALID_CLAIM_LINK); // Check vault balance. let vault_signer_cap_ref = &vault_ref_mut.signer_capability; @@ -199,8 +263,9 @@ module rewards::emojicoin_dot_fun_claim_link { E_VAULT_INSUFFICIENT_FUNDS ); - // Update manifest, transfer APT to claimant. - *manifest_ref_mut.borrow_mut(validated_public_key) = claimant_address; + // Update tables, transfer APT to claimant. + eligible_ref_mut.remove(validated_public_key); + claimed_ref_mut.add(validated_public_key, claimant_address); let vault_signer = account::create_signer_with_capability(vault_signer_cap_ref); aptos_account::transfer(&vault_signer, claimant_address, claim_amount); @@ -245,12 +310,12 @@ module rewards::emojicoin_dot_fun_claim_link { public entry fun remove_public_keys( admin: &signer, public_keys_as_bytes: vector> ) acquires Vault { - let manifest_ref_mut = &mut borrow_vault_mut_checked(admin).manifest; + let eligible_ref_mut = &mut borrow_vault_mut_checked(admin).eligible; + let validated_public_key; public_keys_as_bytes.for_each_ref(|public_key_bytes_ref| { - let validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); - if (manifest_ref_mut.contains(validated_public_key) - && *manifest_ref_mut.borrow(validated_public_key) == NIL) { - manifest_ref_mut.remove(validated_public_key); + validated_public_key = validate_public_key_bytes(*public_key_bytes_ref); + if (eligible_ref_mut.contains(validated_public_key)) { + eligible_ref_mut.remove(validated_public_key); } }); } @@ -277,7 +342,8 @@ module rewards::emojicoin_dot_fun_claim_link { Vault { admins: vector[signer::address_of(rewards)], claim_amount: DEFAULT_CLAIM_AMOUNT, - manifest: smart_table::new(), + claimed: smart_table::new(), + eligible: smart_table::new(), signer_capability } ); @@ -409,8 +475,7 @@ module rewards::emojicoin_dot_fun_claim_link { let public_key_bytes; escrow_account_public_key_bytes.for_each_ref(|public_key_bytes_ref| { public_key_bytes = *public_key_bytes_ref; - assert!(public_key_is_in_manifest(public_key_bytes)); - assert!(public_key_claimant(public_key_bytes) == NIL); + assert!(public_key_is_eligible(public_key_bytes)); }); escrow_account_public_keys.for_each_ref(|public_key_ref| { assert!( @@ -424,7 +489,9 @@ module rewards::emojicoin_dot_fun_claim_link { // Call with zero public keys argument to invoke silent return. assert!(coin::balance(@rewards) == 0); - add_public_keys_and_fund_gas_escrows(&rewards_signer, vector[], amount_per_escrow); + add_public_keys_and_fund_gas_escrows( + &rewards_signer, vector[], amount_per_escrow + ); assert!(coin::balance(@rewards) == 0); } @@ -466,14 +533,21 @@ module rewards::emojicoin_dot_fun_claim_link { // Check initial state. assert!(admins() == vector[@rewards]); assert!(claim_amount() == DEFAULT_CLAIM_AMOUNT); - assert!(!public_key_is_in_manifest(claim_link_validated_public_key_bytes)); - assert!(public_keys().is_empty()); + assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); + assert!(public_keys_that_are_claimed().is_empty()); + assert!(public_keys_that_are_eligible().is_empty()); let (keys, starting_bucket_index, starting_vector_index) = - public_keys_paginated(0, 0, 1); + public_keys_that_are_claimed_paginated(0, 0, 1); assert!(keys == vector[]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); - assert!(manifest_to_simple_map().length() == 0); + (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( + 0, 0, 1 + ); + assert!(keys == vector[]); + assert!(starting_bucket_index == option::none()); + assert!(starting_vector_index == option::none()); + assert!(public_keys_that_are_claimed_to_simple_map().length() == 0); assert!(vault_balance() == 0); assert!( vault_signer_address() @@ -498,20 +572,25 @@ module rewards::emojicoin_dot_fun_claim_link { // Check new state. assert!(admins() == vector[@rewards, new_admin]); assert!(claim_amount() == DEFAULT_CLAIM_AMOUNT); - assert!(public_key_is_in_manifest(claim_link_validated_public_key_bytes)); + assert!(public_key_is_eligible(claim_link_validated_public_key_bytes)); + assert!( + public_key_claimant(claim_link_validated_public_key_bytes) + == option::none() + ); + assert!( + public_keys_that_are_eligible() == vector[claim_link_validated_public_key] + ); assert!( - manifest_to_simple_map().keys() == vector[claim_link_validated_public_key] + public_key_claimant(claim_link_validated_public_key_bytes) + == option::none() ); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == NIL); - (keys, starting_bucket_index, starting_vector_index) = public_keys_paginated( + (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( 0, 0, 1 ); assert!(keys == vector[claim_link_validated_public_key]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); - assert!( - manifest_to_simple_map().keys() == vector[claim_link_validated_public_key] - ); + assert!(public_keys_that_are_claimed_to_simple_map().length() == 0); assert!(vault_balance() == DEFAULT_CLAIM_AMOUNT); // Fund another reward, double claim amount, fund another reward, remove admin, withdraw. @@ -537,13 +616,12 @@ module rewards::emojicoin_dot_fun_claim_link { &rewards_signer, vector[claim_link_validated_public_key_bytes] ); - assert!(!public_key_is_in_manifest(claim_link_validated_public_key_bytes)); + assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); add_public_keys( &rewards_signer, vector[claim_link_validated_public_key_bytes] ); - assert!(public_key_is_in_manifest(claim_link_validated_public_key_bytes)); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == NIL); + assert!(public_key_is_eligible(claim_link_validated_public_key_bytes)); // Get expected proceeds from swap. let swap_event = @@ -577,14 +655,30 @@ module rewards::emojicoin_dot_fun_claim_link { // Check vault balance, manifest. assert!(vault_balance() == 0); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == CLAIMANT); + assert!( + public_key_claimant(claim_link_validated_public_key_bytes) + == option::some(CLAIMANT) + ); + (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_claimed_paginated( + 0, 0, 1 + ); + assert!(keys == vector[claim_link_validated_public_key]); + assert!(starting_bucket_index == option::none()); + assert!(starting_vector_index == option::none()); + assert!( + public_keys_that_are_claimed_to_simple_map().keys() + == vector[claim_link_validated_public_key] + ); + assert!( + public_keys_that_are_claimed_to_simple_map().values() == vector[CLAIMANT] + ); // Verify that public key entry can no longer be removed. remove_public_keys( &rewards_signer, vector[claim_link_validated_public_key_bytes] ); - assert!(public_key_is_in_manifest(claim_link_validated_public_key_bytes)); + assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); // Verify silent return for trying to remove public key not in manifest. let (_, new_public_key) = ed25519::generate_keys(); @@ -594,20 +688,6 @@ module rewards::emojicoin_dot_fun_claim_link { ); } - #[test, expected_failure(abort_code = E_INVALID_PUBLIC_KEY)] - fun test_public_key_claimant_invalid_public_key() acquires Vault { - let (_, claim_link_validated_public_key_bytes) = prepare_for_redemption(); - claim_link_validated_public_key_bytes.push_back(0); - public_key_claimant(claim_link_validated_public_key_bytes); - } - - #[test, expected_failure(abort_code = E_INVALID_PUBLIC_KEY)] - fun test_public_key_is_in_manifest_invalid_public_key() acquires Vault { - let (_, claim_link_validated_public_key_bytes) = prepare_for_redemption(); - claim_link_validated_public_key_bytes.push_back(0); - public_key_is_in_manifest(claim_link_validated_public_key_bytes); - } - #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_CLAIMED)] fun test_redeem_claim_link_already_claimed() acquires Vault { let (signature_bytes, claim_link_validated_public_key_bytes) = @@ -744,7 +824,7 @@ module rewards::emojicoin_dot_fun_claim_link { } #[test, expected_failure(abort_code = E_NOT_ADMIN)] - fun withdraw_from_vault_not_admin() acquires Vault { + fun test_withdraw_from_vault_not_admin() acquires Vault { emojicoin_dot_fun::tests::init_package(); let rewards_signer = get_signer(@rewards); init_module(&rewards_signer); From bbcdd8728d3763b31c0e66ac553f8580f375fc34 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 19:48:50 -0800 Subject: [PATCH 04/17] Add more expected failure tests --- .../sources/emojicoin_dot_fun_claim_link.move | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 85d1471db..37ffedb61 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -424,6 +424,30 @@ module rewards::emojicoin_dot_fun_claim_link { add_admin(¬_admin_signer, not_admin); } + #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_CLAIMED)] + fun test_add_public_keys_claim_link_already_claimed() acquires Vault { + let (signature_bytes, claim_link_validated_public_key_bytes) = + prepare_for_redemption(); + redeem( + &get_signer(CLAIMANT), + signature_bytes, + claim_link_validated_public_key_bytes, + @black_cat_market, + 1 + ); + add_public_keys( + &get_signer(@rewards), vector[claim_link_validated_public_key_bytes] + ); + } + + #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_ELIGIBLE)] + fun test_add_public_keys_claim_link_already_eligible() acquires Vault { + let (_, claim_link_validated_public_key_bytes) = prepare_for_redemption(); + add_public_keys( + &get_signer(@rewards), vector[claim_link_validated_public_key_bytes] + ); + } + #[test, expected_failure(abort_code = E_INVALID_PUBLIC_KEY)] fun test_add_public_keys_invalid_public_key() acquires Vault { emojicoin_dot_fun::tests::init_package(); @@ -496,6 +520,42 @@ module rewards::emojicoin_dot_fun_claim_link { } + #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_CLAIMED)] + fun test_add_public_keys_and_fund_gas_escrows_claim_link_already_claimed() acquires Vault { + let (signature_bytes, claim_link_validated_public_key_bytes) = + prepare_for_redemption(); + redeem( + &get_signer(CLAIMANT), + signature_bytes, + claim_link_validated_public_key_bytes, + @black_cat_market, + 1 + ); + let amount_per_escrow = 1; + emojicoin_dot_fun::test_acquisitions::mint_aptos_coin_to( + @rewards, amount_per_escrow + ); + add_public_keys_and_fund_gas_escrows( + &get_signer(@rewards), + vector[claim_link_validated_public_key_bytes], + amount_per_escrow + ); + } + + #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_ELIGIBLE)] + fun test_add_public_keys_and_fund_gas_escrows_claim_link_already_eligible() acquires Vault { + let (_, claim_link_validated_public_key_bytes) = prepare_for_redemption(); + let amount_per_escrow = 1; + emojicoin_dot_fun::test_acquisitions::mint_aptos_coin_to( + @rewards, amount_per_escrow + ); + add_public_keys_and_fund_gas_escrows( + &get_signer(@rewards), + vector[claim_link_validated_public_key_bytes], + amount_per_escrow + ); + } + #[test, expected_failure(abort_code = E_INVALID_PUBLIC_KEY)] fun test_add_public_keys_and_fund_gas_escrows_invalid_public_key() acquires Vault { emojicoin_dot_fun::tests::init_package(); From 87a12ac238f31a5c79055c2b16e4a30f2e66c576 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 19:56:55 -0800 Subject: [PATCH 05/17] Add more general flow testing --- .../sources/emojicoin_dot_fun_claim_link.move | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 37ffedb61..562f6fa5d 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -580,11 +580,12 @@ module rewards::emojicoin_dot_fun_claim_link { // Initialize black cat market, have it undergo state transition. emojicoin_dot_fun::tests::init_package_then_exact_transition(); - // Get claim link private, public keys. - let (claim_link_private_key, claim_link_validated_public_key) = - ed25519::generate_keys(); + // Get claim link private, public keys, bogus public key. + let (claim_link_private_key, claim_link_validated_public_key) = ed25519::generate_keys(); let claim_link_validated_public_key_bytes = ed25519::validated_public_key_to_bytes(&claim_link_validated_public_key); + let invalid_public_key_bytes = claim_link_validated_public_key_bytes; + invalid_public_key_bytes[0] ^= 0xff; // Initialize module. let rewards_signer = get_signer(@rewards); @@ -594,6 +595,9 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(admins() == vector[@rewards]); assert!(claim_amount() == DEFAULT_CLAIM_AMOUNT); assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); + assert!(!public_key_is_eligible(invalid_public_key_bytes)); + assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); + assert!(public_key_claimant(invalid_public_key_bytes) == option::none()); assert!(public_keys_that_are_claimed().is_empty()); assert!(public_keys_that_are_eligible().is_empty()); let (keys, starting_bucket_index, starting_vector_index) = @@ -601,9 +605,11 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(keys == vector[]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); - (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( - 0, 0, 1 - ); + ( + keys, + starting_bucket_index, + starting_vector_index + ) = public_keys_that_are_eligible_paginated(0, 0, 1); assert!(keys == vector[]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); @@ -637,6 +643,9 @@ module rewards::emojicoin_dot_fun_claim_link { public_key_claimant(claim_link_validated_public_key_bytes) == option::none() ); + assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); + assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); + assert!(public_key_claimant(invalid_public_key_bytes) == option::none()); assert!( public_keys_that_are_eligible() == vector[claim_link_validated_public_key] ); @@ -644,9 +653,11 @@ module rewards::emojicoin_dot_fun_claim_link { public_key_claimant(claim_link_validated_public_key_bytes) == option::none() ); - (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( - 0, 0, 1 - ); + ( + keys, + starting_bucket_index, + starting_vector_index + ) = public_keys_that_are_eligible_paginated(0, 0, 1); assert!(keys == vector[claim_link_validated_public_key]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); @@ -713,7 +724,7 @@ module rewards::emojicoin_dot_fun_claim_link { // Verify claimant's emojicoin balance. assert!(coin::balance(CLAIMANT) == net_proceeds); - // Check vault balance, manifest. + // Check vault balance, state. assert!(vault_balance() == 0); assert!( public_key_claimant(claim_link_validated_public_key_bytes) @@ -740,7 +751,7 @@ module rewards::emojicoin_dot_fun_claim_link { ); assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); - // Verify silent return for trying to remove public key not in manifest. + // Verify silent return for trying to remove public key that is not eligible. let (_, new_public_key) = ed25519::generate_keys(); remove_public_keys( &rewards_signer, @@ -803,7 +814,7 @@ module rewards::emojicoin_dot_fun_claim_link { fun test_redeem_invalid_signature() acquires Vault { let (signature_bytes, claim_link_validated_public_key_bytes) = prepare_for_redemption(); - signature_bytes[0] = signature_bytes[0] ^ 0xff; + signature_bytes[0] ^= 0xff; redeem( &get_signer(CLAIMANT), signature_bytes, From cd0a098e2c14842b0678943e97ba31bec0bd7a31 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:09:06 -0800 Subject: [PATCH 06/17] Comment out portion of non-deterministic test fail --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 562f6fa5d..4f228d17b 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -643,7 +643,6 @@ module rewards::emojicoin_dot_fun_claim_link { public_key_claimant(claim_link_validated_public_key_bytes) == option::none() ); - assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); assert!(public_key_claimant(invalid_public_key_bytes) == option::none()); assert!( @@ -724,6 +723,7 @@ module rewards::emojicoin_dot_fun_claim_link { // Verify claimant's emojicoin balance. assert!(coin::balance(CLAIMANT) == net_proceeds); + /* // Check vault balance, state. assert!(vault_balance() == 0); assert!( @@ -757,6 +757,7 @@ module rewards::emojicoin_dot_fun_claim_link { &rewards_signer, vector[ed25519::validated_public_key_to_bytes(&new_public_key)] ); + */ } #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_CLAIMED)] From 7de4972e2f436ac3ae4304397a5aa921365a26c4 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:11:13 -0800 Subject: [PATCH 07/17] Uncomment more of nondeterministic test --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 4f228d17b..acbe0ca11 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -723,7 +723,6 @@ module rewards::emojicoin_dot_fun_claim_link { // Verify claimant's emojicoin balance. assert!(coin::balance(CLAIMANT) == net_proceeds); - /* // Check vault balance, state. assert!(vault_balance() == 0); assert!( @@ -736,6 +735,7 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(keys == vector[claim_link_validated_public_key]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); + /* assert!( public_keys_that_are_claimed_to_simple_map().keys() == vector[claim_link_validated_public_key] From b1e419a8bdfde8ca5d630350ec269d4dafce24ef Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:15:09 -0800 Subject: [PATCH 08/17] Refactor nondeterministic test --- .../rewards/sources/emojicoin_dot_fun_claim_link.move | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index acbe0ca11..257dd4089 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -749,14 +749,14 @@ module rewards::emojicoin_dot_fun_claim_link { &rewards_signer, vector[claim_link_validated_public_key_bytes] ); - assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); + assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::some(CLAIMANT)); // Verify silent return for trying to remove public key that is not eligible. let (_, new_public_key) = ed25519::generate_keys(); - remove_public_keys( - &rewards_signer, - vector[ed25519::validated_public_key_to_bytes(&new_public_key)] - ); + let new_public_key_bytes = ed25519::validated_public_key_to_bytes(&new_public_key); + remove_public_keys(&rewards_signer, vector[new_public_key_bytes]); + assert!(public_key_claimant(new_public_key_bytes) == option::none()); + assert!(!public_key_is_eligible(new_public_key_bytes)); */ } From ab583e38ea00419ddadd3aea93dc45c253ab4bae Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:15:41 -0800 Subject: [PATCH 09/17] Uncomment more --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 257dd4089..2da5b87fe 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -735,7 +735,6 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(keys == vector[claim_link_validated_public_key]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); - /* assert!( public_keys_that_are_claimed_to_simple_map().keys() == vector[claim_link_validated_public_key] @@ -744,6 +743,7 @@ module rewards::emojicoin_dot_fun_claim_link { public_keys_that_are_claimed_to_simple_map().values() == vector[CLAIMANT] ); + /* // Verify that public key entry can no longer be removed. remove_public_keys( &rewards_signer, From 931d732262f745e57886052545678b1c5c14d513 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:16:20 -0800 Subject: [PATCH 10/17] Uncomment yet more --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 2da5b87fe..d6e2e3424 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -743,13 +743,13 @@ module rewards::emojicoin_dot_fun_claim_link { public_keys_that_are_claimed_to_simple_map().values() == vector[CLAIMANT] ); - /* // Verify that public key entry can no longer be removed. remove_public_keys( &rewards_signer, vector[claim_link_validated_public_key_bytes] ); assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::some(CLAIMANT)); + /* // Verify silent return for trying to remove public key that is not eligible. let (_, new_public_key) = ed25519::generate_keys(); From 191758a6d7a7acefe9d8889fd6cae04b1ee54967 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:17:34 -0800 Subject: [PATCH 11/17] Uncomment yet more --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index d6e2e3424..9620636c4 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -749,12 +749,12 @@ module rewards::emojicoin_dot_fun_claim_link { vector[claim_link_validated_public_key_bytes] ); assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::some(CLAIMANT)); - /* // Verify silent return for trying to remove public key that is not eligible. let (_, new_public_key) = ed25519::generate_keys(); let new_public_key_bytes = ed25519::validated_public_key_to_bytes(&new_public_key); remove_public_keys(&rewards_signer, vector[new_public_key_bytes]); + /* assert!(public_key_claimant(new_public_key_bytes) == option::none()); assert!(!public_key_is_eligible(new_public_key_bytes)); */ From 6b8a9e995e7298fe144f4e63ef13816caeddf483 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:18:32 -0800 Subject: [PATCH 12/17] Uncomment 1 more line --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 9620636c4..f6666af42 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -754,8 +754,8 @@ module rewards::emojicoin_dot_fun_claim_link { let (_, new_public_key) = ed25519::generate_keys(); let new_public_key_bytes = ed25519::validated_public_key_to_bytes(&new_public_key); remove_public_keys(&rewards_signer, vector[new_public_key_bytes]); - /* assert!(public_key_claimant(new_public_key_bytes) == option::none()); + /* assert!(!public_key_is_eligible(new_public_key_bytes)); */ } From 1d5dc28b98f656a656f09f6b9dd64aa5cb7a9fb2 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:20:08 -0800 Subject: [PATCH 13/17] Verify passing test --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index f6666af42..16e1051e4 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -755,9 +755,7 @@ module rewards::emojicoin_dot_fun_claim_link { let new_public_key_bytes = ed25519::validated_public_key_to_bytes(&new_public_key); remove_public_keys(&rewards_signer, vector[new_public_key_bytes]); assert!(public_key_claimant(new_public_key_bytes) == option::none()); - /* assert!(!public_key_is_eligible(new_public_key_bytes)); - */ } #[test, expected_failure(abort_code = E_CLAIM_LINK_ALREADY_CLAIMED)] From b6e16dba7eaa7958e1d9186dc691ee4636d6ee57 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:24:52 -0800 Subject: [PATCH 14/17] Update bitwise operator to fix formatter --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 16e1051e4..c1bfafeda 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -585,7 +585,7 @@ module rewards::emojicoin_dot_fun_claim_link { let claim_link_validated_public_key_bytes = ed25519::validated_public_key_to_bytes(&claim_link_validated_public_key); let invalid_public_key_bytes = claim_link_validated_public_key_bytes; - invalid_public_key_bytes[0] ^= 0xff; + invalid_public_key_bytes[0] = invalid_public_key_bytes ^ 0xff; // Initialize module. let rewards_signer = get_signer(@rewards); From 148a1dd6975d90581d41f61e127f359ad7a1144d Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:25:35 -0800 Subject: [PATCH 15/17] Add missing vec index --- src/move/rewards/sources/emojicoin_dot_fun_claim_link.move | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index c1bfafeda..8ee6648be 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -585,7 +585,7 @@ module rewards::emojicoin_dot_fun_claim_link { let claim_link_validated_public_key_bytes = ed25519::validated_public_key_to_bytes(&claim_link_validated_public_key); let invalid_public_key_bytes = claim_link_validated_public_key_bytes; - invalid_public_key_bytes[0] = invalid_public_key_bytes ^ 0xff; + invalid_public_key_bytes[0] = invalid_public_key_bytes[0] ^ 0xff; // Initialize module. let rewards_signer = get_signer(@rewards); From 0e218d6c57bcdcbb1ad4523001ea65180d478cc7 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:31:48 -0800 Subject: [PATCH 16/17] Update mock invalid pubkey --- .../rewards/sources/emojicoin_dot_fun_claim_link.move | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 8ee6648be..48d763411 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -584,8 +584,6 @@ module rewards::emojicoin_dot_fun_claim_link { let (claim_link_private_key, claim_link_validated_public_key) = ed25519::generate_keys(); let claim_link_validated_public_key_bytes = ed25519::validated_public_key_to_bytes(&claim_link_validated_public_key); - let invalid_public_key_bytes = claim_link_validated_public_key_bytes; - invalid_public_key_bytes[0] = invalid_public_key_bytes[0] ^ 0xff; // Initialize module. let rewards_signer = get_signer(@rewards); @@ -595,9 +593,9 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(admins() == vector[@rewards]); assert!(claim_amount() == DEFAULT_CLAIM_AMOUNT); assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); - assert!(!public_key_is_eligible(invalid_public_key_bytes)); + assert!(!public_key_is_eligible(vector[0])); assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); - assert!(public_key_claimant(invalid_public_key_bytes) == option::none()); + assert!(public_key_claimant(vector[0]) == option::none()); assert!(public_keys_that_are_claimed().is_empty()); assert!(public_keys_that_are_eligible().is_empty()); let (keys, starting_bucket_index, starting_vector_index) = @@ -644,7 +642,7 @@ module rewards::emojicoin_dot_fun_claim_link { == option::none() ); assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); - assert!(public_key_claimant(invalid_public_key_bytes) == option::none()); + assert!(public_key_claimant(vector[0]) == option::none()); assert!( public_keys_that_are_eligible() == vector[claim_link_validated_public_key] ); From ef1934d31c266d6883887fe72260c280da627749 Mon Sep 17 00:00:00 2001 From: alnoki <43892045+alnoki@users.noreply.github.com> Date: Sat, 16 Nov 2024 20:33:37 -0800 Subject: [PATCH 17/17] Update bitwise syntax, apply move fmt --- .../sources/emojicoin_dot_fun_claim_link.move | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move index 48d763411..00a2395a9 100644 --- a/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move +++ b/src/move/rewards/sources/emojicoin_dot_fun_claim_link.move @@ -581,7 +581,8 @@ module rewards::emojicoin_dot_fun_claim_link { emojicoin_dot_fun::tests::init_package_then_exact_transition(); // Get claim link private, public keys, bogus public key. - let (claim_link_private_key, claim_link_validated_public_key) = ed25519::generate_keys(); + let (claim_link_private_key, claim_link_validated_public_key) = + ed25519::generate_keys(); let claim_link_validated_public_key_bytes = ed25519::validated_public_key_to_bytes(&claim_link_validated_public_key); @@ -594,8 +595,13 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(claim_amount() == DEFAULT_CLAIM_AMOUNT); assert!(!public_key_is_eligible(claim_link_validated_public_key_bytes)); assert!(!public_key_is_eligible(vector[0])); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); - assert!(public_key_claimant(vector[0]) == option::none()); + assert!( + public_key_claimant(claim_link_validated_public_key_bytes) + == option::none() + ); + assert!( + public_key_claimant(vector[0]) == option::none() + ); assert!(public_keys_that_are_claimed().is_empty()); assert!(public_keys_that_are_eligible().is_empty()); let (keys, starting_bucket_index, starting_vector_index) = @@ -603,11 +609,9 @@ module rewards::emojicoin_dot_fun_claim_link { assert!(keys == vector[]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); - ( - keys, - starting_bucket_index, - starting_vector_index - ) = public_keys_that_are_eligible_paginated(0, 0, 1); + (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( + 0, 0, 1 + ); assert!(keys == vector[]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); @@ -641,8 +645,13 @@ module rewards::emojicoin_dot_fun_claim_link { public_key_claimant(claim_link_validated_public_key_bytes) == option::none() ); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::none()); - assert!(public_key_claimant(vector[0]) == option::none()); + assert!( + public_key_claimant(claim_link_validated_public_key_bytes) + == option::none() + ); + assert!( + public_key_claimant(vector[0]) == option::none() + ); assert!( public_keys_that_are_eligible() == vector[claim_link_validated_public_key] ); @@ -650,11 +659,9 @@ module rewards::emojicoin_dot_fun_claim_link { public_key_claimant(claim_link_validated_public_key_bytes) == option::none() ); - ( - keys, - starting_bucket_index, - starting_vector_index - ) = public_keys_that_are_eligible_paginated(0, 0, 1); + (keys, starting_bucket_index, starting_vector_index) = public_keys_that_are_eligible_paginated( + 0, 0, 1 + ); assert!(keys == vector[claim_link_validated_public_key]); assert!(starting_bucket_index == option::none()); assert!(starting_vector_index == option::none()); @@ -746,11 +753,15 @@ module rewards::emojicoin_dot_fun_claim_link { &rewards_signer, vector[claim_link_validated_public_key_bytes] ); - assert!(public_key_claimant(claim_link_validated_public_key_bytes) == option::some(CLAIMANT)); + assert!( + public_key_claimant(claim_link_validated_public_key_bytes) + == option::some(CLAIMANT) + ); // Verify silent return for trying to remove public key that is not eligible. let (_, new_public_key) = ed25519::generate_keys(); - let new_public_key_bytes = ed25519::validated_public_key_to_bytes(&new_public_key); + let new_public_key_bytes = + ed25519::validated_public_key_to_bytes(&new_public_key); remove_public_keys(&rewards_signer, vector[new_public_key_bytes]); assert!(public_key_claimant(new_public_key_bytes) == option::none()); assert!(!public_key_is_eligible(new_public_key_bytes)); @@ -811,7 +822,7 @@ module rewards::emojicoin_dot_fun_claim_link { fun test_redeem_invalid_signature() acquires Vault { let (signature_bytes, claim_link_validated_public_key_bytes) = prepare_for_redemption(); - signature_bytes[0] ^= 0xff; + signature_bytes[0] = signature_bytes[0] ^ 0xff; redeem( &get_signer(CLAIMANT), signature_bytes,