diff options
author | Chris Ward <chris.ward@ethereum.org> | 2019-01-14 16:45:08 +0800 |
---|---|---|
committer | Chris Ward <chris.ward@ethereum.org> | 2019-01-14 16:45:08 +0800 |
commit | ea47e382ba43fb4e1a7b0ab788989580379545bd (patch) | |
tree | d3b1ec4c709e1da74d9e8be0368bb724c66f9c30 /docs/solidity-by-example.rst | |
parent | 051df31924e7d10351e9a3abd4becd3631e83391 (diff) | |
download | dexon-solidity-ea47e382ba43fb4e1a7b0ab788989580379545bd.tar.gz dexon-solidity-ea47e382ba43fb4e1a7b0ab788989580379545bd.tar.zst dexon-solidity-ea47e382ba43fb4e1a7b0ab788989580379545bd.zip |
Split safe remote example into new file
Diffstat (limited to 'docs/solidity-by-example.rst')
-rw-r--r-- | docs/solidity-by-example.rst | 108 |
1 files changed, 1 insertions, 107 deletions
diff --git a/docs/solidity-by-example.rst b/docs/solidity-by-example.rst index 0e7d507d..e94a9c29 100644 --- a/docs/solidity-by-example.rst +++ b/docs/solidity-by-example.rst @@ -345,113 +345,7 @@ high or low invalid bids. } -.. index:: purchase, remote purchase, escrow - -******************** -Safe Remote Purchase -******************** - -:: - - pragma solidity >=0.4.22 <0.6.0; - - contract Purchase { - uint public value; - address payable public seller; - address payable public buyer; - enum State { Created, Locked, Inactive } - State public state; - - // Ensure that `msg.value` is an even number. - // Division will truncate if it is an odd number. - // Check via multiplication that it wasn't an odd number. - constructor() public payable { - seller = msg.sender; - value = msg.value / 2; - require((2 * value) == msg.value, "Value has to be even."); - } - - modifier condition(bool _condition) { - require(_condition); - _; - } - - modifier onlyBuyer() { - require( - msg.sender == buyer, - "Only buyer can call this." - ); - _; - } - - modifier onlySeller() { - require( - msg.sender == seller, - "Only seller can call this." - ); - _; - } - - modifier inState(State _state) { - require( - state == _state, - "Invalid state." - ); - _; - } - - event Aborted(); - event PurchaseConfirmed(); - event ItemReceived(); - - /// Abort the purchase and reclaim the ether. - /// Can only be called by the seller before - /// the contract is locked. - function abort() - public - onlySeller - inState(State.Created) - { - emit Aborted(); - state = State.Inactive; - seller.transfer(address(this).balance); - } - - /// Confirm the purchase as buyer. - /// Transaction has to include `2 * value` ether. - /// The ether will be locked until confirmReceived - /// is called. - function confirmPurchase() - public - inState(State.Created) - condition(msg.value == (2 * value)) - payable - { - emit PurchaseConfirmed(); - buyer = msg.sender; - state = State.Locked; - } - - /// Confirm that you (the buyer) received the item. - /// This will release the locked ether. - function confirmReceived() - public - onlyBuyer - inState(State.Locked) - { - emit ItemReceived(); - // It is important to change the state first because - // otherwise, the contracts called using `send` below - // can call in again here. - state = State.Inactive; - - // NOTE: This actually allows both the buyer and the seller to - // block the refund - the withdraw pattern should be used. - - buyer.transfer(value); - seller.transfer(address(this).balance); - } - } +.. include:: examples/safe-remote.rst ******************** Micropayment Channel |