Ethereum 如何在智能合同中接收和发送USDT?

Ethereum 如何在智能合同中接收和发送USDT?,ethereum,solidity,Ethereum,Solidity,是否有任何指南或代码可以作为实施智能合约接收和发送USDT到其他地址的功能的示例 感谢您的帮助代币余额存储在代币合同中(在本例中为USDT),而不是存储在您的代币合同中。因此,发送令牌是一个简单的过程——您只需在令牌契约上执行正确的函数。请注意,您的合同至少需要保留其将要发送的金额,否则交易将恢复 pragma solidity ^0.8; interface IERC20 { function transfer(address _to, uint256 _value) externa

是否有任何指南或代码可以作为实施智能合约接收和发送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);
    }
}

但是,由于余额存储在外部契约中,您不能仅仅通过执行契约中的函数让用户向您发送令牌。请参阅my,它显示了一个示例,说明了如果可能的话,这可能会被误用(只需将
approve
替换为
transfer
,但逻辑是相同的)

某些令牌标准(如或)允许在合同接收令牌时向合同发送钩子。钩子函数名称和所需参数在链接文档中。但代币合约是否会给你一个钩子,这取决于

  • 代币合同的实施(特别是USDT未实施)
  • 您的契约(您必须为您想要接收的所有令牌标准实现钩子函数,或者至少实现一个通用的
    fallback()
    ,在某些情况下可以工作)
  • 有时也在寄件人身上
您可以要求用户批准您的地址使用某些USDT,然后您的合同可以执行USDT合同的
transferFrom()
功能(其中“from”是批准您使用其代币的用户)。然而,正如链接的另一个答案所表明的那样,批准需要在合同之外进行


您还可以使用一个链外应用程序来侦听令牌合同发出的事件日志(在您的情况下,USDT合同上的
Transfer()
event)。事件日志包含传输信息,包括接收方和金额。因此,您的(链外)应用程序只能过滤您的地址为接收者的事件,并在处理事件日志时执行一些操作。

hi Petr,感谢您的帮助。试图执行代码时,我遇到了一个错误,它是这样的:“ParserError:只有状态变量或文件级变量才能有docstring。”这个关于变量“usdt”的错误哦,我使用多行注释块在默认情况下不检查docblocks的IDE中拆分注释以提高可读性(Remix)。如果删除注释,错误将消失。您好,Petr,但是如果我对错误行进行注释,问题将通过,但我可以以什么方式发送资金?我的意思是删除以
/**
开头、以
*/
结尾的多行注释,或者像我刚才在问题中所做的那样,用单行注释替换它。