Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: Implemented personal profile page for obaloluwa #21

Closed
wants to merge 8 commits into from
20 changes: 20 additions & 0 deletions packages/hardhat/contracts/CheckIn.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

import "@openzeppelin/contracts/access/Ownable.sol";

interface IBatchRegistry {
function checkIn() external;
}

contract CheckIn is Ownable {
IBatchRegistry public batchRegistry;

constructor(address initialOwner, address batchRegistryAddress) Ownable(initialOwner) {
batchRegistry = IBatchRegistry(batchRegistryAddress);
}

function checkIn() public {
batchRegistry.checkIn();
}
} //0x814203d2c41Bf3e7486AfD645acF4982703345a4
42 changes: 29 additions & 13 deletions packages/hardhat/deploy/00_deploy_your_contract.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ import { DeployFunction } from "hardhat-deploy/types";
import { Contract } from "ethers";

// Update with your Batch number
const BATCH_NUMBER = "12";
// const BATCH_NUMBER = "12";
const OWNER = "0x1C945Cd472EFBE3b34798AA49457Bc7415636E5D";
const BATCH_REGISTRY_CONTRACT = "0x72ccAbE6620fa94eC69569d17f18a3914BEFBFD6";

/**
* Deploys a contract named "deployYourContract" using the deployer account and
Expand All @@ -25,24 +27,38 @@ const deployYourContract: DeployFunction = async function (hre: HardhatRuntimeEn
const { deployer } = await hre.getNamedAccounts();
const { deploy } = hre.deployments;

await deploy("BatchRegistry", {
// await deploy("BatchRegistry", {
// from: deployer,
// // Contract constructor arguments
// args: [OWNER, BATCH_NUMBER],
// log: true,
// // autoMine: can be passed to the deploy function to make the deployment process faster on local networks by
// // automatically mining the contract deployment transaction. There is no effect on live networks.
// autoMine: true,
// });

// Get the deployed contract to interact with it after deploying.
// const batchRegistry = await hre.ethers.getContract<Contract>("BatchRegistry", deployer);

// const batchRegistryAddress = await batchRegistry.getAddress();

// console.log("\nBatchRegistry deployed to:", batchRegistryAddress);
// console.log("Remember to update the allow list!\n");

// // The GraduationNFT contract is deployed on the BatchRegistry constructor.
// const batchGraduationNFTAddress = await batchRegistry.batchGraduationNFT();
// console.log("BatchGraduation NFT deployed to:", batchGraduationNFTAddress, "\n");

await deploy("CheckIn", {
from: deployer,
// Contract constructor arguments
args: [deployer, BATCH_NUMBER],
args: [OWNER, BATCH_REGISTRY_CONTRACT],
log: true,
// autoMine: can be passed to the deploy function to make the deployment process faster on local networks by
// automatically mining the contract deployment transaction. There is no effect on live networks.
autoMine: true,
});

// Get the deployed contract to interact with it after deploying.
const batchRegistry = await hre.ethers.getContract<Contract>("BatchRegistry", deployer);
console.log("\nBatchRegistry deployed to:", await batchRegistry.getAddress());
console.log("Remember to update the allow list!\n");
const checkIn = await hre.ethers.getContract<Contract>("CheckIn", deployer);

// The GraduationNFT contract is deployed on the BatchRegistry constructor.
const batchGraduationNFTAddress = await batchRegistry.batchGraduationNFT();
console.log("BatchGraduation NFT deployed to:", batchGraduationNFTAddress, "\n");
console.log("CheckIn deployed to:", await checkIn.getAddress(), "\n");
};

export default deployYourContract;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import Image from "next/image";
import { NextPage } from "next";
import { Address } from "~~/components/scaffold-eth";

const obahProfile: NextPage = () => {
const address = "0x1C945Cd472EFBE3b34798AA49457Bc7415636E5D";

return (
<main className="mx-auto w-[90%] md:w-4/5 lg:w-[90%] xl:max-w-7xl">
<section className="flex flex-col-reverse items-center gap-6 px-5 py-3 mt-10 bg-base-100 shadow-xl rounded-lg md:py-14 md:px-10 md:mt-20 lg:grid lg:grid-cols-2 xl:gap-10">
<div className="space-y-8">
<div className="space-y-4">
<h1 className="text-4xl font-bold md:text-6xl">Obaloluwa</h1>

<Address address={address} />

<p className="text-xl font-bold">Web3 Security Researcher</p>
</div>

<div>
<h2 className="mb-6 text-2xl font-extrabold">About Me</h2>

<p>
Hi there, I am Obaloluwa, a software developer passionate about blockchain and securing it. I have a
background in frontend development using Javascript, React and TailwindCSS.
</p>
<p>
I am also proficient in Solidity and I am currently learning Rust and ZK while honing my smart contract
auditing and writing skills. Let us connect and build together 🙂
</p>
</div>

<div className="flex gap-4 items-center">
<a
href="https://github.com/obah"
target="_blank"
rel="noopener noreferrer"
className="btn btn-primary btn-sm font-normal gap-1"
>
GitHub
</a>

<a
href="https://x.com/oba_ddev"
target="_blank"
rel="noopener noreferrer"
className="btn btn-primary btn-sm font-normal gap-1"
>
X
</a>
<a
href="https://medium.com/@olusojiobah/"
target="_blank"
rel="noopener noreferrer"
className="btn btn-primary btn-sm font-normal gap-1"
>
Medium
</a>
</div>
</div>

<div className="avatar">
<Image
src="https://avatars.githubusercontent.com/u/15352545?v=4"
width={300}
height={300}
alt="obaloluwa"
className="rounded-full"
/>
</div>
</section>
</main>
);
};

export default obahProfile;
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
import Image from "next/image";
import { type NextPage } from "next";
import { BuidlGuidlLogo } from "~~/components/assets/BuidlGuidlLogo";
import { Address } from "~~/components/scaffold-eth";

const BUILDER_INFO = {
name: "Jason Suárez",
role: "Smart Contract | Frontend Developer",
address: "0x7d971C39bb700AcEc20879D46f092dC0DB1dbF9E",
avatar: "https://ik.imagekit.io/montresor/9.png?updatedAt=1730742966131",
tagline: "Securing the blockchain, one contract at a time",
languages: ["🇫🇷", "🇩🇴", "🇬🇧"],
links: {
bg: "https://app.buidlguidl.com/builders/0x7d971C39bb700AcEc20879D46f092dC0DB1dbF9E",
github: "https://github.com/All-Khwarizmi",
twitter: "https://twitter.com/swarecito",
telegram: "https://t.me/swarecito",
},
focus: {
building: "Smart Contracts",
learning: "DeFi security and cross-chain mechanics",
contributing: "BuildGuild batch12 and open source",
},
journey: [
{
year: "2023",
milestone: "Frontend Developer",
detail: "Building modern web applications",
},
{
year: "2024",
milestone: "Blockchain Development",
detail: "Smart contract development & security",
},
{
year: "2025",
milestone: "BuildGuild #12",
detail: "Contributing to Web3 ecosystem",
},
],
} as const;
const JasonBuilderProfile: NextPage = () => {
return (
<div className="p-4 flex items-center justify-center">
<div className="max-w-2xl w-full">
<div className=" rounded-lg shadow-xl p-8">
{/* Profile Section */}
<div className="flex flex-col items-center space-y-4">
{/* Avatar */}
<div className="relative">
<Image
src={BUILDER_INFO.avatar}
alt="Profile"
priority
width={128}
height={128}
className="rounded-full object-cover"
/>
</div>

