![](/img/trans.png)
[英]Created custom ERC20 contract, balanceOf msg.sender is zero
[英]Can a solidity smart contract execute the approve function in an erc20 contract on behalf of the msg.sender
建立银行合同以执行存款和取款。 我想知道银行合约是否有可能代表 msg.sender 为他们想要存入的代币执行 erc20 合约中的 approve function。 下面是我尝试让银行合约调用 erc20 代币合约 approve function。但是,msg.sender 不是银行合约地址而不是原始的 msg.sender(存款令牌的第二行 function。)这听起来很傻但是合同有没有办法发送传入 msg.senders 地址的请求? 如果没有,则 msg.sender 是否有一种集成的方式来批准银行合约地址和金额,以使银行合约能够调用 transferFrom function 并获得津贴。
//best guess on what that would look like inside the function depositTokens
msg.sender = customer;
customer.IER20(usdt).approve.address(this), uint _amount;
address public usdt;
mapping(address => uint) public bankBalance;
constructor() public {
usdt = 0x77c24f0Af71257C0ee26e0E0a108F940D1698d53;
}
usdt = 0x77c24f0Af71257C0ee26e0E0a108F940D1698d53;
function depositTokens(uint _amount) public {
IER20(usdt).approve.address(this), uint _amount;
// Trasnfer usdt tokens to contract
IERC20(usdt).transferFrom(msg.sender, address(this), _amount);
// Update the bank balance in map
bankBalance[msg.sender] = bankBalance[msg.sender] + _amount;
}
//approve function in erc20
function approve(address delegate, uint256 numTokens) public override returns (bool) {
allowed[msg.sender][delegate] = numTokens;
emit Approval(msg.sender, delegate, numTokens);
return true;
答案是否定的,approve function 将msg.sender
作为给津贴的那个。 您可以在此处查看最常用的 OpenZeppelin 实现。
但是我可以看到你正在尝试做什么,我想补充一点,有一种方法可以在发送交易之前自动要求 EOA(外部拥有账户)或拥有钱包的用户批准合同中的一些代币。 我不知道钱包是自动执行还是您必须在 UI 中对其进行编码,但我认为这就是您要找的。
然后在用户已经批准您的银行后,您可以删除deposit
中的第一行 function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.