ethereum - 如何在智能合约中接收和发送 USDT?
问题描述
是否有任何指南或代码可以作为示例来实现智能合约接收 USDT 并将其发送到其他地址的功能。
我感谢您的帮助
解决方案
代币余额存储在代币合约(在本例中为 USDT)中,而不是您的。所以发送代币是一个简单的过程——你只需在代币合约上执行正确的功能。请注意,您的合约至少需要保留即将发送的金额,否则交易将恢复。
pragma solidity ^0.8;
interface IERC20 {
function transfer(address _to, uint256 _value) external returns (bool);
// don't need to define other functions, only using `transfer()` in this case
}
contract MyContract {
// Do not use in production
// This function can be executed by anyone
function sendUSDT(address _to, uint256 _amount) external {
// This is the mainnet USDT contract address
// Using on other networks (rinkeby, local, ...) would fail
// - there's no contract on this address on other networks
IERC20 usdt = IERC20(address(0xdAC17F958D2ee523a2206206994597C13D831ec7));
// transfers USDT that belong to your contract to the specified address
usdt.transfer(_to, _amount);
}
}
但是因为余额存储在外部合约中,你不能仅仅通过执行合约中的函数来让用户向你发送代币。请参阅我的另一个答案,该答案显示了一个示例,如果可能的话,如何滥用它(只需替换approve
为transfer
,但逻辑是相同的)。
一些代币标准(例如ERC-1155或ERC-721)允许在您的合约收到代币时向您的合约发送挂钩。挂钩函数名称和所需参数在链接文档中。但是代币合约是否给你发送了一个钩子,这取决于
- 代币合约的实施(特别是 USDT 没有实施)
- 您的合同(您必须为您想要接收的所有令牌标准实现挂钩功能 - 或者至少是
fallback()
在某些情况下可以使用的通用) - 有时也在发件人身上。
您可以要求您的用户批准您的地址使用一些 USDT,然后您的合约可以执行transferFrom()
USDT 合约的功能(其中“from”是批准您使用其代币的用户)。但是,正如链接的其他答案所暗示的那样,批准需要在您的合同之外完成。
您还可以拥有一个链下应用程序来侦听令牌合约发出的事件日志(在您的情况Transfer()
下是 USDT 合约上的事件)。事件日志包含转账信息,包括接收方和金额。因此,您的(链下)应用程序只能过滤您的地址是接收者的事件,并在处理事件日志时执行一些操作。
推荐阅读
- java - nohup 不向文件写入任何内容
- c++ - C++ 的 For 循环中的位补函数有什么作用?
- c - 什么 scanf("%d", array + i); 做
- scala - json4s,如何使用 FullTypeHints 反序列化 json 而无需明确设置 TypeHints
- bash - 在 linux shell 脚本中提取字符串
- javascript - 隐藏嵌套数据
- wpf - Xaml Toolkit DialogHost 中的 C# WPF MaterialDesign。对话框后面的背景窗口没有变暗
- parallel-processing - 在并行区域中使用 fortran 保存属性
- html - 使用 Chrome 开发工具(或其他)打印/突出显示/导出所有选中的复选框
- javascript - 点击画布上的 Javascript 10 行告诉您点击了哪一行