泰山眾籌Defi理財合約系統技術開發丨Solidity程式設計程式碼

I76搭2o72建9II9發表於2023-04-19

在泰山眾籌平臺上,我們可以建立一個Defi理財合約,允許使用者將代幣存入合約並獲得利息,同時也允許使用者提取存入的

代幣。在本文中,我們將展示如何建立一個這樣的合約並提供相應的Solidity程式碼。


合約特點:


支援多種代幣儲存。

可以根據不同的代幣設定不同的年化收益率。

支援存入和提取操作。

儲存的代幣可以被用於其他智慧合約或交易所。


Solidity程式碼:

scssCopy codepragma solidity ^0.8.0;
interface IERC20 {
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
}
contract TaiShanCrowdfunding {
    struct Token {
        uint256 balance;
        uint256 interest;
        uint256 lastInterestUpdate;
    }    mapping(address => Token) private tokens;
    uint256 private totalBalance;
    function deposit(address tokenAddress, uint256 amount) public {
        IERC20 token = IERC20(tokenAddress);   
             require(token.allowance(msg.sender, address(this)) >= amount, "Allowance not enough");
        if (tokens[tokenAddress].balance == 0) {
            tokens[tokenAddress].lastInterestUpdate = block.timestamp;
        } else {
            uint256 accumulatedInterest = calculateAccumulatedInterest(tokenAddress);
            if (accumulatedInterest > 0) {
                tokens[tokenAddress].balance += accumulatedInterest;
                totalBalance += accumulatedInterest;
            }
        }        require(token.transferFrom(msg.sender, address(this), amount), "Token transfer failed");
        tokens[tokenAddress].balance += amount;
        totalBalance += amount;
    }
    function withdraw(address tokenAddress, uint256 amount) public {   
         require(tokens[tokenAddress].balance >= amount, "Not enough balance");
        uint256 accumulatedInterest = calculateAccumulatedInterest(tokenAddress);
        if (accumulatedInterest > 0) {
            tokens[tokenAddress].balance += accumulatedInterest;
            totalBalance += accumulatedInterest;
        }
        IERC20 token = IERC20(tokenAddress);    
            require(token.transfer(msg.sender, amount), "Token transfer failed");
        tokens[tokenAddress].balance -= amount;
        totalBalance -= amount;
    }
    function setInterest(address tokenAddress, uint256 interest) public {   
         require(interest >= 0 && interest <= 100, "Invalid interest");
        uint256 accumulatedInterest = calculateAccumulatedInterest(tokenAddress);
        if (accumulatedInterest > 0) {
            tokens[tokenAddress].balance += accumulatedInterest;
            totalBalance += accumulatedInterest;
        }
        tokens[tokenAddress].interest = interest;
        tokens[tokenAddress].lastInterestUpdate = block.timestamp;
    }
    function calculateAccumulatedInterest(address tokenAddress) private view returns (uint256) {
        Token memory token = tokens[tokenAddress];
        uint256 secondsSinceLastUpdate = block.timestamp - token.lastInterestUpdate;
        uint256 accumulatedInterest = token.balance * token.interest


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027509/viewspace-2946768/,如需轉載,請註明出處,否則將追究法律責任。

相關文章