mirror of
https://github.com/vacp2p/staking-reward-streamer.git
synced 2026-01-09 23:37:58 -05:00
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -139,7 +139,7 @@ jobs:
|
|||||||
with: { java-version: "11", java-package: jre }
|
with: { java-version: "11", java-package: jre }
|
||||||
|
|
||||||
- name: Install Certora CLI
|
- name: Install Certora CLI
|
||||||
run: pip3 install certora-cli==5.0.5
|
run: pip3 install certora-cli==7.17.2
|
||||||
|
|
||||||
- name: Install Solidity
|
- name: Install Solidity
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,9 +1,15 @@
|
|||||||
{
|
{
|
||||||
"files": ["src/RewardsStreamerMP.sol"],
|
"files": [
|
||||||
|
"src/RewardsStreamerMP.sol",
|
||||||
|
"certora/helpers/ERC20A.sol"
|
||||||
|
],
|
||||||
|
"link" : [
|
||||||
|
"RewardsStreamerMP:STAKING_TOKEN=ERC20A",
|
||||||
|
"RewardsStreamerMP:REWARD_TOKEN=ERC20A"
|
||||||
|
],
|
||||||
"msg": "Verifying RewardsStreamerMP.sol",
|
"msg": "Verifying RewardsStreamerMP.sol",
|
||||||
"rule_sanity": "basic",
|
"rule_sanity": "basic",
|
||||||
"verify": "RewardsStreamerMP:certora/specs/RewardsStreamerMP.spec",
|
"verify": "RewardsStreamerMP:certora/specs/RewardsStreamerMP.spec",
|
||||||
"wait_for_results": "all",
|
|
||||||
"optimistic_loop": true,
|
"optimistic_loop": true,
|
||||||
"loop_iter": "3",
|
"loop_iter": "3",
|
||||||
"packages": [
|
"packages": [
|
||||||
|
|||||||
10
certora/helpers/ERC20A.sol
Normal file
10
certora/helpers/ERC20A.sol
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
pragma solidity ^0.8.26;
|
||||||
|
|
||||||
|
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
|
||||||
|
|
||||||
|
contract ERC20A is ERC20 {
|
||||||
|
constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,3 +1,16 @@
|
|||||||
rule test {
|
using ERC20A as staked;
|
||||||
assert true;
|
|
||||||
|
methods {
|
||||||
|
function totalStaked() external returns (uint256) envfree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ghost mathint sumOfBalances {
|
||||||
|
init_state axiom sumOfBalances == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hook Sstore users[KEY address account].stakedBalance uint256 newValue (uint256 oldValue) {
|
||||||
|
sumOfBalances = sumOfBalances - oldValue + newValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
invariant sumOfBalancesIsTotalStaked()
|
||||||
|
sumOfBalances == to_mathint(totalStaked());
|
||||||
|
|||||||
Reference in New Issue
Block a user