【问题标题】:Transferring assets between accounts and pallet在账户和托盘之间转移资产
【发布时间】: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


【解决方案1】:

我们遵循一个非常简单的模式,为托盘提供自己的“帐户”,用于将余额转移到其他地方。

首先,您创建一个唯一的PalletId 代表您的托盘:

use frame_support::PalletId;
const MyPalletId: PalletId = PalletId(*b"replace_");

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

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))
}

此模式用于Treasury Pallet 等。

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2020-08-16
    • 1970-01-01
    • 2017-11-08
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多