Skip to content

Commit f0226c7

Browse files
quasisamuraiantmat
authored andcommitted
feat: market crud (#1565)
* administratum: advanced master-worker relations * feat: change onwable => administratable * orders crud * master-worker crud * deals crud * change requests crud * massive market reworking * feat: migrate func added * crud for administratum * fix: cr status bug * fix: counterpartry bid matching * fix: migrate order * rating fields
1 parent c40eaa1 commit f0226c7

12 files changed

+1258
-616
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
pragma solidity ^0.4.23;
2+
3+
import "zeppelin-solidity/contracts/ownership/Ownable.sol";
4+
import "./AdministratumCrud.sol";
5+
6+
contract Administratum is Ownable {
7+
8+
// events
9+
event WorkerAnnounced(address indexed worker, address indexed master);
10+
event WorkerConfirmed(address indexed worker, address indexed master, address indexed confirmator);
11+
event WorkerRemoved(address indexed worker, address indexed master);
12+
event AdminAdded(address indexed admin, address indexed master);
13+
14+
// storage
15+
16+
mapping(address => mapping(address => bool)) masterRequest;
17+
18+
AdministratumCrud crud;
19+
20+
21+
//constructor
22+
constructor(address _administratumCrud){
23+
owner = msg.sender;
24+
crud = AdministratumCrud(_administratumCrud);
25+
}
26+
27+
//funcs
28+
29+
function RegisterWorker(address _master) public returns (bool) {
30+
require(crud.GetMaster(msg.sender) == msg.sender);
31+
require(!crud.isMaster(msg.sender));
32+
require(crud.GetMaster(_master) == _master);
33+
masterRequest[_master][msg.sender] = true;
34+
emit WorkerAnnounced(msg.sender, _master);
35+
return true;
36+
}
37+
38+
function ConfirmWorker(address _worker) public returns (bool) {
39+
require(masterRequest[msg.sender][_worker] == true || IsValid(_worker));
40+
crud.SetMaster(_worker, msg.sender);
41+
crud.SwitchToMaster(msg.sender);
42+
delete masterRequest[msg.sender][_worker];
43+
emit WorkerConfirmed(_worker, crud.GetMaster(_worker), msg.sender);
44+
return true;
45+
}
46+
47+
function RemoveWorker(address _worker, address _master) public returns (bool) {
48+
require(crud.GetMaster(_worker) == _master && (msg.sender == _worker || msg.sender == _master));
49+
crud.DeleteMaster(_worker);
50+
emit WorkerRemoved(_worker, _master);
51+
return true;
52+
}
53+
54+
function RegisterAdmin(address _admin) public returns (bool){
55+
require(GetMaster(msg.sender) == msg.sender);
56+
require(msg.sender != _admin);
57+
crud.SetAdmin(_admin, msg.sender);
58+
return true;
59+
}
60+
61+
function Migrate (address _newAdministratum) public onlyOwner {
62+
crud.transferOwnership(_newAdministratum);
63+
suicide(msg.sender);
64+
}
65+
66+
67+
//INTERNAL
68+
// check if transaction sended by valid admin
69+
function IsValid(address _worker) internal view returns(bool){
70+
address master = crud.GetAdminMaster(msg.sender);
71+
return master != address(0) && masterRequest[master][_worker] == true;
72+
}
73+
74+
75+
//GETTERS
76+
77+
function GetMaster(address _worker) public view returns (address master) {
78+
return crud.GetMaster(_worker);
79+
}
80+
81+
82+
83+
84+
//modifiers
85+
86+
87+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
pragma solidity ^0.4.23;
2+
3+
import "./Administratable.sol";
4+
5+
contract AdministratumCrud is Administratable {
6+
7+
// events
8+
event WorkerAnnounced(address indexed worker, address indexed master);
9+
event WorkerConfirmed(address indexed worker, address indexed master);
10+
event WorkerRemoved(address indexed worker, address indexed master);
11+
event AdminAdded(address indexed admin, address indexed master);
12+
13+
// storage
14+
mapping(address => address) masterOf;
15+
16+
mapping(address => bool) flagIsMaster;
17+
18+
mapping(address => mapping(address => bool)) masterRequest;
19+
20+
//maps admin into its master; alternative method
21+
//that's like asym cryptography, but implemented by design
22+
mapping(address => address) admins;
23+
24+
//constructor
25+
constructor(){
26+
owner = msg.sender;
27+
administrator = msg.sender;
28+
}
29+
30+
function SetMaster(address _worker, address _master) public onlyOwner {
31+
masterOf[_worker] = _master;
32+
}
33+
34+
function SetAdmin(address _admin, address _master) public onlyOwner {
35+
admins[_admin] = _master;
36+
}
37+
38+
function DeleteMaster(address _worker) public onlyOwner {
39+
delete masterOf[_worker];
40+
}
41+
42+
function SwitchToMaster(address _target) public onlyOwner {
43+
flagIsMaster[_target] = true;
44+
}
45+
46+
function GetMaster(address _worker) public view returns (address) {
47+
if (masterOf[_worker] == address(0) || flagIsMaster[_worker] == true){
48+
return _worker;
49+
}
50+
return masterOf[_worker];
51+
}
52+
53+
function GetAdminMaster(address _admin) public view returns (address) {
54+
return admins[_admin];
55+
}
56+
57+
function isMaster(address _address) public view returns (bool) {
58+
return flagIsMaster[_address];
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
pragma solidity ^0.4.23;
2+
3+
import "./Administratable.sol";
4+
import "zeppelin-solidity/contracts/math/SafeMath.sol";
5+
import "./Orders.sol";
6+
7+
8+
contract ChangeRequests is Administratable {
9+
using SafeMath for uint256;
10+
11+
mapping(uint => ChangeRequest) requests;
12+
13+
mapping(uint => uint[2]) actualRequests;
14+
15+
uint requestsAmount;
16+
17+
struct ChangeRequest {
18+
uint dealID;
19+
Orders.OrderType requestType;
20+
uint price;
21+
uint duration;
22+
RequestStatus status;
23+
}
24+
25+
enum RequestStatus {
26+
REQUEST_UNKNOWN,
27+
REQUEST_CREATED,
28+
REQUEST_CANCELED,
29+
REQUEST_REJECTED,
30+
REQUEST_ACCEPTED
31+
}
32+
33+
34+
constructor() public {
35+
owner = msg.sender;
36+
administrator = msg.sender;
37+
}
38+
39+
function Write(
40+
uint _dealID,
41+
Orders.OrderType _requestType,
42+
uint _price,
43+
uint _duration,
44+
RequestStatus _status) public onlyOwner returns(uint){
45+
46+
requestsAmount = requestsAmount.add(1);
47+
48+
requests[requestsAmount] = ChangeRequest(_dealID, _requestType, _price, _duration, _status);
49+
50+
return requestsAmount;
51+
}
52+
53+
//SETTERS
54+
55+
function SetChangeRequestDealID(uint _changeRequestID, uint _dealID) public onlyOwner {
56+
requests[_changeRequestID].dealID = _dealID;
57+
}
58+
59+
function SetChangeRequestType(uint _changeRequestID, Orders.OrderType _type) public onlyOwner {
60+
requests[_changeRequestID].requestType = _type;
61+
}
62+
63+
function SetChangeRequestPrice(uint _changeRequestID, uint _price) public onlyOwner {
64+
requests[_changeRequestID].price = _price;
65+
}
66+
67+
function SetChangeRequestDuration(uint _changeRequestID, uint _duration) public onlyOwner {
68+
requests[_changeRequestID].duration = _duration;
69+
}
70+
71+
function SetChangeRequestStatus(uint _changeRequestID, RequestStatus _status) public onlyOwner {
72+
requests[_changeRequestID].status = _status;
73+
}
74+
75+
function SetActualChangeRequest(uint dealID, uint role, uint _changeRequestID) public onlyOwner {
76+
actualRequests[dealID][role] = _changeRequestID;
77+
}
78+
79+
// GETTERS
80+
81+
function GetChangeRequestDealID(uint _changeRequestID) public view returns(uint) {
82+
return requests[_changeRequestID].dealID;
83+
}
84+
85+
function GetChangeRequestType(uint _changeRequestID) public view returns(Orders.OrderType) {
86+
return requests[_changeRequestID].requestType;
87+
}
88+
89+
function GetChangeRequestPrice(uint _changeRequestID) public view returns(uint) {
90+
return requests[_changeRequestID].price;
91+
}
92+
93+
function GetChangeRequestDuration(uint _changeRequestID) public view returns(uint) {
94+
return requests[_changeRequestID].duration;
95+
}
96+
97+
function GetChangeRequestStatus(uint _changeRequestID) public view returns(RequestStatus) {
98+
return requests[_changeRequestID].status;
99+
}
100+
101+
function GetActualChangeRequest(uint dealID, uint role)public view returns(uint) {
102+
return actualRequests[dealID][role];
103+
104+
}
105+
106+
function GetChangeRequestsAmount() public view returns(uint) {
107+
return requestsAmount;
108+
}
109+
110+
function GetChangeRequestInfo(uint changeRequestID) public view
111+
returns (
112+
uint dealID,
113+
Orders.OrderType requestType,
114+
uint price,
115+
uint duration,
116+
RequestStatus status
117+
) {
118+
return (
119+
requests[changeRequestID].dealID,
120+
requests[changeRequestID].requestType,
121+
requests[changeRequestID].price,
122+
requests[changeRequestID].duration,
123+
requests[changeRequestID].status
124+
);
125+
}
126+
127+
128+
}

0 commit comments

Comments
 (0)