Skip to content
GoPay

GoPay

Decentralised Payroll Protocol

Created on 3rd August 2025

β€’

GoPay

GoPay

Decentralised Payroll Protocol

The problem GoPay solves

🚧 Problem Statement

In today’s global economy, sending and receiving payments across borders is still slow, expensive, and complicated. Traditional banking systems and remittance services come with:

  • High fees
  • Lengthy processing times (3–7 days)
  • Currency conversion issues
  • Lack of transparency and accessibility, especially for freelancers and small businesses in underbanked regions

These inefficiencies hurt global collaboration, delay business operations, and exclude millions from participating in the digital economy.

πŸ’‘ What GoPay Solves

GoPay simplifies cross-border payments by offering an instant, secure, and cost-effective solution on the blockchain.

βœ… Instant Global Transfers β€” No more waiting days for international payments.

🌍 Borderless β€” Works globally, removing the friction of currencies and regional banking limitations.

πŸ’Έ Low-costβ€” Eliminates excessive banking and remittance fees.

πŸ” Secure & Transparent β€” Powered by blockchain for tamper-proof, trackable transactions.

🧾 Paperless β€” Say goodbye to traditional paperwork and compliance bottlenecks.

Whether it's freelancers, e-commerce businesses, or global teams, GoPay enables faster, simpler, and safer financial interactions without the overhead of legacy systems.

Challenges I ran into

Challenge 1: Chainlink Price Feed Reliability Crisis

The Problem

One of the biggest blockers was the unreliable behavior of Chainlink price feeds across multi-chain setups, especially on testnets like Lisk Sepolia. Price fetches would intermittently fail, completely breaking our payroll calculations and halting bulk payments.

The Fix

We engineered a 3-tier fallback strategy in /lib/chainlink-helper.ts to ensure price reliability:

// 1. Primary: Chainlink feed
try {
  const aggregator = new ethers.Contract(priceFeed, chainlinkAggregatorABI, provider);
  const [roundData, decimals] = await Promise.all([
    aggregator.latestRoundData(),
    aggregator.decimals()
  ]);
  const price = Number(roundData.answer) / 10 ** Number(decimals);
  const exchangeRate = 1 / price;
} catch (chainlinkError) {
  console.warn(`Chainlink error for ${tokenSymbol}:`, chainlinkError);
  // Proceed to fallback methods
}

// 2. Fallback: CoinGecko API
const coingeckoRate = await fetchPriceFromCoinGecko(tokenSymbol);

// 3. Final fallback: Hardcoded rates
const fallbackRates = {
  'ETH': 0.001,
  'BNB': 0.001,
  'MATIC': 0.001
  // ... extendable
};

Result

This system gave us 99.9% uptime in fetching accurate pricing data, ensuring that payroll operations were never interrupted.

Challenge 2: Lisk Chain Integration Nightmare

The Problem

While integrating the Lisk Sepolia testnet, we ran into incompatible RPC responses with standard wagmi hooks. Basic operations like fetching wallet balances failed, which was a critical issue since our dApp is built specifically for the Lisk ecosystem.

The Fix

We built a custom balance-fetching system in /components/payroll/TokenSelector.tsx using ethers.js directly as a workaround:

useEffect(() => {
  if (isLiskChain && isConnected && address && selectedToken) {
    setIsFallbackLoading(true);
    fetchBalanceWithEthers()
      .then(result => result && setFallbackBalance(result))
      .catch(err => {
        setFallbackError(err as Error);
        console.error("Error fetching Lisk chain balance:", err);
      });
  }
}, [isLiskChain, isConnected, address, selectedToken]);

We also defined a custom Lisk Sepolia chain configuration to support RPC and explorer access.

Result

With this dual-path logic, we restored reliable balance fetching on Lisk and ensured our dApp worked seamlessly on the intended network.

Discussion

Builders also viewed

See more projects on Devfolio