This is a fullstack application for handling Web3-integrated tender and grant submissions, combining modern UX with Bitcoin + Ordinals tech.
- Frontend: React + TypeScript + Webpack + Sass
- Backend: Node.js (JavaScript) + Express + Firebase + Zaprite + GitHub OAuth
- Features: Voucher-gated access, resume & project uploads, wallet integration, project hash timestamping, Ordinals logo inscription
npm install
npm run dev
Ensure you set ZAPRITE_API_KEY
. Firebase credentials are required and can be
provided through firebase-adminsdk.json
or the
FIREBASE_SERVICE_ACCOUNT
environment variable. For GitHub OAuth, also set
GITHUB_CLIENT_ID
, GITHUB_CLIENT_SECRET
and GITHUB_CALLBACK_URL
.
npm run dev
The frontend uses Webpack Dev Server and proxies /api
to http://localhost:5000
.
Webpack is configured via webpack.config.json
at the project root.
After connecting your GitHub account and Xverse wallet, you can inscribe using OrdinalsBot or select an existing inscription. Payments are handled via Bitcoin, Zaprite or PayPal USD stablecoin.
All inscriptions and payments operate on Bitcoin testnet4. PayPal USD payments
are directed to the Sepolia wallet 0xCaC524BcA292aaade2DF8A05cC58F0a65B1B3bB9
.
Inscription fees are paid from the internal wallet
2MxnPXCMyXZCAH92QFUpf6ELaqV2EU4d4b2
using the OrdinalsBot API. The
corresponding WIF key (INTERNAL_BTC_WIF
) is required for OP_RETURN pushes.
- Install Vercel CLI and run
vercel
to deploy. - The build script outputs static files to
dist/client
and the Express API is served from/api
. - Set the following environment variables in Vercel:
FIREBASE_SERVICE_ACCOUNT
– JSON string of your service accountFIREBASE_BUCKET
– Cloud Storage bucket name (optional)ZAPRITE_API_KEY
,GITHUB_CLIENT_ID
,GITHUB_CLIENT_SECRET
,GITHUB_CALLBACK_URL
INTERNAL_BTC_WALLET
and any other secrets
/api/submission/verify-voucher
/api/submission/create
/api/submission/:id
/api/bitcoin/wallet/link
/api/bitcoin/ordinals/store
/api/bitcoin/zaprite/pay
/api/bitcoin/paypal/pay
/api/bitcoin/ordinals/cost
/api/bitcoin/ordinals/inscribe
/api/bitcoin/opreturn/push
/api/auth/github
/api/auth/github/callback
contracts/SubmissionRegistry.sol
provides a small smart contract to store
submission hashes on Ethereum. Deploy it with Hardhat:
npx hardhat run scripts/deploy.js --network sepolia
Set EVM_RPC_URL
, EVM_PRIVATE_KEY
and EVM_CONTRACT_ADDRESS
in the backend
to record hashes automatically.
- Integrate OpenTimestamps + inscription hashproofs
- Resume metadata extraction
- Reviewer/selection dashboard
- Xverse wallet integration with Ordinals inscriptions
MIT — built permissionlessly.
The flow is:
/case
- read the hackathon opportunity./form
- submit personal or corporate data and upload your resume./wallet
- connect Xverse and specify your Ordinals address./timestamp
- push the hash via OP_RETURN./success
- confirmation.