將所有 msg.sender.balance 轉移到合約,無需使用者輸入 msg.value?
有沒有辦法將所有 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
.我不清楚為什麼有人會同意這樣的條款。
希望能幫助到你。