About Me

Building dependable products across Web2 and Web3.

Sri Lanka
4+ years experience
Web3 enthusiast

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.

Product ThinkingFull-StackExecution

Web2 Foundation

My core stack is TypeScript, React, Next.js, Node.js, and PostgreSQL. I focus on maintainable systems, clear interfaces, and reliable delivery.

TypeScriptReactNext.jsNode.jsExpressTailwindPostgreSQL

Mobile Expertise

I build cross-platform mobile apps with React Native and Expo, prioritizing performance, clean UX, and resilient app structure.

React NativeExpoTypeScriptStateAPI

Desktop Expertise

On desktop, I use Tauri and Rust with TypeScript and React to ship efficient applications with native feel and web-level developer velocity.

TauriRustReactTypeScriptTailwind

Blockchain Expertise

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.

SolidityFoundryWagmiViemChainlinkCyfrin

Building the Future

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.

SecurityScalabilityDXUXWeb3
Let us build the decentralized web, one block at a time.
Smart Contract Resume

About Me in Solidity.

A contract-style profile with practical functions, structured metadata, and production-minded patterns.

Gas Aware

Compact, structured logic

Production Ready

Error handling and guardrails

Readable

Clear naming and docs

KavindaRathnayakeResume.sol
Solidity ^0.8.30MIT

    // 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;
        }
    }