The Journey Begins
I am Kavinda Rathnayake, a Full-Stack Developer focused on building web, mobile, and desktop products that bridge modern Web2 architecture with practical Web3 capabilities.
I am Kavinda Rathnayake, a Full-Stack Developer focused on building web, mobile, and desktop products that bridge modern Web2 architecture with practical Web3 capabilities.
My core stack is TypeScript, React, Next.js, Node.js, and PostgreSQL. I focus on maintainable systems, clear interfaces, and reliable delivery.
I build cross-platform mobile apps with React Native and Expo, prioritizing performance, clean UX, and resilient app structure.
On desktop, I use Tauri and Rust with TypeScript and React to ship efficient applications with native feel and web-level developer velocity.
My blockchain work centers on Solidity and Foundry, supported by Wagmi, Viem, and Chainlink for production-ready on-chain integrations.
I completed advanced Ethereum training through Cyfrin Updraft, from fundamentals to secure contract patterns used in real projects.
I build products that combine usable interfaces with secure engineering, from full-stack systems to on-chain applications.
My focus is simple: secure, scalable, and practical software that helps move the decentralized web forward.
Let us build the decentralized web, one block at a time.
A contract-style profile with practical functions, structured metadata, and production-minded patterns.
Compact, structured logic
Error handling and guardrails
Clear naming and docs
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title KavindaRathnayakeResume
* @author Kavinda Rathnayake
* @notice A smart contract resume demonstrating experience, skills, and aspirations.
* @dev contact info, skills, experience, and salary expectations are included.
*/
contract KavindaRathnayakeResume is Ownable {
// --------------------------- Custom Errors
error Salary_CannotBeNegative();
error No_Salary_To_Withdraw();
error TransAction_Failed();
// --------------------------- Events
event NewSalaryUpdated(uint256 newSalary);
event SalaryWithdrawn(uint256 amount);
// --------------------------- Basic Info
string public constant name = "Kavinda Rathnayake";
string public constant email = "kavindarathnayake100@gmail.com";
string public constant title = "Full Stack Developer";
// --------------------------- Web3 Stack
string[] public web3Skills = [
"Solidity",
"Foundry",
"Chainlink Oracles",
"Wagmi",
"RainbowKit"
];
// --------------------------- Web2 Stack
string[] public web2Skills = [
"TypeScript",
"Next.js",
"React.js",
"Tailwind CSS",
"Node.js",
"Express.js",
"PostgreSQL",
"MongoDB",
"Prisma ORM",
"Drizzle ORM",
"Kinde, Client, and NextAuth",
"RESTful APIs"
];
// ----------------------------- Mobile Development
string[] public mobileDevelopmentSkills = [
"React Native",
"Expo",
"TypeScript",
"NativeWind",
"Tailwind CSS",
"Zustand",
];
// ----------------------------- Desktop Development
string[] public desktopDevelopmentSkills = [
"Tauri",
"Rust",
"React",
"TypeScript",
];
// --------------------------- Other Technical Skills
string[] public otherTechnicalSkills = [
"Git & GitHub",
"Docker",
"Linux",
"CI/CD Pipelines",
"Agile Methodologies",
"Unit & Integration Testing"
];
// --------------------------- Soft Skills
string[] public softSkills = [
"Effective Communication",
"Problem-Solving",
"Team Collaboration",
"Adaptability",
"Time Management"
];
// --------------------------- Professional Data
uint256 public yearsOfExperience = 4;
uint256 public salaryExpectation = 0 ether; // can be set by you!
// -----------------------------------------------------------------------------------
// ------------------------------- Constructor --------------------------------------
// -----------------------------------------------------------------------------------
constructor() Ownable(msg.sender) {}
// -----------------------------------------------------------------------------------
// ---------------------------- Public/External Functions ----------------------------
// -----------------------------------------------------------------------------------
/**
* @notice Set a new desired salary in ETH.
* @dev Payable function to set salary expectation.
*/
function setSalaryExpectation() external payable {
// check salary is non-negative
if(msg.value < 0) {
revert Salary_CannotBeNegative();
}
// update salary expectation
salaryExpectation = msg.value;
// emit event
emit NewSalaryUpdated(salaryExpectation);
}
/**
* @notice Withdraw salary.
* @dev Only the contract owner can withdraw.
*/
function withdrawSalary() external onlyOwner {
// check contract balance
if(address(this).balance == 0) {
revert No_Salary_To_Withdraw();
}
// transfer balance to owner
(bool sent, ) = payable(owner()).call{value: address(this).balance}("");
// check transfer success
if(!sent) {
revert TransAction_Failed();
}
// emit event
emit SalaryWithdrawn(address(this).balance);
}
// -----------------------------------------------------------------------------------
// ------------------------------ View/Pure Functions -------------------------------------
// -----------------------------------------------------------------------------------
/**
* @notice Retrieve all skills (all Web2 + Web3 + Other Technical + Soft Skills + Desktop Development Skills).
*/
function allSkills() external view returns (string[] memory) {
uint256 total = web2Skills.length + mobileDevelopmentSkills.length + web3Skills.length + otherTechnicalSkills.length + softSkills.length + desktopDevelopmentSkills.length;
string[] memory combined = new string[](total);
uint256 index = 0;
// combine web2 skills
for (uint256 i = 0; i < web2Skills.length; i++) {
combined[index++] = web2Skills[i];
}
// combine web3 skills
for (uint256 i = 0; i < web3Skills.length; i++) {
combined[index++] = web3Skills[i];
}
// combine mobile development skills
for (uint256 i = 0; i < mobileDevelopmentSkills.length; i++) {
combined[index++] = mobileDevelopmentSkills[i];
}
// combine other technical skills
for (uint256 i = 0; i < otherTechnicalSkills.length; i++) {
combined[index++] = otherTechnicalSkills[i];
}
// combine soft skills
for (uint256 i = 0; i < softSkills.length; i++) {
combined[index++] = softSkills[i];
}
// combine desktop development skills
for (uint256 i = 0; i < desktopDevelopmentSkills.length; i++) {
combined[index++] = desktopDevelopmentSkills[i];
}
// return the combined skills
return combined;
}
/**
* @notice Get a Name and Title summary.
*/
function getSummary() external pure returns (string memory) {
return string(abi.encodePacked(name, " - ", title));
}
/**
* @notice Get Name
*/
function getName() external pure returns (string memory) {
return name;
}
/**
* @notice Get Email
*/
function getEmail() external pure returns (string memory) {
return email;
}
/**
* @notice Get Title
*/
function getTitle() external pure returns (string memory) {
return title;
}
}
Open to collaboration, product discussions, and Web3 opportunities.
If you have a project idea, role, or product challenge, send a message.
Send Message