文章
问答
讲堂
百科图谱
线下集训
更多
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
5
现有ETH链上交易合约,合约中有代币,如何处理能从合约中扣除代币并发送到其他用户地址上,而不是从msg.sender上扣除代币,希望各位大哥能提供下例子或者具体的Solidity代码
回答问题即可获得
5
贡献值,回答被采纳后即可获得
10
学分。
0 条评论
分类:
智能合约
请先
登录
后评论
默认排序
时间排序
3 个回答
用户_19991
2024-05-06 16:01
library TransferHelper { function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb,to,value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } } function extractUSDT(address _user, uint256 _amount) external { TransferHelper.safeTransfer(USDT, _user, _amount); } safeTransfer 直接转账就可以了
请先
登录
后评论
Wade
- Footprint Analytics CTO
2024-05-06 16:27
擅长:数据分析,GameFi,NFT
```js // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { function transferFrom(address from, address to, uint256 amount) external returns (bool); } contract TokenContract { IERC20 public token; // 假设合约中有一个ERC20代币 function sendTokenToAddress(address _to, uint256 _amount) external { // 调用transferFrom函数,从合约中扣除代币并发送到指定地址 token.transferFrom(address(this), _to, _amount); } } ```
请先
登录
后评论
SpikeDu
2024-05-07 21:53
你好,标准ERC-20合约只能通过2个函数转移Token--transfer( ) 和 transferFrom( )。 ```solidity function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; _balances[to] += amount; } emit Transfer(from, to, amount); } ``` ```solidity function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; }//本质上还是通过_transfer转移Token,_spendAllowance和_blance映射和_allowances映射相关 ``` transfer( )函数不需要approve( )验证,但需要_balances[from]发送者在_balances这个映射中, 但是一开始合约自己是不会被存储这个_balances映射中的,能改变_balances这个映射的只有_transfer( )、_mint( )、_burn( )这三个函数。 所以要合约自己能够转移Token的前提是合约地址要被加入到_balances映射中,得看你的代币合约在改变_balances的三个函数中是否对自己的地址有限制。 如有任何错误,请指正。 ERC-20:https://academy.binance.com/zh/articles/an-introduction-to-erc-20-tokens
请先
登录
后评论
您需要登录后才可以回答问题,
登录
关注
3
关注
收藏
0
收藏,
1087
浏览
醒梦无痕
提出于 2024-05-06 15:50
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因: