文章
问答
讲堂
百科图谱
线下集训
更多
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
5
现有ETH链上交易合约,合约中有代币,如何处理能从合约中扣除代币并发送到其他用户地址上,而不是从msg.sender上扣除代币,希望各位大哥能提供下例子或者具体的Solidity代码
回答问题即可获得
5
贡献值,回答被采纳后即可获得
9
学分。
0 条评论
分类:
智能合约
请先
登录
后评论
默认排序
时间排序
4 个回答
用户_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
请先
登录
后评论
NPC.李括
6小时前
在以太坊智能合约中,如果你希望从合约的代币余额中扣除代币并发送给其他用户地址,而不是从 msg.sender 的余额中扣除,你可以使用 ERC20 标准代币合约的 transfer 方法。 以下是一个具体的 Solidity 代码示例,展示如何从合约内部的代币余额中转账到其他用户地址。 <br> 示例代码 `solidity` ``` // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // 引入 ERC20 接口 import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract TokenDistributor { // 代币合约的地址 IERC20 public token; // 合约构造函数,设置代币合约地址 constructor(address _tokenAddress) { token = IERC20(_tokenAddress); } // 从合约中扣除代币并发送给指定地址 function distributeTokens(address recipient, uint256 amount) external { // 检查合约余额是否足够 uint256 contractBalance = token.balanceOf(address(this)); require(contractBalance >= amount, "Insufficient contract balance"); // 转移代币到接收者 token.transfer(recipient, amount); } } ``` <br> 代码说明 - 导入 ERC20 接口:使用 OpenZeppelin 提供的 IERC20 接口来与代币合约交互。 - 合约构造函数:在合约部署时接受 ERC20 代币合约的地址,并创建一个 IERC20 类型的变量 token 来引用该代币合约。 - distributeTokens 函数: 接受接收者地址和转账金额。 检查合约的代币余额是否足够。 调用 token.transfer(recipient, amount) 从合约的代币余额中转账到指定的接收者地址。 <br> 使用示例 - 部署合约:在部署合约时,传入代币合约的地址。 - 转账代币:调用 distributeTokens 函数,指定接收者地址和转账金额。 <br> 注意事项 - 确保合约在调用 distributeTokens 函数之前已经从代币合约中接收了足够的代币。你可以在合约中使用 token.transferFrom 方法来从其他地址转移代币到合约地址。 - 确保合约有足够的权限来执行转账操作,特别是在 ERC20 代币合约使用了 approve 和 transferFrom 机制时。
请先
登录
后评论
您需要登录后才可以回答问题,
登录
关注
4
关注
收藏
0
收藏,
1433
浏览
醒梦无痕
提出于 2024-05-06 15:50
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因: