基于ERC20代币协议实现的去中心化应用平台

这篇具有很好参考价值的文章主要介绍了基于ERC20代币协议实现的去中心化应用平台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内容简介

使用 solidity 实现的基于 ERC20 代币协议的借贷款去中心化应用平台(极简版)。实现存款、取款、贷款、还款以及利息计算的功能。

设计逻辑

  • 平台提供ERC20协议代币的相关存取和利息计算工作。部署智能合约时初始化贷款和存款的年利率、代币实现地址。
  • 用户可以将手中的代币存入平台,等到一定的期限再次拿出获得本金加利息。也可以向平台申请代币,在一定的期限之后自主还款即可。

ERC20TokenLoanPlatform 合约

事件

合约包含4个事件,包括 Deposit 存款、Withdrawal 取款、CreateLoan 贷款、PayLoan 还款。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "erc-token-standard/ERC/IERC20.sol"; 

// 基于ERC20代币协议的借贷款平台 
contract ERC20TokenLoanPlatform {
    event Deposit(address depositor, uint amount ,uint DepositTime); 
    event Withdrawal(address payee, uint amount, uint WithdrawalTime); 
    event CreateLoan(address loanAddress, uint amount, uint interest, uint CreateLoanTime); 
    event PayLoan(address loanAddress, uint amount, bool total, uint PayLoanTime); 

结构体

合约包含2个结构体, 包括 Client 客户信息、Loan 贷款信息。

	// 客户信息 
	struct Client {
	    uint amount;
	    uint depositTime; 
	    uint withdrawalTime;
	}
	
	// 贷款信息
	struct Loan {
	    address loanAddress; 
	    uint amount;
	    uint interest; 
	}

状态变量

本合约使用了6个状态变量,其中有 clients 客户信息映射、loans 贷款信息映射、annualInterestRate 贷款年利率、annualDepositRate 存款年利率、tokenAddress 代币实现地址、erc20Token 代币对象。

	mapping(address => Client) private clients; 
    mapping (uint => Loan) private loans;
    uint public annualInterestRate;        // 贷款年利率,如5%
    uint public annualDepositRate;         // 存款年利率,如2%
    address public tokenAddress;           // ERC20代币地址 
    IERC20 erc20Token; 

函数

本合约包含了8个基本函数,其中包括构造函数、deposit 存款、withdrawal 取款、createLoan 贷款、payLoan 还款、loanInquiry 待还款查询、depositInquiry 账户余额查询、balanceInquiry 客户信息查询 。

	// 构造函数
    constructor(address _tokenAddress, uint _initLoanInterest, uint _initDepositInterest) {
        tokenAddress = _tokenAddress;           // 初始化代币地址 
        erc20Token = IERC20(tokenAddress);      // 声明IERC20接口合约变量
        annualInterestRate = _initLoanInterest; 
        annualDepositRate = _initDepositInterest;   
    }

    // 存款 
    function deposit(uint _amount) public {
        require(_amount > 0, "Amount is less than or equal to 0.");      // 存款代币数不能为0     
        require(erc20Token.balanceOf(msg.sender) >= _amount, "Number of tokens is insufficient.");            // 检查持有代币数是否大于等于存款代币数
        require(erc20Token.allowances(msg.sender, address(this)) >= _amount, "Not enough approvals.");        // 检查是否有足够的授权 

        erc20Token.transferFrom(msg.sender, address(this), _amount);             
        clients[msg.sender].amount += _amount;                      // 增加存款
        if (clients[msg.sender].depositTime == 0){
            clients[msg.sender].depositTime = block.timestamp;      // 当前的存款时间 
        }
        
        emit Deposit(msg.sender,_amount ,block.timestamp); 
    }

    // 取款 
    function withdrawal(uint _amount) public {
        require(_amount > 0, "Amount is less than or equal to 0.");               // 取款代币数不能为0  
        uint timestamp = block.timestamp;   
        depositInquiry();                 // 计算本金 + 利息2% 
        require(clients[msg.sender].amount >= _amount, "Insufficient balance.");         // 检查存款代币数是否大于等于取款代币数 
        require(erc20Token.balanceOf(address(this)) >= _amount, "Platform bankruptcy."); // 检查平台的代币数是否满足取款 
         
        erc20Token.transfer(msg.sender, _amount);            
        clients[msg.sender].amount -= _amount; 
        clients[msg.sender].withdrawalTime = timestamp; 

        emit Withdrawal(msg.sender, _amount, timestamp);
    }

    // 贷款
    function createLoan(uint _amount) public returns (uint){
        require(_amount > 0, "Amount is less than or equal to 0.");            // 贷款不能小于0        
        require(erc20Token.balanceOf(address(this))*10/100 >= _amount, "Exceeding the platform loan limit.");        // 超过平台总存款的10%
        require(erc20Token.balanceOf(msg.sender) + clients[msg.sender].amount >= _amount*20/100, "Invalid loan.");   // 账户资产数需有贷款的20%

        erc20Token.transfer(msg.sender, _amount); 
        uint timestamp = block.timestamp;           // 以当前块的时间戳为贷款id值 
        uint interest = _amount * annualInterestRate / 100;     // 计算利率 
        
        loans[timestamp].loanAddress = msg.sender; 
        loans[timestamp].amount = _amount; 
        loans[timestamp].interest = interest;     // 计算利率 

        emit CreateLoan(msg.sender, _amount, interest, timestamp);

        return timestamp; 
    }

    // 还款
    function payLoan(uint _amount, uint _loanId) public {
        require(_amount > 0, "Amount is less than or equal to 0.");        // 还款需大于0
        require(erc20Token.balanceOf(msg.sender) >= _amount, "Number of tokens is insufficient.");            // 检查持有代币数是否大于等于存款代币数
        require(erc20Token.allowances(msg.sender, address(this)) >= _amount, "Not enough approvals.");        // 检查是否有足够的授权 

        uint total = loanInquiry(_loanId);        // 计算代还款 
        bool fullPayment = false; 

        // 还一部分或一次性还 
        if (total <= _amount) {     
            erc20Token.transferFrom(msg.sender, address(this), total);       // 一次性还完
            delete loans[_loanId];                                           // 删除贷款记录  
            fullPayment = true; 
        } else {    
            erc20Token.transferFrom(msg.sender, address(this), _amount);        // 还了一部分 _amount 
            loans[_loanId].amount -= _amount;                                   // 重写贷款记录 
        }
        
        emit PayLoan(msg.sender, _amount, fullPayment, block.timestamp);
    }

    
    // 待还款查询
    function loanInquiry(uint _loanId) public returns (uint) {
        require(loans[_loanId].amount != 0, "Invalid loan id.");
        require(loans[_loanId].loanAddress == msg.sender, "Non-personal enquiry.");

        // 计算需要还款的代币数: 本金 + 利息
        uint timestamp = block.timestamp; 
        uint diffDays = ( timestamp - _loanId) / 86400;                 // 时间戳转换为天数 
        uint total = loans[_loanId].amount + loans[_loanId].interest*diffDays/365;      // 总计还款数 
        
        loans[_loanId].amount = total;            //重写用户贷款数 

        return total; 
    }

    // 余额+利息的计算
    function depositInquiry() public  returns (uint){
        uint principal = clients[msg.sender].amount;    // 本金
        uint diffDays = (block.timestamp - clients[msg.sender].depositTime) / 86400;                 // 时间戳转换为天数 
        uint interest = principal * annualDepositRate / 100 * diffDays / 365;
        uint total = principal + interest;
        clients[msg.sender].amount = total;

        return total;
    }

    // 客户信息查询 
    function balanceInquiry() public returns (address, uint, uint, uint){
        depositInquiry();                 // 计算本金 + 利息2% 
        uint balance = clients[msg.sender].amount;
        uint depositTime = clients[msg.sender].depositTime;
        uint withdrawalTime = clients[msg.sender].withdrawalTime;

        return (msg.sender, balance, depositTime, withdrawalTime);
    }
}

