معماری
این صفحه معماری هدف پشته غیرامانی OrcaRail را شرح میدهد و برای هر جزء، مسیر کد قدیمیای را که جایگزینش میشود مشخص میکند.
نمودار سیستم
اجزا
PaymentLinkFactory (EVM)
یکی برای هر زنجیره. آدرسهای قطعی CREATE2 که از هش ۳۲ بایتی UUID لینک پرداخت مشتق میشوند. این توابع را ارائه میکند:
computeAddress(bytes32 linkId) view returns (address): آدرس پیش از استقرار برای UI و API.deployAndPay(bytes32 linkId, Split split, address token, uint256 amount): استقرار تنبل و ارسال در یک تراکنش.isDeployed(bytes32 linkId) view returns (bool).
پشت یک پراکسی UUPS که مالک آن مولتیسیگ Safe سه از پنج است قابل ارتقاست؛ با timelock چهلوهشت ساعته. گیرندههای هر لینک قابل ارتقا نیستند.
جایگزین: شاخه EVM تابع generateAddressForNetwork در api/src/payments/wallet.service.ts (اشتقاق HD و محاسبه آدرس counterfactual اسمارت اکانت Alchemy).
PaymentLinkReceiver (EVM)
کلون حداقلی EIP-1167، یکی برای هر لینک پرداخت. ارز بومی و ERC-20 را میپذیرد (SafeERC20 برای توکنهای غیراستاندارد مثل USDT). رویداد Paid(linkId, payer, token, amount) را منتشر میکند. FeeSplitter.split() را بهصورت اتمیک فراخوانی میکند.
جایگزین: مرحله جمعآوری در SmartAccountWalletService.drainSmartAccountWallet در api/src/withdrawals/services/smart-account-wallet.service.ts.
FeeSplitter (EVM)
منطق تقسیم بدون حالت. یک ساختار Split بر حسب basis point و یک مبلغ میگیرد و بین آدرسهای پذیرنده، پلتفرم، معرف و کارمزد پل تقسیم میکند. باقیمانده به پذیرنده میرسد (بدون خرده).
جایگزین: محاسبات تقسیم TypeScript در drainSmartAccountWallet و buildNativeDrainCalls / شاخه معادل ERC-20 در همان سرویس.
SubscriptionHub (EVM)
یکی برای هر زنجیره. برای هر bytes32 id یک ساختار Subscription ذخیره میکند. charge(id) عمومی و بدون نیاز به مجوز است و اینها را اعمال میکند:
block.timestamp >= nextChargeAtlastChargedAtیکنواamountCharged + amount <= cap- بررسی allowance و موجودی ERC-20
رویدادهای Charged، ChargeSkipped(reason)، Canceled و SubscriptionCreated را منتشر میکند.
جایگزین: برداشت امانی در api/src/scheduler/processors/subscription-auto-charge.processor.ts که امروز از اسمارت اکانتی تحت کنترل OrcaRail استفاده میکند.
برنامه payment_link (سولانا)
برنامه Anchor با یک PDA برای هر لینک که از [b"pl", link_id] مشتق میشود. دستورها: initialize، pay، refund. تقسیم از طریق CPI انجام میشود.
جایگزین: شاخه سولانای generateAddressForNetwork در api/src/payments/wallet.service.ts (اشتقاق ed25519-hd-key) و مسیر جمعآوری SOL در api/src/withdrawals/services/solana-withdrawal-transfer.service.ts.
برنامه subscription (سولانا)
برنامه Anchor که از Approve / Revoke در SPL بهعنوان ابزار پایه اختیار delegate استفاده میکند. charge(id) همان معنای SubscriptionHub.charge(id) در EVM را دارد.
جایگزین: شاخه SOL در subscription-auto-charge.processor.ts و برداشت امانی از طریق حسابهای توکن تحت کنترل OrcaRail.
مولتیسیگ دو از دو BTC + بازپرداخت از پیش امضاشده
آدرس taproot برای هر لینک با یک کلید عمومی پذیرنده و یک کلید عمومی پلتفرم. PSBT بازپرداخت از پیش امضاشده در زمان واریز خارج از زنجیره ذخیره میشود. پلتفرم نمیتواند بهتنهایی وجوه را جابهجا کند.
جایگزین: کیف پول داغ یکطرفه در api/src/withdrawals/services/bitcoin-hot-wallet.service.ts. مسیر جمعآوری در api/src/withdrawals/services/bitcoin-withdrawal-transfer.service.ts حفظ میشود، اما به جای کلید یکطرفه با مولتیسیگ امضا میکند.
ایندکسر رویداد
سرویس جدیدی به نام payments/indexer/* مشترک اینها میشود:
- رویدادهای EVM یعنی
Paid،SubscriptionCreated،Charged،ChargeSkippedوCanceled(watchContractEventدر viem، با Alchemy بهعنوان اصلی و RPC عمومی بهعنوان پشتیبان). - لاگهای برنامههای سولانا (وبهوکهای Helius یا استریمهای Triton).
ردیفهای PaymentTransaction و SubscriptionAutoCharge را درج یا بهروز میکند و رویدادهای وبهوک موجود در api/src/webhooks/webhooks.service.ts را ارسال میکند.
جایگزین: پایش دورهای موجودی واریز و callbackهای تکمیل جمعآوری که امروز وبهوکها را راه میاندازند.
جریانهای داده
پرداخت یکباره (EVM)
برداشت اشتراک (EVM)
بازپرداخت
EVM: EOA keeper پذیرنده یا مولتیسیگ تابع PaymentLinkReceiver.refund(txId) را فراخوانی میکند. سولانا: امضاکننده دستور refund را اجرا میکند. BTC: پذیرنده PSBT بازپرداخت از پیش امضاشده را منتشر میکند.
تسویه بینزنجیرهای
Relay همچنان استفاده میشود (api/src/withdrawals/services/bridge را ببینید)، اما محرک به جای امانی، آنچین است: گیرنده در همان تراکنش executor ریلی را فراخوانی میکند، یا keeper بلافاصله پس از رویداد Paid این کار را انجام میدهد.
آنچه در کد جایگزین میشود
فهرستی فشرده برای مهندسان. در فازهای ۱ تا ۴ جایگزین یا دور زده میشوند و در فاز ۷ حذف میشوند.
| فایل / مسیر قدیمی | جایگزین |
|---|---|
api/src/payments/wallet.service.ts: اشتقاق HD، اسمارت اکانت Alchemy | computeAddress در factory + findProgramAddressSync در سولانا |
api/src/withdrawals/services/smart-account-wallet.service.ts: تخلیه / انتقال | تقسیم اتمیک در PaymentLinkReceiver.pay |
api/src/withdrawals/services/solana-withdrawal-transfer.service.ts: جمعآوری SOL | دستور pay در برنامه payment_link |
api/src/scheduler/processors/subscription-auto-charge.processor.ts: برداشت امانی | SubscriptionHub.charge + charge در Anchor |
api/src/withdrawals/services/bitcoin-hot-wallet.service.ts: کلید یکطرفه BTC | مولتیسیگ دو از دو برای هر لینک با امضاکننده پذیرنده |
جدول hd_wallet_seed + WALLET_ENCRYPTION_KEY | برای EVM/SOL حذف؛ در فاز ۷ بایگانی میشود |