Add presigned signature type

This commit is contained in:
Amir Bandeali
2018-04-19 13:22:23 -07:00
parent e532f2c165
commit 67117913dd

View File

@@ -33,9 +33,18 @@ contract MixinSignatureValidator is
Ecrecover,
EIP712,
Trezor,
Contract
Contract,
PreSigned
}
// Mapping of hash => signer => signed
mapping(bytes32 => mapping(address => bool)) preSigned;
/// @dev Verifies that a hash has been signed by the given signer.
/// @param hash Any 32 byte hash.
/// @param signer Address that should have signed the given hash.
/// @param signature Proof that the hash has been signed by signer.
/// @return True if the address recovered from the provided signature matches the input signer address.
function isValidSignature(
bytes32 hash,
address signer,
@@ -135,6 +144,11 @@ contract MixinSignatureValidator is
} else if (signatureType == SignatureType.Contract) {
isValid = ISigner(signer).isValidSignature(hash, signature);
return isValid;
// Signer signed hash previously using the preSign function
} else if (signatureType == SignatureType.PreSigned) {
isValid = preSigned[hash][signer];
return isValid;
}
// Anything else is illegal (We do not return false because
@@ -145,6 +159,20 @@ contract MixinSignatureValidator is
revert();
}
/// @dev Approves a hash on-chain using any valid signature type.
/// After presigning a hash, the preSign signature type will become valid for that hash and signer.
/// @param signer Address that should have signed the given hash.
/// @param signature Proof that the hash has been signed by signer.
function preSign(
bytes32 hash,
address signer,
bytes memory signature)
public
{
require(isValidSignature(hash, signer, signature));
preSigned[hash][signer] = true;
}
function get32(bytes memory b, uint256 index)
private pure
returns (bytes32 result)