-
Notifications
You must be signed in to change notification settings - Fork 1
/
VeriFoodDemo.sol
175 lines (149 loc) · 5.28 KB
/
VeriFoodDemo.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
pragma solidity ^0.4.20;
contract WorkbenchBase {
event WorkbenchContractCreated(string applicationName, string workflowName, address originatingAddress);
event WorkbenchContractUpdated(string applicationName, string workflowName, string action, address originatingAddress);
string internal ApplicationName;
string internal WorkflowName;
function WorkbenchBase(string applicationName, string workflowName) internal {
ApplicationName = applicationName;
WorkflowName = workflowName;
}
function ContractCreated() internal {
WorkbenchContractCreated(ApplicationName, WorkflowName, msg.sender);
}
function ContractUpdated(string action) internal {
WorkbenchContractUpdated(ApplicationName, WorkflowName, action, msg.sender);
}
}
contract VeriFoodDemo is WorkbenchBase('VeriFoodDemo', 'VeriFoodDemo') {
//Set of States
enum StateType { Created, InTransit, Completed, OutOfCompliance}
enum SensorType { None, Humidity, Temperature }
//List of properties
StateType public State;
address public Owner;
address public InitiatingCounterparty;
address public Counterparty;
address public PreviousCounterparty;
address public Device;
address public SupplyChainOwner;
address public SupplyChainObserver;
int public MinHumidity;
int public MaxHumidity;
int public MinTemperature;
int public MaxTemperature;
SensorType public ComplianceSensorType;
int public ComplianceSensorReading;
bool public ComplianceStatus;
string public ComplianceDetail;
int public LastSensorUpdateTimestamp;
int public farmLatitude;
int public farmLongitude;
function VeriFoodDemo(int latitude, int longitude, address device, address supplyChainOwner, address supplyChainObserver, int minHumidity, int maxHumidity, int minTemperature, int maxTemperature) public
{
farmLatitude = latitude;
farmLongitude = longitude;
ComplianceStatus = true;
ComplianceSensorReading = -1;
InitiatingCounterparty = msg.sender;
Owner = InitiatingCounterparty;
Counterparty = InitiatingCounterparty;
Device = device;
SupplyChainOwner = supplyChainOwner;
SupplyChainObserver = supplyChainObserver;
MinHumidity = minHumidity;
MaxHumidity = maxHumidity;
MinTemperature = minTemperature;
MaxTemperature = maxTemperature;
State = StateType.Created;
ComplianceDetail = 'N/A';
ContractCreated();
}
function IngestTelemetry(int humidity, int temperature, int timestamp) public
{
// Separately check for states and sender
// to avoid not checking for state when the sender is the device
// because of the logical OR
if ( State == StateType.Completed )
{
revert();
}
if ( State == StateType.OutOfCompliance )
{
revert();
}
if (Device != msg.sender)
{
revert();
}
LastSensorUpdateTimestamp = timestamp;
if (humidity > MaxHumidity || humidity < MinHumidity)
{
ComplianceSensorType = SensorType.Humidity;
ComplianceSensorReading = humidity;
ComplianceDetail = 'Humidity value out of range.';
ComplianceStatus = false;
}
else if (temperature > MaxTemperature || temperature < MinTemperature)
{
ComplianceSensorType = SensorType.Temperature;
ComplianceSensorReading = temperature;
ComplianceDetail = 'Temperature value out of range.';
ComplianceStatus = false;
}
if (ComplianceStatus == false)
{
State = StateType.OutOfCompliance;
}
ContractUpdated('IngestTelemetry');
}
function TransferResponsibility(address newCounterparty, int latitude, int longitude) public
{
// keep the state checking, message sender, and device checks separate
// to not get cloberred by the order of evaluation for logical OR
if ( State == StateType.Completed )
{
revert();
}
if ( State == StateType.OutOfCompliance )
{
revert();
}
if ( InitiatingCounterparty != msg.sender && Counterparty != msg.sender )
{
revert();
}
if ( newCounterparty == Device )
{
revert();
}
if (State == StateType.Created)
{
State = StateType.InTransit;
}
PreviousCounterparty = Counterparty;
Counterparty = newCounterparty;
ContractUpdated('TransferResponsibility');
}
function Complete() public
{
// keep the state checking, message sender, and device checks separate
// to not get cloberred by the order of evaluation for logical OR
if ( State == StateType.Completed )
{
revert();
}
if ( State == StateType.OutOfCompliance )
{
revert();
}
if (Owner != msg.sender && SupplyChainOwner != msg.sender)
{
revert();
}
State = StateType.Completed;
PreviousCounterparty = Counterparty;
Counterparty = 0x0;
ContractUpdated('Complete');
}
}