ethereum_smartcontract_intro
146 строк · 3.7 Кб
1// SPDX-License-Identifier: UNLICENSED
2
3pragma solidity >=0.8;
4
5import "./Debug.sol";
6
7import "hardhat/console.sol";
8
9
10contract HelloWorld is DebugPrintContract {
11
12uint startValue = 333330;
13
14address payable creator;
15
16//constructor (uint value) payable {
17constructor () payable {
18
19creator = payable(msg.sender);
20
21console.log ("gasleft() = %s\n", gasleft());
22
23PrintInfo();
24}
25
26function GetContractName () internal override pure returns (string memory) {
27return "Hello";
28}
29
30// Вызывается при вызове функции с пустым селектором (пустой calldata).
31receive() external payable {
32string memory msgStr = GetContractName();
33console.log ("[%s] receive value = %s, gasleft = %s\n", msgStr, msg.value, gasleft());
34}
35
36// Вызывается при вызове функции с несуществующим селектором.
37fallback() external payable {
38string memory msgStr = GetContractName();
39console.log ("[%s] fallback value = %s, gasleft = %s\n", msgStr, msg.value, gasleft());
40}
41
42function Hello (uint a) public payable {
43
44string memory msgStr = GetContractName();
45console.log ("[%s] Hello from %s. a = %s, ", msgStr, msg.sender, a);
46console.log ("value = %s", msg.value);
47console.log ("gasleft = %s\n", gasleft());
48
49// цикл для траты газа
50for (uint i = 0; i < 50; ++i) {
51uint a = i;
52}
53console.log ("gasleft = %s\n", gasleft());
54
55//PrintInfo();
56}
57
58function SelfDestroy () public {
59
60// Контракт удаляется (уже нет) и все деньги пересылаются на адрес из аргумента.
61selfdestruct (creator);
62}
63
64// Выводит значение из слота в storage.
65function ShowStorageValue () public view {
66
67DebugPrint ("ShowStorageValue: ", startValue);
68}
69
70}
71
72
73
74contract HelloWorld2 {
75
76uint startValue = 444440;
77
78receive() external payable {
79
80require (msg.value > 1 ether);
81
82// Через send/transfer передаётся так мало газа,
83// что не хватит даже на отладочный вывод.
84//console.log ("[Hello2] receive value = %s, gasleft = %s\n", msg.value, gasleft());
85}
86
87fallback() external payable {
88
89console.log ("[Hello2] fallback value = %s, gasleft = %s\n", msg.value, gasleft());
90}
91
92function Revert (uint a) public {
93
94++startValue;
95
96console.log ("Revert: %s -> %s startValue = %s", msg.sender, address(this), startValue);
97if (a > 0)
98revert ("[Hello2] Revert");
99}
100}
101
102
103contract HelloWorld3 {
104
105receive() external payable {
106
107require (msg.value > 1 ether);
108
109console.log ("[Hello3] receive value = %s, gasleft = %s\n", msg.value, gasleft());
110}
111
112fallback() external payable {
113
114console.log ("[Hello3] fallback value = %s, gasleft = %s\n", msg.value, gasleft());
115}
116
117function NotPayableFunction() public view {
118
119uint value;
120assembly {
121value := callvalue()
122}
123
124console.log ("[Hello3] NotPayableFunction value = %s, gasleft = %s\n", value, gasleft());
125}
126
127function fun (uint a) external pure {
128
129console.log ("[Hello3] fun: a = %s\n", a);
130}
131
132function fun2 (uint a) public pure {
133
134console.log ("[Hello3] fun2: a = %s\n", a);
135}
136
137function ProxyFun (uint a) external view {
138
139// так вызывать external-функцию нельзя
140//fun (a);
141// только так
142this.fun (a);
143
144fun2 (a);
145}
146}