Skip to content
About

Why Stellaroid Earn

A thin piece of software around one idea: certificates should be verifiable in seconds, not emails. And if they're verifiable, the grad should get paid on the same tap.

The problem

The friction costs more than the fraud

Maria graduated top of her bootcamp cohort in Quezon City. She applies to a Singapore fintech, and then the clock starts.

  1. Tuesday

    Maria applies. Employer emails the school to confirm the certificate.

  2. 14–21 days

    Verification drags. 32% of candidates misrepresent. Background checks cost $30–$75 each.

  3. Three weeks later

    Role filled by a candidate who didn’t need verifying. Maria loses a job she earned.

The certificate is real. The problem is that proving it costs more than hiring around it.

The approach

Bind the hash. Trust the issuer. Pay the wallet.

Same Maria, same Tuesday, on Stellar. The whole cycle takes less time than reading this paragraph.

  1. Step 1 · Anchor

    School hashes Maria’s diploma and anchors it on Stellar testnet.

  2. Step 2 · Verify in 5s

    An approved issuer or admin verifies on-chain, so the employer can trust the proof without an email thread.

  3. Step 3 · Employer pays

    The employer verifies the proof, hires Maria, and sends payment straight to her wallet — no invoice, no middleman.

The canonical output isn't the UI; it's the event stream on stellar.expert. The proof is public by default.

What changes for Maria

Concrete wins, not abstract outcomes

  • Paid same day

    Payment clears the moment work is verified, no 30-day invoice, no net-terms.

  • Keeps 100% of XLM

    Direct wallet-to-wallet, no 20% platform take rate between the employer and Maria.

  • Public Verified Badge URL

    A shareable link she drops into her next offer email, verifiable without any login.

  • One-click LinkedIn share

    Pre-filled post with thumbnail; verified work becomes a portfolio artifact.

  • Owns it forever

    Credential lives on Stellar, no platform lock-in, no migration pain if the tool shuts down.

Tech stack

Boring, proven, fast to demo.

Rust + soroban-sdk 22

Contract crate, trust-layer tests included

Stellar testnet

Deployed + initialised with native SAC

Next.js 15 + React 19

App Router, server + client

Freighter wallet

@stellar/freighter-api signing

@stellar/stellar-sdk

Build, simulate, submit via Soroban RPC

Vercel

Auto-deployed from main

Contract surface

Twelve public functions; issuer trust explicit; errors human.

Init1 function
init(admin, token)

One-shot bootstrap. Stores admin + reward token in instance storage.

Write9 functions
register_issuer(issuer, name, website, category)

Issuer self-registers on-chain and enters the pending trust queue.

approve_issuer(admin, issuer)

Admin approves a pending issuer so it can issue and verify credentials.

suspend_issuer(admin, issuer)

Admin suspends an issuer from future issue / verify operations.

register_certificate(issuer, student, cert_hash, title, cohort, metadata_uri)

Binds hash plus minimal proof metadata to a student wallet; rejects duplicates; emits cert_reg.

verify_certificate(verifier, cert_hash)

Trusted verification by the approved issuer or admin; emits cert_ver.

revoke_certificate(actor, cert_hash)

Marks a credential revoked so payment-linked actions are blocked.

suspend_certificate(actor, cert_hash)

Temporarily suspends a credential without deleting its audit trail.

reward_student(student, cert_hash, amount)

Admin-triggered XLM reward via the configured SAC.

link_payment(employer, student, cert_hash, amount)

Employer pays a verified student directly; emits payment.

Read2 functions
get_certificate(cert_hash)

Read-only lookup of the certificate record.

get_issuer(issuer)

Read-only lookup of issuer trust status and profile metadata.

Errors are human

No raw ScVal or HostError reaches the UI; every contract error maps to a sentence a reviewer can read.

#1state

AlreadyInitialized

Init called twice.

#2state

NotInitialized

Admin/token not set yet.

#3auth

Unauthorized

Caller isn't allowed.

#4input

AlreadyExists

Duplicate cert hash.

#5input

NotFound

Hash isn't registered.

#6input

InvalidAmount

Amount must be > 0.

#7input

IssuerNotFound

Issuer hasn't registered on-chain.

#8state

IssuerNotApproved

Issuer still needs admin approval.

#9state

IssuerSuspended

Issuer has been suspended.

#10state

InvalidStatus

Credential is in the wrong lifecycle state for this action.

#11state

CredentialRevoked

Credential was revoked and can no longer unlock payment.

#12state

CredentialExpired

Credential expired and must be reissued or renewed.