57 lines
1.8 KiB
Plaintext
57 lines
1.8 KiB
Plaintext
/* Example from Solidity by Example
|
|
http://solidity.readthedocs.io/en/develop/common-patterns.html
|
|
|
|
contract WithdrawalContract {
|
|
address public richest
|
|
uint public mostSent
|
|
|
|
mapping (address => uint) pendingWithdrawals
|
|
|
|
function WithdrawalContract() payable {
|
|
richest = msg.sender
|
|
mostSent = msg.value
|
|
}
|
|
|
|
function becomeRichest() payable returns (bool) {
|
|
if (msg.value > mostSent) {
|
|
pendingWithdrawals[richest] += msg.value
|
|
richest = msg.sender
|
|
mostSent = msg.value
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function withdraw() {
|
|
uint amount = pendingWithdrawals[msg.sender]
|
|
// Remember to zero the pending refund before
|
|
// sending to prevent re-entrancy attacks
|
|
pendingWithdrawals[msg.sender] = 0
|
|
msg.sender.transfer(amount)
|
|
}
|
|
}
|
|
|
|
*/
|
|
|
|
contract WithdrawalContract =
|
|
|
|
record state = { richest : address,
|
|
mostSent : uint,
|
|
pendingWithdrawals : map(address, uint) }
|
|
|
|
function becomeRichest() : result(bool) =
|
|
if (call().value > state.mostSent)
|
|
let totalAmount : uint = Map.get_(state.richest, pendingWithdrawals) + call().value
|
|
{state = state{ pendingWithdrawals = Map.insert(state.richest, call().value, state.pendingWithdrawals),
|
|
richest = call().sender,
|
|
mostSent = call().value },
|
|
result = true}
|
|
else
|
|
{result = false}
|
|
|
|
function withdraw() =
|
|
let amount : uint = Map.get_(call().sender, state.pendingWithdrawals)
|
|
{ state.pendingWithdrawals = Map.insert(call().sender, 0, state.pendingWithdrawals),
|
|
transactions = spend_tx(amount, call().sender) }
|