尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 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.