aboutsummaryrefslogtreecommitdiffstats
path: root/docs/solidity-by-example.rst
diff options
context:
space:
mode:
authorChris Ward <chris.ward@ethereum.org>2019-01-14 16:45:08 +0800
committerChris Ward <chris.ward@ethereum.org>2019-01-14 16:45:08 +0800
commitea47e382ba43fb4e1a7b0ab788989580379545bd (patch)
treed3b1ec4c709e1da74d9e8be0368bb724c66f9c30 /docs/solidity-by-example.rst
parent051df31924e7d10351e9a3abd4becd3631e83391 (diff)
downloaddexon-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.rst108
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