Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/hardhat/contracts/INFTFlags.sol
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we do https://github.com/BuidlGuidl/ctf.buidlguidl.com/pull/27/files#r2581810234

we could keep this file on the contracts root

Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,8 @@ pragma solidity >=0.8.0 <0.9.0;

interface INFTFlags {
function mint(address _recipient, uint256 _challengeId) external;

function hasMinted(address _recipient, uint256 _challengeId) external view returns (bool);

function tokenIdCounter() external view returns (uint256);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge1 {
contract Season1Challenge1 {
address public nftContract;
mapping(address => string) public builderNames;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge11 {
contract Season1Challenge11 {
address public nftContract;

constructor(address _nftContract) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./RLPReader.sol";
import "./INFTFlags.sol";
import "../RLPReader.sol";
import "../INFTFlags.sol";

contract Challenge12 {
contract Season1Challenge12 {
using RLPReader for RLPReader.RLPItem;
using RLPReader for bytes;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge2 {
contract Season1Challenge2 {
address public nftContract;

constructor(address _nftContract) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge3 {
contract Season1Challenge3 {
address public nftContract;

constructor(address _nftContract) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge4 is Ownable {
contract Season1Challenge4 is Ownable {
using ECDSA for bytes32;
using MessageHashUtils for bytes32;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge5 {
contract Season1Challenge5 {
address public nftContract;
mapping(address => uint256) public points;
uint256 public constant POINTS_TO_MINT = 10;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ pragma solidity >=0.8.0 <0.9.0;

import "@openzeppelin/contracts/utils/Strings.sol";

import "./INFTFlags.sol";
import "../INFTFlags.sol";

interface IContract6Solution {
function name() external view returns (string memory);
}

contract Challenge6 {
contract Season1Challenge6 {
using Strings for uint256;

address public nftContract;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge7Delegate {
contract Season1Challenge7Delegate {
address public owner;
event OwnerChange(address indexed owner);

Expand All @@ -18,14 +18,14 @@ contract Challenge7Delegate {
}
}

contract Challenge7 {
contract Season1Challenge7 {
address public owner;
Challenge7Delegate delegate;
Season1Challenge7Delegate delegate;
address public nftContract;

constructor(address _nftContract, address _delegateAddress, address _owner) {
nftContract = _nftContract;
delegate = Challenge7Delegate(_delegateAddress);
delegate = Season1Challenge7Delegate(_delegateAddress);
owner = _owner;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "./INFTFlags.sol";
import "../INFTFlags.sol";

contract Challenge9 {
contract Season1Challenge9 {
address public nftContract;
bytes32 private password;
uint256 private count;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Base64.sol";

contract NFTFlags is ERC721, IERC721Receiver, Ownable {
contract Season1NFTFlags is ERC721, IERC721Receiver, Ownable {
using Strings for uint256;

event Enabled(address indexed caller);
Expand Down
23 changes: 23 additions & 0 deletions packages/hardhat/contracts/S2/Season2Challenge10.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "../INFTFlags.sol";

contract Season2Challenge10 {
address public nftContract;

constructor(address _nftContract) {
nftContract = _nftContract;
}

function mintFlag() public {
require(msg.sender != tx.origin, "Same address");
uint8 senderLast = uint8(abi.encodePacked(msg.sender)[19]);
uint8 originLast = uint8(abi.encodePacked(tx.origin)[19]);
uint8 contractFirst = uint8(abi.encodePacked(address(this))[0]);
uint8 senderFirst = uint8(abi.encodePacked(msg.sender)[0]);
require((senderLast & 0xF) == (originLast & 0xF), "Wrong sender/origin address");
require((senderFirst & 0xF0) == (contractFirst & 0xF0), "Wrong sender/contract address");
INFTFlags(nftContract).mint(tx.origin, 10);
}
}
50 changes: 50 additions & 0 deletions packages/hardhat/contracts/S2/Season2Challenge11.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "../RLPReader.sol";
import "../INFTFlags.sol";

contract Season2Challenge11 {
using RLPReader for RLPReader.RLPItem;
using RLPReader for bytes;

address public nftContract;
mapping(address => uint256) public blockNumber;
mapping(address => uint256) public counts;
mapping(uint256 => bool) public blocks;

uint256 public constant futureBlocks = 2;

constructor(address _nftContract) {
nftContract = _nftContract;
}

function preMintFlag() public {
require(blocks[block.number] == false, "Block already used");
blocks[block.number] = true;
blockNumber[msg.sender] = block.number;
counts[msg.sender] += 1;
}

function mintFlag(bytes memory rlpBytes) public {
require(blockNumber[msg.sender] != 0, "PreMintFlag first");
require(block.number >= blockNumber[msg.sender] + futureBlocks, "Future block not reached.");
require(block.number < blockNumber[msg.sender] + futureBlocks + 256, "You miss the window. PreMintFlag again.");

RLPReader.RLPItem[] memory ls = rlpBytes.toRlpItem().toList();

uint256 blockNumberFromHeader = ls[8].toUint();

require(blockNumberFromHeader == blockNumber[msg.sender] + futureBlocks, "Wrong block");

require(blockhash(blockNumberFromHeader) == keccak256(rlpBytes), "Wrong block header");

bytes memory mixHash = ls[13].toBytes();

uint256 random = uint256(keccak256(abi.encodePacked(mixHash, address(this), msg.sender))) % 10;

require(random < counts[msg.sender], "Not enough pre-mints");

INFTFlags(nftContract).mint(msg.sender, 11);
}
}
Loading