-
Notifications
You must be signed in to change notification settings - Fork 0
/
DiceMarket.sol
64 lines (56 loc) · 2.58 KB
/
DiceMarket.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
pragma solidity ^0.5.0;
import "./Dice.sol";
contract DiceMarket {
// DiceMarket contract define variable that is Dice object named diceContract
Dice diceContract;
uint256 public commissionFee;
// address that deploy DiceMarket / the seller is set as "actual" _owner of the dice in this contract
address _owner = msg.sender;
// map dice id to price
mapping(uint256 => uint256) listPrice;
// DiceMarket initialise with Dice object as 1st arg
// constructor function called during deploy
constructor(Dice diceAddress, uint256 fee) public {
// DiceMarket contract variable Dice object (diceContract) is the 1st arg Dice object (diceAddress) passed into constructor function
diceContract = diceAddress;
commissionFee = fee;
}
// list a dice for sale, price needs to be >= value + fee
function list(uint256 id, uint256 price) public {
require(msg.sender == diceContract.getPrevOwner(id));
listPrice[id] = price;
}
function unlist(uint256 id) public {
require(msg.sender == diceContract.getPrevOwner(id));
listPrice[id] = 0;
}
// get price of dice
function checkPrice(uint256 id) public view returns (uint256) {
return listPrice[id];
}
// buyer call this function, buyer is msg.sender
// buy the dice at the requested price
function buy(uint256 id) public payable {
require(listPrice[id] != 0); // is listed
// buyer input value needs to be higher than price + fee
require(msg.value >= (listPrice[id] + commissionFee)); // offered price meets minimum ask
// normal address is not payable
// must define payable address
// the dice owner / seller is the recipient, used as payable address
address payable recipient = address(uint160(diceContract.getPrevOwner(id)));
// solidity standard method <address>.transfer to transfer amount from the caller to the <address> of the recipient
recipient.transfer(msg.value - commissionFee); // transfer (price-commissionFee) to real owner
// Dice object custom function to transfer dice to buyer
diceContract.transfer(id, msg.sender);
}
function getContractOwner() public view returns(address) {
return _owner;
}
// seller of the dice call this function
function withdraw() public {
// if caller is seller of the dice
if (msg.sender == _owner)
// solidity standard method, caller to receive balalnce amount from this DiceMarket address
msg.sender.transfer(address(this).balance);
}
}