{/* Identity */}
<h1 className="text-3xl font-bold">{BUILDER_INFO.name}</h1>
<Address address={BUILDER_INFO.address} />
<p className="text-lg opacity-80">{BUILDER_INFO.tagline}</p>

{/* Social Links */}
<a
href={BUILDER_INFO.links.bg}
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity underline text-blue-600"
>
<BuidlGuidlLogo className=" h-6" />
</a>
<div className="flex space-x-4">
<a
href={BUILDER_INFO.links.github}
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity underline text-blue-600"
>
Github
</a>
<a
href={BUILDER_INFO.links.twitter}
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity underline text-blue-600"
>
X
</a>
<a
href={BUILDER_INFO.links.telegram}
target="_blank"
rel="noopener noreferrer"
className="hover:opacity-80 transition-opacity underline text-blue-600"
>
Telegram
</a>
</div>
</div>
{/* Languages */}
<div className="text-center">
<p className="text-lg opacity-80">{BUILDER_INFO.languages.join(" ")}</p>
</div>

{/* Current Focus */}
<div className="mt-8 space-y-6">
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div>
<h2 className="text-xl font-bold mb-2">Building</h2>
<p>{BUILDER_INFO.focus.building}</p>
</div>
<div>
<h2 className="text-xl font-bold mb-2">Learning</h2>
<p>{BUILDER_INFO.focus.learning}</p>
</div>
<div>
<h2 className="text-xl font-bold mb-2">Contributing</h2>
<p>{BUILDER_INFO.focus.contributing}</p>
</div>
</div>
</div>

{/* Journey Timeline */}
<div className="mt-8">
<h2 className="text-xl font-bold mb-4">Journey</h2>
<div className="space-y-2">
{BUILDER_INFO.journey.map((step, index) => (
<div key={index} className="flex items-center space-x-4">
<span className="font-bold">{step.year}</span>
<span className="flex-grow border-t border-base-300"></span>
<span>{step.milestone}</span>
</div>
))}
</div>
</div>
</div>
</div>
</div>
);
};

export default JasonBuilderProfile;
Loading