【发布时间】:2021-04-13 21:16:54
【问题描述】:
我正在尝试创建一个托盘,用户可以将资产存入和取出。 我已经编写了以下代码,但我不确定这是不是最好的处理方式,因为 frame_system::RawOrigin::Root.into() 可以被每个运行时访问。
我对 Substrate 还很陌生,不确定它到底是如何工作的,希望得到一些关于最佳设计选择的指导。
利用资产托盘存放:
<Assets::Module<T>>::transfer(origin, asset_id, RawOrigin::Root.into(), amount);
退出:
<Assets::Module<T>>::transfer(RawOrigin::Root.into(), asset_id, origin, amount);
编辑
用 Solidity 写的一个类似的想法:
contract DepositWithdrawSend {
using SafeMath for uint256;
mapping (address => mapping (address => uint256)) public depositInfo;
address public sendPallet;
constructor(address _sendPallet) public {
sendPallet = _sendPallet;
}
function deposit(address _token, uint256 _amount) public {
IERC20(_token).transferFrom(msg.sender, address(this), amount);
depositInfo[_token][msg.sender] = depositInfo[_token][msg.sender].add(_amount);
}
function withdraw(address _token, uint256 _amount) public {
require(depositInfo[_token][msg.sender] >= _amount, "Over withdraw");
require(IERC20(_token).balanceOf(address(this)) >= _amount, "Not enough");
IERC20(_token).transfer(msg.sender, amount);
depositInfo[_token][msg.sender] = depositInfo[_token][msg.sender].sub(_amount);
}
function send(address _token, uint256 _amount) public {
require(IERC20(_token).balanceOf(address(this)) >= _amount, "Not enough");
IERC20(_token).transfer(sendPallet, amount);
}
}
【问题讨论】:
-
欢迎来到基板开发 :) -- 有关如何处理帐户余额的示例,余额托盘是一个很好的示例:substrate.dev/rustdocs/v3.0.0/pallet_balances/index.html 和此处的来源:github.com/paritytech/substrate/tree/master/frame/balances
-
如果您正在使用资产托盘并希望在其他托盘中与之交互,请在此处查看如何操作:substrate.dev/recipes/pallet-coupling.html
-
“我正在尝试创建一个托盘,用户可以将资产存入和取出。” - 你的意思是你只想像使用刻痕托盘一样保留余额吗? github.com/paritytech/substrate/tree/master/frame/nicks 如果是这样,请查看教程以了解这是如何完成的:substrate.dev/docs/en/tutorials/add-a-pallet
-
@NukeManDan 感谢您的回复!我一定会看看食谱。我想要实现的目标类似于可以在 Solidity 上完成的目标。合约可以将用户的 ERC20 转入自身(存款),并将其转回给用户(提现)。实现这一目标的最佳方法是使用
assets托盘,对吗? github.com/paritytech/substrate/blob/master/frame/assets/src/… -
乐于助人! :)——你能提供一个简单的例子来说明这种合同的可靠性吗?我可以看到你想要的逻辑?根据您希望 deposit 锁定后做什么,或者它应该启用什么,资产可能是也可能不是适合这项工作的工具(但很可能是)
标签: substrate