forked from district0x/name-bazaar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
OfferingRequests.sol
97 lines (82 loc) · 3.59 KB
/
OfferingRequests.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
pragma solidity ^0.4.18;
/**
* @title OfferingRequests
* @dev Contract serves as indicator for demand of not offered ENS names, also stores requesters
* addresses, so they can later by notified e.g by email using District0xEmails.
* This contract doesn't have any critical functionality for names trading, nor does store any funds
*/
import "UsedByFactories.sol";
import "OfferingRequestsAbstract.sol";
import "strings.sol";
contract OfferingRequests is OfferingRequestsAbstract, UsedByFactories {
using strings for *;
struct Requests {
string name; // ENS name in plaintext
uint latestRound; // Increments every time new offering is created
mapping(uint => address[]) requesters; // Addresses of requesters mapped by round number
mapping(uint => mapping(address => bool)) hasRequested; // determines if address has already requested given name
}
mapping(bytes32 => Requests) public requests;
event onRequestAdded(bytes32 node, uint round, address requester, uint requestersCount);
event onRoundChanged(bytes32 node, uint latestRound);
/**
* @dev Adds new request for a ENS name to be offered
* @param name string Plaintext ENS name
*/
function addRequest(string name) {
require(bytes(name).length > 0);
var node = namehash(name);
if (bytes(requests[node].name).length == 0) {
onRoundChanged(node, 0);
}
requests[node].name = name;
var i = requests[node].latestRound;
if (!requests[node].hasRequested[i][msg.sender]) {
requests[node].hasRequested[i][msg.sender] = true;
requests[node].requesters[i].push(msg.sender);
onRequestAdded(node, i, msg.sender, requests[node].requesters[i].length);
}
}
/**
* @dev Clears offering requests. Increases latestRound counter, so requests are cleared
* This happens when offering is finally created for requested name
* @param node bytes32 ENS node
*/
function clearRequests(bytes32 node)
onlyFactory
{
if (bytes(requests[node].name).length > 0) {
requests[node].latestRound += 1;
onRoundChanged(node, requests[node].latestRound);
}
}
/**
* @dev Namehash function used by ENS to convert plain text name into node hash
* @param name string Plaintext ENS name
* @return bytes32 ENS node hash, aka node
*/
function namehash(string name) internal returns(bytes32) {
var nameSlice = name.toSlice();
if (nameSlice.len() == 0) {
return bytes32(0);
}
var label = nameSlice.split(".".toSlice()).toString();
return sha3(namehash(nameSlice.toString()), sha3(label));
}
function getRequest(bytes32 node) constant public returns(string, uint, uint) {
var request = requests[node];
var latestRound = request.latestRound;
return (request.name, request.requesters[latestRound].length, latestRound);
}
function getRequesters(bytes32 node, uint round) constant public returns(address[]) {
return requests[node].requesters[round];
}
function hasRequested(bytes32 node, address[] addresses) constant public returns(bool[] _hasRequested) {
_hasRequested = new bool[](addresses.length);
var latestRound = requests[node].latestRound;
for(uint i = 0; i < addresses.length; i++) {
_hasRequested[i] = requests[node].hasRequested[latestRound][addresses[i]];
}
return _hasRequested;
}
}