Pre-launch checklist for deploying StellarWork to production. Complete every item and record the result before going live. Do not skip items — each one protects users or funds.
Work through this checklist in order. Items in earlier sections must be complete before later sections are meaningful.
- Work through each section top-to-bottom.
- Mark each item ✅ when complete or ❌ if blocked (note the blocker inline).
- Assign a responsible person and a completion timestamp for each section.
- Keep a copy of the completed checklist in the deployment log.
Owner: ____________ Completed: ____________
- All contract unit tests pass:
cd contracts/escrow && cargo test - Contract builds without warnings:
soroban contract build - WASM artifact exists at
target/wasm32-unknown-unknown/release/escrow.wasm - WASM SHA-256 hash recorded and stored in deployment log
- Contract version number (
CONTRACT_VERSION) matches the intended release - No
todo!(),unimplemented!(), or#[allow(dead_code)]items that affect production paths - Contract reviewed for arithmetic overflow — all maths uses checked helpers (
checked_mul_div,checked_add,checked_sub) - Upgrade timelock constant (
UPGRADE_TIMELOCK_SECS = 86_400) confirmed as intentional
-
npm run typecheckpasses with zero errors:cd frontend && npm run typecheck -
npm run lintpasses with zero errors:cd frontend && npm run lint -
npm run buildsucceeds locally with production environment values - No hardcoded testnet contract IDs, addresses, or secrets in source code
- No
console.logstatements exposing sensitive data (wallet keys, contract details) - All pages load without JavaScript errors in a production build (
npm run start) - Freighter wallet connection works on the production build
- All destructive actions (cancel job, approve work, raise dispute, withdraw fees) show confirmation dialogs
-
npm auditinfrontend/shows zero critical or high severity vulnerabilities -
cargo auditincontracts/escrow/shows no known vulnerabilities (install:cargo install cargo-audit) - All dependencies are pinned to specific versions (no open
*or^latestranges for security-critical packages) -
@stellar/freighter-apiis on a stable, non-pre-release version -
@stellar/stellar-sdkis on a stable, non-pre-release version
Owner: ____________ Completed: ____________
- Admin Stellar keypair generated on a secure machine (offline or air-gapped preferred)
- Admin secret key stored in a hardware wallet or secrets manager (not in plain text files)
- Admin secret key backed up in at least two physically separate locations
- Backup verified: import from backup, confirm public key matches admin address
- Admin public key recorded in deployment log
- No team member has admin secret key stored in a personal password manager without HSM/2FA protection
- Admin address funded with at least 10 XLM on mainnet
- Vercel project created and linked to the GitHub repository
- Root directory set to
frontend/in Vercel project settings - GitHub Actions secrets added:
VERCEL_TOKEN,VERCEL_ORG_ID,VERCEL_PROJECT_ID - GitHub Actions workflows (
deploy-production.yml,deploy-preview.yml) enabled - Vercel production environment variables set (see DEPLOYMENT.md §3.1):
-
NEXT_PUBLIC_CONTRACT_ID -
NEXT_PUBLIC_NETWORK=mainnet -
NEXT_PUBLIC_SOROBAN_RPC -
NEXT_PUBLIC_ADMIN_ADDRESS -
NEXT_PUBLIC_NATIVE_TOKEN
-
- Preview environment variables point to testnet contract (not production)
- Domain registered and DNS provider configured
- A record (or CNAME) pointing to Vercel confirmed propagated:
dig stellarwork.appornslookup stellarwork.app - HTTPS certificate issued and valid:
curl -sv https://stellarwork.app 2>&1 | grep "SSL certificate verify ok" -
wwwsubdomain configured and redirects to apex (or vice versa) — no broken redirect loops - HSTS header is present in production responses
-
mainbranch is protected: direct pushes blocked, PR reviews required - CI workflow (
frontend.yml) runs on every PR and must pass before merge - Contract CI workflow (
contract.yml) runs on every PR and must pass before merge - No secrets are stored in repository files (
.env,*.pem,secrets.json, etc.) -
.gitignorecovers.env.local,.vercel/, and any secrets files
Owner: ____________ Completed: ____________
Follow DEPLOYMENT.md §2 for full step-by-step instructions.
- Soroban CLI configured with mainnet network profile
- Admin identity added to Soroban CLI
- Contract deployed — contract ID recorded:
_______________________________ -
initializecalled with correct admin address and native token -
get_adminreturns expected admin address ✓ -
get_fee_bpsreturns 250 (2.5%) ✓ -
get_job_countreturns 0 ✓ -
get_contract_versionreturns 1 ✓ -
get_native_tokenreturns expected native token address ✓ - Any additional allowed tokens added via
add_allowed_token - Contract ID stored in: secrets manager ☐, Vercel env vars ☐, deployment log ☐
- Deployment transaction hash recorded:
_______________________________ - Deployment timestamp recorded:
_______________________________
Owner: ____________ Completed: ____________
- Production environment variables confirmed in Vercel before first deploy
- Triggered production deployment (push to
mainor manual redeploy) - Vercel deployment status shows Ready
- No errors in Vercel build log
- Production URL resolves:
curl -s -o /dev/null -w "%{http_code}\n" https://stellarwork.app→ 200 - Custom domain active (not the
.vercel.appdefault URL) - HTTPS is the default — HTTP redirects to HTTPS automatically
- Network badge in nav displays "Mainnet"
Owner: ____________ Completed: ____________
Use two wallets: one for the client role, one for the freelancer.
- "Connect Wallet" button opens Freighter popup
- Approving connection shows short wallet address in nav header
- WalletMenu dropdown shows full address, "Switch Account", and "Disconnect"
- Disconnecting clears wallet state and nav returns to "Connect Wallet"
- Post Job — client posts a job for 10 XLM; confirmation dialog shown; Freighter prompted; job appears in job list with "Open" status
- Accept Job — freelancer accepts the job; Freighter prompted; status changes to "In Progress"
- Submit Work — freelancer submits work; confirmation dialog shown; status changes to "Submitted for Review"
- Approve Work — client approves work; confirmation dialog shown; status changes to "Completed"
- Payment verified — freelancer wallet received ~9.75 XLM (10 XLM minus 2.5% fee)
- Fee verified — Admin panel shows ~0.25 XLM in accrued fees
- Admin panel accessible to admin wallet; "Unauthorized" shown for other wallets
- Accrued fees visible in Admin panel
- "Withdraw Fees" shows confirmation dialog; Freighter prompted; admin wallet balance increases
- Fee balance resets to 0 after withdrawal
- Raising a dispute shows confirmation dialog
- Job status changes to "Disputed" after dispute is raised
- Dispute visible in the Disputes page
- Admin can resolve the dispute with a custom split
- Funds distributed according to split after resolution
- Attempting a contract action without wallet shows "Connect your wallet" message
- Attempting an action on a job in wrong status shows a clear error message
- RPC timeout shows user-friendly error (not a raw stack trace)
Owner: ____________ Completed: ____________
- No private keys or secrets visible in browser DevTools → Network tab during any operation
- No internal wallet addresses or secrets visible in page source
-
X-Frame-Options: SAMEORIGINheader present (prevents clickjacking) -
X-Content-Type-Options: nosniffheader present - No mixed content warnings (all resources loaded over HTTPS)
- Contract admin address is not the same as any user-facing freelancer or client wallet
- Freighter is the only wallet extension with access — no other extensions have been granted permission during testing
- Reviewed contract for reentrancy: all state mutations happen before token transfers ✓ (verified in contract source)
- Confirmed
initializecan only be called once (panics withAlreadyInitializedon repeat calls) ✓
Owner: ____________ Completed: ____________
- Uptime monitoring configured for
https://stellarwork.app(alert on non-200 for 2+ min) - Vercel email notifications enabled for deployment failures
- Stellar network status page subscribed (https://status.stellar.org)
- Sentry (or equivalent) error tracking configured in frontend
- Ops team has access to Vercel dashboard
- Ops team has access to admin keypair (or secure handoff procedure documented)
- OPS_RUNBOOK.md reviewed by at least one ops team member
- Incident escalation path confirmed: who to contact for SEV-1 and SEV-2 (production-escalation.md)
- First fee withdrawal scheduled (monthly cadence recommended)
Owner: ____________ Completed: ____________
- Release notes written and reviewed (release-notes-guide.md)
- Changelog / GitHub Release created and tagged (e.g.
v1.0.0) - Public announcement drafted (blog post, Discord, social)
-
README.mdupdated with live production URL - Documentation links (DEPLOY.md, CONTRACT.md, INTEGRATION.md) verified to be accurate for the released version
- docs/README.md index verified — all linked docs exist and are current
| Role | Name | Date | Signature |
|---|---|---|---|
| Contract lead | |||
| Frontend lead | |||
| Ops / security | |||
| Project maintainer |
Final go / no-go decision: ☐ GO — all items complete ☐ NO-GO — blocker(s) outstanding
Blockers (if no-go):
1.
2.
3.
Related: DEPLOYMENT.md · OPS_RUNBOOK.md · release-checklist.md · production-escalation.md