Skip to content

Commit ca26a84

Browse files
authored
fix(storyBadge): add contract address to signature (#182)
1 parent eaf3df5 commit ca26a84

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

contracts/story-nft/StoryBadgeNFT.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ contract StoryBadgeNFT is IStoryBadgeNFT, BaseOrgStoryNFT, CachableNFT, ERC721Ho
9898
$.usedSignatures[signature] = true;
9999

100100
// The given signature must be valid
101-
bytes32 digest = keccak256(abi.encodePacked(msg.sender)).toEthSignedMessageHash();
101+
bytes32 digest = keccak256(abi.encodePacked(msg.sender, address(this))).toEthSignedMessageHash();
102102
if (!SignatureChecker.isValidSignatureNow($.signer, digest, signature))
103103
revert StoryBadgeNFT__InvalidSignature();
104104

test/story-nft/StoryBadgeNFT.t.sol

+10-10
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ contract StoryBadgeNFTTest is BaseTest {
140140
}
141141

142142
function test_StoryBadgeNFT_mint() public {
143-
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl);
143+
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl, address(rootOrgStoryNft));
144144

145145
uint256 totalSupplyBefore = rootOrgStoryNft.totalSupply();
146146
vm.startPrank(u.carl);
@@ -195,7 +195,7 @@ contract StoryBadgeNFTTest is BaseTest {
195195
vm.prank(rootOrgStoryNftOwner);
196196
rootOrgStoryNft.setSigner(u.bob);
197197

198-
bytes memory signature = _signAddress(sk.bob, u.carl);
198+
bytes memory signature = _signAddress(sk.bob, u.carl, address(rootOrgStoryNft));
199199

200200
vm.prank(u.carl);
201201
rootOrgStoryNft.mint(u.carl, signature);
@@ -214,7 +214,7 @@ contract StoryBadgeNFTTest is BaseTest {
214214
}
215215

216216
function test_StoryBadgeNFT_cachedMint() public {
217-
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.alice);
217+
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.alice, address(rootOrgStoryNft));
218218
vm.startPrank(u.alice);
219219
(uint256 tokenId, ) = rootOrgStoryNft.mint(u.alice, signature);
220220
assertEq(rootOrgStoryNft.ownerOf(tokenId), u.alice); // minted directly
@@ -228,7 +228,7 @@ contract StoryBadgeNFTTest is BaseTest {
228228
rootOrgStoryNft.setCacheMode(CachableNFT.CacheMode.Cache); // enable cache mode
229229
vm.stopPrank();
230230

231-
signature = _signAddress(rootOrgStoryNftSignerSk, u.carl);
231+
signature = _signAddress(rootOrgStoryNftSignerSk, u.carl, address(rootOrgStoryNft));
232232
vm.startPrank(u.carl);
233233
(tokenId, ) = rootOrgStoryNft.mint(u.carl, signature);
234234
assertEq(rootOrgStoryNft.ownerOf(tokenId), u.carl); // minted from cache
@@ -239,7 +239,7 @@ contract StoryBadgeNFTTest is BaseTest {
239239
rootOrgStoryNft.setCacheMode(CachableNFT.CacheMode.Passthrough); // disable cache mode
240240
vm.stopPrank();
241241

242-
signature = _signAddress(rootOrgStoryNftSignerSk, u.bob);
242+
signature = _signAddress(rootOrgStoryNftSignerSk, u.bob, address(rootOrgStoryNft));
243243
vm.startPrank(u.bob);
244244
(tokenId, ) = rootOrgStoryNft.mint(u.bob, signature);
245245
assertEq(rootOrgStoryNft.ownerOf(tokenId), u.bob); // minted directly
@@ -252,7 +252,7 @@ contract StoryBadgeNFTTest is BaseTest {
252252
vm.stopPrank();
253253

254254
vm.fee(20 gwei);
255-
signature = _signAddress(rootOrgStoryNftSignerSk, u.dan);
255+
signature = _signAddress(rootOrgStoryNftSignerSk, u.dan, address(rootOrgStoryNft));
256256
vm.startPrank(u.dan);
257257
(tokenId, ) = rootOrgStoryNft.mint(u.dan, signature);
258258
assertEq(rootOrgStoryNft.ownerOf(tokenId), u.dan); // minted directly
@@ -261,7 +261,7 @@ contract StoryBadgeNFTTest is BaseTest {
261261

262262
vm.fee(200 gwei);
263263
address eva = vm.addr(0x123456);
264-
signature = _signAddress(rootOrgStoryNftSignerSk, eva);
264+
signature = _signAddress(rootOrgStoryNftSignerSk, eva, address(rootOrgStoryNft));
265265
vm.startPrank(eva);
266266
(tokenId, ) = rootOrgStoryNft.mint(eva, signature);
267267
assertEq(rootOrgStoryNft.ownerOf(tokenId), eva); // minted from cache
@@ -284,7 +284,7 @@ contract StoryBadgeNFTTest is BaseTest {
284284
}
285285

286286
function test_StoryBadgeNFT_revert_mint_SignatureAlreadyUsed() public {
287-
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl);
287+
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl, address(rootOrgStoryNft));
288288

289289
vm.startPrank(u.carl);
290290
rootOrgStoryNft.mint(u.carl, signature);
@@ -294,7 +294,7 @@ contract StoryBadgeNFTTest is BaseTest {
294294
}
295295

296296
function test_StoryBadgeNFT_revert_mint_InvalidSignature() public {
297-
bytes memory signature = _signAddress(sk.carl, u.carl);
297+
bytes memory signature = _signAddress(sk.carl, u.carl, address(rootOrgStoryNft));
298298

299299
vm.startPrank(u.carl);
300300
vm.expectRevert(IStoryBadgeNFT.StoryBadgeNFT__InvalidSignature.selector);
@@ -303,7 +303,7 @@ contract StoryBadgeNFTTest is BaseTest {
303303
}
304304

305305
function test_StoryBadgeNFT_revert_TransferLocked() public {
306-
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl);
306+
bytes memory signature = _signAddress(rootOrgStoryNftSignerSk, u.carl, address(rootOrgStoryNft));
307307

308308
vm.startPrank(u.carl);
309309
(uint256 tokenId, ) = rootOrgStoryNft.mint(u.carl, signature);

test/utils/BaseTest.t.sol

+14-3
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,20 @@ contract BaseTest is Test, DeployHelper {
512512
signature = abi.encodePacked(r, s, v);
513513
}
514514

515-
/// @dev Uses `signerSk` to sign `addr` and return the signature.
516-
function _signAddress(uint256 signerSk, address addr) internal pure returns (bytes memory signature) {
517-
bytes32 digest = keccak256(abi.encodePacked(addr)).toEthSignedMessageHash();
515+
/// @dev Uses `signerSk` to sign `recipient` and return the signature.
516+
function _signAddress(uint256 signerSk, address recipient) internal pure returns (bytes memory signature) {
517+
bytes32 digest = keccak256(abi.encodePacked(recipient)).toEthSignedMessageHash();
518+
(uint8 v, bytes32 r, bytes32 s) = vm.sign(signerSk, digest);
519+
signature = abi.encodePacked(r, s, v);
520+
}
521+
522+
/// @dev Uses `signerSk` to sign `recipient` and `badgeAddr` and return the signature.
523+
function _signAddress(
524+
uint256 signerSk,
525+
address recipient,
526+
address badgeAddr
527+
) internal pure returns (bytes memory signature) {
528+
bytes32 digest = keccak256(abi.encodePacked(recipient, badgeAddr)).toEthSignedMessageHash();
518529
(uint8 v, bytes32 r, bytes32 s) = vm.sign(signerSk, digest);
519530
signature = abi.encodePacked(r, s, v);
520531
}

0 commit comments

Comments
 (0)