Solidity

將所有 msg.sender.balance 轉移到合約,無需使用者輸入 msg.value?

  • April 22, 2022

有沒有辦法將所有 user.balance 提取到合約或外部支付地址,而不需要使用者輸入 msg.value?

我在solidity 0.5.0上看到的最直覺的版本有點像這樣:

address(this).transfer(msg.sender.balance)

但是,似乎契約地址本質上是不可支付的,所以我嘗試首先將其轉換為可支付地址:

address payable payableContract = address(uint160(address(this)))

但它似乎也不起作用。有人建議我研究可能解決問題的契約工廠。為了達到相同的結果,繞過它的最佳方法是什麼?

你需要扭轉事物的流動,否則這將永遠沒有意義。

無法編寫合約以從使用者錢包中轉移資金。不是全部,不是一些,不是任何一個。

address(this).transfer(msg.sender.balance)

這意味著目的地 ( to) 是address(this)並且金額是msg.sender的餘額。from: address隱含 address(this)的,因為沒有別的可能。因此,from在語法中未提及。

你真正想要發生的事情是讓使用者簽署一筆交易,將他們的錢發送到你的合約中。我不知道為什麼它必須是他們的全部平衡,這對我來說聽起來像是另一個設計失誤,但這是你將如何做到的。

這是一個前端問題。再次強調,因為只有使用者可以授權轉移自己的資金。在合約方面,你所能做的就是接收它,驗證交易,如果出現問題,可能會拒絕它。

function depositFunds() public payable {
 // carry on
 // msg.value and msg.sender inform about who and how much
}

在前端,您可以使用 Web3 或類似的庫來幫助使用者使用amount: as much as possible, to: your contract, {gas: amount, gasPrice: bid}.

使用者必須支付 gas,這將減少可用於發送到您的合約的資金量。你必須考慮到這一點。您的前端必須弄清楚:

  • 交易的gas估算
  • gasPrice(消耗的乙太幣成本 = gas 估算 * gasPrice)
  • 可發送的資金(使用者餘額 - 消耗的成本),使使用者的餘額正好為 0。

如果瀏覽器(或伺服器)執行計算,那麼使用者將被提供一個選項來簽署發送 x 數量的交易,並為 gas 出價 y,gas 估計值為 z,最終餘額為0.

我不清楚為什麼有人會同意這樣的條款。

希望能幫助到你。

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