0xb305…42f1

All memos sent from and to 0xb305…42f1.

contract PseudonymPairs { uint entropy; function getRandomNumber() internal returns (uint){ entropy = uint(keccak256(abi.encodePacked(now, msg.sender, blockhash(block.number - 1), entropy))); return entropy; } uint maxValue = 2**256-1; uint schedule; uint period = 28 days; uint hour; struct Reg { bool rank; uint id; bool[] signatures; bool verified; } struct Token { mapping(address => uint) balanceOf; mapping (address => mapping (address => uint)) allowed; } struct Data { mapping(address => Reg) registry; address[] shuffler; mapping(uint => bool) disputed; Token[3] tokens; uint personhoodNonce; mapping(address => uint) proofOfPersonhood; } mapping(uint => Data) data; function pseudonymEvent() public view returns (uint) { return schedule + period + hour * 3600; } modifier scheduler() { if(block.timestamp > pseudonymEvent()) { schedule += period; hour = getRandomNumber()%24; } _; } function isReg(address _account) public view returns (bool) { return data[schedule].registry[_account].signatures.length != 0; } function register() public scheduler { require(isReg(msg.sender) == false && data[schedule].tokens[1].balanceOf[msg.sender] >= 1); data[schedule].tokens[1].balanceOf[msg.sender]--; uint id; if(data[schedule].shuffler.length != 0) { id += getRandomNumber() % data[schedule].shuffler.length; data[period].registry[data[period].shuffler[id]].id = data[period].shuffler.length; data[schedule].shuffler.push(data[schedule].shuffler[id]); } else data[schedule].shuffler.push(); data[schedule].shuffler[id] = msg.sender; data[schedule].registry[msg.sender] = Reg(true, id, new bool[](1), false); data[schedule+period].tokens[0].balanceOf[msg.sender]++; } function immigrate() public scheduler { require(isReg(msg.sender) == false && data[schedule].tokens[0].balanceOf[msg.sender] >= 1); data[schedule].tokens[0].balanceOf[msg.sender]--; data[schedule].registry[msg.sender] = Reg(false, getRandomNumber(), new bool[](2), false); data[schedule].tokens[0].balanceOf[data[schedule-period].shuffler[getRandomNumber()%data[schedule-period].shuffler.length]]++; } function transferRegistrationKey(address _to) public scheduler { require(isReg(msg.sender) == true && isReg(_to) == false); if(data[schedule].registry[msg.sender].rank == true) data[schedule].shuffler[data[schedule].registry[msg.sender].id] = _to; data[schedule].registry[_to] = data[schedule].registry[msg.sender]; delete data[schedule].registry[msg.sender]; } function pairVerified(uint _pair) internal view returns (bool) { address peer1 = data[schedule-period].shuffler[_pair]; address peer2 = data[schedule-period].shuffler[_pair + 1]; return (data[schedule-period].registry[peer1].signatures[0] == true && data[schedule-period].registry[peer2].signatures[0] == true); } function dispute() public scheduler { require(data[schedule-period].registry[msg.sender].rank == true); uint pair = data[schedule-period].registry[msg.sender].id/2; require(pairVerified(pair) == false); data[schedule-period].disputed[pair] = true; } function getPair(address _account) internal view returns (uint) { if(data[schedule-period].registry[_account].rank == true) return data[schedule-period].registry[_account].id/2; return data[schedule-period].registry[msg.sender].id%(data[schedule-period].shuffler.length/2); } function reassign() public scheduler { require(data[schedule-period].disputed[getPair(msg.sender)] == true); delete data[schedule-period].registry[msg.sender]; data[schedule-period].registry[msg.sender] = Reg(false, getRandomNumber(), new bool[](2), false); } function verifyPersonhood(address _account) public scheduler returns (uint) { require(data[schedule].proofOfPersonhood[_account] != 0); return data[schedule].proofOfPersonhood[_account]; } function lockProofOfPersonhood() public scheduler { require(data[schedule].tokens[2].balanceOf[msg.sender] >= 1); require(data[schedule].proofOfPersonhood[msg.sender] == 0); data[schedule].tokens[2].balanceOf[msg.sender]--; data[schedule].personhoodNonce++; data[schedule].proofOfPersonhood[msg.sender] = data[schedule].personhoodNonce; } function transferPersonhoodKey(address _account) public scheduler { require(data[schedule].proofOfPersonhood[msg.sender] == 0 && _account != msg.sender); data[schedule].proofOfPersonhood[_account] = data[schedule].proofOfPersonhood[msg.sender]; delete data[schedule].proofOfPersonhood[msg.sender]; } function collectPersonhood() public scheduler { require(data[schedule-period].registry[msg.sender].verified = false); require(pairVerified(getPair(msg.sender)) == true); if(data[schedule-period].registry[msg.sender].rank == false) require(data[schedule-period].registry[msg.sender].signatures[0] == true && data[schedule-period].registry[msg.sender].signatures[1] == true); data[schedule].tokens[1].balanceOf[msg.sender]++; data[schedule].tokens[2].balanceOf[msg.sender]++; data[schedule-period].registry[msg.sender].verified = true; } function verify(address _account, address _signer) internal { require(_account != _signer && data[schedule-period].registry[_signer].rank == true); uint pair = getPair(_account); require(data[schedule-period].disputed[pair] == false && pair == getPair(_signer)); if(data[schedule-period].registry[_account].rank == true) data[schedule-period].registry[_account].signatures[0] = true; else data[schedule-period].registry[_account].signatures[data[schedule-period].registry[_signer].id%2] = true; } function verifyAccount(address _account) public scheduler { verify(_account, msg.sender); } function uploadSignature(address _account, bytes memory _signature) public scheduler { bytes32 r; bytes32 s; uint8 v; assembly { r := mload(add(_signature,0x20)) s := mload(add(_signature,0x40)) v := and(mload(add(_signature, 0x41)), 0xFF) } if (v < 27) v += 27; bytes32 msgHash = keccak256(abi.encodePacked(_account, schedule)); verify(_account, ecrecover(msgHash, v, r, s)); } function transfer(address _from, address _to, uint _value, uint _token) internal { require(data[schedule].tokens[_token].balanceOf[_from] >= _value); data[schedule].tokens[_token].balanceOf[_from] -= _value; data[schedule].tokens[_token].balanceOf[_to] += _value; } function delegate(address _spender, uint _value, uint _token) internal { data[schedule].tokens[_token].allowed[msg.sender][_spender] = _value; } function collect(address _from, address _to, uint _value, uint _token) internal { require(data[schedule].tokens[_token].allowed[_from][msg.sender] >= _value); transfer(_from, _to, _value, _token); data[schedule].tokens[_token].allowed[_from][msg.sender] -= _value; } function transferImmigrationToken(address _to, uint _value) public scheduler { transfer(msg.sender, _to, _value, 0); } function transferRegistrationToken(address _to, uint _value) public scheduler { transfer(msg.sender, _to, _value, 1); } function transferVerifiedToken(address _to, uint _value) public scheduler { transfer(msg.sender, _to, _value, 2); } function delegateImmigrationToken(address _spender, uint _value) public scheduler { delegate(_spender, _value, 0); } function delegateRegistrationToken(address _spender, uint _value) public scheduler { delegate(_spender, _value, 1); } function delegateVerifiedToken(address _spender, uint _value) public scheduler { delegate(_spender, _value, 2); } function collectImmigrationToken(address _from, address _to, uint _value) public scheduler { collect(_from, _to, _value, 0); } function collectRegistrationToken(address _from, address _to, uint _value) public scheduler { collect(_from, _to, _value, 1); } function collectVerifiedToken(address _from, address _to, uint _value) public scheduler { collect(_from, _to, _value, 2); } function initiateNetwork() public { require(block.timestamp > pseudonymEvent()); schedule = 198000 + ((block.timestamp - 198000)/ 7 days) * 7 days - 21 days; require(data[schedule-period].shuffler.length < 2); hour = getRandomNumber()%24; data[schedule].tokens[1].balanceOf[msg.sender] = maxValue; } }
<pre>uint genesisEvent = 1580540400; uint[] clockwork; uint hour; struct Reg { bool rank; uint id; } mapping(address =&gt; Reg) accountID; uint[][2] index; uint[][2] courtUtility; function incrementCourtUtility() internal { courtUtility[0].push(index[true].length/2 + index[false].length); courtUtility[1].push(courtUtility[0].length); } bool[3][][] pairData; function eventScheduler() { if(clockwork.length == 0) clockwork.length = 24; uint randomHour = getRandomNumber() % clockwork.length; if(clockwork[randomHour] == 0) hour = randomHour; else hour = clockwork[randomHour]; if(clockwork[clockwork.length - 1] == 0) clockwork[randomHour] = clockwork.length - 1; else clockwork[randomHour] = clockwork[clockwork.length - 1]; clockwork.length--; } function assignID(bool _rank) internal { index[_rank].length++; accountID[msg.sender].rank = _rank; accountID[msg.sender].id = index[_rank].length; } function shuffle(bool _rank) internal returns (uint id) { if(index[_rank].length != 0) id = getRandomNumber() % index[_rank].length; assignID(_rank); index[_rank][index[_rank].length - 1] = index[_rank][id]; return id; } function register() { index[true][shuffle(true)] = index[true].length; if(index[true].length%2 == 0) { incrementCourtUtility(); pairData.length++; pairData[pairData.length - 1].length = 2; } } function assignCourt(bool _reassign) internal { uint height = index[true].length/2 - index[false].length % index[true].length/2; uint id = getRandomNumber() % height; if(_reassign == false) { index[false][shuffle(false)] = courtUtility[id]; } else { assignID(false); index[false][index[false].length - 1] = courtUtility[id]; } delete courtUtility[1][courtUtility[0][id]]; courtUtility[id] = courtUtility[height-1]; courtUtility[1][courtUtility[height-1]] = id; courtUtility[height-1] = courtUtility[courtUtility.length - 1]; courtUtility[1][courtUtility[courtUtility.length - 1]] = height-1; courtUtility.length--; incrementCourtUtility(); } function immigrate() { assignCourt(false); } function reassign() { assignCourt(true); } function getIndex(address _account) internal returns (uint) { return index[accountID[_account].rank][accountID[_account].id - 1]; } function getPair(address _account) internal returns (uint) { if(accountID[_account].rank == true) return (1 + getIndex(_account))/2; return getIndex(_account) % index[true].length/2; } function verification(uint _pairID, address _account, address _signer) internal { uint signerID = (1+getIndex(_signer))%2; uint id; if(accountID[_account].rank == true) { id = (1 + getIndex(_account))%2; } else { id = 2 + getIndex(_account) / pairData.length; if(pairData[_pairID].length &lt; id + 1) pairData[_pairID].length = id; } pairData[_pairID][id][signerID] = true; } function verify(address _account) { uint pairID = getPair(_account); require(pairData[pairID].length != 0); if(pairID == getPair(msg.sender) &amp;&amp; accountID[msg.sender].rank == true) verification(pairID, _account, msg.sender); } function uploadSignature(address _account, bytes _signature) { uint pairID = getPair(_account); require(pairData[pairID].length != 0); bytes32 sig1; bytes32 sig2; assembly { sig1 := mload(add(_signature,0x20)) sig2 := mload(add(_signature,0x40)) } bytes32 msgHash = keccak256(_account, eventCounter - 1); address v1 = ecrecover(msgHash, 27, r, s); if(pairID == getPair(v1) &amp;&amp; accountID[v1].rank == true) verification(pairID, _account, v1); else { address v2 = ecrecover(msgHash, 28, r, s); if(pairID == getPair(v2) &amp;&amp; accountID[v2]. rank == true) verification(pairID, _account, v2); } }</pre>
<p>uint[] clockwork;</p><p>uint hour;</p><p>&nbsp;</p><p>struct Reg{</p><p>bool rank;</p><p>uint id;</p><p>}</p><p>mapping(address=&gt; Reg) accountID;</p><p>&nbsp;</p><p>uint[][2] index;</p><p>uint[][2] courtUtility;</p><p>&nbsp;</p><p>function incrementCourtUtility() internal{</p><p>courtUtility[0].push(index[true].length/2 + index[false].length);</p><p>courtUtility[1].push(courtUtility[0].length);</p><p>}</p><p>&nbsp;</p><p>bool[3][][] pairData;</p><p>&nbsp;</p><p>function eventScheduler(){</p><p>if(clockwork.length==0) clockwork.length=24;</p><p>uint randomHour=getRandomNumber() % clockwork.length;</p><p>if(clockwork[randomHour]==0) hour=randomHour;</p><p>else hour=clockwork[randomHour];</p><p>if(clockwork[clockwork.length - 1]==0) clockwork[randomHour]=clockwork.length - 1;</p><p>else clockwork[randomHour]&nbsp;=clockwork[clockwork.length - 1];</p><p>clockwork.length--;</p><p>}</p><p>&nbsp;</p><p>function assignID(bool _rank) internal{</p><p>index[_rank].length++;</p><p>accountID[msg.sender].rank=_rank;</p><p>accountID[msg.sender].id=index[_rank].length;</p><p>}</p><p>function shuffle(bool _rank) internal returns (uint id){</p><p>if(index[_rank].length !=0) id=getRandomNumber() % index[_rank].length;</p><p>assignID(_rank);</p><p>index[_rank][index[_rank].length - 1]=index[_rank][id];</p><p>return id;</p><p>}</p><p>function register(){</p><p>index[true][shuffle(true)]=index[true].length;</p><p>if(index[true].length%2==0){</p><p>incrementCourtUtility();</p><p>pairData.length++;</p><p>pairData[pairData.length - 1].length=2;</p><p>}</p><p>}</p><p>function assignCourt(bool _reassign) internal{</p><p>uint height=index[true].length/2 - index[false].length % index[true].length/2;</p><p>uint id=getRandomNumber() % height;</p><p>if(_reassign==false){</p><p>index[false][shuffle(false)]=courtUtility[id];</p><p>}</p><p>else{</p><p>assignID(false);</p><p>index[false][index[false].length - 1]=courtUtility[id];</p><p>}</p><p>delete courtUtility[1][courtUtility[0][id]];</p><p>courtUtility[id]=courtUtility[height-1];</p><p>courtUtility[1][courtUtility[height-1]]=id;</p><p>courtUtility[height-1]=courtUtility[courtUtility.length - 1];</p><p>courtUtility[1][courtUtility[courtUtility.length - 1]]=height-1;</p><p>courtUtility.length--;</p><p>incrementCourtUtility();</p><p>}</p><p>function immigrate(){assignCourt(false);}</p><p>function reassign(){assignCourt(true);}</p><p>&nbsp;</p><p>&nbsp;</p><p>function getIndex(address _account) internal returns (uint){</p><p>return index[accountID[_account].rank][accountID[_account].id - 1];</p><p>}</p><p>function getPair(address _account) internal returns (uint){</p><p>if(accountID[_account].rank==true) return (1 + getIndex(_account))/2;</p><p>return getIndex(_account) % index[true].length/2;</p><p>}</p><p>&nbsp;</p><p>function sign(address _account, bytes _signature){</p><p>&nbsp;</p><p>uint pairID=getPair(_account);</p><p>require(pairData[pairID].length !=0);</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; address signer;</p><p>&nbsp;</p><p>if(_signature !=0){</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bytes32 sig1;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bytes32 sig2;</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assembly{</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sig1 :=mload(add(_signature,0x20))</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sig2 :=mload(add(_signature,0x40))</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bytes32 msgHash=keccak256(_account);</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address v1=ecrecover(msgHash, 27, r, s);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(pairID==getPair(v1) &amp;&amp; accountID[v1].rank==true) signer=v1;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else{</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; address v2=ecrecover(msgHash, 28, r, s);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(pairID==getPair(v2) &amp;&amp; accountID[v2]. rank==true) signer=v2;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; else if(pairID==getPair(msg.sender) &amp;&amp;&nbsp; accountID[msg.sender].rank==true) signer=msg.sender;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</p><p>uint signerID=(1+getIndex(signer))%2;</p><p>&nbsp;</p><p>uint id;</p><p>&nbsp;</p><p>if(accountID[_account].rank==true){</p><p>id=(1 + getIndex(_account))%2;</p><p>}</p><p>else{</p><p>id=2 + getIndex(_account) / pairData.length;</p><p>if(pairData[pairID].length &lt; id + 1) pairData[pairID].length=id;</p><p>}</p><p>pairData[pairID][id][signerID]=true;</p><p>}</p>