Skip to content
This repository has been archived by the owner on May 15, 2024. It is now read-only.

Commit

Permalink
Add mutate extrinsic (#237)
Browse files Browse the repository at this point in the history
* * Implementation of mutate extrinsic

* refactor(aaa): rename mutate_avatar -> fix_variation

* feat(aaa): add benchmark

* feat(aaa): calculate weights

---------

Co-authored-by: Eric <[email protected]>
  • Loading branch information
DidacSF and cowboy-bebug authored Mar 22, 2023
1 parent 0074295 commit 2dcf69c
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 87 deletions.
14 changes: 14 additions & 0 deletions pallets/ajuna-awesome-avatars/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,20 @@ benchmarks! {
assert_last_event::<T>(Event::FreeMintsSet { target, how_many }.into())
}

fix_variation {
let name = "player";
create_avatars::<T>(name, 1)?;

let player = account::<T>(name);
let avatar_id = AAvatars::<T>::owners(&player)[0];
let (_owner, original_avatar) = AAvatars::<T>::avatars(avatar_id).unwrap();
}: _(RawOrigin::Signed(player), avatar_id)
verify {
let (_owner, updated_avatar) = AAvatars::<T>::avatars(avatar_id).unwrap();
assert!(original_avatar.dna[1] & 0b0000_1111 != original_avatar.dna[2] & 0b0000_1111);
assert!(updated_avatar.dna[1] & 0b0000_1111 == updated_avatar.dna[2] & 0b0000_1111);
}

impl_benchmark_test_suite!(
AAvatars, crate::mock::ExtBuilder::default().build(), crate::mock::Test
);
Expand Down
15 changes: 15 additions & 0 deletions pallets/ajuna-awesome-avatars/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,21 @@ pub mod pallet {
Self::deposit_event(Event::AvatarUnlocked { avatar_id });
Ok(())
}

#[pallet::call_index(16)]
#[pallet::weight(T::WeightInfo::fix_variation())]
pub fn fix_variation(origin: OriginFor<T>, avatar_id: AvatarIdOf<T>) -> DispatchResult {
let account = ensure_signed(origin)?;
let mut avatar = Self::ensure_ownership(&account, &avatar_id)?;

// Update the variation of the 3nd component to be the same as that of the 2nd by
// copying the rightmost 4 bits of dna[1] to the dna[2]
avatar.dna[2] = (avatar.dna[2] & 0b1111_0000) | (avatar.dna[1] & 0b0000_1111);

Avatars::<T>::insert(avatar_id, (account, avatar));

Ok(())
}
}

impl<T: Config> Pallet<T> {
Expand Down
32 changes: 32 additions & 0 deletions pallets/ajuna-awesome-avatars/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3020,3 +3020,35 @@ mod unlock_avatar {
});
}
}

mod fix_variation {
use super::*;

#[test]
fn fix_variation_successfully() {
let season = Season::default();

ExtBuilder::default()
.seasons(&[(1, season.clone())])
.balances(&[(ALICE, 1_000_000_000_000)])
.build()
.execute_with(|| {
run_to_block(season.start);

let avatar_id = create_avatars(1, ALICE, 1)[0];

let (_, mut avatar_before) = Avatars::<Test>::get(avatar_id).unwrap();

avatar_before.dna[1] = 0b0001_1100;
avatar_before.dna[2] = 0b0100_0010;

Avatars::<Test>::insert(avatar_id, (ALICE, avatar_before));

assert_ok!(AAvatars::fix_variation(RuntimeOrigin::signed(ALICE), avatar_id));

let (_, avatar_after) = Avatars::<Test>::get(avatar_id).unwrap();
assert_eq!(avatar_after.dna[1], 0b0001_1100);
assert_eq!(avatar_after.dna[2], 0b0100_1100);
});
}
}
Loading

0 comments on commit 2dcf69c

Please sign in to comment.