尚未检测到更新。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.