ESDT 代币
## 简介
ESDT 代表Elrond标准数字代币。
以本机速度和可扩展性定制代币,无需 ERC20
Elrond网络本身支持定制代币的发行,无需 ERC20 等合约,但处理相同的用例。由于本地协议内支持,使用自定义代币的交易根本不需要 VM。实际上,这意味着定制代币和本地 EGLD 代币一样快,一样可伸缩。
用户在处理自定义代币时也不需要担心分片问题,因为该协议采用了与 EGLD 代币相同的机制来处理跨分片的 ESDT 交易。因此,分片是自动处理的,对用户来说是不可见的。
从技术上讲,账户持有的 ESDT 代币余额直接存储在该账户的数据 trie 下。这还意味着,除了本地 EGLD 余额之外,一个帐户还可以持有任意数量的自定义代币余额。该协议保证任何帐户都不能修改 ESDT 代币的存储,无论是它自己的还是其他帐户的。
ESDT 代币可以由Elrond网络上的任何账户发行、拥有和持有,这意味着用户和智能合约可以使用相同的功能。由于 ESDT 代币的设计,智能合约可以轻松管理代币,甚至可以对 ESDT 转移做出反应。
发行可互换的 ESDT 代币
ESDT 代币是通过对元链的请求来发行的,元链是由管理代币的账户提交的交易。发行代币时,必须提供代币名称、报价器、初始供应量、用于显示目的的小数位数以及可选的附加属性。该交易具有以下形式:
IssuanceTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 50000000000000000 # (0.05 EGLD)
GasLimit: 60000000
Data: "issue" +
"@" + <token name in hexadecimal encoding> +
"@" + <token ticker in hexadecimal encoding> +
"@" + <initial supply in hexadecimal encoding> +
"@" + <number of decimals in hexadecimal encoding>
}
关于参数如何编码的更多细节,点击这里。
发行费用定为 0.05 埃及镑。
或者,可以在颁发代币时设置这些属性。示例:
IssuanceTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 50000000000000000 # (0.05 EGLD)
GasLimit: 60000000
Data: "issue" +
"@" + <token name in hexadecimal encoding> +
"@" + <token ticker in hexadecimal encoding> +
"@" + <initial supply in hexadecimal encoding> +
"@" + <number of decimals in hexadecimal encoding> +
"@" + <"canFreeze" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canWipe" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canPause" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canMint" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canBurn" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canChangeOwner" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canUpgrade" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded> +
"@" + <"canAddSpecialRoles" hexadecimal encoded> + "@" + <"true" or "false" hexadecimal encoded>
}
关于参数如何编码的更多细节,点击这里。
接收方地址erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
是一个内置的系统智能合约(不是 VM 可执行的合约),只处理代币发放和其他代币管理操作,不处理任何传输。该合约将向自动收报机添加一个随机字符串,从而创建了代币标识符。随机字符串以“-”开头,还有 6 个随机字符(3 字节- 6 字符十六进制编码)。例如,代币标识符可能看起来像 ALC-6258d2 。
注
由于 6 个随机字符序列(3 个字节- 6 个十六进制编码的字符),代币标识符无法预先计算,因此必须检查指示它的发行交易的智能合约结果。或者,用户可以通过 Explorer 或 API 检查其代币,并搜索以发行代币时选择的 ticker 开始的代币。
参数格式
代币名称:
- 长度在 3 到 20 个字符之间
- 仅限字母数字字符
代币报价机:
- 长度在 3 到 10 个字符之间
- 仅字母数字大写
小数位数:
- 应该是介于 0 和 18 之间的数值
- 十六进制编码
数值,如初始供应量或小数位数,应该是代表它们的十进制数的十六进制编码。此外,它们应该有偶数个字符。示例:
- 10 十进制 = > 0a 十六进制编码
- 48 十进制=>T4】30十六进制编码
- 1000000 十进制 = > 0f4240 十六进制编码
小数位数用法
前端应用程序将使用小数位数来显示余额。因此,您必须根据小数位数参数调整电源。
例如,如果您想要创建一个总供应量为 100 且小数位数为 2 的代币ALC
, 然后你要把初始供应量设置为10000
(100 此外,当转让/燃烧/铸造代币时,你应该记住还有涉及的面额。
因此,如果你拥有上述一些 ALC 代币,并且你想转让 7.5 ALC,那么交易的 value 参数应该是750
(5∵102)。同样的规则也适用于燃烧或铸造。
提示
这仅在通过手动交易对 ESDT 代币执行操作时相关。例如,网络钱包已经具备了这一功能,所以你不必在意小数位数。
发行实例
例如,名为爱丽丝的用户想要发行 4091 个名为“AliceTokens”的代币,其代码为“ALC”。还有,小数位数是 6。
如上所述,如果用户想要 4091 个具有 6 位小数的代币, 那么初始供应量就得是409
IssuanceTransaction {
Sender: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 50000000000000000 # (0.05 EGLD)
GasLimit: 60000000
Data: "issue" +
"@416c696365546f6b656e73" + // "AliceTokens" hex encoded
"@414c43" + // "ALC" hex encoded
"@f3d7b4c0" + // 4091000000 hex encoded
"@06" // 6 hex encoded
}
关于参数如何编码的更多细节,点击这里。
一旦元链处理了该交易,爱丽丝就成为了被指定的 Alice tokens 的管理器,并被授予了带有6
小数的4091000000
AliceTokens 余额(产生了4091
tokens)。如果需要,她可以在以后增加代币的总供应量。有关 ESDT 代币管理器可用的更多操作,请参见代币管理。
如果发行交易成功,智能合约结果将铸造所请求的代币,并提供用于发行的帐户,该帐户也是代币管理器。在智能合约结果中,data
字段将包含下面解释转移语法。需要注意的重要一点是,可以从这里获取代币标识符,以便将其用于传输。或者,可以从 API 中获取代币标识符(也将在下面解释)。
转账
执行 ESDT 转账的方法是将交易直接发送到所需的收款人账户,但在其Data
字段中指定一些额外的信息。ESDT 转账交易具有以下形式:
TransferTransaction {
Sender: <account address of the sender>
Receiver: <account address of the receiver>
Value: 0
GasLimit: 500000
Data: "ESDTTransfer" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <value to transfer in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
重要
交易的值应该设置为 0 EGLD,否则交易将失败。要转移的(代币)金额被编码到数据字段中。
虽然这个交易可能表面上看起来像一个智能合约调用,但它不是。区别如下:
- 接收者可以是任何账户(可以是也可以不是智能合约)
GasLimit
必须设置为 ESDT 传输协议要求的值,即500000
- 数据字段包含似乎是带有参数的智能合约方法调用,但是该调用从未到达 VM:字符串
ESDTTransfer
被协议保留,并作为内置函数处理,而不是作为智能合约调用
按照前面的例子,假设代币标识符是414c432d363235386432
,从 Alice 到另一个用户 Bob 的传输将如下所示:
TransferTransaction {
Sender: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
Receiver: erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx
Value: 0
GasLimit: 500000
Data: "ESDTTransfer" +
"@414c432d363235386432" +
"@0c"
}
关于参数如何编码的更多细节,请点击这里。
使用上面示例中的交易,Alice 将向 Bob 转移 12 个 AliceTokens。
调气上限
在计算 ESDT 中转所需的气体限制时,我们建议使用 500_000,因为它包括一个缓冲区,剩余的气体将退还给发送方的账户。
然而,如果有人想计算所需气体的确切数量,这里有一个公式:
ESDT_TRANSFER_GAS_LIMIT = MIN_GAS_LIMIT + data_length * GAS_PER_DATA_BYTE + ESDT_TRANSFER_FUNCTION_COST
其中常量代表:
MIN_GAS_LIMIT
-一笔交易的最低气体限额。每笔交易至少会有这个成本。可以从这里取来。GAS_PER_DATA_BYTE
-数据字段中每个字符使用的气体量。可以从这里取来。ESDT_TRANSFER_FUNCTION_COST
-ESDTTransfer
函数的成本。可以从这里取。
这些常量的当前值为:
MIN_GAS_LIMIT = 50,000
GAS_PER_DATA_BYTE = 1,500
ESDT_TRANSFER_FUNCTION_COST = 200,000
因此,知道这些值,预先计算 ESDT 传输气体限制所需的气体单位,交易的数据长度是唯一的变量。
例子
我们举个例子。如果要传输20,000 MEX
,交易的数据字段将如下所示:
- 其长度为 54 个字符。
根据公式,我们将得到:
ESDT_TRANSFER_GAS_LIMIT = MIN_GAS_LIMIT + data_length * GAS_PER_DATA_BYTE + ESDT_TRANSFER_FUNCTION_COST
= 50,000 + 54 * 1,500 + 200,000
= 331,000
调剂费
当计算费用时,将获得的气体限制与气体价格相乘是不够的,因为在智能合约调用或内置函数调用的情况下(这是当前的情况),费用有所减少。
因此,计算费用的公式是:
ESDT_TRANSFER_FEE = gas_price * gas_cost
= gas_price * [MIN_GAS_LIMIT + (data_length * GAS_PER_DATA_BYTE) + (ESDT_TRANSFER_FUNCTION_COST * GAS_PRICE_MODIFIER)]
大多数常量可以在传输气体限制部分找到,旁边的GAS_PRICE_MODIFIER
可以在这里找到。
目前,常量值为:
MIN_GAS_LIMIT = 50,000
GAS_PER_DATA_BYTE = 1,500
ESDT_TRANSFER_FUNCTION_COST = 200,000
GAS_PRICE_MODIFIER = 0.01
例子
我们举个例子。如果要传输20,000 MEX
,交易的数据字段将如下所示:
TransferTransaction {
...
gasPrice: 1000000000
data: ESDTTransfer@4d45582d343535633537@043c33c1937564800000
}
我们可以看到数据长度是 54,而气价是网络的最小值,也就是1000000000
。
根据公式,我们将得到:
ESDT_TRANSFER_FEE = gas_price * gas_cost
= 1000000000 * [ MIN_GAS_LIMIT + (data_length * GAS_PER_DATA_BYTE) + (ESDT_TRANSFER_FUNCTION_COST * GAS_PRICE_MODIFIER)]
= 1,000,000,000 * [ 50,000 + ( 54 * 1500 ) + ( 200,000 * 0.01 )]
= 133000000000000
= 0.000133 EGLD
转账至智能合约
智能合约可以持有 ESDT 代币,并与它们进行任何类型的交易,就像任何账户一样。然而,有一些额外的 ESDT 功能专用于智能合约:
应付与不应付合约:在部署时,智能合约可能被标记为应付,这意味着它可以接收 EGLD 或 ESDT 代币,而无需调用它的任何方法(即简单的转移)。但是默认情况下,所有的合约都是不可支付的,这意味着简单的 EGLD 或 ESDT 代币的转移将被拒绝,除非它们是方法调用。
带方法调用的 ESDT 转移:可以将 ESDT 代币作为方法调用的一部分发送给合约,就像将 EGLD 作为方法调用的一部分发送一样。向合约发送 ESDT 代币同时调用其方法之一的交易具有以下形式:
TransferWithCallTransaction {
Sender: <account address of the sender>
Receiver: <account address of the smart contract>
Value: 0
GasLimit: 500000 + <an appropriate amount for the method call>
Data: "ESDTTransfer" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <value to transfer in hexadecimal encoding> +
"@" + <name of method to call in hexadecimal encoding> +
"@" + <first argument of the method in hexadecimal encoding> +
"@" + <second argument of the method in hexadecimal encoding> +
<...>
}
关于参数如何编码的更多细节,点击这里。
发送一个包含 ESDT 转移和方法调用的交易,允许不可支付的智能合约接收代币作为调用的一部分,就像它是 EGLD 一样。智能合约可以使用专用的 API 函数来检查所接收的 ESDT 代币的名称及其数量,并相应地做出反应。
多重代币转移
也有可能在单个批量中执行多个代币传输。这样,一个人可以通过单个交易发送(到单个接收者)多个可替换、半可替换或不可替换的代币。
多代币转移交易具有以下形式:
MultiTokensTransferTransaction {
Sender: <account address of the sender>
Receiver: <same as sender>
Value: 0
GasLimit: 1_100_000 * num tokens
Data: "MultiESDTNFTTransfer" +
"@" + <receiver bytes in hexadecimal encoding> +
"@" + <number of tokens to transfer in hexadecimal encoding> +
"@" + <token 0 identifier in hexadecimal encoding> +
"@" + <token 0 nonce in hexadecimal encoding> +
"@" + <token 0 quantity to transfer in hexadecimal encoding> +
"@" + <token 1 identifier in hexadecimal encoding> +
"@" + <token 1 nonce in hexadecimal encoding> +
"@" + <token 1 quantity to transfer in hexadecimal encoding> +
...
}
关于参数如何编码的更多细节,请点击这里。
提示
每个代币都需要代币标识符、随机数和要传输的数量。
对于可替换代币(常规 ESDT ), nonce 必须为 0 ( 00
十六进制编码)
示例:
MultiTokensTransferTransaction {
Sender: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
Receiver: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
Value: 0
GasLimit: 2_200_000
Data: "MultiESDTNFTTransfer" +
"@8049d639e5a6980d1cd2392abcce41029cda74a1563523a202f09641cc2618f8" + // erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx
"@02" + // 2 tokens to transfer
"@414c432d363235386432" + // ALC-6258d2
"@00" + // 0 -> the nonce is 0 for regular ESDT tokens
"@0c" + // 12 -> value to transfer
"@5346542d317134723869" + // SFT-1q4r8i
"@01" + // 1 -> the nonce of the SFT
"@03" // 3 -> the quantity to transfer
}
关于参数如何编码的更多细节,请点击这里。
使用上例中的交易,接收者应获得12 ALC-6258d2
代币和3 SFT-1q4r8i
代币。
转账以编程方式完成
Rust 框架公开了几种通过 SendApi 传输 ESDT 代币的方法。例如,为了将的数量esdt _ token _ name传送到地址,可以执行以下操作:
self.send().direct_esdt(&address, &esdt_token_name, token_nonce: u64, &amount);
代币管理
提交自定义代币发行请求的账户自动成为代币的管理者(参见ESDT 代币的发行)。代币的管理者能够管理代币的属性、总供应量和可用性。因为智能合约也是帐户,所以智能合约还可以发行和拥有 ESDT 代币,并通过发送适当的交易来执行管理操作,如下所示。
ESDT 代币的配置属性
每个 ESDT 代币都有一组属性,这些属性控制着可以对其进行哪些操作。其控制的操作见下面的管理操作。这些属性是:
- 初始发行后,代币管理器可以铸造更多单位的代币,从而增加供应量
- 用户可能会“烧掉”他们的一些代币,从而减少供应量
canPause
-代币管理器可以阻止代币的所有交易,除了铸造和烧录canFreeze
-代币管理器可以冻结特定账户中的代币余额,防止转入和转出该账户canWipe
-代币管理器可以清除冻结账户持有的代币,从而减少供应量canChangeOwner
-代币管理可以转移到不同的账户canUpgrade
-代币管理器可以改变这些属性canAddSpecialRoles
-代币管理员可以分配特定的角色canCreateMultiShard
-如果为真,则可以使用本地铸币/燃烧,这样代币将在碎片之间分发。
管理运营
ESDT 代币的管理器有许多操作供其支配,这些操作控制其他用户如何使用代币。这些操作只能由代币管理器执行,任何其他帐户都不能执行。一个特殊的例外是ESDTBurn
操作,它适用于任何持有代币单元的账户。
铸造
提示
在 Mainnet 上,从纪元 432 开始,全球造币厂被禁用,所以必须使用本地造币厂。
ESDT 代币的管理者可以通过向元链发送以下形式的交易来增加总供应量:
MintTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "mint" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <supply to mint in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
在该交易之后,代币的总供应量增加了在数据字段中指定的新供应量,并且管理者将该数量的代币接收到他们的余额中。
该操作要求将代币的选项canMint
设置为true
。
或者,设置了ESDTRoleLocalMint
角色的帐户可以执行本地造币:
LocalMintTransaction {
Sender: <address with ESDTRoleLocalMint role>
Receiver: <same as sender>
Value: 0
GasLimit: 300000
Data: "ESDTLocalMint" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <supply to mint in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
燃烧
提示
在 Mainnet 上,从纪元 432 开始,全局刻录被禁用,因此必须使用本地刻录。
任何持有一定数量 ESDT 代币的人都可以随意烧掉它们,实际上是永久失去它们。此操作减少了代币的总供应量,并且无法撤消,除非代币管理器铸造更多代币。烧录是通过向元链发送一个交易来执行的,形式如下:
BurnTransaction {
Sender: <account address of a token holder>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "ESDTBurn" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <supply to burn in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
在该交易之后,代币持有者从余额中损失由数据指定的代币数量。
该操作要求将代币的选项canBurn
设置为true
。
或者,设置了ESDTRoleLocalBurn
角色的帐户可以执行本地烧录:
LocalBurnTransaction {
Sender: <address with ESDTRoleLocalBurn role>
Receiver: <same as sender>
Value: 0
GasLimit: 300000
Data: "ESDTLocalBurn" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <supply to burn in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
注
在版本 1 . 3 . 42(2022 年 10 月)之后发行的代币,每个持有者都可以烧毁,因此为这些代币设置角色变得多余。
然而,对于较旧的代币,仍然需要设置特殊角色ESDTRoleLocalBurn
的交易。这里是的文档。
暂停和解除暂停
ESDT 代币的管理者可以选择暂停代币的所有交易,除了铸造、冻结/解冻和擦除。交易形式如下:
PauseTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "pause" +
"@" + <token identifier in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
反向操作“取消暂停”将再次允许代币交易:
UnpauseTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "unPause" +
"@" + <token identifier in hexadecimal encoding>
}
关于参数如何编码的更多细节,点击这里。
这两个操作需要将选项canPause
设置为true
。
冻结和解冻
ESDT 代币的管理者可以冻结特定账户持有的代币。因此,不得将代币转入或转出冻结账户。冻结和解冻帐户的代币是旨在帮助代币管理人员遵守法规的操作。冻结帐户代币的交易具有以下形式:
FreezeTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "freeze" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <account address to freeze in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
相反的操作,解冻,将允许进一步转入和转出账户:
UnfreezeTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "unFreeze" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <account address to unfreeze in hexadecimal encoding>
}
关于参数如何编码的更多细节,点击这里。
这两个操作需要将选项canFreeze
设置为true
。
擦拭
ESDT 代币的管理者可以清除冻结账户持有的所有代币。这个操作类似于烧毁代币,但是必须事先冻结帐户,并且必须由代币管理器来完成。擦除帐户的代币是一项旨在帮助代币管理人员遵守法规的操作。这种交易具有以下形式:
WipeTransaction {
Sender: <account address of the token managers>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "wipe" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <account address to wipe in hexadecimal encoding>
}
关于参数如何编码的更多细节,点击这里。
设置和取消设置特殊角色
ESDT 代币的管理者可以为给定的地址设置和取消设置特殊角色。仅当canAddSpecialRoles
属性为true
时适用。基本 ESDT 代币的特殊角色包括:
-
ESDTRoleLocalBurn :具有该角色的地址可以刻录代币
-
ESDTRoleLocalMint :具有该角色的地址可以铸造新代币
对于 NFTs,可以设置不同的角色。你可以在这里找到他们。
设置特殊角色
所有者可以通过执行如下交易来设置地址的一个或多个角色:
RolesAssigningTransaction {
Sender: <address of the ESDT manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "setSpecialRole" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <address to assign the role(s) in a hexadecimal encoding> +
"@" + <role in hexadecimal encoding> +
"@" + <role in hexadecimal encoding> +
...
}
关于参数如何编码的更多细节,请点击这里。
未设置特殊角色
所有者可以通过执行如下交易来取消设置地址的一个或多个角色:
RolesAssigningTransaction {
Sender: <address of the ESDT manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "unSetSpecialRole" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <address to unset the role(s) in a hexadecimal encoding> +
"@" + <role in hexadecimal encoding> +
"@" + <role in hexadecimal encoding> +
...
}
关于参数如何编码的更多细节,请点击这里。
转让代币经营权
ESDT 代币的管理者可以将管理权限转移到另一个账户。这可以通过以下形式的交易来完成:
TransferOwnershipTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "transferOwnership" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <account address of the new token manager in hexadecimal encoding>
}
关于参数如何编码的更多细节,请点击这里。
在元链处理该交易之后,任何后续的管理操作将只被允许对新账户进行,如交易的数据字段所指定的。
该操作需要将选项canChangeOwner
设置为true
。
升级(改变属性)
提示
在 Mainnet 上,从纪元 432 开始,全局铸币和全局烧录被禁用,所以必须使用本地铸币/烧录。
因此,属性 canMint 和 canBurn 在那个纪元之后不再有效。为了设置这些属性,必须改为设置ESDTRoleLocalMint
和/或ESDTRoleLocalBurn
。
ESDT 代币的管理员可以单独更改代币的任何属性,也可以一次更改多个属性。这种操作由以下形式的交易执行:
UpgradingTransaction {
Sender: <account address of the token manager>
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "controlChanges" +
"@" + <token identifier in hexadecimal encoding> +
"@" + <property name in hexadecimal encoding> +
"@" + <"true" or "false" in hexadecimal encoding> +
"@" + <property name in hexadecimal encoding> +
"@" + <"true" or "false" in hexadecimal encoding> +
<...>
}
关于参数如何编码的更多细节,点击这里。
例如,假设前面几节讨论的“AliceTokens”将属性canWipe
设置为true
,将属性canBurn
设置为false
,但是代币管理器 Alice 想要将这些属性分别更改为false
和true
。实现这一变化的交易是:
UpgradingTransaction {
Sender: erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
Receiver: erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u
Value: 0
GasLimit: 60000000
Data: "controlChanges" +
"@414c432d363235386432" + # ALC-6258d2
"@63616e57697065" + # canWipe
"@66616c7365" + # false
"@63616e4275726e" + # canBurn
"@74727565" # true
}
关于参数如何编码的更多细节,点击这里。
烙印
任何人都可以在Elrond网络上创建一个 ESDT 代币。代币名称或代号也没有限制。例如,发出一个带有股票代码ALC
的AliceToken
。其他任何人都可以自由地创建一个具有相同代币名称和相同代币标记的新代币。唯一的区别是代币标识符的随机序列。因此“原始”代币可能已经接收到随机序列1q2w3e
产生了ALC-1q2w3e
标识符,而第二个代币可能已经接收到序列3e4r5t
产生了ALC-3e4r5t
。
为了区分原始代币和具有相同名称或股票代码的其他代币,我们引入了一种品牌机制,允许代币所有者为其代币提供徽标、描述、网站以及社交链接。品牌代币的一个例子是 MEX,即 Maiar 交易所的代币。Elrond产品如 Explorer、Wallet 等将根据其品牌显示代币(如果有)。
代币所有者可以通过在https://github.com/ElrondNetwork/assets上打开拉取请求来提交品牌申请。
提交品牌推广请求
项目所有者可以创建一个针对https://github.com/ElrondNetwork/assets存储库的 PR,带有.png
和.svg
格式的标识,以及一个包含所有相关信息的.json
文件。
这是一个预填充的模板。json 文件帮助您入门:
{
"website": "https://www.elrondtoken.com",
"description": "The ERD token is the utility token of Elrond Token",
"social": {
"email": "[email protected]",
"blog": "https://www.elrondtoken.com/ERD-token-blog",
"twitter": "https://twitter.com/ERD-token-twitter",
"whitepaper": "https://www.elrondtoken.com/ERD-token-whitepaper.pdf",
"coinmarketcap": "https://coinmarketcap.com/currencies/ERD-token",
"coingecko": "https://www.coingecko.com/en/coins/ERD-token"
},
"status": "active"
}
壁架签名将由Elrond生成。这将使您的代币在账本应用程序上处于“白名单”状态,并为用户在他们的账本硬件钱包上存储您的代币提供更丰富的数据。如果想要设置分类账签名,请在打开 PR 时请求。
休息 API
有许多 API 端点可以用来与 ESDT 数据进行交互。这些是:
获取 获取一个地址的所有 ESDT 代币
RequestResponse 返回指定地址与之交互(发出、发送或接收)的 ESDT 代币的数组。
https://gateway.elrond.com/address/*bech32Address*/esdt
参数 | 需要 | 类型 | 描述 |
---|---|---|---|
bech 32 地址 | 必需的 | string |
以 bech32 格式查询的地址。 |
{ | |||
"data": { | |||
"tokens": [ | |||
"ABC-0d0060", | |||
"DEF-d00600" | |||
] | |||
}, | |||
"error": "", | |||
"code": "successful" | |||
} |
### 获取 **获取余额一个地址和一个 ESDT 代币**
RequestResponse 返回特定 ESDT 代币的地址余额。
```rust
https://gateway.elrond.com/address/*bech32Address*/esdt/*tokenIdentifier*
参数 | 需要 | 类型 | 描述 |
---|---|---|---|
bech 32 地址 | 必需的 | string |
以 bech32 格式查询的地址。 |
代币标识符 | 必需的 | string |
代币标识符。 |
{ | |||
"data": { | |||
"tokenData": { | |||
"balance": "99502603", | |||
"properties": "", | |||
"tokenIdentifier": "GLD-0d0060" | |||
} | |||
}, | |||
"error": "", | |||
"code": "successful" | |||
} |
### 获取 **获取一个地址代币的所有角色**
这涉及一个基本请求,该请求包含获取所有代币和角色的地址。例如:
RequestResponse ```rust
https://gateway.elrond.com/address/*bech32Address*/esdts/roles
``` ```rust
{
"data": {
"roles": {
"TCK-0cv5hj": [
"ESDTRoleNFTAddQuantity",
"ESDTRoleNFTBurn"
],
"TCK-ft90kn": [
"ESDTRoleLocalBurn"
]
}
},
"error": "",
"code": "successful"
}
获得 获得代币的供应量,煅造值
这涉及到一个包含代币名称的基本请求。它将从所有碎片中收集数据,并计算初始铸造值、燃烧值、铸造值和总供应值。
RequestResponse | 参数 | 需要 | 类型 | 描述 |
| --- | --- | --- | --- |
| 代币标识符 | 必需的 | string
| 代币标识符(例如:WEGLD-bd4d79)
|
https://gateway.elrond.com/network/esdt/supply/*token name*
``` ```rust
{
"data": {
"supply": "95000000000000000000",
"minted": "5000000000000000000",
"burned": "10000000000000000000",
"initialMinted": "100000000000000000000"
},
"error": "",
"code": "successful"
}
获取 获取所有发放的 ESDT 代币
- 所有 ESDT 代币
例如:
RequestResponse rust
https://gateway.elrond.com/network/esdts
```rust
{
"data": {
"tokens": [
"token1",
"token2",
...
],
"error": "",
"code": "successful"
}
* * *
2. 可替代代币
RequestResponse ```rust
https://gateway.elrond.com/network/esdt/fungible-tokens
``` ```rust
{
"data": {
"tokens": [
"token1",
"token2",
...
],
"error": "",
"code": "successful"
}
- 半可替换代币
RequestResponse rust
https://gateway.elrond.com/network/esdt/semi-fungible-tokens
```rust
{
"data": {
"tokens": [
"token1",
"token2",
...
],
"error": "",
"code": "successful"
}
* * *
4. 不可替换的代币
RequestResponse ```rust
https://gateway.elrond.com/network/esdt/non-fungible-tokens
``` ```rust
{
"data": {
"tokens": [
"token1",
"token2",
...
],
"error": "",
"code": "successful"
}
获取 解析可替换代币转移日志
每次成功的 ESDT 传输都会生成日志和事件,可用于解析传输的所有细节(代币标识符、发送数量和接收者)。为了获得由传输生成的日志和事件,应该知道交易的散列。
RequestResponse | 参数 | 需要 | 类型 | 描述 |
| --- | --- | --- | --- |
| txHash | 必需的 | string
| 交易的哈希 |
https://gateway.elrond.com/transaction/*txHash*?withResults=true
``` ```rust
{
"data": {
"transaction": {
...
"logs": {
"address": "...",
"events": [
{
"address": "...",
"identifier": "ESDTTransfer",
"topics": [
"TUVYLTQ1NWM1Nw==", // MEX-455c57
"", // N/A
"CKxyMEiegAAA", // 160000000000000000000
"givNK+JiLZ5VA5/dP11QKoYEn7qoqnD8uPchH3ZMLw4=" // erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
],
"data": null
},
}
}
"error": "",
"code": "successful"
}
标识符为ESDTTransfer
的事件将有以下主题:
- 第一个主题:代币标识符(解码:base64 到字符串)
- 第二个主题:代币 nonce(仅用于 NFTs,此处不适用)
- 第三个主题:要发送的数量(解码:base64 到十六进制字符串+十六进制字符串到大数)
- 第四个主题:代币的接收者(解码:base64 到十六进制字符串+十六进制字符串到 bech32 地址)
在本例中,erd1sg4u62lzvgkeu4grnlwn7h2s92rqf8a64z48pl9c7us37ajv9u8qj9w8xg
收到了160 MEX-455c57
(MEX-455c57 有 18 位小数)
发布 获取 ESDT 代币属性
这涉及到对ESDT
地址的vm query
请求。例如:
RequestResponse ```rust https://gateway.elrond.com/vm-values/query
```rust
{
"scAddress": "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u",
"funcName": "getTokenProperties",
"args": ["474c442d306430303630"]
}
参数必须是十六进制编码的代币标识符。例中,474c442d306430303630
= GLD-0d0060
。 ```rust
{
"data": {
"data": {
"returnData": [
"QWxpY2VUb2tlbnM=",
"RnVuZ2libGVFU0RU",
"2DSJxJNAmou8TU9f4WQo7rpyJ822eZVUQYwnabJM5hk=",
"MTAwMDAwMDAwMDA=",
"MA==",
"TnVtRGVjaW1hbHMtNg==",
"SXNQYXVzZWQtZmFsc2U=",
"Q2FuVXBncmFkZS10cnVl",
"Q2FuTWludC10cnVl",
"Q2FuQnVybi10cnVl",
"Q2FuQ2hhbmdlT3duZXItZmFsc2U=",
"Q2FuUGF1c2UtdHJ1ZQ==",
"Q2FuRnJlZXplLXRydWU=",
"Q2FuV2lwZS10cnVl",
"Q2FuQWRkU3BlY2lhbFJvbGVzLXRydWU=",
"Q2FuVHJhbnNmZXJORlRDcmVhdGVSb2xlLWZhbHNl",
"TkZUQ3JlYXRlU3RvcHBlZC1mYWxzZQ==",
"TnVtV2lwZWQtMA=="
],
"returnCode": "ok",
"returnMessage": "",
"gasRemaining": 18446744073659551615,
"gasRefund": 0,
"outputAccounts": {
"000000000000000000010000000000000000000000000000000000000002ffff": {
"address": "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u",
"nonce": 0,
"balance": null,
"balanceDelta": 0,
"storageUpdates": {},
"code": null,
"codeMetaData": null,
"outputTransfers": [],
"callType": 0
}
},
"deletedAccounts": null,
"touchedAccounts": null,
"logs": []
}
},
"error": "",
"code": "successful"
}
成员将包含一个固定顺序的属性数组(base64 编码)。对于示例响应,含义是:
```rust
"returnData": [
"QWxpY2VUb2tlbnM=", | token name | AliceTokens
"RnVuZ2libGVFU0RU", | token type | FungibleESDT
"2DSJxJNAmou8TU9f4WQo7rpyJ822eZVUQYwnabJM5hk=", | bytes of a bech32 addres | erd1mq6gn3yngzdgh0zdfa07zepga6a8yf7dkeue24zp3snknvjvucvs37hmrq after decoding
"MTAwMDAwMDAwMDA=", | total supply | 10000000000
"MA==", | burnt value | 0
"TnVtRGVjaW1hbHMtNg==", | number of decimals | NumDecimals-6
"SXNQYXVzZWQtZmFsc2U=", | is paused | IsPaused-false
"Q2FuVXBncmFkZS10cnVl", | can upgrade | CanUpgrade-true
"Q2FuTWludC10cnVl", | can mint | CanMint-true
"Q2FuQnVybi10cnVl", | can burn | CanBurn-true
"Q2FuQ2hhbmdlT3duZXItZmFsc2U=", | can change token management address | CanChangeOwner-true
"Q2FuUGF1c2UtdHJ1ZQ==", | can pause | CanPause-true
"Q2FuRnJlZXplLXRydWU=", | can freeze | CanFreeze-true
"Q2FuV2lwZS10cnVl", | can wipe | CanWipe-true
"Q2FuQWRkU3BlY2lhbFJvbGVzLXRydWU=", | can add special roles | CanAddSpecialRoles-true
"Q2FuVHJhbnNmZXJORlRDcmVhdGVSb2xlLWZhbHNl", | can transfer nft create role | CanTransferNFTCreateRole-false
"TkZUQ3JlYXRlU3RvcHBlZC1mYWxzZQ==", | nft creation stopped | NFTCreateStopped-false
"TnVtV2lwZWQtMA==" | number of wiped quantity | NumWiped-0
],
岗位 获得特殊角色兑换代币
这涉及到对ESDT
地址的vm query
请求。它将返回为具有所提供标识符的代币分配了角色的所有地址。例如:
RequestResponse ```rust https://gateway.elrond.com/vm-values/query
```rust
{
"scAddress": "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u",
"funcName": "getSpecialRoles",
"args": ["474c442d306430303630"]
}
参数必须是十六进制编码的代币标识符。例中,474c442d306430303630
= GLD-0d0060
。 rust
{
"data": {
"data": {
"returnData": [
"ZXJkMTM2cmw4NzhqMDltZXYyNGd6cHk3MGsyd2ZtM3htdmo1dWN3eGZmczl2NXQ1c2sza3NodHN6ejI1ejk6RVNEVFJvbGVMb2NhbEJ1cm4=",
"ZXJkMWt6enYydXc5N3E1azltdDQ1OHFrM3E5dTNjd2h3cXlrdnlrNTk4cTJmNnd3eDdndnJkOXM4a3N6eGs6RVNEVFJvbGVORlRBZGRRdWFudGl0eSxFU0RUUm9sZU5GVEJ1cm4="
],
"returnCode": "ok",
........
}
在此示例中,将 2 条消息从 base64 转换为 string 将导致:
erd136rl878j09mev24gzpy70k2wfm3xmvj5ucwxffs9v5t5sk3kshtszz25z9:ESDTRoleLocalBurn
erd1kzzv2uw97q5k9mt458qk3q9u3cwhwqykvyk598q2f6wwx7gvrd9s8kszxk:ESDTRoleNFTAddQuantity,ESDTRoleNFTBurn
*