首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在账户和托盘之间转移资产

在账户和托盘之间转移资产
EN

Stack Overflow用户
提问于 2021-04-13 21:16:54
回答 1查看 661关注 0票数 1

我试图创建一个托盘,用户可以将资产存入和退出。我编写了以下代码,但我不确定它是否是最好的方法,因为每个运行时都可以访问frame_system::RawOrigin::Root.into()。

我仍然是相当新的基板和不确定这是确切的工作方式,会喜欢一些最好的设计选择的指导。

利用资产托盘进行存款:

<Assets::Module<T>>::transfer(origin, asset_id, RawOrigin::Root.into(), amount);

撤回:

<Assets::Module<T>>::transfer(RawOrigin::Root.into(), asset_id, origin, amount);

编辑

用坚实的文字写成的类似的想法:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 07:20:44

我们遵循一个非常简单的模式,给托盘他们自己的“帐户”,以转移余额或其他任何东西。

首先,创建一个表示托盘的唯一PalletId

代码语言:javascript
复制
use frame_support::PalletId;
const MyPalletId: PalletId = PalletId(*b"replace_");

然后,从这里,您可以从这个AccountId生成一个PalletId

代码语言:javascript
复制
use sp_runtime::traits::AccountIdConversion;

/// These actually do computation. If you need to keep using them,
/// then make sure you cache the value and only call them once.

pub fn account_id() -> T::AccountId {
    T::PalletId::get().into_account()
}

pub fn sub_account(seed: u16) -> T::AccountId {
    // only use two byte prefix to support 16 byte account id (used by test)
    // "modl" ++ "replace_" ++ "hi" is 14 bytes, and two bytes remaining for bounty index
    T::PalletId::get().into_sub_account(("hi", id))
}

此模式用于国库托盘和其他方面。

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

https://stackoverflow.com/questions/67082488

复制
相关文章

相似问题

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