-
Notifications
You must be signed in to change notification settings - Fork 0
/
BlockLockAggregator.sol
113 lines (94 loc) · 3.5 KB
/
BlockLockAggregator.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
pragma solidity ^0.5.6;
import "./Blocklock.sol";
//----------------------Il contratto non deve essere mai chiuso, Non implementare la closecontract---------------------
contract BlocklockAggregator {
address creator; //potrebbe non servire
uint256 globalCounter; //tiene traccia del numero di blocklock create. Necessario perchè non tiene in considerazione i reset
Blocklock blockL; //istanza di blocklock
/**
* Info sulla porta
* isActive ci dice se la porta è ancora attiva o meno
* userList è la lista di utenti di una certa porta
**/
struct doorInfo{
bool isActive;
address doorAddress;
}
/**
* utenti relativi ad una porta
* primo parametro è la porta, il seconondo è l'array di utenti
**/
//mapping(address => address[]) doorsUser;
//Posso prenderlo già da blocklock
/**
* Porte relative ad un singolo utente
* primo parametro è l'address dell'utente, il seconondo è l'array di porte (identificate da struct)
**/
mapping(address => doorInfo[]) userToDoors;
event blockLockAdded(uint256 block, address blocklockAddress, address creator);
constructor() public{
creator = msg.sender;
}
/**
* Aggiunge una nuova Blocklock
**/
function addBlocklock(address _blocklockAddress, address _usr) public{
//doorsUser[_blocklockAddress].push(_usr); //Aggiunge il creator come utente della porta
userToDoors[_usr].push(doorInfo(true, _blocklockAddress));
globalCounter += 1;
emit blockLockAdded(block.number, _blocklockAddress, _usr);
}
/**
* aggiunge l'utente alla porta
**/
function addUser(address _blocklockAddress, address _usr) public{
//doorsUser[_blocklockAddress].push(_usr);
userToDoors[_usr].push(doorInfo(true, _blocklockAddress));
}
/**
* Elimina l'utente associato alla porta
**/
function deleteUser(address _blocklockAddress, address _usr) public{
for(uint i = 0; i < userToDoors[_usr].length; i++){
if(userToDoors[_usr][i].doorAddress == _blocklockAddress){
delete userToDoors[_usr][i];
break;
}
}
}
/**
* esegue il reset di blocklock settando a inattiva la porta precedente
* deploya un nuovo contratto
**/
function resetBlocklock(address _blocklockAddress, address _usr, bytes32 lockId) public{
for(uint i = 0; i < userToDoors[_usr].length; i++){
if(userToDoors[_usr][i].doorAddress == _blocklockAddress){
userToDoors[_usr][i].isActive = false; //setta la vecchia porta come inattiva
break;
}
}
Blocklock bl = new Blocklock(bytesToString(lockId), address(this)); //deploya un nuovo contratto
//doorsUser[_usr].push(address(bl));
userToDoors[_usr].push(doorInfo(true, address(bl))); //aggiungo la nuova porta alla lista
}
/**
* restituisce il counter di blocklock
**/
function getCounter() public view returns(uint256){
return globalCounter;
}
/**
* Converte i bytes32 in stringhe
**/
function bytesToString (bytes32 _bytes32) private pure returns (string memory){
string memory result;
assembly {
let val := mload(0x40)
mstore(val, 0x20)
mstore(add(val, 0x20), _bytes32)
mstore(0x40, add(val, 0x40))
result := val
}
return result;
}
}