Skip to content

TEP: 89 - 可发现的 Jettons 钱包

  • TEP: 89
  • 标题: 可发现的 Jettons 钱包
  • 状态: 活跃
  • 类型: 合约接口
  • 作者: sasha1618, EmelyanenkoK
  • 创建日期: 2022年9月8日
  • 取代: -
  • 被取代: -

摘要

本提案建议通过添加强制性的链上 provide_wallet_address 处理程序来扩展标准 Jetton 主合约。

动机

一些应用程序可能希望能够发现其或其他合约的钱包地址,以处理特定 Jetton 主合约。例如,某些合约可能希望获取并存储其 Jetton 钱包地址,以便以特定方式处理来自该地址的转账通知。

指南

在收到包含查询地址的 provide_wallet_address 消息后,Jetton 主合约应回复包含地址的消息。

规范

新的 Jetton 主合约

可发现的 jetton 铸币机代码示例可以在这里找到。

Jetton 主合约应处理消息

provide_wallet_address#2c76b973 query_id:uint64 owner_address:MsgAddress include_address:Bool = InternalMsgBody;

附带的 TON 数量应高于 5000 gas-units + msg_forward_prices.lump_price + msg_forward_prices.cell_price = 0.0061 TON(当前基础链设置下,如果金额不足则无法发送响应)。

如果传入的值不足以计算钱包地址,则抛出异常,否则 响应消息(以模式 64 发送)

take_wallet_address#d1735400 query_id:uint64 wallet_address:MsgAddress owner_address:(Maybe ^MsgAddress) = InternalMsgBody;

注意:如果无法为查询地址生成钱包地址(例如错误的工作链),则 take_wallet_address 中的 wallet_address 应等于 addr_none。如果 include_address 设置为 Truetake_wallet_address 应包含与请求中的 owner_address 相同的 owner_address(换句话说,响应包含所有者地址和关联的 jetton 钱包地址)。

已存在的 Jetton 主合约

具有不可升级 Jetton 主合约的 Jettons 可以生成一个单独的智能合约(Jetton 发现),实现此功能。在这种情况下,合约对(Jetton 主合约 + Jetton 发现)将与新的 Jetton 主合约行为一致。对于具有可更新元数据的不可升级 Jetton 主合约,建议添加 "wallet-discovery" 键,值等于 Jetton 发现合约地址的文本表示。

方案:

provide_wallet_address#2c76b973 query_id:uint64 owner_address:MsgAddress include_address:Bool = InternalMsgBody;
take_wallet_address#d1735400 query_id:uint64 wallet_address:MsgAddress owner_address:(Maybe ^MsgAddress) = InternalMsgBody;
crc32('provide_wallet_address query_id:uint64 owner_address:MsgAddress include_address:Bool = InternalMsgBody') = 2c76b973
crc32('take_wallet_address query_id:uint64 wallet_address:MsgAddress owner_address:Maybe ^MsgAddress = InternalMsgBody') = d1735400

缺点

如果新应用程序开始严重依赖这些提案而不支持单独的 Jetton 主合约/Jetton 发现,它们可能无法处理已存在的 Jettons。

理由和替代方案

目前预期去中心化应用程序将与特定钱包而不是 Jetton 主合约一起工作。然而,有时这会使逻辑更加复杂(特别是如果希望创建可预测的合约地址)或对用户端检查不那么直接。

先前的工作

未解决的问题

无法区分消耗高于预期费用的 Jetton 发现与非 Jetton 发现合约。

未来的可能性