ethereum_smartcontract_intro

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

3
pragma solidity >=0.8;
4

5
import "./Debug.sol";
6

7
import "hardhat/console.sol";
8

9
import {DebugPrintContract} from "./Debug.sol";
10

11

12
contract DepositContract is DebugPrintContract {
13

14
    address private owner;
15

16
    mapping (address => uint) private balances;
17
    mapping (address => uint) private depositsDates;
18

19
    // Тип генерируемого события.
20
    event Withdrawal (uint amount, uint when);
21
    
22
    constructor () payable {
23

24
        owner = msg.sender;
25

26
    }
27

28
    function GetContractName () internal override pure returns (string memory) {
29
        return "DepositContract";
30
    }
31

32
    modifier OnlyOwner () {
33
        require(msg.sender == owner, "OnlyOwner");
34
        _;
35
    }
36

37
    // Запрос баланса адреса на контракте.
38
    function balanceOf (address addr) public view returns (uint){
39
        return balances[addr];
40
    }
41

42
    function deposit () public payable {
43

44
        // пополнить можно только пустой счёт
45
        require (balances[msg.sender] == 0, "Second deposit");
46
        
47
        balances[msg.sender] = msg.value;
48
        depositsDates[msg.sender] = block.timestamp;
49

50
        DebugPrint ("deposit ", msg.sender, msg.value);
51
    }
52

53
    // Высчитываем выплачиваемый процент.
54
    function CalculateInterest (uint amount) private pure returns (uint) {
55
        return (amount * 10) / 100;
56
    }
57

58
    // Запрос денег с депозита (возможно, с процентами).
59
    function withdraw (uint amount) public {
60

61
        require (amount > 0, "amount is null");
62
        require (balances[msg.sender] >= amount, "amount too big");
63
        balances[msg.sender] -= amount;
64

65
        uint amountForTranser = amount;
66

67
        // Если со времени размещения депозита прошло достаточно времени,
68
        // выплачиваем проценты.
69
        if (block.timestamp - depositsDates[msg.sender] > 60 seconds) {
70
            amountForTranser += CalculateInterest (amount);
71
        }
72

73
        if (amountForTranser > address(this).balance) {
74
            amountForTranser = address(this).balance;
75
        }
76

77
        // По умолчанию msg.sender имеет тип address.
78
        // Для перевода денег нужен тип address payable.
79
        payable(msg.sender).transfer (amountForTranser);
80

81
        // Генерируем событие.
82
        emit Withdrawal (amount, block.timestamp);
83

84
        DebugPrint ("withdraw ", msg.sender, amount);
85
    }
86

87
    // Владелец может уничтожить контракт и забрать все деньги.
88
    function destroy () public OnlyOwner {
89
        
90
        payable(owner).transfer (address(this).balance);
91

92
        // Начиная с cancun, контракт не будет удаляться.
93
        selfdestruct (payable(owner));
94
    }
95

96
}
97

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

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

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

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