Skip to content

Commit

Permalink
fix: unified the calculation of timestamp belonging to a period (#36)
Browse files Browse the repository at this point in the history
  • Loading branch information
vasyafromrussia authored Feb 26, 2024
1 parent d8b71b0 commit d396b25
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 6 deletions.
7 changes: 5 additions & 2 deletions contract/src/burn/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ use claim_model::{
};
use near_sdk::{json_types::U128, near_bindgen, require, PromiseOrValue};

use crate::{common::now_seconds, Contract, ContractExt};
use crate::{
common::{now_seconds, UnixTimestampExtension},
Contract, ContractExt,
};

#[near_bindgen]
impl BurnApi for Contract {
Expand All @@ -21,7 +24,7 @@ impl BurnApi for Contract {
let now = now_seconds();

for (datetime, (_, total)) in self.accruals.iter() {
if now - datetime >= self.burn_period {
if !datetime.is_within_period(now, self.burn_period) {
keys_to_remove.push(*datetime);
total_to_burn += total;
}
Expand Down
10 changes: 7 additions & 3 deletions contract/src/claim/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ use claim_model::{
};
use near_sdk::{env, json_types::U128, near_bindgen, require, store::Vector, AccountId, PromiseOrValue};

use crate::{common::now_seconds, Contract, ContractExt, StorageKey::AccrualsEntry};
use crate::{
common::{now_seconds, UnixTimestampExtension},
Contract, ContractExt,
StorageKey::AccrualsEntry,
};

#[near_bindgen]
impl ClaimApi for Contract {
Expand All @@ -18,7 +22,7 @@ impl ClaimApi for Contract {
let now = now_seconds();

for (datetime, index) in &account_data.accruals {
if now - datetime > self.burn_period {
if !datetime.is_within_period(now, self.burn_period) {
continue;
}

Expand Down Expand Up @@ -65,7 +69,7 @@ impl ClaimApi for Contract {
let mut details = vec![];

for (datetime, index) in &account_data.accruals {
if now - datetime > self.burn_period {
if !datetime.is_within_period(now, self.burn_period) {
continue;
}

Expand Down
17 changes: 17 additions & 0 deletions contract/src/claim/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,23 @@ fn test_claim_when_user_has_tokens_and_claim_period_is_not_passed() {
contract.claim();
}

#[test]
fn test_claim_when_user_has_tokens_and_current_time_matches_claim_period() {
let (mut context, mut contract, accounts) = Context::init_with_oracle();

let alice_balance = 500_000;
context.switch_account(&accounts.oracle);
contract.record_batch_for_hold(vec![(accounts.alice.clone(), U128(alice_balance))]);

context.set_block_timestamp_in_seconds(contract.burn_period as u64);

let alice_new_balance = contract.get_claimable_balance_for_account(accounts.alice.clone()).0;
assert_eq!(0, alice_new_balance);

let alice_can_claim = contract.is_claim_available(accounts.alice.clone());
assert_eq!(alice_can_claim, ClaimAvailabilityView::Available);
}

#[test]
fn test_claim_when_user_has_tokens_and_claim_period_is_passed() {
let (mut context, mut contract, accounts) = Context::init_with_oracle();
Expand Down
12 changes: 11 additions & 1 deletion contract/src/common/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use claim_model::UnixTimestamp;
use claim_model::{Duration, UnixTimestamp};
use near_sdk::env::{block_timestamp_ms, panic_str};

mod asserts;
Expand All @@ -13,6 +13,16 @@ pub(crate) fn now_seconds() -> UnixTimestamp {
ms_timestamp_to_seconds(block_timestamp_ms())
}

pub(crate) trait UnixTimestampExtension {
fn is_within_period(&self, now: UnixTimestamp, period: Duration) -> bool;
}

impl UnixTimestampExtension for UnixTimestamp {
fn is_within_period(&self, now: UnixTimestamp, period: Duration) -> bool {
now - self < period
}
}

#[test]
fn convert_milliseconds_to_unix_timestamp_successfully() {
let millis: u64 = 1_699_038_575_819;
Expand Down
Binary file modified res/sweat_claim.wasm
Binary file not shown.

0 comments on commit d396b25

Please sign in to comment.