Appearance
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
设置为 True
,take_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 发现合约。