Solidity

使 msg.sender 在solidity嵌套合約中保持不變

  • October 17, 2021

我有三個不同的契約。一個是簡單合約(ContractA),第二個是我的代幣合約,第三個是ERC20代幣合約,它繼承在我的代幣合約中。因此,當我從前端(reactjs)向我的 ContractA 發出請求時,它會將該請求發送到我的代幣合約,該合約將請求發送到 ERC20 代幣合約,以便將代幣轉移到一個地址。

我面臨的問題是,在呼叫函式時,使用者的地址被更改為呼叫另一個合約的合約。我怎樣才能使契約在整個執行過程中保持不變。這意味著合約的地址應該是從前端發起請求的使用者。

注意:我無法更改我的代幣合約中的實現,因為它已經部署。

我的契約.sol

function sellTokens(address _from) public {
       require(myToken.balanceOf(_from) >= 1);
       myToken.transfer(_deployerAddress, 1);
}

這是我的 sellTokens 函式,它將一個代幣轉移給代幣的所有者。這是從myContract文件呼叫的。

傳輸函式在 OpenZeppllin 的 ERC20 令牌實現中實現。現在,當我呼叫傳輸函式時,它會將 msg.sender 作為合約,即 myContract。作為回報,由於 myContract 不持有任何代幣,因此金額超過餘額的錯誤。myToken是繼承了 ERC20 代幣的代幣。

我不完全確定我理解你的問題,你可以改變什麼,不能改變什麼,snaToken 和 myToken 有什麼區別。您正在檢查 snaToken 的餘額,然後發送 myToken - 那裡到底發生了什麼?

但是不管怎樣,你知道津貼機制嗎?(函式 .approve 和 .transferFrom)您可以使用它來執行此操作:

  1. 使用者將為 MyContract 呼叫批准。含義 - 您的前端將要求使用者為您要轉移的令牌簽署“批准”交易。因此,例如,如果您希望使用者發送他的 myToken,首先他需要呼叫並簽名:myToken.approve(myContract, transferAmount)。這允許 myContract 合約將 transferAmount 代幣從 msg.sender 發送給 myContract 選擇的任何人。
  2. 然後使用者會呼叫 MyContract sellTokens,但是現在 sellTokens 不會呼叫 .transfer,而是會呼叫 transferFrom: myToken.transferForm(msg.sender, destinationAddress, transferAmount)。這會將使用者的 myTokens 轉移到destinationAddress。

希望這會有所幫助,但正如我所說,我不確定 myToken 和 snaToken 之間的關係是什麼,以及為什麼要檢查一個餘額並發送另一個。

引用自:https://ethereum.stackexchange.com/questions/111707