function mintProfile(string memory name, uint8 age, string memory profileImage) external {
require(profileToToken[msg.sender] == 0, "Profile already exists");
uint256 tokenId = ++_nextTokenId;
_safeMint(msg.sender, tokenId);
_profiles[tokenId] = Profile(name, age, profileImage);
}
vm.prank(alice);
nft.mintProfile("", 0, "");
vm.prank(bob);
nft.mintProfile("Bob", 12, "ipfs://bob");
vm.prank(carol);
nft.mintProfile("Carol", 255, "ipfs://carol");
string memory longName = new string(10000);
vm.prank(dave);
nft.mintProfile(longName, 25, "ipfs://dave");
- remove this code
+ add this code
uint8 public constant MIN_AGE = 18; // For dating app compliance
uint8 public constant MAX_AGE = 120;
uint256 public constant MAX_NAME_LENGTH = 50;
uint256 public constant MAX_IMAGE_LENGTH = 200;
function mintProfile(
string memory name,
uint8 age,
string memory profileImage
) external {
require(profileToToken[msg.sender] == 0, "Profile already exists");
// Validate name
require(bytes(name).length > 0, "Name cannot be empty");
require(bytes(name).length <= MAX_NAME_LENGTH, "Name too long");
// Validate age (critical for dating apps!)
require(age >= MIN_AGE, "Must be 18 or older");
require(age <= MAX_AGE, "Invalid age");
// Validate image URL
require(bytes(profileImage).length > 0, "Image URL cannot be empty");
require(bytes(profileImage).length <= MAX_IMAGE_LENGTH, "Image URL too long");
// Optional: Validate image URL format
require(
_startsWith(profileImage, "ipfs://") ||
_startsWith(profileImage, "https://"),
"Invalid image URL format"
);
uint256 tokenId = ++_nextTokenId;
_safeMint(msg.sender, tokenId);
_profiles[tokenId] = Profile(name, age, profileImage);
profileToToken[msg.sender] = tokenId;
emit ProfileMinted(msg.sender, tokenId, name, age, profileImage);
}
function _startsWith(string memory str, string memory prefix)
private
pure
returns (bool)
{
bytes memory strBytes = bytes(str);
bytes memory prefixBytes = bytes(prefix);
if (strBytes.length < prefixBytes.length) {
return false;
}
for (uint i = 0; i < prefixBytes.length; i++) {
if (strBytes[i] != prefixBytes[i]) {
return false;
}
}
return true;
}