Remix 运行实现

部署相关智能合约

solidity实现ERC20代币标准。
先部署 ERC20 代币合约,初始化代币合约信息。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
部署 ERC20TokenLoanPlatform 合约,初始化代币实现地址、贷款年利率5和存款年利率2。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
首先需要给自己的账户铸造 200 个代币用于功能测试,
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
再给 ERC20TokenLoanPlatform 合约地址铸造一定数量的代币和授权代币转账权限,保证平台功能的正常运行。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊

存款和取款

调用 deposit 函数存款 100 个代币,
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
balanceInquiry 函数查看余额变化,这里已经显示自己的余额为刚才存入的100。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
调用 withdrawal 函数取出指定数量的代币,不能超出自己的余额。平台会自动进行存款利息计算。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
balanceInquiry 函数查看余额变化,这里已经显示自己的余额还剩下50。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊

贷款和还款

调用 createLoan 函数输入自己需要贷多少代币。在这里注意账户的资产需要有贷款数的20%才有资格贷款。成功后拿到此次贷款的id值 1703236890。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
调用 payLoan 函数输入贷款的 id 值进行还款,可以先还一部分也可以一次性还完,平台会自动进行贷款利息计算。

基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊
调用 loanInquiry 函数输入贷款的 id 值进行待还款的查询。
基于ERC20代币协议实现的去中心化应用平台,区块链,去中心化,区块链,solidity,Remix,以太坊

