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.

Free public Stellar testnet demo. No purchase, subscription, or mainnet funds required.

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. Days, not minutes

    Verification drags. Manual checks wait on someone answering an email, and background-check vendors charge per candidate.

  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 26.1

Contract crate, trust-layer tests included

Stellar testnet

Deployed + initialised with native SAC

Next.js 16 + React 19

App Router, server + client

Freighter + Albedo

Multi-wallet signing (desktop & mobile)

@stellar/stellar-sdk

Build, simulate, submit via Soroban RPC

Vercel

Auto-deployed from main

Contract surface

Nineteen 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.

Escrow6 functions
create_opportunity(employer, candidate, cert_hash, title, amount, milestone_count)

Employer opens a paid-trial escrow against a candidate's credential; rejects bad amounts, expired credentials, and mismatched owners; emits opp_crt.

fund_opportunity(employer, opp_id)

Employer escrows the full amount into the contract; re-funding fails with AlreadyFunded; emits opp_fund.

submit_milestone(candidate, opp_id)

Candidate marks the next milestone delivered; emits mile_sub.

approve_milestone(employer, opp_id)

Employer approves the submitted milestone; emits mile_apr.

release_payment(employer, opp_id)

Releases the approved milestone share from escrow to the candidate; emits pay_rel.

refund_opportunity(employer, opp_id)

Returns remaining escrowed funds to the employer; emits pay_ref.

Read3 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.

get_opportunity(opp_id)

Read-only lookup of a paid-trial opportunity record.

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.

#13input

OpportunityNotFound

No paid-trial opportunity exists for this id.

#14state

AlreadyFunded

The opportunity has already been funded.

#15input

InvalidMilestone

Milestone submission or approval is out of order.

#16state

InvalidOpportunityStatus

Action isn't allowed in the opportunity's current status.

#17state

PaymentLocked

Escrowed funds can't be released in the current state.

Frequently asked questions

Common questions from issuers, employers, and graduates.

Do I need a wallet to verify a certificate?
No. Verification is public and read-only, anyone can open a proof page and confirm a credential without connecting a wallet or logging in. A wallet is only needed to issue, verify, or pay on-chain.
How do I verify a credential on Stellar?
Paste the 64-character SHA-256 hash on the public proof page to view its on-chain record, the issuer's trust status, and any attached credential evidence.
What is an on-chain certificate?
An on-chain certificate is a credential whose SHA-256 hash is bound to a student's Stellar wallet by an issuer. The proof lives on Stellar testnet and is verifiable in seconds instead of by email, and duplicate hashes are rejected on-chain.
How does the employer pay the graduate?
Once a credential is verified, the employer calls link_payment, which transfers XLM through the native Stellar Asset Contract straight to the graduate's verified wallet. On testnet, settlement is typically under five seconds and costs a fraction of a cent, with no invoice and no platform fee.
Who can verify a credential?
Only an approved issuer or the admin wallet can submit the verify_certificate transaction. When they do, the contract updates the credential status to Verified and emits a cert_ver event that anyone can audit on stellar.expert.
What does it cost to use Stellaroid Earn?
It is a free public Stellar testnet demo, no purchase, subscription, or mainnet funds required. On-chain payments settle in under five seconds for a fraction of a cent in network fees.