Skip to content

Commit

Permalink
Merge pull request #113 from multiversx/submission_timestamps_improve…
Browse files Browse the repository at this point in the history
…ment

submission timestamp checks improvement
  • Loading branch information
iulianpascalau authored Oct 8, 2024
2 parents da17d9d + 9c18d7c commit e72c201
Showing 1 changed file with 12 additions and 20 deletions.
32 changes: 12 additions & 20 deletions contracts/price-aggregator/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,22 +130,17 @@ pub trait PriceAggregator:
self.require_not_paused();
self.require_is_oracle();

let current_timestamp = self.blockchain().get_block_timestamp();
require!(
submission_timestamp <= current_timestamp,
"Timestamp is from the future"
);
self.require_valid_submission_timestamp(submission_timestamp);

self.check_decimals(&from, &to, decimals);

self.submit_unchecked(from, to, submission_timestamp, price, decimals);
self.submit_unchecked(from, to, price, decimals);
}

fn submit_unchecked(
&self,
from: ManagedBuffer,
to: ManagedBuffer,
submission_timestamp: u64,
price: BigUint,
decimals: u8,
) {
Expand All @@ -168,8 +163,6 @@ pub trait PriceAggregator:
let current_timestamp = self.blockchain().get_block_timestamp();
let mut is_first_submission = false;
let mut first_submission_timestamp = if submissions.is_empty() {
self.require_valid_first_submission(submission_timestamp, current_timestamp);

first_sub_time_mapper.set(current_timestamp);
is_first_submission = true;

Expand All @@ -180,8 +173,6 @@ pub trait PriceAggregator:

// round was not completed in time, so it's discarded
if current_timestamp > first_submission_timestamp + MAX_ROUND_DURATION_SECONDS {
self.require_valid_first_submission(submission_timestamp, current_timestamp);

submissions.clear();
first_sub_time_mapper.set(current_timestamp);
last_sub_time_mapper.set(current_timestamp);
Expand All @@ -194,7 +185,7 @@ pub trait PriceAggregator:
let caller = self.blockchain().get_caller();
let has_caller_already_submitted = submissions.contains_key(&caller);
let accepted = !has_caller_already_submitted
&& (is_first_submission || submission_timestamp >= first_submission_timestamp);
&& (is_first_submission || current_timestamp >= first_submission_timestamp);
if accepted {
submissions.insert(caller.clone(), price.clone());
last_sub_time_mapper.set(current_timestamp);
Expand All @@ -210,7 +201,7 @@ pub trait PriceAggregator:
self.emit_discard_submission_event(
&token_pair,
round_id,
submission_timestamp,
current_timestamp,
first_submission_timestamp,
has_caller_already_submitted,
);
Expand All @@ -224,7 +215,12 @@ pub trait PriceAggregator:
});
}

fn require_valid_first_submission(&self, submission_timestamp: u64, current_timestamp: u64) {
fn require_valid_submission_timestamp(&self, submission_timestamp: u64) {
let current_timestamp = self.blockchain().get_block_timestamp();
require!(
submission_timestamp <= current_timestamp,
"Timestamp is from the future"
);
require!(
current_timestamp - submission_timestamp <= FIRST_SUBMISSION_TIMESTAMP_MAX_DIFF_SECONDS,
"First submission too old"
Expand All @@ -239,19 +235,15 @@ pub trait PriceAggregator:
self.require_not_paused();
self.require_is_oracle();

let current_timestamp = self.blockchain().get_block_timestamp();
for (from, to, submission_timestamp, price, decimals) in submissions
.into_iter()
.map(|submission| submission.into_tuple())
{
require!(
submission_timestamp <= current_timestamp,
"Timestamp is from the future"
);
self.require_valid_submission_timestamp(submission_timestamp);

self.check_decimals(&from, &to, decimals);

self.submit_unchecked(from, to, submission_timestamp, price, decimals);
self.submit_unchecked(from, to, price, decimals);
}
}

Expand Down

0 comments on commit e72c201

Please sign in to comment.