Agentic Trading Lab
Talk to agents, and test trading ideas. Try AI trading agents on real market data with no code required.
AI translation
Solana invoices with instant on-chain auto-split, shareable Blinks, and an official Kazakhstan Act of Completed Works with Solscan QR seal.
FinanceTypeScript · RustGitHub @OMaRgaLyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Invoice the world. Get paid in one click. Solana invoices with instant on-chain auto-split, shareable Blinks, and an official Kazakhstan Ðкт выполненных работ sealed with an on-chain QR.
Built for the Superteam Kazakhstan track of the Colosseum Crypto World's Fair Hackathon.
Freelancers in Kazakhstan and Central Asia selling to clients abroad face slow, expensive SWIFT transfers, cards that don't work across borders, and platforms (Upwork, Fiverr) that own their reputation. On top of that, local accounting and tax filing still expect a formal Ðкт выполненных работ tied to every payment.
flowchart LR
F[Freelancer wallet] -- initialize_invoice --> P[(Anchor program<br/>steppe_invoice)]
P --> I[Invoice PDA<br/>creator + id]
C[Client in X / Telegram / web] -- GET/POST Action --> A[Next.js Actions API<br/>/api/actions/invoice/creator/id]
A -- reads --> I
A -- unsigned pay_invoice tx --> C
C -- signs --> P
P -- atomic split --> W1[Freelancer 85%]
P -- atomic split --> W2[Savings vault 10%]
P -- atomic split --> W3[Collaborator 5%]
I --> ACT[Act of Completed Works<br/>+ QR to Solscan]
I --> PROF[Reputation profile]
| Part | Where |
|---|---|
| Anchor program | programs/steppe_invoice/src/lib.rs |
| Program tests (9) | tests/steppe_invoice.ts |
| Web app (Next.js) | app/ |
| Blink / Actions API | app/app/api/actions/invoice/[creator]/[id]/route.ts, app/app/actions.json/route.ts |
| Act of Works | app/app/invoice/[creator]/[id]/act/page.tsx |
| Reputation profile | app/app/profile/[wallet]/page.tsx |
Invoice PDA seeds: ["invoice", creator, invoice_id (u64 LE)].
initialize_invoice validates vault_bps + collaborator_bps <= 10000, title ≤ 64 bytes, amount > 0, and that a collaborator share has a collaborator wallet.pay_invoice computes shares with checked_mul / checked_div, transfers to vault, collaborator and creator via the System Program in the same transaction, sets is_paid, payer, paid_at, and emits InvoicePaidEvent. The creator receives the remainder, so rounding dust is never lost. A paid invoice cannot be paid again.cancel_invoice closes an unpaid invoice and refunds rent to the creator; only the creator can call it.Open /demo: five public Devnet test wallets (freelancer, two clients, vault, collaborator) are built into the site. Their keys are published on purpose and hold worthless test SOL. Connect Demo Freelancer, create an invoice, switch to Demo Client 1, pay it, and watch the balances change. An on-screen Activity log shows every step. Phantom/Solflare also work.
@steppeinvoice_bot (Russian, Kazakh, English; picks the language from Telegram, /lang overrides it). Every action is a button on the main menu:
/demo): the bot creates an invoice as Demo Freelancer, offers Pay as demo client, and then sends the "Paid" alert with a link to the act. The whole flow with nothing to install./new): a short dialogue that hands a prefilled draft to the site, where the wallet signs./wallet <address> or /wallet demo), My invoices (/my), Taxes (/tax), SOL rate (/rate)./dashboard combines on-chain income with income earned elsewhere (added by hand), and estimates Kazakhstan 2026 taxes for the self-employed regime and for an IP on the simplified declaration, with the next payment deadlines. Rules and sources live in app/lib/tax/kz2026.ts and are covered by tests. It is an estimate, not tax advice.
Prerequisites: Rust, Solana CLI, Anchor 1.2.1, Node 22. (On Windows use WSL Ubuntu; scripts/ contains the setup helpers.)
# 1. Program tests (local validator)
anchor build
anchor test --validator legacy # 9 passing
# 2. Web app
cd app
cp .env.example .env.local # set NEXT_PUBLIC_PROGRAM_ID (+ bot variables, see docs/TELEGRAM_SETUP.md)
npm install --legacy-peer-deps
npm run dev # ngrok tunnel + Telegram webhook + site, one command
npm run dev:plain # site only, http://localhost:3000
npm run build # production build
npx vitest run # split math unit tests
# 3. End-to-end scripts (any cluster)
KEYPAIR=~/.config/solana/id.json RPC=https://api.devnet.solana.com \
NEXT_PUBLIC_PROGRAM_ID=<id> npx tsx scripts/smoke.ts
KEYPAIR=... RPC=... APP=http://localhost:3000 NEXT_PUBLIC_PROGRAM_ID=<id> npx tsx scripts/blink-e2e.ts
solana config set --url devnet
solana airdrop 2 # or https://faucet.solana.com
anchor deploy --provider.cluster devnet
Program ID (declared in the program): 7ze4Utjmn73v42terYZMTFVGCt2ygVu9u85US89uNGJm
Deployed on Devnet: program. Sample create/pay transactions:
docs/DEVNET.md.
GET /actions.json (and /api/actions.json): routing rules for /pay/*/* → /api/actions/invoice/*/*.GET /api/actions/invoice/:creator/:id: Action metadata (dynamic banner, title, auto-split description, Pay Invoice label).POST /api/actions/invoice/:creator/:id with { "account": "<payer>" }: returns a base64 pay_invoice transaction + message.Blinks unfurl inside X only from a public HTTPS domain registered with Dialect; every invoice also works through https://dial.to/?action=solana-action:<action-url>.
SPL USDC, yield-vault routing, per-invoice client details on-chain via hashed metadata, recurring invoices, Kaspi/KZT off-ramp partners, e-sign of the Act.