forked from AmazingAng/WTF-Solidity
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TryCatch.sol
62 lines (55 loc) · 2.07 KB
/
TryCatch.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract OnlyEven{
constructor(uint a){
require(a != 0, "invalid number");
assert(a != 1);
}
function onlyEven(uint256 b) external pure returns(bool success){
// Ao inserir um número ímpar, reverta
require(b % 2 == 0, "Ups! Reverting");
success = true;
}
}
contract TryCatch {
// Evento de sucesso
event SuccessEvent();
// Evento de falha
event CatchEvent(string message);
event CatchByte(bytes data);
// Declarando a variável do contrato OnlyEven
OnlyEven even;
constructor() {
even = new OnlyEven(2);
}
// Usando try-catch em chamadas externas
// execute(0) será bem-sucedido e liberará o `SuccessEvent`
// execute(1) falhará e liberará `CatchEvent`
function execute(uint amount) external returns (bool success) {
try even.onlyEven(amount) returns(bool _success){
// Em caso de sucesso na chamada
emit SuccessEvent();
return _success;
} catch Error(string memory reason){
// Em caso de falha na chamada
emit CatchEvent(reason);
}
}
// Ao usar try-catch em contratos criados (a criação de contratos é considerada uma chamada externa)
// executeNew(0) falhará e liberará `CatchEvent`
// executeNew(1) falhará e liberará `CatchByte`
// executeNew(2) será bem-sucedido e liberará `SuccessEvent`
function executeNew(uint a) external returns (bool success) {
try new OnlyEven(a) returns(OnlyEven _even){
// Em caso de sucesso na chamada
emit SuccessEvent();
success = _even.onlyEven(a);
} catch Error(string memory reason) {
// catch revert("reasonString") e require(false, "reasonString")
emit CatchEvent(reason);
} catch (bytes memory reason) {
// catch failed assert assert failed error type is Panic(uint256) not Error(string) type, so it will enter this branch
emit CatchByte(reason);
}
}
}