我在修改下面的“跳马”合同。合同的运作方式如下:存入令牌X并接受铸币制股份。提取你持有的股票数量的令牌X,股票就会被烧毁。
我希望共享是一个ERC20令牌(具有名称、符号等)。但我的问题是,一旦产生股票,我就不能把它们送到任何地方。有人能帮我补充一下吗?
以下是确定代码:
// 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:
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);
}发布于 2022-08-12 22:52:53
若要允许转让您的合同并使您的合同完全符合ERC-20,您必须实现ERC20 20令牌的其余逻辑(即transfer、transferFrom等)。
一个更好的解决方案是创建一个保险库合同,即兼4626兼容。这将允许其他开发人员轻松地将您的金库令牌集成到他们的应用程序中(例1,例2)。
https://ethereum.stackexchange.com/questions/133375
复制相似问题