Overview

This case study documents the complete technical architecture of the INRC ERC-20 smart contract deployed on Polygon Mainnet at address 0xe0B74D04706274Bc1B57b9a47E3e220D827834fc.

Technology Stack

  • Language: Solidity 0.8.x
  • Framework: OpenZeppelin Contracts v4.x
  • IDE: Remix IDE + Hardhat for testing
  • Network: Polygon (ChainID: 137)
  • Verification: PolygonScan source verification

Contract Modules

ERC20: Base implementation providing the standard interface. All standard transfer, approval, and allowance functions are inherited with zero custom modification — ensuring maximum compatibility with all DeFi protocols.

ERC20Burnable: Adds burn() and burnFrom() functions. Any holder can permanently destroy their tokens. This reduces circulating supply over time, creating deflationary pressure.

Ownable: Single-owner access control. The deployer wallet is the initial owner. Owner-exclusive functions: pause/unpause. Minting is NOT an owner function — the supply was fixed at deployment.

Pausable: Allows the owner to freeze all transfers via pause(). Unpause() resumes normal operation. This emergency stop prevents losses during discovered vulnerabilities.

Deployment Process

  1. Contract written and unit tested on Polygon Mumbai testnet
  2. Gas estimation performed for deployment
  3. Deployed to Polygon Mainnet using Remix IDE
  4. Contract source code submitted to PolygonScan for verification
  5. Initial token supply minted to deployer wallet
  6. Liquidity provided to Uniswap V3 INRC/MATIC pool

Security Decisions

The decision to use OpenZeppelin over custom implementations was the most critical security choice. Custom ERC-20 implementations introduce attack surface — reentrancy, overflow, and access control bugs are common in custom code. OpenZeppelin's code has been audited by the industry's best security firms and used in protocols securing +.

Gas Optimization

Polygon's low gas costs mean gas optimization is less critical than on Ethereum, but we still followed best practices: using uint256 (not smaller uints), minimizing storage writes, and leveraging immutable variables where possible.