Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update contract #2314

Merged
merged 11 commits into from
Nov 12, 2024
57 changes: 55 additions & 2 deletions contracts/v0.2/src/SubmissionProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ contract SubmissionProxy is Ownable {

mapping(address => OracleInfo) public whitelist;
mapping(bytes32 feedHash => IFeed feed) public feeds;
mapping(bytes32 feedHash => uint8 threshold) thresholds;
mapping(bytes32 feedHash => uint256 lastSubmissionTime) lastSubmissionTimes;
mapping(bytes32 feedHash => uint8 threshold) public thresholds;
mapping(bytes32 feedHash => uint256 lastSubmissionTime) public lastSubmissionTimes;

event OracleAdded(address oracle, uint256 expirationTime);
event OracleRemoved(address oracle);
Expand Down Expand Up @@ -445,6 +445,59 @@ contract SubmissionProxy is Ownable {
}
}

function submitOnlyNew(
bytes32[] calldata _feedHashes,
int256[] calldata _answers,
uint256[] calldata _timestamps,
bytes[] calldata _proofs
) external {
if (
_feedHashes.length != _answers.length || _answers.length != _proofs.length
|| _proofs.length != _timestamps.length || _feedHashes.length > maxSubmission
) {
revert InvalidSubmissionLength();
}

uint256 feedsLength_ = _feedHashes.length;
for (uint256 i = 0; i < feedsLength_; i++) {
submitSingleIfNew(_feedHashes[i], _answers[i], _timestamps[i], _proofs[i]);
}
}

function submitSingleIfNew(bytes32 _feedHash, int256 _answer, uint256 _timestamp, bytes calldata _proof) public {
if (lastSubmissionTimes[_feedHash] >= _timestamp) {
return;
}

if (_timestamp <= (block.timestamp - dataFreshness) * 1000 ) {
revert AnswerTooOld();
}

(bytes[] memory proofs_, bool success_) = splitProofs(_proof);
if (!success_) {
// splitting proofs failed -> do not submit!
revert InvalidProofFormat();
}

if (address(feeds[_feedHash]) == address(0)) {
// feedHash not registered -> do not submit!
revert FeedHashNotFound();
}

if (keccak256(abi.encodePacked(feeds[_feedHash].name())) != _feedHash) {
// feedHash not matching with registered feed -> do not submit!
revert InvalidFeedHash();
}

bytes32 message_ = keccak256(abi.encodePacked(_answer, _timestamp, _feedHash));
if (validateProof(_feedHash, message_, proofs_)) {
feeds[_feedHash].submit(_answer);
lastSubmissionTimes[_feedHash] = _timestamp;
} else {
revert InvalidProof();
}
}

/**
* @notice Return the version and type of the feed.
* @return typeAndVersion The type and version of the feed.
Expand Down
Loading