Skip to content

Commit

Permalink
allow multiple providers to be set on creation
Browse files Browse the repository at this point in the history
return data from forwarded calls in meta transaction provider

upgrade to solidity 0.5.0

upgrade to truffle 5.0.0-beta.2

keep tests up to date
  • Loading branch information
Noah Zinsmeister committed Nov 26, 2018
1 parent bcca21f commit c460bcd
Show file tree
Hide file tree
Showing 23 changed files with 325 additions and 192 deletions.
4 changes: 2 additions & 2 deletions contracts/AddressSet/AddressSet.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

/// @title An implementation of the set data structure for addresses.
/// @author Noah Zinsmeister
Expand Down Expand Up @@ -29,7 +29,7 @@ library AddressSet {
self.memberIndices[self.members[self.memberIndices[other] - 1]] = self.memberIndices[other];
delete self.memberIndices[other];
// remove the last element
self.members.length--;
self.members.pop();
}
}

Expand Down
4 changes: 2 additions & 2 deletions contracts/AddressSet/AddressSetTest.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

import "./AddressSet.sol";

Expand All @@ -23,7 +23,7 @@ contract AddressSetTest {
return mySet.length();
}

function members() public view returns (address[]) {
function members() public view returns (address[] memory) {
return mySet.members;
}

Expand Down
62 changes: 36 additions & 26 deletions contracts/IdentityRegistry.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

import "./SignatureVerifier.sol";
import "./AddressSet/AddressSet.sol";
Expand Down Expand Up @@ -164,7 +164,10 @@ contract IdentityRegistry is SignatureVerifier {
/// @param ein The EIN to get information for.
/// @return All the information for the Identity denominated by the passed EIN.
function getIdentity(uint ein) public view _identityExists(ein)
returns (address recoveryAddress, address[] associatedAddresses, address[] providers, address[] resolvers)
returns (
address recoveryAddress,
address[] memory associatedAddresses, address[] memory providers, address[] memory resolvers
)
{
Identity storage _identity = identityDirectory[ein];

Expand All @@ -182,26 +185,28 @@ contract IdentityRegistry is SignatureVerifier {
/// @notice Create an new Identity for the transaction sender.
/// @dev Sets the msg.sender as the only Associated Address.
/// @param recoveryAddress A recovery address to set for the new Identity.
/// @param provider A provider to set for the new Identity.
/// @param providers A list of providers to set for the new Identity.
/// @param resolvers A list of resolvers to set for the new Identity.
/// @return The EIN of the new Identity.
function createIdentity(address recoveryAddress, address provider, address[] resolvers) public returns (uint ein)
function createIdentity(address recoveryAddress, address[] memory providers, address[] memory resolvers)
public returns (uint ein)
{
return createIdentity(recoveryAddress, msg.sender, provider, resolvers, false);
return createIdentity(recoveryAddress, msg.sender, providers, resolvers, false);
}

/// @notice Allows a Provider to create an new Identity for the passed associatedAddress.
/// @dev Sets the msg.sender as the only provider.
/// @param recoveryAddress A recovery address to set for the new Identity.
/// @param associatedAddress An associated address to set for the new Identity (must have produced the signature).
/// @param providers A list of providers to set for the new Identity.
/// @param resolvers A list of resolvers to set for the new Identity.
/// @param v The v component of the signature.
/// @param r The r component of the signature.
/// @param s The s component of the signature.
/// @param timestamp The timestamp of the signature.
/// @return The EIN of the new Identity.
function createIdentityDelegated(
address recoveryAddress, address associatedAddress, address[] resolvers,
address recoveryAddress, address associatedAddress, address[] memory providers, address[] memory resolvers,
uint8 v, bytes32 r, bytes32 s, uint timestamp
)
public ensureSignatureTimeValid(timestamp) returns (uint ein)
Expand All @@ -221,12 +226,13 @@ contract IdentityRegistry is SignatureVerifier {
"Permission denied."
);

return createIdentity(recoveryAddress, associatedAddress, msg.sender, resolvers, true);
return createIdentity(recoveryAddress, associatedAddress, providers, resolvers, true);
}

/// @dev Common logic for all identity creation.
function createIdentity(
address recoveryAddress, address associatedAddress, address provider, address[] resolvers, bool delegated
address recoveryAddress,
address associatedAddress, address[] memory providers, address[] memory resolvers, bool delegated
)
private _hasIdentity(associatedAddress, false) returns (uint)
{
Expand All @@ -236,12 +242,14 @@ contract IdentityRegistry is SignatureVerifier {
_identity.recoveryAddress = recoveryAddress;
_identity.associatedAddresses.insert(associatedAddress);
associatedAddressDirectory[associatedAddress] = ein;
_identity.providers.insert(provider);
for (uint i; i < resolvers.length; i++) {
_identity.resolvers.insert(resolvers[i]);
for (uint i; i < providers.length; i++) {
_identity.providers.insert(providers[i]);
}
for (uint j; j < resolvers.length; j++) {
_identity.resolvers.insert(resolvers[j]);
}

emit IdentityCreated(msg.sender, ein, recoveryAddress, associatedAddress, provider, resolvers, delegated);
emit IdentityCreated(msg.sender, ein, recoveryAddress, associatedAddress, providers, resolvers, delegated);

return ein;
}
Expand All @@ -255,7 +263,8 @@ contract IdentityRegistry is SignatureVerifier {
/// @param s The s component of the signatures.
/// @param timestamp The timestamp of the signatures.
function addAssociatedAddressDelegated(
address approvingAddress, address addressToAdd, uint8[2] v, bytes32[2] r, bytes32[2] s, uint[2] timestamp
address approvingAddress, address addressToAdd,
uint8[2] memory v, bytes32[2] memory r, bytes32[2] memory s, uint[2] memory timestamp
)
public _hasIdentity(addressToAdd, false)
ensureSignatureTimeValid(timestamp[0]) ensureSignatureTimeValid(timestamp[1])
Expand Down Expand Up @@ -338,19 +347,19 @@ contract IdentityRegistry is SignatureVerifier {

/// @notice Allows an associated address to add providers to its Identity.
/// @param providers A list of providers.
function addProviders(address[] providers) public {
function addProviders(address[] memory providers) public {
addProviders(getEIN(msg.sender), providers, false);
}

/// @notice Allows providers to add providers to an Identity.
/// @param ein The EIN to add providers to.
/// @param providers A list of providers.
function addProvidersFor(uint ein, address[] providers) public _isProviderFor(ein) {
function addProvidersFor(uint ein, address[] memory providers) public _isProviderFor(ein) {
addProviders(ein, providers, true);
}

/// @dev Common logic for all provider adding.
function addProviders(uint ein, address[] providers, bool delegated) private {
function addProviders(uint ein, address[] memory providers, bool delegated) private {
Identity storage _identity = identityDirectory[ein];
for (uint i; i < providers.length; i++) {
_identity.providers.insert(providers[i]);
Expand All @@ -360,19 +369,19 @@ contract IdentityRegistry is SignatureVerifier {

/// @notice Allows an associated address to remove providers from its Identity.
/// @param providers A list of providers.
function removeProviders(address[] providers) public {
function removeProviders(address[] memory providers) public {
removeProviders(getEIN(msg.sender), providers, false);
}

/// @notice Allows providers to remove providers to an Identity.
/// @param ein The EIN to remove providers from.
/// @param providers A list of providers.
function removeProvidersFor(uint ein, address[] providers) public _isProviderFor(ein) {
function removeProvidersFor(uint ein, address[] memory providers) public _isProviderFor(ein) {
removeProviders(ein, providers, true);
}

/// @dev Common logic for all provider removal.
function removeProviders(uint ein, address[] providers, bool delegated) private {
function removeProviders(uint ein, address[] memory providers, bool delegated) private {
Identity storage _identity = identityDirectory[ein];
for (uint i; i < providers.length; i++) {
_identity.providers.remove(providers[i]);
Expand All @@ -383,7 +392,7 @@ contract IdentityRegistry is SignatureVerifier {
/// @notice Allows providers to add resolvers to an Identity.
/// @param ein The EIN to add resolvers to.
/// @param resolvers A list of providers.
function addResolversFor(uint ein, address[] resolvers) public _isProviderFor(ein) {
function addResolversFor(uint ein, address[] memory resolvers) public _isProviderFor(ein) {
Identity storage _identity = identityDirectory[ein];
for (uint i; i < resolvers.length; i++) {
_identity.resolvers.insert(resolvers[i]);
Expand All @@ -394,7 +403,7 @@ contract IdentityRegistry is SignatureVerifier {
/// @notice Allows providers to remove resolvers from an Identity.
/// @param ein The EIN to remove resolvers from.
/// @param resolvers A list of providers.
function removeResolversFor(uint ein, address[] resolvers) public _isProviderFor(ein) {
function removeResolversFor(uint ein, address[] memory resolvers) public _isProviderFor(ein) {
Identity storage _identity = identityDirectory[ein];
for (uint i; i < resolvers.length; i++) {
_identity.resolvers.remove(resolvers[i]);
Expand Down Expand Up @@ -483,17 +492,18 @@ contract IdentityRegistry is SignatureVerifier {
/// @param firstChunk The array of addresses before the msg.sender in the pre-recovery associated addresses array.
/// @param lastChunk The array of addresses after the msg.sender in the pre-recovery associated addresses array.
/// @param resetResolvers true if the poisonser wants resolvers to be removed, false otherwise.
function triggerPoisonPill(uint ein, address[] firstChunk, address[] lastChunk, bool resetResolvers)
function triggerPoisonPill(uint ein, address[] memory firstChunk, address[] memory lastChunk, bool resetResolvers)
public _identityExists(ein)
{
require(!canRecover(ein), "Recovery has not recently been triggered.");
Identity storage _identity = identityDirectory[ein];

// ensure that the msg.sender was an old associated address for the referenced identity
address[1] memory middleChunk = [msg.sender];
address payable[1] memory middleChunk = [msg.sender];
require(
keccak256(abi.encodePacked(firstChunk, middleChunk, lastChunk)) ==
recoveryLogs[ein].hashedOldAssociatedAddresses,
keccak256(
abi.encodePacked(firstChunk, middleChunk, lastChunk)
) == recoveryLogs[ein].hashedOldAssociatedAddresses,
"Cannot activate the poison pill from an address that was not recently removed via recovery."
);

Expand All @@ -518,7 +528,7 @@ contract IdentityRegistry is SignatureVerifier {

event IdentityCreated(
address indexed initiator, uint indexed ein,
address recoveryAddress, address associatedAddress, address provider, address[] resolvers, bool delegated
address recoveryAddress, address associatedAddress, address[] providers, address[] resolvers, bool delegated
);
event AssociatedAddressAdded(
address indexed initiator, uint indexed ein, address approvingAddress, address addedAddress
Expand Down
2 changes: 1 addition & 1 deletion contracts/Migrations.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

contract Migrations {
address public owner;
Expand Down
2 changes: 1 addition & 1 deletion contracts/SignatureVerifier.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

/// @title Provides helper functions to determine the validity of passed signatures.
/// @author Noah Zinsmeister
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.4;
pragma solidity ^0.5.0;

contract EthereumDIDRegistry {

Expand Down Expand Up @@ -36,7 +36,7 @@ contract EthereumDIDRegistry {

function identityOwner(address identity) public view returns(address) {
address owner = owners[identity];
if (owner != 0x0) {
if (owner != address(0)) {
return owner;
}
return identity;
Expand Down Expand Up @@ -99,30 +99,30 @@ contract EthereumDIDRegistry {
revokeDelegate(identity, checkSignature(identity, sigV, sigR, sigS, hash), delegateType, delegate);
}

function setAttribute(address identity, address actor, bytes32 name, bytes value, uint validity ) internal onlyOwner(identity, actor) {
function setAttribute(address identity, address actor, bytes32 name, bytes memory value, uint validity ) internal onlyOwner(identity, actor) {
emit DIDAttributeChanged(identity, name, value, now + validity, changed[identity]);
changed[identity] = block.number;
}

function setAttribute(address identity, bytes32 name, bytes value, uint validity) public {
function setAttribute(address identity, bytes32 name, bytes memory value, uint validity) public {
setAttribute(identity, msg.sender, name, value, validity);
}

function setAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes value, uint validity) public {
function setAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes memory value, uint validity) public {
bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, nonce[identityOwner(identity)], identity, "setAttribute", name, value, validity));
setAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value, validity);
}

function revokeAttribute(address identity, address actor, bytes32 name, bytes value ) internal onlyOwner(identity, actor) {
function revokeAttribute(address identity, address actor, bytes32 name, bytes memory value ) internal onlyOwner(identity, actor) {
emit DIDAttributeChanged(identity, name, value, 0, changed[identity]);
changed[identity] = block.number;
}

function revokeAttribute(address identity, bytes32 name, bytes value) public {
function revokeAttribute(address identity, bytes32 name, bytes memory value) public {
revokeAttribute(identity, msg.sender, name, value);
}

function revokeAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes value) public {
function revokeAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes memory value) public {
bytes32 hash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, nonce[identityOwner(identity)], identity, "revokeAttribute", name, value));
revokeAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

import "./Forwarder.sol";

Expand All @@ -17,7 +17,9 @@ contract ExternalProxy is Forwarder {
_;
}

function forwardCall(address destination, bytes memory data) public onlyAllowedCaller() {
super.forwardCall(destination, data);
function forwardCall(address destination, bytes memory data)
public onlyAllowedCaller() returns (bytes memory returnData)
{
return super.forwardCall(destination, data);
}
}
11 changes: 7 additions & 4 deletions contracts/examples/Providers/MetaTransactions/Forwarder.sol
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
pragma solidity ^0.4.24;
pragma solidity ^0.5.0;

contract ForwarderInterface {
function forwardCall(address destination, bytes memory data) public;
function forwardCall(address destination, bytes memory data) public returns (bytes memory returnData);
}

contract Forwarder is ForwarderInterface {
function forwardCall(address destination, bytes memory data) public {
require(destination.call(data), "Call was not successful."); // solium-disable-line security/no-low-level-calls
function forwardCall(address destination, bytes memory data) public returns (bytes memory returnData) {
// solium-disable-next-line security/no-low-level-calls
(bool success, bytes memory _returnData) = destination.call(data);
require(success, "Call was not successful.");
return _returnData;
}
}
Loading

0 comments on commit c460bcd

Please sign in to comment.