源码地址

本文只是简单介绍,具体实现看代码。gitee 开源地址。文章来源地址https://www.toymoban.com/news/detail-761776.html


到了这里,关于基于ERC20代币协议实现的去中心化应用平台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web3下的去中心化契约

    随着Web3的兴起,智能合约成为了这一新兴领域中最为重要的概念之一。智能合约是一种在区块链上执行的可编程代码,其作用类似于传统世界中的合约,但具有更多的灵活性和安全性。本文将介绍智能合约的基本概念、工作原理以及在Web3下的应用场景。 一、智能合约的概念

    2024年02月09日
    浏览(33)
  • 区块链创新:探索 Web3 的去中心化应用

    引言 随着数字化时代的发展,区块链技术作为一种颠覆性的技术正在改变着我们的社会和经济生活。在这个背景下,Web3的概念应运而生,它代表了一种去中心化的互联网新时代,为去中心化应用(DApps)的发展提供了坚实的基础。本文将深入探讨Web3的去中心化应用,探索其

    2024年04月08日
    浏览(39)
  • Solidity中的去中心化金融(DeFi)应用开发

    去中心化金融(Decentralized Finance,DeFi)是基于区块链技术的一种新型金融模式,它通过智能合约和去中心化应用程序(DApps)实现了传统金融中的各种功能,如借贷、交易、存款和投资,而无需依赖传统金融机构。Solidity是一种专为以太坊平台设计的智能合约编程语言,它成

    2024年02月09日
    浏览(34)
  • 构建高可用的去中心化微服务集群架构指南

    随着云计算、大数据和物联网的快速发展,企业对于可扩展的、高性能的微服务架构的需求也日益增长。传统的集中式架构已经不能满足这些需求,因此出现了去中心化的微服务集群架构。本文将介绍如何构建高可用的去中心化微服务集群架构,以满足企业的 高性能 和 可扩

    2024年02月12日
    浏览(38)
  • 以太坊数字资产的发行和流通:以太坊上的数字资产定义、ERC 20代币合约标准、ERC 20标准接口、ERC 721代币合约标准、

    以太坊设计的目标就是让各种数字资产能以智能合约的形式运行在以太坊虚拟机上。目前,众多智能合约中最广泛应用的是代币合约(Token Contract)。是负责管理账户以及其拥有的代币的智能合约,实质可以理解为一张账户地址和对应账户代币余额的映射表。 即:代币可以被

    2023年04月11日
    浏览(40)
  • 创建一个区块链,是由三个节点组成的去中心化网络。

    目录 一、准备工作: 1、创建三个python文件: 2、创建nodes.json文件 3、transaction.json文件 4、打开三个控制台 二、在三个节点上进行交互。 二、添加交易发布请求(a向b发送10000coin) lancoin_node_5001.py、lancoin_node_5002.py、lancoin_node_5003.py。 它们每个都将连接到不同的端口,一个端

    2024年04月29日
    浏览(38)
  • TikTok区块链实践:数字社交媒体的去中心化未来

    随着区块链技术的日渐成熟,数字社交媒体行业也在探索如何整合区块链,以推动去中心化发展。在这一潮流中,TikTok作为全球领先的短视频平台,积极实践区块链技术,探索数字社交媒体的未来。本文将深入探讨TikTok的区块链实践,以及这一实践对数字社交媒体去中心化发

    2024年02月04日
    浏览(31)
  • 代币合约 ERC20 Token接口

    在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改。 在以太坊上发布了这么多与代币有关的合约,那么

    2024年02月02日
    浏览(40)
  • 什么是 Web 3.0:面向未来的去中心化互联网

    Web 3.0 可能是基于公共区块链的未来互联网模式,公共区块链是一种用以促进加密货币交易的记录保存系统。 Web 3.0 的最重要的地方在于它是去中心化的,这意味着用户不是通过腾讯、阿里、百度、字节、谷歌、苹果等公司提供的服务访问互联网,而是个人自己拥有和管理互

    2024年01月21日
    浏览(37)
  • Polkadot + DeFi | 透明公平、高效交易的去中心化金融未来可期

    拥有投资理财意愿的人士,对金融领域的关注热度一直居高不下。从传统的金融产品,到去中心化金融产品的体验与尝试,借助区块链技术实现资产存储、资金交易行为范式的变革。无论是股票、期权,还是其他金融资产形式,DeFi(去中心化金融)不断实现对传统中心化金融

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包