首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在本合同中将"_shares“转换为ERC20令牌?

如何在本合同中将"_shares“转换为ERC20令牌?
EN

Ethereum用户
提问于 2022-08-10 16:33:47
回答 1查看 28关注 0票数 1

我在修改下面的“跳马”合同。合同的运作方式如下:存入令牌X并接受铸币制股份。提取你持有的股票数量的令牌X,股票就会被烧毁。

我希望共享是一个ERC20令牌(具有名称、符号等)。但我的问题是,一旦产生股票,我就不能把它们送到任何地方。有人能帮我补充一下吗?

以下是确定代码:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract Vault {
    IERC20 public immutable token;

    uint public totalSupply;
    string public symbol;
    string public name;
    uint8 public decimals;
    mapping(address => uint) public balanceOf;

    constructor(address _token) {
        token = IERC20(_token);
        name = "VaultWithdraw";
        symbol = "wdraw";
        decimals = 0;
    }

    function _mint(address _to, uint _shares) private {
        totalSupply += _shares;
        balanceOf[_to] += _shares;
    }

    function _burn(address _from, uint _shares) private {
        totalSupply -= _shares;
        balanceOf[_from] -= _shares;
    }

    function deposit(uint _amount) external {
        /*
        a = amount
        B = balance of token before deposit
        T = total supply
        s = shares to mint

        (T + s) / T = (a + B) / B 

        s = aT / B
        */
        uint shares;
        if (totalSupply == 0) {
            shares = _amount;
        } else {
            shares = (_amount * totalSupply) / token.balanceOf(address(this));
        }

        _mint(msg.sender, shares);
        token.transferFrom(msg.sender, address(this), _amount);
    }

    function withdraw(uint _shares) external {
        /*
        a = amount
        B = balance of token before withdraw
        T = total supply
        s = shares to burn

        (T - s) / T = (B - a) / B 

        a = sB / T
        */
        uint amount = (_shares * token.balanceOf(address(this))) / totalSupply;
        _burn(msg.sender, _shares);
        token.transfer(msg.sender, amount);
    }
}

IERC20:

代码语言:javascript
复制
interface IERC20 {
    function totalSupply() external view returns (uint);

    function balanceOf(address account) external view returns (uint);

    function transfer(address recipient, uint amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint amount);
}
EN

回答 1

Ethereum用户

发布于 2022-08-12 22:52:53

若要允许转让您的合同并使您的合同完全符合ERC-20,您必须实现ERC20 20令牌的其余逻辑(即transfertransferFrom等)。

一个更好的解决方案是创建一个保险库合同,即兼4626兼容。这将允许其他开发人员轻松地将您的金库令牌集成到他们的应用程序中(例1例2)。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/133375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档