feat: isolate manual verification RPC usage

- add rpc node purpose support for general/manual_verify/both
- keep scan, WSS and health checks away from manual_verify nodes
- fallback manual hash verification from general RPC to manual_verify RPC
- add public cashier hash submission path and errno responses
- update tests for RPC selection, failover and manual payment flows
This commit is contained in:
line-6000
2026-05-27 19:36:56 +08:00
parent 13c81ee560
commit c69b0d6c0c
185 changed files with 2525 additions and 483 deletions
+1
View File
@@ -0,0 +1 @@
import{r as e}from"./chunk-DECur_0Z.js";import{a as t}from"./auth-store-BnVIXJIp.js";import{t as n}from"./react-CO2uhaBc.js";import{Bd as r,Hd as i,Ld as a,Mn as o,Nn as s,Rd as c,Ud as l,Vd as u,dp as d,jn as f,zd as p}from"./messages-Bbvu5aaF.js";import{t as m}from"./button-DlGFBuNZ.js";import{a as h,i as g,n as _,r as v,t as y}from"./select-BRRg0L32.js";import{c as b,s as x}from"./zod-CQemhjci.js";import{a as S,c as C,i as w,l as T,n as E,o as D,s as O,t as k}from"./form-CwBNjUHP.js";import{t as A}from"./input-CJ09jXcS.js";import{t as j}from"./page-header-v0-NzBJQ.js";import{n as M,t as N}from"./labels-DcMMAJnk.js";import{a as P,i as F,n as I,t as L}from"./lib-xbBdbolX.js";var R=e(n(),1),z=d(),B=x({defaultToken:b().trim().min(1,p()),defaultCurrency:b().trim().min(1,c()),defaultNetwork:b().trim().min(1,a())});function V(){let e=F(`epay`),n=t.useQuery(`get`,`/admin/api/v1/config`),a=P(),s=(0,R.useRef)(``),c=T({resolver:C(B),defaultValues:{defaultToken:`usdt`,defaultCurrency:`CNY`,defaultNetwork:`TRON`}}),l=(0,R.useMemo)(()=>n.data?.data?.supported_assets??[],[n.data?.data?.supported_assets]),d=(0,R.useMemo)(()=>H(l),[l]),p=c.watch(`defaultNetwork`),b=(0,R.useMemo)(()=>U(l,p),[l,p]);(0,R.useEffect)(()=>{let t=e.data?.data;if(!(t&&!n.isLoading))return;let r=`${e.dataUpdatedAt}:${n.dataUpdatedAt}`;if(s.current===r)return;s.current=r;let i=L(t,`epay.default_network`).trim(),a=d.find(e=>q(e.network,i))?.network||d[0]?.network||i||`TRON`,o=U(l,a),u=L(t,`epay.default_token`).trim(),f=o.find(e=>q(e.value,u))?.value||(u&&o.length===0?u.toLowerCase():o[0]?.value||`usdt`);c.reset({defaultToken:f,defaultCurrency:L(t,`epay.default_currency`,`CNY`).trim().toUpperCase(),defaultNetwork:a})},[n.dataUpdatedAt,n.isLoading,c,d,e.dataUpdatedAt,e.data,l]);async function x(t){await I(a.mutateAsync,[{group:`epay`,key:`epay.default_token`,type:`string`,value:t.defaultToken.toLowerCase()},{group:`epay`,key:`epay.default_currency`,type:`string`,value:t.defaultCurrency.toLowerCase()},{group:`epay`,key:`epay.default_network`,type:`string`,value:t.defaultNetwork.toLowerCase()}],o()),await e.refetch()}return(0,z.jsx)(k,{...c,children:(0,z.jsxs)(`form`,{className:`space-y-6`,onSubmit:c.handleSubmit(x),children:[(0,z.jsxs)(`div`,{className:`grid gap-6 md:grid-cols-2`,children:[(0,z.jsx)(w,{control:c.control,name:`defaultNetwork`,render:({field:e})=>{let t=G(d,e.value),i=t?.network||e.value;return(0,z.jsxs)(S,{children:[(0,z.jsx)(D,{children:r()}),(0,z.jsxs)(y,{disabled:n.isLoading||d.length===0,onValueChange:t=>{e.onChange(t);let n=U(l,t)[0]?.value;c.setValue(`defaultToken`,n??``,{shouldDirty:!0,shouldValidate:!0})},value:e.value,children:[(0,z.jsx)(E,{children:(0,z.jsxs)(g,{className:`w-full`,children:[(0,z.jsx)(`span`,{className:`sr-only`,children:(0,z.jsx)(h,{})}),(0,z.jsx)(`span`,{className:`pointer-events-none`,children:(0,z.jsx)(N,{displayName:t?.displayName,network:i||`TRON`})})]})}),(0,z.jsx)(_,{children:d.map(e=>(0,z.jsx)(v,{textValue:W(e),value:e.network,children:(0,z.jsx)(`span`,{className:`pointer-events-none`,children:(0,z.jsx)(N,{displayName:e.displayName,network:e.network})})},e.network))})]}),(0,z.jsx)(O,{})]})}}),(0,z.jsx)(w,{control:c.control,name:`defaultToken`,render:({field:e})=>{let t=K(b,e.value);return(0,z.jsxs)(S,{children:[(0,z.jsx)(D,{children:i()}),(0,z.jsxs)(y,{disabled:n.isLoading||b.length===0,onValueChange:e.onChange,value:e.value,children:[(0,z.jsx)(E,{children:(0,z.jsxs)(g,{className:`w-full`,children:[(0,z.jsx)(`span`,{className:`sr-only`,children:(0,z.jsx)(h,{})}),(0,z.jsx)(`span`,{className:`pointer-events-none`,children:(0,z.jsx)(M,{token:t||`USDT`})})]})}),(0,z.jsx)(_,{children:b.map(e=>(0,z.jsx)(v,{textValue:e.displayName,value:e.value,children:(0,z.jsx)(`span`,{className:`pointer-events-none`,children:(0,z.jsx)(M,{token:e.displayName})})},e.value))})]}),(0,z.jsx)(O,{})]})}})]}),(0,z.jsx)(w,{control:c.control,name:`defaultCurrency`,render:({field:e})=>(0,z.jsxs)(S,{children:[(0,z.jsx)(D,{children:u()}),(0,z.jsx)(E,{children:(0,z.jsx)(A,{placeholder:`CNY`,...e})}),(0,z.jsx)(O,{})]})}),(0,z.jsx)(m,{disabled:a.isPending||e.isLoading,type:`submit`,children:f()})]})})}function H(e){let t=new Map;for(let n of e){if(!n.network)continue;let e=n.network.toLowerCase();t.has(e)||t.set(e,{displayName:n.display_name,network:n.network})}return Array.from(t.values())}function U(e,t){let n=new Map;for(let r of e)if(q(r.network,t))for(let e of r.tokens??[]){if(!e)continue;let t=e.toLowerCase();n.has(t)||n.set(t,{displayName:e.toUpperCase(),value:t})}return Array.from(n.values())}function W(e){return e.displayName?.trim()||e.network}function G(e,t){return e.find(e=>q(e.network,t))}function K(e,t){return t?e.find(e=>q(e.value,t))?.displayName||t.toUpperCase():``}function q(e,t){return String(e??``).toLowerCase()===String(t??``).toLowerCase()}function J(){return(0,z.jsx)(j,{description:s(),title:l(),variant:`section`,children:(0,z.jsx)(V,{})})}var Y=J;export{Y as component};