Openzeppelin

@openzeppelin/contracts:為什麼我不能使用 Gnosis Safe 作為眾籌錢包?

  • July 28, 2021

我有一個眾籌契約,它從 openzepplin 繼承了以下契約:

contract MyCrowdsale is Crowdsale, TimedCrowdsale, AllowanceCrowdsale, PostDeliveryCrowdsale, IncreasingPriceCrowdsale {
    constructor(
       uint256 openingTime,
       uint256 closingTime,
       uint256 initialRate,
       uint256 finalRate,
       address tokenWallet,
       address payable wallet,
       IERC20 token
   )
   public
   Crowdsale(initialRate, wallet, token)
   TimedCrowdsale(openingTime, closingTime)
   IncreasingPriceCrowdsale(initialRate, finalRate)
   AllowanceCrowdsale(tokenWallet)
   PostDeliveryCrowdsale()
   {

   }
} 

當我將它部署wallet為 Metamask 錢包時,一切正常。這wallet是從 ICO 收集的 ETH 應該去的地方。

 await MyCrowdsale.deploy(
    openingTime,
    closingTime,
    initialRate,
    finalRate,
    tokenWallet,  //tokenWallet - address holding MyToken to sell (granted allowance)
    myMetamaskVault, //wallet - where to send ETH from crowdsale. This parameter cannot be a Gnosis Safe???
    tokenProxyAdd
);

當我將眾籌部署myMetamaskVault為保險庫時(批准眾籌從 tokenWallet 中支出),一切正常。

但是,如果我只是簡單地將發送 ETH 的保險庫替換為 Gnosis 多重簽名保險箱,我將無法再呼籲buyTokens()眾籌。它返回Out of gas,如我的 Tenderly 堆棧跟踪中所示:

在此處輸入圖像描述在此處輸入圖像描述

我知道 Gnosis 錢包不能用於簽署交易,但批准()是需要簽署的。為什麼我的眾籌不能簡單地將收到的 ETH 轉移到 Gnosis?

openzepplin Crowdsale 是否有特定限制阻止使用多重簽名保險箱作為保險庫?

我想我可以手動執行此操作,在資金流入時從 Metamask 轉移到 Gnosis,但這顯然並不理想。

您可以通過呼叫 buyTokens() 通過 Etherscan 對 Rinkeby 進行測試:

wallet使用元遮罩地址: https : //rinkeby.etherscan.io/address/0x24aBb9Ce02B0349a8170b653400757dE5cFB4E02#writeContract

相同的契約,不適用於 Gnosis 安全wallethttps ://rinkeby.etherscan.io/address/0xAA3F9E7DA337276A9fa5839Fb0FebA31F760469e#writeContract

眾籌在將 ETH 轉移到目標錢包時使用了少量 gas,顯然不足以在 Gnosis Safe 中處理接收。

您可以覆蓋_forwardFunds要使用的函式.call.transfer但您需要確保檢查返回值.call並在它為 false 時恢復。

function _forwardFunds() internal {
   (bool success,) = wallet().call.value(msg.value)('');
   require(success, 'Failed to forward funds');
}

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