remove recipient from Reedem struct

This commit is contained in:
Michele Balistreri 2020-03-25 11:23:22 +03:00
parent 470b00ba9a
commit 7bfa7275e7
No known key found for this signature in database
GPG Key ID: E9567DA33A4F791A
2 changed files with 8 additions and 13 deletions

View File

@ -22,7 +22,6 @@ contract GiftBucket {
mapping(address => Gift) public gifts; mapping(address => Gift) public gifts;
struct Redeem { struct Redeem {
address recipient;
address receiver; address receiver;
bytes32 code; bytes32 code;
} }
@ -30,7 +29,7 @@ contract GiftBucket {
uint256 public redeemableSupply; uint256 public redeemableSupply;
bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
bytes32 constant REDEEM_TYPEHASH = keccak256("Redeem(address recipient,address receiver,bytes32 code)"); bytes32 constant REDEEM_TYPEHASH = keccak256("Redeem(address receiver,bytes32 code)");
bytes32 DOMAIN_SEPARATOR; bytes32 DOMAIN_SEPARATOR;
modifier onlyOwner() { modifier onlyOwner() {
@ -102,11 +101,10 @@ contract GiftBucket {
function redeem(Redeem calldata _redeem, bytes calldata sig) external { function redeem(Redeem calldata _redeem, bytes calldata sig) external {
require(block.timestamp < expirationTime, "expired gift"); require(block.timestamp < expirationTime, "expired gift");
Gift storage gift = gifts[_redeem.recipient]; address recipient = verifySig(_redeem, sig);
require(gift.amount > 0, "not found");
bool signedByKeycard = verifySig(_redeem, sig); Gift storage gift = gifts[recipient];
require(signedByKeycard, "wrong recipient sig"); require(gift.amount > 0, "not found");
bytes32 codeHash = keccak256(abi.encodePacked(_redeem.code)); bytes32 codeHash = keccak256(abi.encodePacked(_redeem.code));
require(codeHash == gift.code, "invalid code"); require(codeHash == gift.code, "invalid code");
@ -132,13 +130,12 @@ contract GiftBucket {
function hashRedeem(Redeem memory _redeem) internal pure returns (bytes32) { function hashRedeem(Redeem memory _redeem) internal pure returns (bytes32) {
return keccak256(abi.encode( return keccak256(abi.encode(
REDEEM_TYPEHASH, REDEEM_TYPEHASH,
_redeem.recipient,
_redeem.receiver, _redeem.receiver,
_redeem.code _redeem.code
)); ));
} }
function verifySig(Redeem memory _redeem, bytes memory sig) internal view returns(bool) { function verifySig(Redeem memory _redeem, bytes memory sig) internal view returns(address) {
require(sig.length == 65, "bad signature length"); require(sig.length == 65, "bad signature length");
bytes32 r; bytes32 r;
@ -163,6 +160,6 @@ contract GiftBucket {
hashRedeem(_redeem) hashRedeem(_redeem)
)); ));
return ecrecover(digest, v, r, s) == _redeem.recipient; return ecrecover(digest, v, r, s);
} }
} }

View File

@ -53,7 +53,6 @@ async function signRedeem(contractAddress, signer, message) {
]; ];
let redeem = [ let redeem = [
{ name: "recipient", type: "address" },
{ name: "receiver", type: "address" }, { name: "receiver", type: "address" },
{ name: "code", type: "bytes32" }, { name: "code", type: "bytes32" },
]; ];
@ -264,7 +263,6 @@ contract("GiftBucket", function () {
const amount = parseInt(gift.amount); const amount = parseInt(gift.amount);
const message = { const message = {
recipient: recipient,
receiver: receiver, receiver: receiver,
code: redeemCode, code: redeemCode,
}; };
@ -312,13 +310,13 @@ contract("GiftBucket", function () {
} }
}); });
it("cannot redeem with invalid signature", async function() { it("cannot redeem with invalid recipient", async function() {
await mineAt(NOW); await mineAt(NOW);
try { try {
await testRedeem(user, keycard_1, keycard_2, relayer, REDEEM_CODE); await testRedeem(user, keycard_1, keycard_2, relayer, REDEEM_CODE);
assert.fail("redeem should have failed"); assert.fail("redeem should have failed");
} catch(e) { } catch(e) {
assert.match(e.message, /wrong recipient sig/); assert.match(e.message, /not found/);
} }
}); });