Skip to content

Commit 028d769

Browse files
miguelmtzinfnisnisleviMichaelMorami
authored
feat: Add Certora Review and FV CI (#88)
* Certora Review (#87) Co-authored-by: Michael M <[email protected]> * docs: Add Certora audit to README * docs: Update Certora audit report * fix: Remove remaining comments from previous iterations of specs * docs: Update audit report of Certora --------- Co-authored-by: Nissan Levi <[email protected]> Co-authored-by: Michael M <[email protected]>
1 parent 23366cc commit 028d769

File tree

49 files changed

+3169
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+3169
-0
lines changed

.github/workflows/certora.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
name: certora
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
branches:
9+
- main
10+
11+
workflow_dispatch:
12+
13+
jobs:
14+
verify:
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- uses: actions/checkout@v2
19+
with:
20+
submodules: recursive
21+
22+
- name: Check key
23+
env:
24+
CERTORAKEY: ${{ secrets.CERTORAKEY }}
25+
run: echo "key length" ${#CERTORAKEY}
26+
27+
- name: Install python
28+
uses: actions/setup-python@v2
29+
with: { python-version: 3.9 }
30+
31+
- name: Install java
32+
uses: actions/setup-java@v1
33+
with: { java-version: "11", java-package: jre }
34+
35+
- name: Install certora cli
36+
run: pip3 install certora-cli==3.6.8.post3
37+
38+
- name: Install solc
39+
run: |
40+
wget https://github.com/ethereum/solidity/releases/download/v0.8.10/solc-static-linux
41+
chmod +x solc-static-linux
42+
sudo mv solc-static-linux /usr/local/bin/solc8.10
43+
44+
- name: Verify rule ${{ matrix.rule }}
45+
run: |
46+
cd certora
47+
touch applyHarness.patch
48+
make munged
49+
cd ..
50+
echo "key length" ${#CERTORAKEY}
51+
certoraRun certora/conf/${{ matrix.rule }}
52+
env:
53+
CERTORAKEY: ${{ secrets.CERTORAKEY }}
54+
55+
strategy:
56+
fail-fast: false
57+
max-parallel: 16
58+
matrix:
59+
rule:
60+
- changeInContractBalanceShouldCauseAccrual.conf
61+
- erc4626-previewOPERATIONS.conf
62+
- fees_LEQ_ATokenBal.conf
63+
- lastVaultBalance_LEQ_ATokenBalThis.conf
64+
- positiveSupply_imply_positiveAssets-deposit.conf
65+
- positiveSupply_imply_positiveAssets-mint.conf
66+
- positiveSupply_imply_positiveAssets-other.conf
67+
- positiveSupply_imply_positiveAssets-redeem.conf
68+
- positiveSupply_imply_positiveAssets-withdraw.conf
69+
- rayMul_rayDiv_mulDiv_properties.conf
70+
- totalSupply_EQ_sumAllBal.conf
71+
- accrueYieldCheck.conf
72+

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ You can find all audit reports under the audits folder
6363

6464
- [01-03-2023 OpenZeppelin](./audits/01-03-2023_OpenZeppelin_Wrapped_AToken_Vault.pdf)
6565
- [03-03-2023 PeckShield](./audits/03-03-2023_Peckshield_Wrapped_AToken_Vault.pdf)
66+
- [18-06-2023 Certora](./certora/report/Aave-Vault-Formal-Verification.pdf)
6667

6768

6869
## License

certora/Makefile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
default: help
2+
3+
PATCH = applyHarness.patch
4+
CONTRACTS_DIR = ../src
5+
MUNGED_DIR = munged
6+
7+
help:
8+
@echo "usage:"
9+
@echo " make clean: remove all generated files (those ignored by git)"
10+
@echo " make $(MUNGED_DIR): create $(MUNGED_DIR) directory by applying the patch file to $(CONTRACTS_DIR)"
11+
@echo " make record: record a new patch file capturing the differences between $(CONTRACTS_DIR) and $(MUNGED_DIR)"
12+
13+
munged: $(wildcard $(CONTRACTS_DIR)/*.sol) $(PATCH)
14+
rm -rf $@
15+
mkdir $@
16+
cp -r ../lib $@
17+
cp -r ../src $@
18+
patch -p0 -d $@ < $(PATCH)
19+
20+
record:
21+
mkdir tmp
22+
cp -r ../lib tmp
23+
cp -r ../src tmp
24+
diff -ruN tmp $(MUNGED_DIR) | sed 's+tmp/++g' | sed 's+$(MUNGED_DIR)/++g' > $(PATCH)
25+
rm -rf tmp
26+
27+
clean:
28+
git clean -fdX
29+
touch $(PATCH)
30+

certora/applyHarness.patch

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
diff -ruN .gitignore .gitignore
2+
--- .gitignore 1970-01-01 01:00:00.000000000 +0100
3+
+++ .gitignore 2023-04-13 11:36:09.000000000 +0100
4+
@@ -0,0 +1,2 @@
5+
+*
6+
+!.gitignore
7+
\ No newline at end of file
8+
diff -ruN lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol
9+
--- lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol 2023-04-16 05:13:16.000000000 +0100
10+
+++ lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol 2023-04-11 14:54:24.000000000 +0100
11+
@@ -71,16 +71,16 @@
12+
13+
_domainSeparator = _calculateDomainSeparator();
14+
15+
- emit Initialized(
16+
- underlyingAsset,
17+
- address(POOL),
18+
- treasury,
19+
- address(incentivesController),
20+
- aTokenDecimals,
21+
- aTokenName,
22+
- aTokenSymbol,
23+
- params
24+
- );
25+
+ // emit Initialized(
26+
+ // underlyingAsset,
27+
+ // address(POOL),
28+
+ // treasury,
29+
+ // address(incentivesController),
30+
+ // aTokenDecimals,
31+
+ // aTokenName,
32+
+ // aTokenSymbol,
33+
+ // params
34+
+ // );
35+
}
36+
37+
/// @inheritdoc IAToken

certora/conf/accrueYieldCheck.conf

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"files": [
3+
"certora/harness/ATokenVaultHarness.sol",
4+
"certora/harness/DummyContract.sol",
5+
"certora/harness/pool/SymbolicLendingPoolL1.sol",
6+
"certora/harness/tokens/DummyERC20_aTokenUnderlying.sol",
7+
"certora/munged/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol"
8+
],
9+
"link": [
10+
"AToken:POOL=SymbolicLendingPoolL1",
11+
"AToken:_underlyingAsset=DummyERC20_aTokenUnderlying",
12+
"ATokenVaultHarness:AAVE_POOL=SymbolicLendingPoolL1",
13+
"ATokenVaultHarness:ATOKEN=AToken",
14+
"ATokenVaultHarness:DUMMY=DummyContract",
15+
"ATokenVaultHarness:UNDERLYING=DummyERC20_aTokenUnderlying",
16+
"SymbolicLendingPoolL1:aToken=AToken",
17+
"SymbolicLendingPoolL1:underlyingToken=DummyERC20_aTokenUnderlying"
18+
],
19+
"packages": [
20+
"@aave-v3-core=certora/munged/lib/aave-v3-core/contracts",
21+
"@aave-v3-periphery=certora/munged/lib/aave-v3-periphery/contracts",
22+
"@aave/core-v3=certora/munged/lib/aave-v3-core",
23+
"@openzeppelin-upgradeable=certora/munged/lib/openzeppelin-contracts-upgradeable/contracts",
24+
"@openzeppelin=certora/munged/lib/openzeppelin-contracts/contracts"
25+
],
26+
"verify": ["ATokenVaultHarness:certora/specs/accrueYieldCheck.spec"],
27+
"rule": ["accrueYieldCheck"],
28+
"optimistic_loop": true,
29+
"process": "emv",
30+
"rule_sanity": "basic",
31+
"settings": [
32+
"-assumeUnwindCond",
33+
"-depth=15",
34+
"-mediumTimeout=1000",
35+
"-ruleSanityChecks=basic",
36+
"-t=2000"
37+
],
38+
"smt_timeout": "2000",
39+
"solc": "solc8.10",
40+
"cloud": "" ,
41+
"msg": "accrueYieldCheck"
42+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"files": [
3+
"certora/harness/ATokenVaultHarness.sol",
4+
"certora/harness/DummyContract.sol",
5+
"certora/harness/pool/SymbolicLendingPoolL1.sol",
6+
"certora/harness/tokens/DummyERC20_aTokenUnderlying.sol",
7+
"certora/munged/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol"
8+
],
9+
"link": [
10+
"AToken:POOL=SymbolicLendingPoolL1",
11+
"AToken:_underlyingAsset=DummyERC20_aTokenUnderlying",
12+
"ATokenVaultHarness:AAVE_POOL=SymbolicLendingPoolL1",
13+
"ATokenVaultHarness:ATOKEN=AToken",
14+
"ATokenVaultHarness:DUMMY=DummyContract",
15+
"ATokenVaultHarness:UNDERLYING=DummyERC20_aTokenUnderlying",
16+
"SymbolicLendingPoolL1:aToken=AToken",
17+
"SymbolicLendingPoolL1:underlyingToken=DummyERC20_aTokenUnderlying"
18+
],
19+
"msg": "changeInContractBalanceShouldCauseAccrual",
20+
"optimistic_loop": true,
21+
"packages": [
22+
"@aave-v3-core=certora/munged/lib/aave-v3-core/contracts",
23+
"@aave-v3-periphery=certora/munged/lib/aave-v3-periphery/contracts",
24+
"@aave/core-v3=certora/munged/lib/aave-v3-core",
25+
"@openzeppelin-upgradeable=certora/munged/lib/openzeppelin-contracts-upgradeable/contracts",
26+
"@openzeppelin=certora/munged/lib/openzeppelin-contracts/contracts"
27+
],
28+
"process": "emv",
29+
"rule": [
30+
"changeInContractBalanceShouldCauseAccrual"
31+
],
32+
"rule_sanity": "basic",
33+
"settings": [
34+
"-assumeUnwindCond",
35+
"-depth=15",
36+
"-mediumTimeout=1000",
37+
"-rule=changeInContractBalanceShouldCauseAccrual",
38+
"-ruleSanityChecks=basic",
39+
"-t=2000"
40+
],
41+
"smt_timeout": "2000",
42+
"solc": "solc8.10",
43+
"cloud": "" ,
44+
"verify": [
45+
"ATokenVaultHarness:certora/specs/changeInContractBalanceShouldCauseAccrual.spec"
46+
]
47+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"files": [
3+
"certora/harness/ATokenVaultHarness.sol",
4+
"certora/harness/DummyContract.sol",
5+
"certora/harness/pool/SymbolicLendingPoolL1.sol",
6+
"certora/harness/tokens/DummyERC20_aTokenUnderlying.sol",
7+
"certora/munged/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol"
8+
],
9+
"link": [
10+
"AToken:POOL=SymbolicLendingPoolL1",
11+
"AToken:_underlyingAsset=DummyERC20_aTokenUnderlying",
12+
"ATokenVaultHarness:AAVE_POOL=SymbolicLendingPoolL1",
13+
"ATokenVaultHarness:ATOKEN=AToken",
14+
"ATokenVaultHarness:DUMMY=DummyContract",
15+
"ATokenVaultHarness:UNDERLYING=DummyERC20_aTokenUnderlying",
16+
"SymbolicLendingPoolL1:aToken=AToken",
17+
"SymbolicLendingPoolL1:underlyingToken=DummyERC20_aTokenUnderlying"
18+
],
19+
"optimistic_loop": true,
20+
"packages": [
21+
"@aave-v3-core=certora/munged/lib/aave-v3-core/contracts",
22+
"@aave-v3-periphery=certora/munged/lib/aave-v3-periphery/contracts",
23+
"@aave/core-v3=certora/munged/lib/aave-v3-core",
24+
"@openzeppelin-upgradeable=certora/munged/lib/openzeppelin-contracts-upgradeable/contracts",
25+
"@openzeppelin=certora/munged/lib/openzeppelin-contracts/contracts"
26+
],
27+
"process": "emv",
28+
"rule": [
29+
"previewMint_amount_check","previewDeposit_amount_check","previewWithdraw_amount_check","previewRedeem_amount_check"
30+
],
31+
"settings": [
32+
"-assumeUnwindCond",
33+
"-depth=15",
34+
"-mediumTimeout=1000",
35+
"-t=2000"
36+
],
37+
"smt_timeout": "2000",
38+
"solc": "solc8.10",
39+
"cloud": "" ,
40+
"verify": [
41+
"ATokenVaultHarness:certora/specs/erc4626.spec"
42+
],
43+
"msg": "previewOPERATION_amount_check"
44+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"files": [
3+
"certora/harness/ATokenVaultHarness.sol",
4+
"certora/harness/DummyContract.sol",
5+
"certora/harness/pool/SymbolicLendingPoolL1.sol",
6+
"certora/harness/tokens/DummyERC20_aTokenUnderlying.sol",
7+
"certora/munged/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol"
8+
],
9+
"link": [
10+
"AToken:POOL=SymbolicLendingPoolL1",
11+
"AToken:_underlyingAsset=DummyERC20_aTokenUnderlying",
12+
"ATokenVaultHarness:AAVE_POOL=SymbolicLendingPoolL1",
13+
"ATokenVaultHarness:ATOKEN=AToken",
14+
"ATokenVaultHarness:DUMMY=DummyContract",
15+
"ATokenVaultHarness:UNDERLYING=DummyERC20_aTokenUnderlying",
16+
"SymbolicLendingPoolL1:aToken=AToken",
17+
"SymbolicLendingPoolL1:underlyingToken=DummyERC20_aTokenUnderlying"
18+
],
19+
"packages": [
20+
"@aave-v3-core=certora/munged/lib/aave-v3-core/contracts",
21+
"@aave-v3-periphery=certora/munged/lib/aave-v3-periphery/contracts",
22+
"@aave/core-v3=certora/munged/lib/aave-v3-core",
23+
"@openzeppelin-upgradeable=certora/munged/lib/openzeppelin-contracts-upgradeable/contracts",
24+
"@openzeppelin=certora/munged/lib/openzeppelin-contracts/contracts"
25+
],
26+
"cloud": "",
27+
"optimistic_loop": true,
28+
"process": "emv",
29+
"settings": [
30+
"-assumeUnwindCond",
31+
"-depth=15",
32+
"-mediumTimeout=1000",
33+
"-t=2000"
34+
],
35+
"smt_timeout": "2000",
36+
"solc": "solc8.10",
37+
"verify": ["ATokenVaultHarness:certora/specs/fees_LEQ_ATokenBal.spec"],
38+
"rule": ["getCLMFees_LEQ_ATokenBAL_DM_other","getCLMFees_LEQ_ATokenBAL_RW"],
39+
"msg": "getclaimablefees LEQ Atoken.Balanceof[Vault]"
40+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"disable_auto_cache_key_gen": true,
3+
"files": [
4+
"certora/harness/ATokenVaultHarness.sol",
5+
"certora/harness/DummyContract.sol",
6+
"certora/harness/pool/SymbolicLendingPoolL1.sol",
7+
"certora/harness/tokens/DummyERC20_aTokenUnderlying.sol",
8+
"certora/munged/lib/aave-v3-core/contracts/protocol/tokenization/AToken.sol"
9+
],
10+
"link": [
11+
"AToken:POOL=SymbolicLendingPoolL1",
12+
"AToken:_underlyingAsset=DummyERC20_aTokenUnderlying",
13+
"ATokenVaultHarness:AAVE_POOL=SymbolicLendingPoolL1",
14+
"ATokenVaultHarness:ATOKEN=AToken",
15+
"ATokenVaultHarness:DUMMY=DummyContract",
16+
"ATokenVaultHarness:UNDERLYING=DummyERC20_aTokenUnderlying",
17+
"SymbolicLendingPoolL1:aToken=AToken",
18+
"SymbolicLendingPoolL1:underlyingToken=DummyERC20_aTokenUnderlying"
19+
],
20+
"packages": [
21+
"@aave-v3-core=certora/munged/lib/aave-v3-core/contracts",
22+
"@aave-v3-periphery=certora/munged/lib/aave-v3-periphery/contracts",
23+
"@aave/core-v3=certora/munged/lib/aave-v3-core",
24+
"@openzeppelin-upgradeable=certora/munged/lib/openzeppelin-contracts-upgradeable/contracts",
25+
"@openzeppelin=certora/munged/lib/openzeppelin-contracts/contracts"
26+
],
27+
"process": "emv",
28+
"optimistic_loop": true,
29+
"settings": [
30+
"-assumeUnwindCond",
31+
"-depth=15",
32+
"-mediumTimeout=1000",
33+
"-rule=lastVaultBalance_LEQ_ATokenBalThis",
34+
"-t=2000"
35+
],
36+
"smt_timeout": "2000",
37+
"solc": "solc8.10",
38+
"cloud": "" ,
39+
"verify": ["ATokenVaultHarness:certora/specs/lastVaultBal_LEQ_ATokenBalThis.spec"],
40+
"disableLocalTypeChecking": false,
41+
"rule": ["lastVaultBalance_LEQ_ATokenBalThis"],
42+
"msg": "_s.lastVaultBalance LEQ AToken.balance[this] accurate assertion"
43+
}

0 commit comments

Comments
 (0)