-
Notifications
You must be signed in to change notification settings - Fork 0
/
Diadem.sol
116 lines (86 loc) · 3.06 KB
/
Diadem.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
pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;
import "./Messages.sol";
import "./Ethereum.sol";
import "./Bitcoin.sol";
contract Diadem {
Messages messages;
Ethereum ethereum;
Bitcoin bitcoin;
struct Achievement {
address owner;
string title;
string link;
bool exists;
}
mapping (bytes32 => Achievement) achievements;
mapping (address => bytes32[]) chains;
constructor(
address messagesContract,
address ethereumContract,
address bitcoinContract
) public {
messages = Messages(messagesContract);
ethereum = Ethereum(ethereumContract);
bitcoin = Bitcoin(bitcoinContract);
}
function getHash(address owner, string memory link)
public view returns (bytes32)
{
return messages.getMessageHash(address(this), owner, link);
}
function getAchievementsChain(address owner)
public view returns(bytes32[] memory)
{
return chains[owner];
}
function getAchievementByHash(bytes32 messageHash)
public view returns(Achievement memory)
{
return achievements[messageHash];
}
function getAchievement(address owner, string memory link)
public view returns(Achievement memory)
{
bytes32 messageHash = getHash(owner, link);
return getAchievementByHash(messageHash);
}
function updateTitle(string memory link, string memory newTitle)
public
{
address owner = msg.sender;
bytes32 messageHash = getHash(owner, link);
Achievement storage achievement = achievements[messageHash];
require(achievement.owner == owner);
require(keccak256(abi.encode(achievement.title)) != keccak256(abi.encode(newTitle)));
achievement.title = newTitle;
emit UpdateTitle(link, newTitle);
}
function create(string memory link, string memory title)
public
{
address owner = msg.sender;
bytes32 messageHash = messages.saveMessage(owner, link);
bytes32 previousMessageHash = bytes32(0);
uint256 achievementsChainLength = chains[owner].length;
if (achievementsChainLength > 0) {
previousMessageHash = chains[owner][achievementsChainLength - 1];
}
Achievement memory achievement = Achievement(owner, title, link, true);
achievements[messageHash] = achievement;
chains[owner].push(messageHash);
emit Create(messageHash, previousMessageHash);
}
function confirm(address owner, string memory link, address witness, bytes memory signature)
public
{
bytes32 messageHash = getHash(owner, link);
require(achievements[messageHash].exists == true);
ethereum.saveSignature(messageHash, signature);
bitcoin.saveSignature(messageHash, signature);
emit Confirm(owner, link, witness);
}
event Create(bytes32 messageHash, bytes32 previousMessageHash);
event UpdateTitle(string link, string newTitle);
event Confirm(address owner, string link, address witness);
}