I am Jean a passionate web3 dev, specialised in smart contracts and Solidity.
Author of the 📓 All About Solidity Book! + ✍🏼 All About Solidity article series
- 🔭 Currently working as: Smart Contract Team Lead at LUKSO.
- 🌱 Currently learning: Defi.
- 🤝🏻 Looking to collaborate on: any web3 protocol or project.
- 💬 Ask me anything about: smart contracts and Solidity! 🫡
- Building a POAP using the LSP8 Standard - Eth Denver 2024 Workshop.
- The Bytecode Episode #4 - Explaining the LSP6 Key Manager
- LUKSO LSP Recipes to build new protocols
- LUKSO Standard Proposal Workshops for BuildUP #2 Hackathon - Episode 1 | Episode 2
Note: below is my GitHub profile as a smart contract code in Solidity!
// SPDX-License-Identifier: YOLO
pragma solidity ^0.8.x;
// YOLO LICENSE
// Version 1, July 10 2015
// THIS SOFTWARE LICENSE IS PROVIDED "ALL CAPS" SO THAT YOU KNOW IT IS SUPER
// SERIOUS AND YOU DON'T MESS AROUND WITH COPYRIGHT LAW BECAUSE YOU WILL GET IN
// TROUBLE HERE ARE SOME OTHER BUZZWORDS COMMONLY IN THESE THINGS WARRANTIES
// LIABILITY CONTRACT TORT LIABLE CLAIMS RESTRICTION MERCHANTABILITY SUBJECT TO
// THE FOLLOWING CONDITIONS:
// 1. #yolo
// 2. #swag
// 3. #blazeit
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
/// @title GitHubProfile
/// @dev A contract to store and manage your GitHub profile information.
contract GitHubProfile is Ownable(0xB82023c6d61C60E8715db485066542d501A91140) { // cj42.eth
/// @dev Event emitted when the profile is created
event ProfileCreated(string username, string url, string job, string[] skills);
/// @dev Event emitted when the job is updated
event JobChanged(string oldJob, string newJob);
/// @dev Event emitted when a new skill is added
event SkillAdded(string newSkill);
struct Github {
string username;
string url;
}
Github private githubInfos;
/// @dev Set as constant as assigned at birth (not planning to change it!)
string public constant FIRST_NAME = "Jean";
/// @notice The current job title
string public job;
/// @notice A list of skills
string[] public skills;
/// @dev My approach to web3, Blockchain and Programming 🪂
string public constant motto = unicode"Keep Learning 📚, Keep BUIDLing! 🫡";
/// @dev Initializes the contract with default values for GitHub information, job title, and skills.
constructor() {
githubInfos.username = "CJ42";
githubInfos.url = "https://github.com/CJ42";
job = "Smart Contract Team Lead at LUKSO";
skills.push("Solidity");
skills.push("Smart Contracts");
skills.push("Blockchain");
skills.push("Web Development");
skills.push("React");
emit ProfileCreated(githubInfos.username, githubInfos.url, job, skills);
}
/// @notice Updates the job title
/// @param newJob The new job title to set
/// @dev Only the contract owner (CJ42.eth) can call this function
function updateJob(string memory newJob) public onlyOwner {
emit JobChanged(job, newJob);
job = newJob;
}
/// @notice Adding a new skill `newSkill` to the list
/// @param newSkill The new skill to add
function addSkill(string memory newSkill) public onlyOwner {
skills.push(newSkill);
emit SkillAdded(newSkill);
}
/// @notice Retrieves the list of skills
/// @dev We cant get back the full array from the `public` getter of the state variable.
/// The `skills(uint256)` getter function can only get value at specific indexes.
/// @return An array of strings representing the skills
function getSkills() public view returns (string[] memory) {
return skills;
}
/// @notice Retrieves the GitHub username and URL
/// @return A tuple containing the GitHub username and URL
function getGithubInfo() public view returns (string memory, string memory) {
return (githubInfos.username, githubInfos.url);
}
}
- All About Solidity
- Blockchain Academic References
- Bitcoin Core Alpha release - Deep Dive into the C++ source code.
- solidity-debugger.io - curated list of Solidity errors and warnings + their explanations and how to fix them.
- Decentralised Relayer Contracts - optimised forked version of any.sender working with Solidity 0.8.x
- Solidity Bytes Utils - Solidity library to manipulate bits and bytes.