跳转到主要内容

概述

Stable SDK 中的 x/bank 模块仅提供基本的代币管理功能。 每个代币都可以无限制地转移到任何账户,用户无法委托其他账户代为转移其代币到其他账户。 因此,bank 预编译合约在 Stable SDK 现有的 x/bank 模块基础上提供了额外的授权和委托功能。

目录

  1. 概念
  2. 配置
  3. 方法
  4. 事件

概念

该预编译合约提供 ERC20 标准方法 - 如用于转账的 transferbalanceOf,以及用于委托的 transferFromapproveallowance。这些方法可以直接调用,无需注册合约地址。 然而,mintburn 方法需要合约地址被列入白名单,通过 x/precompile 模块注册。
func (p *Precompile) mint(
  ctx sdk.Context,
  contract *vm.Contract,
  denom string,
  method *abi.Method,
  stateDB vm.StateDB,
  args []interface{},
) ([]byte, error) {
  // ...

  // mint method is only allowed for the registered caller contract
  if _, err := precompilecommon.CheckPermissions(ctx, p.precompileKeeper, contract.CallerAddress, CallerPermissions); err != nil {
    return nil, err
  }
额外的验证过程可以保证调用此预编译合约的代币合约是经过授权的。 需要通过治理提案来注册代币合约地址及其denomination到 x/precompile 模块的白名单中。

配置

合约地址和gas费用已预定义。

合约地址

  • “0x0000000000000000000000000000000000001000” 用于gas代币
  • “0x0000000000000000000000000000000000001003” 用于治理代币

方法

mint

铸造请求数量的新代币并转移到账户。 要铸造的代币数量必须大于零。 当代币成功铸造并转移到账户时,会发出 PrecompiledBankMint 事件。 注意:
  • 禁止铸造治理代币。
  • 调用铸造方法的合约必须在 x/precompile 模块中注册。

输入参数

名称类型描述
toaddress接收铸造代币的地址
amountuint256要铸造的代币数量

输出参数

名称类型描述
successbool如果代币成功铸造并转移到账户,则为true

burn

从账户中销毁请求数量的代币。 要销毁的代币数量必须大于零。 当代币成功销毁时,会发出 PrecompiledBankBurn 事件。 注意:
  • 禁止销毁治理代币。
  • 调用铸造方法的合约必须在 x/precompile 模块中注册。

输入参数

名称类型描述
fromaddress销毁代币的地址
amountuint256要销毁的代币数量

输出参数

名称类型描述
successbool如果代币成功销毁,则为true

transfer

将请求数量的代币从发送者转移给接收者。 代币必须设置为可发送。要转移的代币数量必须大于零。 当代币成功转移时,会发出 PrecompiledBankTransfer 事件。

输入参数

名称类型描述
toaddress接收代币的地址
amountuint256要转移的代币数量

输出参数

名称类型描述
successbool如果代币成功转移,则为true

transferFrom

由授权的支出者在允许额度范围内将请求数量的代币从所有者转移给接收者。 代币必须设置为可发送。 要转移的代币数量必须大于零并且小于或等于当前允许额度。 当代币成功转移时,会发出 PrecompiledBankTransfer 事件。

输入参数

名称类型描述
fromaddress转出代币的地址
toaddress接收代币的地址
amountuint256要转移的代币数量

输出参数

名称类型描述
successbool如果代币成功转移,则为true

multiTransfer

将代币从单个账户转移到多个账户。 代币必须设置为可发送。 转移给每个接收者的代币数量必须大于零。 当代币成功转移时,每个接收者都会发出 PrecompiledBankTransfer 事件。

输入参数

名称类型描述
toaddress[]接收转移代币的地址数组
amountuint256[]转移给每个接收者的代币数量

输出参数

名称类型描述
successbool如果代币成功转移给每个接收者,则为true

approve

授权支出者从所有者账户转移代币。 要授权的代币数量必须大于零。 当授权成功设置时,会发出 PrecompiledBankApproval 事件。

输入参数

名称类型描述
spenderaddress要授权的地址
valueuint256要授权的代币数量

输出参数

名称类型描述
successbool如果授权成功设置,则为true

revoke

撤销支出者从所有者转移代币的授权。 当授权成功撤销时,会发出 PrecompiledBankRevoke 事件。

输入参数

名称类型描述
spenderaddress要撤销的地址

输出参数

名称类型描述
successbool如果授权成功撤销,则为true

balanceOf

返回账户的代币余额。

输入参数

名称类型描述
accountaddress要获取代币余额的地址

输出参数

名称类型描述
balanceuint256账户中的代币数量

totalSupply

返回代币的总供应量。

输入参数

输出参数

名称类型描述
totalSupplyuint256代币的总数量

allowance

返回支出者仍可从所有者提取的金额。

输入参数

名称类型描述
owneraddress所有者的地址
spenderaddress支出者的地址

输出参数

名称类型描述
amountuint256授权的代币数量

事件

所有从此预编译合约发出的事件都以 PrecompiledBank 为前缀。 为了避免歧义,调用此预编译合约的代币合约应避免使用相同前缀的事件名称。

PrecompiledBankMint

名称类型索引描述
fromaddressY铸造代币的地址
toaddressY接收铸造代币的地址
amountuint256N铸造的代币数量

PrecompiledBankBurn

名称类型索引描述
fromaddressY销毁代币的地址
toaddressY此方法中未使用
amountuint256N销毁的代币数量

PrecompiledBankTransfer

名称类型索引描述
fromaddressY转移代币的地址
toaddressY接收转移代币的地址
amountuint256N转移的代币数量

PrecompiledBankApproval

名称类型索引描述
owneraddressY授权代币的地址
spenderaddressY被授权的地址
valueuint256N授权的代币数量

PrecompiledBankRevoke

名称类型索引描述
owneraddressY撤销代币授权的地址
spenderaddressY被撤销的地址
valueuint256N授权的代币数量