@openzeppelin/contracts:為什麼我不能使用 Gnosis Safe 作為眾籌錢包?
我有一個眾籌契約,它從 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 安全
wallet
: https ://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'); }