ethereum_smartcontract_intro

Форк
0
146 строк · 3.7 Кб
1
// SPDX-License-Identifier: UNLICENSED
2

3
pragma solidity >=0.8;
4

5
import "./Debug.sol";
6

7
import "hardhat/console.sol";
8

9

10
contract HelloWorld is DebugPrintContract {
11

12
    uint startValue = 333330;
13

14
    address payable creator;
15

16
    //constructor (uint value) payable {
17
    constructor () payable {
18

19
        creator = payable(msg.sender);
20

21
        console.log ("gasleft() = %s\n", gasleft());
22

23
        PrintInfo();
24
    }
25

26
    function GetContractName () internal override pure returns (string memory) {
27
        return "Hello";
28
    }
29

30
    // Вызывается при вызове функции с пустым селектором (пустой calldata).
31
    receive() external payable {
32
        string memory msgStr = GetContractName();
33
        console.log ("[%s] receive value = %s, gasleft = %s\n", msgStr, msg.value, gasleft());
34
    }
35

36
    // Вызывается при вызове функции с несуществующим селектором.
37
    fallback() external payable {
38
        string memory msgStr = GetContractName();
39
        console.log ("[%s] fallback value = %s, gasleft = %s\n", msgStr, msg.value, gasleft());
40
    }
41

42
    function Hello (uint a) public payable {
43

44
        string memory msgStr = GetContractName();
45
        console.log ("[%s] Hello from %s. a = %s, ", msgStr, msg.sender, a);
46
        console.log ("value = %s", msg.value);
47
        console.log ("gasleft = %s\n", gasleft());
48

49
        // цикл для траты газа
50
        for (uint i = 0; i < 50; ++i) {
51
            uint a = i;
52
        }
53
        console.log ("gasleft = %s\n", gasleft());
54

55
        //PrintInfo();
56
    }
57

58
    function SelfDestroy () public {
59

60
        // Контракт удаляется (уже нет) и все деньги пересылаются на адрес из аргумента.
61
        selfdestruct (creator);
62
    }
63

64
    // Выводит значение из слота в storage.
65
    function ShowStorageValue () public view {
66

67
        DebugPrint ("ShowStorageValue: ", startValue);
68
    }
69

70
}
71

72

73

74
contract HelloWorld2 {
75

76
    uint startValue = 444440;
77

78
    receive() external payable {
79
        
80
        require (msg.value > 1 ether);
81

82
        // Через send/transfer передаётся так мало газа,
83
        // что не хватит даже на отладочный вывод.
84
        //console.log ("[Hello2] receive value = %s, gasleft = %s\n", msg.value, gasleft());
85
    }
86

87
    fallback() external payable {
88
        
89
        console.log ("[Hello2] fallback value = %s, gasleft = %s\n", msg.value, gasleft());
90
    }
91

92
    function Revert (uint a) public {
93

94
        ++startValue;
95
        
96
        console.log ("Revert: %s -> %s startValue = %s", msg.sender, address(this), startValue);
97
        if (a > 0)
98
            revert ("[Hello2] Revert");
99
    }
100
}
101

102

103
contract HelloWorld3 {
104

105
    receive() external payable {
106
        
107
        require (msg.value > 1 ether);
108

109
        console.log ("[Hello3] receive value = %s, gasleft = %s\n", msg.value, gasleft());
110
    }
111

112
    fallback() external payable {
113
        
114
        console.log ("[Hello3] fallback value = %s, gasleft = %s\n", msg.value, gasleft());
115
    }
116

117
    function NotPayableFunction() public view {
118

119
        uint value;
120
        assembly {
121
            value := callvalue()
122
        }
123

124
        console.log ("[Hello3] NotPayableFunction value = %s, gasleft = %s\n", value, gasleft());
125
    }
126

127
    function fun (uint a) external pure {
128

129
        console.log ("[Hello3] fun: a = %s\n", a);
130
    }
131

132
    function fun2 (uint a) public pure {
133

134
        console.log ("[Hello3] fun2: a = %s\n", a);
135
    }
136

137
    function ProxyFun (uint a) external view {
138

139
        // так вызывать external-функцию нельзя
140
        //fun (a);
141
        // только так
142
        this.fun (a);
143

144
        fun2 (a);
145
    }
146
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.