This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -76,6 +76,11 @@ certoraRun --help

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***ERC20***.
</br>

### ***Results***

The prover will print various information to the console.
Expand All@@ -99,6 +104,20 @@ Follow the "Verification results" link in the command line, or go to [prover.cer
You'll see a table with the verification results, similar to this image: ![results](images/results.jpg)
For each rule, the table either displays a checkmark when the rule was proved or a x-mark when a violation of the rule was discovered.

</br>

## Results in VSCode IDE ##

The results will appear under the job title. After a job is sent to the cloud, the 'Go To Rule Report' icon to the left of
the job will turn light blue. Clicking it will open the rule report in the web.

![Screen Shot 2023-03-07 at 11 21 42](https://user-images.githubusercontent.com/101042618/223378848-63242073-2987-4efd-adc9-fbb155344837.png)

To see the call trace, click a violated rule's details:

![Screen Shot 2023-03-07 at 11 24 10](https://user-images.githubusercontent.com/101042618/223379486-a728d578-4f72-481f-ab8f-959dd4451db3.png)


</br>

## Understanding Rule Violations
Expand DownExpand Up@@ -131,6 +150,11 @@ No violations were found. Great!

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the job ***bankfixed integrityofdeposit***.
</br>

## Preconditions and Helper Variables

Let’s define [another property](TotalGreaterThanUser.spec) and verify that after mint, the `totalSupply` in the system is at least the balance of the beneficiary:
Expand DownExpand Up@@ -176,6 +200,11 @@ You will see the message in the run results mail and in the job's list in [prove

</br>

### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***bankfixed totalfundsafterdepos*** and ***bankfixed running with precondition***.
</br>

## Parametric Rules

Many properties can be generalized to be used for all functions.
Expand DownExpand Up@@ -209,3 +238,9 @@ Notice that this rule uncovers a bug in `decreaseAllowance`.
Parametric rules enable expressing reusable and concise correctness conditions.
Note that they are not dependent on the implementation.
You can integrate them easily into the CI to verify changes to the code, including signature changes, new functions, and implementation changes.

</br>
### ***Running in the IDE***

Alternatively, use the ***Certora VSCode extension IDE*** to run the jobs ***parametric rule on bank*** and ***parametric rule on bankfixed***.
</br>
16 changes: 16 additions & 0 deletions 01.Lesson_GettingStarted/ERC20Lesson1/certora/conf/01_erc20.conf
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "01 erc20",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:ERC20Fixed.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:Parametric.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 parametric rule",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermint",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMint"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMint"
]
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
{
"files": [
"ERC20.sol:ERC20"
],
"verify": [
"ERC20:TotalGreaterThanUser.spec"
],
"solc": "solc8.0",
"msg": "01 erc20 totalsupplyaftermintwithpr",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"rule": [
"totalSupplyAfterMintWithPrecondition"
],
"process": "emv",
"settings": [
"-rule=totalSupplyAfterMintWithPrecondition"
]
}
5 changes: 4 additions & 1 deletion 01.Lesson_GettingStarted/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,7 +16,10 @@

- [ ] In the VSCode extensions/marketplace search for [Certora Verification Language LSP](https://marketplace.visualstudio.com/items?itemName=Certora.evmspec-lsp) and install it. This is an extension developed for supporting the spec language - the language in which we will be writing specifications. The extension supports syntax highlighting, autocompletion and more.

- [ ] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.
- [x] It is recommanded to install [Certora IDE](https://marketplace.visualstudio.com/items?itemName=Certora.vscode-certora-prover) in the VSCode extensions/marketplace as well, to get an easy-to-use interface for running jobs.

- [x] It is also recommended to install the [Ethereum Security Bundle](https://marketplace.visualstudio.com/items?itemName=tintinweb.ethereum-security-bundle) by tintinweb on the VSCode extensions/marketplace, to get support for the Solidity contracts.


</br>

Expand Down
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"BordaBug1.sol:Borda"
],
"verify": [
"Borda:Borda.spec"
],
"solc": "solc7.6",
"msg": "02 borda bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"ERC20Fixed.sol:ERC20"
],
"verify": [
"ERC20:ERC20.spec"
],
"solc": "solc8.0",
"msg": "02 erc20 bug fixed",
"optimistic_loop": true,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"MeetingSchedulerBug1.sol:MeetingScheduler"
],
"verify": [
"MeetingScheduler:meetings.spec"
],
"solc": "solc8.7",
"msg": "02 meeting scheduler bug 1",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
3 changes: 2 additions & 1 deletion 02.Lesson_InvestigateViolations/README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,11 +34,12 @@ For each of the systems in this directory do as follows:
</br>

- [ ] Create a script (or multiple scripts) that will serve you for running the verifications of the system's buggy versions.
- [ ] Alternatively, create a new empty job in the VSCode IDE or upload an existing file.

> :bulb:
> <details>
> <summary>Script Hint</summary>
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest.
> Craft your script wisely - use the `--rule` to filter out information that isn't of your interest ('Rules' is under 'Certora Spec' in the IDE's settings form).
></details>

</br>
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,7 +34,9 @@ You can read about the catch in the following [blog post](https://blog.makerdao.

- [ ] Run the script [runBroken.sh](runBroken.sh) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Alternatively, run the job [run_broken](run_broken.conf) and get a violation. Investigate the reason for the fail and see that you understand it.

- [ ] Try to suggest a solution that will mitigate the wrongful behavior.

- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) and see that it is indeed solving the problem.
- [ ] Compare the 2 contracts - [Auction Broken](AuctionBroken.sol) and [Auction Fixed](AuctionFixed.sol) to find the fix. Run the script [runFixed.sh](runFixed.sh) or the job [run_fixed](run_fixed.conf) and see that it is indeed solving the problem.
Were you thinking of the same solution or did you think of another one? There could be more than 1 correct answer.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"AuctionBroken.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run broken",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"AuctionFixed.sol:System"
],
"verify": [
"System:Auction.spec"
],
"solc": "solc5.12",
"msg": "06 run fixed",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"TicketDepot.sol:TicketDepot"
],
"verify": [
"TicketDepot:sanity.spec"
],
"solc": "solc6.12",
"msg": "06 ticket depot sanity",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
{
"files": [
"BallGame.sol:BallGame"
],
"verify": [
"BallGame:BallGame.spec"
],
"solc": "solc8.6",
"msg": "07 ball game",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true,
"process": "emv"
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:Manager.spec"
],
"solc": "solc8.6",
"msg": "07 manager",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"smt_timeout": "600",
"loop_iter": "1",
"disableLocalTypeChecking": false
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"BankFixed.sol:Bank"
],
"verify": [
"Bank:invariant.spec"
],
"solc": "solc7.6",
"msg": "07 bank invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"files": [
"Manager.sol:Manager"
],
"verify": [
"Manager:ManagerFullSolution.spec"
],
"solc": "solc8.6",
"msg": "08 managet invariant",
"optimistic_loop": false,
"multi_assert_check": false,
"send_only": true,
"disableLocalTypeChecking": true
}